mirror of
https://github.com/MODSetter/SurfSense.git
synced 2026-05-05 13:52:40 +02:00
feat(story-5.3): add Stripe webhook subscription lifecycle handlers
- Add migration 125: subscription_current_period_end column - Add PLAN_LIMITS config (free/pro_monthly/pro_yearly token + pages limits) - Add subscription webhook handlers: created/updated/deleted, invoice payment - Handle checkout.session.completed for subscription mode separately from PAYG - Idempotency: subscription_id + status + plan_id + period_end guard - pages_limit upgraded on activation, gracefully downgraded on cancel - Token reset on subscription_create and subscription_cycle billing events - Period_end forward-only guard against out-of-order webhook delivery Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
07a4bc3fc3
commit
20c4f128bb
7 changed files with 381 additions and 27 deletions
|
|
@ -1976,6 +1976,7 @@ if config.AUTH_TYPE == "GOOGLE":
|
|||
plan_id = Column(String(50), nullable=False, default="free", server_default="free")
|
||||
stripe_customer_id = Column(String(255), nullable=True, unique=True)
|
||||
stripe_subscription_id = Column(String(255), nullable=True, unique=True)
|
||||
subscription_current_period_end = Column(TIMESTAMP(timezone=True), nullable=True)
|
||||
|
||||
# User profile from OAuth
|
||||
display_name = Column(String, nullable=True)
|
||||
|
|
@ -2104,6 +2105,7 @@ else:
|
|||
plan_id = Column(String(50), nullable=False, default="free", server_default="free")
|
||||
stripe_customer_id = Column(String(255), nullable=True, unique=True)
|
||||
stripe_subscription_id = Column(String(255), nullable=True, unique=True)
|
||||
subscription_current_period_end = Column(TIMESTAMP(timezone=True), nullable=True)
|
||||
|
||||
# User profile (can be set manually for non-OAuth users)
|
||||
display_name = Column(String, nullable=True)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue