Source code for sirepo.auth_db.stripe
"""Stripe db tables
:copyright: Copyright (c) 2025 RadiaSoft LLC. All Rights Reserved.
:license: http://www.apache.org/licenses/LICENSE-2.0.html
"""
from pykern.pkcollections import PKDict
from pykern.pkdebug import pkdc, pkdlog, pkdp
import sqlalchemy
import sirepo.auth_db
# https://docs.stripe.com/upgrades#what-changes-does-stripe-consider-to-be-backward-compatible
_STRIPE_ID = sqlalchemy.String(255)
_CREATION_REASON_DEFAULT = "payments_checkout_session_status_complete"
_REVOCATION_REASON_INACTIVE_STRIPE_STATUS = "inactive_stripe_status"
[docs]
class StripePayment(sirepo.auth_db.UserDbBase):
__tablename__ = "stripe_payment_t"
user_payment_key = sirepo.auth_db.primary_key_column("spk")
# Invoice id's are unique in Stripe
# https://docs.stripe.com/api/invoices/object#invoice_object-id
invoice_id = sqlalchemy.Column(_STRIPE_ID, unique=True, nullable=False)
uid = sqlalchemy.Column(sirepo.auth_db.STRING_NAME, nullable=False)
amount_paid = sqlalchemy.Column(sqlalchemy.Integer(), nullable=False)
created = sqlalchemy.Column(
sqlalchemy.DateTime(),
server_default=sqlalchemy.sql.func.now(),
nullable=False,
)
customer_id = sqlalchemy.Column(_STRIPE_ID, nullable=False)
subscription_id = sqlalchemy.Column(_STRIPE_ID, nullable=False)
subscription_name = sqlalchemy.Column(_STRIPE_ID, nullable=False)
[docs]
def payment_exists(self, invoice_id):
return self.unchecked_search_by(invoice_id=invoice_id)
[docs]
class StripeSubscription(sirepo.auth_db.UserDbBase):
__tablename__ = "stripe_subscription_t"
stripe_subscription_key = sirepo.auth_db.primary_key_column("ssk")
uid = sqlalchemy.Column(sirepo.auth_db.STRING_NAME)
customer_id = sqlalchemy.Column(_STRIPE_ID, nullable=False)
checkout_session_id = sqlalchemy.Column(_STRIPE_ID, nullable=True)
subscription_id = sqlalchemy.Column(_STRIPE_ID, nullable=False)
creation_reason = sqlalchemy.Column(
sirepo.auth_db.STRING_NAME,
server_default=_CREATION_REASON_DEFAULT,
)
created = sqlalchemy.Column(sqlalchemy.DateTime(), nullable=False)
revocation_reason = sqlalchemy.Column(sirepo.auth_db.STRING_NAME, nullable=True)
revoked = sqlalchemy.Column(sqlalchemy.DateTime(), nullable=True)
role = sqlalchemy.Column(sirepo.auth_db.STRING_NAME, nullable=False)
[docs]
def not_revoked_stripe_subscriptions(self):
return self.unchecked_search_all(
revoked=None,
creation_reason=_CREATION_REASON_DEFAULT,
)
[docs]
def revoke_due_to_inactive_stripe_status(self, subscription_record):
s = self._new(subscription_record)
s.revocation_reason = _REVOCATION_REASON_INACTIVE_STRIPE_STATUS
s.revoked = sirepo.srtime.utc_now()
s.save()