import { AbstractService, EndpointCreator, HttpMethod, Modules, NextRef, PreviousRef } from "../../../../core"; import { ProrationPreviewInterface } from "../../stripe-invoice/data/stripe-invoice.interface"; import { StripeSubscriptionCreateMeta, StripeSubscriptionCreateResponse, StripeSubscriptionInput, StripeSubscriptionInterface, } from "./stripe-subscription.interface"; /** * Customer-facing billing service for managing subscriptions, payments, and usage */ export class StripeSubscriptionService extends AbstractService { // ============================================================================ // Subscription Methods // ============================================================================ /** * List all subscriptions for the current user */ static async listSubscriptions(params?: { next?: NextRef; prev?: PreviousRef; }): Promise { const endpoint = new EndpointCreator({ endpoint: Modules.StripeSubscription, }); return this.callApi({ type: Modules.StripeSubscription, method: HttpMethod.GET, endpoint: endpoint.generate(), next: params?.next, previous: params?.prev, }); } /** * Get a specific subscription by ID */ static async getSubscription(params: { subscriptionId: string }): Promise { const endpoint = new EndpointCreator({ endpoint: Modules.StripeSubscription, id: params.subscriptionId, }); return this.callApi({ type: Modules.StripeSubscription, method: HttpMethod.GET, endpoint: endpoint.generate(), }); } /** * Create a new subscription * Returns subscription data along with meta containing SCA payment confirmation details */ static async createSubscription(params: StripeSubscriptionInput): Promise { const endpoint = new EndpointCreator({ endpoint: Modules.StripeSubscription, }); const result = await this.callApiWithMeta({ type: Modules.StripeSubscription, method: HttpMethod.POST, endpoint: endpoint.generate(), input: params, }); return { subscription: result.data, meta: (result.meta as StripeSubscriptionCreateMeta) ?? { clientSecret: null, paymentIntentId: null, requiresAction: false, }, }; } /** * Change the plan of an existing subscription */ static async changePlan(params: StripeSubscriptionInput): Promise { const endpoint = new EndpointCreator({ endpoint: Modules.StripeSubscription, id: params.id, childEndpoint: "change-plan", }); return this.callApi({ type: Modules.StripeSubscription, method: HttpMethod.POST, endpoint: endpoint.generate(), input: params, }); } /** * Get a proration preview for a plan change */ static async getProrationPreview(params: { subscriptionId: string; newPriceId: string; quantity?: number; }): Promise { const endpoint = new EndpointCreator({ endpoint: Modules.StripeSubscription, id: params.subscriptionId, childEndpoint: "proration-preview", }); endpoint.addAdditionalParam("priceId", params.newPriceId); if (params.quantity) { endpoint.addAdditionalParam("quantity", params.quantity.toString()); } return this.callApi({ type: Modules.StripeSubscription, method: HttpMethod.GET, endpoint: endpoint.generate(), }); } /** * Cancel a subscription */ static async cancelSubscription(params: StripeSubscriptionInput): Promise { const endpoint = new EndpointCreator({ endpoint: Modules.StripeSubscription, id: params.id, childEndpoint: "cancel", }); return this.callApi({ type: Modules.StripeSubscription, method: HttpMethod.POST, endpoint: endpoint.generate(), input: params, }); } /** * Pause a subscription */ static async pauseSubscription(params: { subscriptionId: string }): Promise { const endpoint = new EndpointCreator({ endpoint: Modules.StripeSubscription, id: params.subscriptionId, childEndpoint: "pause", }); return this.callApi({ type: Modules.StripeSubscription, method: HttpMethod.POST, endpoint: endpoint.generate(), }); } /** * Resume a paused subscription */ static async resumeSubscription(params: { subscriptionId: string }): Promise { const endpoint = new EndpointCreator({ endpoint: Modules.StripeSubscription, id: params.subscriptionId, childEndpoint: "resume", }); return this.callApi({ type: Modules.StripeSubscription, method: HttpMethod.POST, endpoint: endpoint.generate(), }); } /** * Sync a subscription with the latest data from Stripe * This is useful after payment confirmation to get the updated status */ static async syncSubscription(params: { subscriptionId: string }): Promise { const endpoint = new EndpointCreator({ endpoint: Modules.StripeSubscription, id: params.subscriptionId, childEndpoint: "sync", }); return this.callApi({ type: Modules.StripeSubscription, method: HttpMethod.POST, endpoint: endpoint.generate(), }); } }