Refactor billing system and enhance logging

Updated the billing system's schema to change 'storeId' to a string type, and improved the cleanliness and readability of the code. Enhanced the logging system within the billing service for better tracking and debugging. In line with these changes, added corresponding error pages in the client side to handle any errors.
This commit is contained in:
giancarlo
2024-04-02 12:19:09 +08:00
parent 6149f6a313
commit d24cf8427f
14 changed files with 458 additions and 81 deletions

View File

@@ -10,6 +10,7 @@ import {
ReportBillingUsageSchema,
RetrieveCheckoutSessionSchema,
} from '@kit/billing/schema';
import { Logger } from '@kit/shared/logger';
import { createStripeBillingPortalSession } from './create-stripe-billing-portal-session';
import { createStripeCheckout } from './create-stripe-checkout';
@@ -23,12 +24,39 @@ export class StripeBillingStrategyService
) {
const stripe = await this.stripeProvider();
Logger.info(
{
name: 'billing.stripe',
customerId: params.customerId,
accountId: params.accountId,
},
'Creating checkout session...',
);
const { client_secret } = await createStripeCheckout(stripe, params);
if (!client_secret) {
Logger.error(
{
name: 'billing.stripe',
customerId: params.customerId,
accountId: params.accountId,
},
'Failed to create checkout session',
);
throw new Error('Failed to create checkout session');
}
Logger.info(
{
name: 'billing.stripe',
customerId: params.customerId,
accountId: params.accountId,
},
'Checkout session created successfully',
);
return { checkoutToken: client_secret };
}
@@ -37,7 +65,35 @@ export class StripeBillingStrategyService
) {
const stripe = await this.stripeProvider();
return createStripeBillingPortalSession(stripe, params);
Logger.info(
{
name: 'billing.stripe',
customerId: params.customerId,
},
'Creating billing portal session...',
);
const session = await createStripeBillingPortalSession(stripe, params);
if (!session?.url) {
Logger.error(
{
name: 'billing.stripe',
customerId: params.customerId,
},
'Failed to create billing portal session',
);
} else {
Logger.info(
{
name: 'billing.stripe',
customerId: params.customerId,
},
'Billing portal session created successfully',
);
}
return session;
}
async cancelSubscription(
@@ -45,11 +101,40 @@ export class StripeBillingStrategyService
) {
const stripe = await this.stripeProvider();
await stripe.subscriptions.cancel(params.subscriptionId, {
invoice_now: params.invoiceNow ?? true,
});
Logger.info(
{
name: 'billing.stripe',
subscriptionId: params.subscriptionId,
},
'Cancelling subscription...',
);
return { success: true };
try {
await stripe.subscriptions.cancel(params.subscriptionId, {
invoice_now: params.invoiceNow ?? true,
});
Logger.info(
{
name: 'billing.stripe',
subscriptionId: params.subscriptionId,
},
'Subscription cancelled successfully',
);
return { success: true };
} catch (e) {
Logger.error(
{
name: 'billing.stripe',
subscriptionId: params.subscriptionId,
error: e,
},
'Failed to cancel subscription',
);
throw new Error('Failed to cancel subscription');
}
}
async retrieveCheckoutSession(
@@ -57,17 +142,46 @@ export class StripeBillingStrategyService
) {
const stripe = await this.stripeProvider();
const session = await stripe.checkout.sessions.retrieve(params.sessionId);
const isSessionOpen = session.status === 'open';
return {
checkoutToken: session.client_secret,
isSessionOpen,
status: session.status ?? 'complete',
customer: {
email: session.customer_details?.email ?? null,
Logger.info(
{
name: 'billing.stripe',
sessionId: params.sessionId,
},
};
'Retrieving checkout session...',
);
try {
const session = await stripe.checkout.sessions.retrieve(params.sessionId);
const isSessionOpen = session.status === 'open';
Logger.info(
{
name: 'billing.stripe',
sessionId: params.sessionId,
},
'Checkout session retrieved successfully',
);
return {
checkoutToken: session.client_secret,
isSessionOpen,
status: session.status ?? 'complete',
customer: {
email: session.customer_details?.email ?? null,
},
};
} catch (error) {
Logger.error(
{
name: 'billing.stripe',
sessionId: params.sessionId,
error,
},
'Failed to retrieve checkout session',
);
throw new Error('Failed to retrieve checkout session');
}
}
async reportUsage(params: z.infer<typeof ReportBillingUsageSchema>) {