Imporve UI and token
This commit is contained in:
@@ -6,6 +6,7 @@ This service abstracts payment provider interactions and makes the system paymen
|
||||
import structlog
|
||||
from typing import Dict, Any, Optional
|
||||
import uuid
|
||||
from datetime import datetime
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from app.core.config import settings
|
||||
@@ -250,3 +251,53 @@ class PaymentService:
|
||||
except Exception as e:
|
||||
logger.error("Failed to get subscription from payment provider", error=str(e))
|
||||
raise e
|
||||
|
||||
async def sync_subscription_status(self, subscription_id: str, db_session: Session) -> Subscription:
|
||||
"""
|
||||
Sync subscription status from payment provider to database
|
||||
This ensures our local subscription status matches the payment provider
|
||||
"""
|
||||
try:
|
||||
# Get current subscription from payment provider
|
||||
stripe_subscription = await self.payment_provider.get_subscription(subscription_id)
|
||||
|
||||
logger.info("Syncing subscription status",
|
||||
subscription_id=subscription_id,
|
||||
stripe_status=stripe_subscription.status)
|
||||
|
||||
# Update local database record
|
||||
self.subscription_repo.db_session = db_session
|
||||
local_subscription = await self.subscription_repo.get_by_stripe_id(subscription_id)
|
||||
|
||||
if local_subscription:
|
||||
# Update status and dates
|
||||
local_subscription.status = stripe_subscription.status
|
||||
local_subscription.current_period_end = stripe_subscription.current_period_end
|
||||
|
||||
# Handle status-specific logic
|
||||
if stripe_subscription.status == 'active':
|
||||
local_subscription.is_active = True
|
||||
local_subscription.canceled_at = None
|
||||
elif stripe_subscription.status == 'canceled':
|
||||
local_subscription.is_active = False
|
||||
local_subscription.canceled_at = datetime.utcnow()
|
||||
elif stripe_subscription.status == 'past_due':
|
||||
local_subscription.is_active = False
|
||||
elif stripe_subscription.status == 'unpaid':
|
||||
local_subscription.is_active = False
|
||||
|
||||
await self.subscription_repo.update(local_subscription)
|
||||
logger.info("Subscription status synced successfully",
|
||||
subscription_id=subscription_id,
|
||||
new_status=stripe_subscription.status)
|
||||
else:
|
||||
logger.warning("Local subscription not found for Stripe subscription",
|
||||
subscription_id=subscription_id)
|
||||
|
||||
return stripe_subscription
|
||||
|
||||
except Exception as e:
|
||||
logger.error("Failed to sync subscription status",
|
||||
error=str(e),
|
||||
subscription_id=subscription_id)
|
||||
raise e
|
||||
|
||||
Reference in New Issue
Block a user