Refactor usage reporting for metered subscriptions

This commit is contained in:
giancarlo
2024-04-04 16:42:10 +08:00
parent 5612c3f81f
commit 4a122ee5df
4 changed files with 23 additions and 9 deletions

View File

@@ -39,7 +39,6 @@ NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=
NEXT_PUBLIC_ENABLE_ACCOUNT_DELETION=true
NEXT_PUBLIC_ENABLE_PERSONAL_ACCOUNT_BILLING=true
NEXT_PUBLIC_ENABLE_ORGANIZATION_DELETION=true
NEXT_PUBLIC_ENABLE_ORGANIZATION_INVITATIONS=true
NEXT_PUBLIC_ENABLE_ORGANIZATION_BILLING=true
# LOCALES

View File

@@ -1,8 +1,9 @@
import { z } from 'zod';
export const ReportBillingUsageSchema = z.object({
subscriptionId: z.string(),
subscriptionItemId: z.string(),
usage: z.object({
quantity: z.number(),
action: z.enum(['increment', 'set']),
}),
});

View File

@@ -121,6 +121,15 @@ export class LemonSqueezyBillingStrategyService
const { error } = await cancelSubscription(params.subscriptionId);
if (error) {
Logger.error(
{
name: 'billing.lemon-squeezy',
subscriptionId: params.subscriptionId,
error: error.message,
},
'Failed to cancel subscription',
);
throw error;
}
@@ -197,21 +206,22 @@ export class LemonSqueezyBillingStrategyService
Logger.info(
{
name: 'billing.lemon-squeezy',
subscriptionItemId: params.subscriptionId,
subscriptionItemId: params.subscriptionItemId,
},
'Reporting usage...',
);
const { error } = await createUsageRecord({
quantity: params.usage.quantity,
subscriptionItemId: params.subscriptionId,
subscriptionItemId: params.subscriptionItemId,
action: params.usage.action,
});
if (error) {
Logger.error(
{
name: 'billing.lemon-squeezy',
subscriptionItemId: params.subscriptionId,
subscriptionItemId: params.subscriptionItemId,
error: error.message,
},
'Failed to report usage',
@@ -223,7 +233,7 @@ export class LemonSqueezyBillingStrategyService
Logger.info(
{
name: 'billing.lemon-squeezy',
subscriptionItemId: params.subscriptionId,
subscriptionItemId: params.subscriptionItemId,
},
'Usage reported successfully',
);

View File

@@ -187,9 +187,13 @@ export class StripeBillingStrategyService
async reportUsage(params: z.infer<typeof ReportBillingUsageSchema>) {
const stripe = await this.stripeProvider();
await stripe.subscriptionItems.createUsageRecord(params.subscriptionId, {
quantity: params.usage.quantity,
});
await stripe.subscriptionItems.createUsageRecord(
params.subscriptionItemId,
{
quantity: params.usage.quantity,
action: params.usage.action,
},
);
return { success: true };
}