diff options
Diffstat (limited to 'Biz/PodcastItLater')
| -rw-r--r-- | Biz/PodcastItLater/Billing.py | 47 |
1 files changed, 34 insertions, 13 deletions
diff --git a/Biz/PodcastItLater/Billing.py b/Biz/PodcastItLater/Billing.py index 7daa3dc..9c0e1db 100644 --- a/Biz/PodcastItLater/Billing.py +++ b/Biz/PodcastItLater/Billing.py @@ -336,23 +336,44 @@ def _handle_payment_failed(invoice: dict[str, typing.Any]) -> None: def _update_subscription_state(subscription: dict[str, typing.Any]) -> None: """Update user subscription state from Stripe subscription object.""" - customer_id = subscription["customer"] - subscription_id = subscription["id"] - status = subscription["status"] + customer_id = subscription.get("customer") + subscription_id = subscription.get("id") + status = subscription.get("status") cancel_at_period_end = subscription.get("cancel_at_period_end", False) - # Get billing period - period_start = datetime.fromtimestamp( - subscription["current_period_start"], - tz=timezone.utc, - ) - period_end = datetime.fromtimestamp( - subscription["current_period_end"], - tz=timezone.utc, - ) + if not customer_id or not subscription_id or not status: + logger.warning( + "Missing required fields in subscription: %s", + subscription_id, + ) + return + + # Get billing period - handle both dict and object access patterns + period_start_ts = subscription.get("current_period_start") + period_end_ts = subscription.get("current_period_end") + + if not period_start_ts or not period_end_ts: + logger.warning( + "Missing period dates in subscription: %s", + subscription_id, + ) + return + + period_start = datetime.fromtimestamp(period_start_ts, tz=timezone.utc) + period_end = datetime.fromtimestamp(period_end_ts, tz=timezone.utc) # Determine tier from price ID - price_id = subscription["items"]["data"][0]["price"]["id"] + items = subscription.get("items", {}) + data = items.get("data", []) + if not data: + logger.warning("No items in subscription: %s", subscription_id) + return + + price_id = data[0].get("price", {}).get("id") + if not price_id: + logger.warning("No price ID in subscription: %s", subscription_id) + return + tier = PRICE_TO_TIER.get(price_id, "free") # Find user by customer ID |
