Relates to #205
backend/src/features/subscriptions/domain/subscriptions.service.ts
backend/src/features/subscriptions/api/subscriptions.controller.ts
Extract ensureStripeCustomer() private method (replaces resolveStripeCustomerId()):
ensureStripeCustomer()
resolveStripeCustomerId()
upgradeSubscription() (lines 203-280):
upgradeSubscription()
updatePaymentMethod() (lines 965-973):
updatePaymentMethod()
getInvoices() (line 981):
getInvoices()
if (!subscription?.stripeCustomerId) { return []; }
Edge case hardening for cancelSubscription() and reactivateSubscription() (service layer):
cancelSubscription()
reactivateSubscription()
Controller comment cleanup: Remove any stale comments in subscriptions.controller.ts referencing admin_override_ pattern
No dependencies set.
The note is not visible to the blocked user.
Relates to #205
Milestone 4: Service - Stripe flows + null handling
Files
backend/src/features/subscriptions/domain/subscriptions.service.tsbackend/src/features/subscriptions/api/subscriptions.controller.ts(comment cleanup only)Changes
Extract
ensureStripeCustomer()private method (replacesresolveStripeCustomerId()):upgradeSubscription()(lines 203-280):resolveStripeCustomerId()call (line 220) withensureStripeCustomer()updatePaymentMethod()(lines 965-973):resolveStripeCustomerId()call withensureStripeCustomer()getInvoices()(line 981):if (!subscription?.stripeCustomerId) { return []; }Edge case hardening for
cancelSubscription()andreactivateSubscription()(service layer):Controller comment cleanup: Remove any stale comments in subscriptions.controller.ts referencing admin_override_ pattern
Tests
Mobile + Desktop Validation
Acceptance Criteria