diff --git a/packages/backend/src/db/migrations/20230411203412_add_cancellation_effective_date_to_subscriptions.ts b/packages/backend/src/db/migrations/20230411203412_add_cancellation_effective_date_to_subscriptions.ts new file mode 100644 index 00000000..dc9ee247 --- /dev/null +++ b/packages/backend/src/db/migrations/20230411203412_add_cancellation_effective_date_to_subscriptions.ts @@ -0,0 +1,18 @@ +import { Knex } from 'knex'; +import appConfig from '../../config/app'; + +export async function up(knex: Knex): Promise { + if (!appConfig.isCloud) return; + + return knex.schema.table('subscriptions', (table) => { + table.date('cancellation_effective_date'); + }); +} + +export async function down(knex: Knex): Promise { + if (!appConfig.isCloud) return; + + return knex.schema.table('subscriptions', (table) => { + table.dropColumn('cancellation_effective_date'); + }); +} diff --git a/packages/backend/src/helpers/billing/webhooks.ee.ts b/packages/backend/src/helpers/billing/webhooks.ee.ts index b9556d42..78e2fa60 100644 --- a/packages/backend/src/helpers/billing/webhooks.ee.ts +++ b/packages/backend/src/helpers/billing/webhooks.ee.ts @@ -3,13 +3,16 @@ import Subscription from '../../models/subscription.ee'; import Billing from './index.ee'; const handleSubscriptionCreated = async (request: IRequest) => { - const subscription = await Subscription.query().insertAndFetch(formatSubscription(request)); - await subscription.$relatedQuery('usageData').insert(formatUsageData(request)); + const subscription = await Subscription.query().insertAndFetch( + formatSubscription(request) + ); + await subscription + .$relatedQuery('usageData') + .insert(formatUsageData(request)); }; const handleSubscriptionUpdated = async (request: IRequest) => { - await Subscription - .query() + await Subscription.query() .findOne({ paddle_subscription_id: request.body.subscription_id, }) @@ -17,15 +20,15 @@ const handleSubscriptionUpdated = async (request: IRequest) => { }; const handleSubscriptionCancelled = async (request: IRequest) => { - const subscription = await Subscription - .query() - .findOne({ - paddle_subscription_id: request.body.subscription_id, - }); + const subscription = await Subscription.query().findOne({ + paddle_subscription_id: request.body.subscription_id, + }); await subscription.$query().patchAndFetch(formatSubscription(request)); - await subscription.$query().delete(); + // Have a background job that deletes the subscription in cancellation effective date + // Architect in a way that it will behave as cron. + // await subscription.$query().delete(); }; const handleSubscriptionPaymentSucceeded = async (request: IRequest) => { @@ -45,7 +48,9 @@ const handleSubscriptionPaymentSucceeded = async (request: IRequest) => { lastBillDate: remoteSubscription.last_payment.date, }); - await subscription.$relatedQuery('usageData').insert(formatUsageData(request)); + await subscription + .$relatedQuery('usageData') + .insert(formatUsageData(request)); }; const formatSubscription = (request: IRequest) => { @@ -58,6 +63,7 @@ const formatSubscription = (request: IRequest) => { status: request.body.status, nextBillDate: request.body.next_bill_date, nextBillAmount: request.body.unit_price, + cancellationEffectiveDate: request.body.cancellation_effective_date, }; }; diff --git a/packages/backend/src/models/subscription.ee.ts b/packages/backend/src/models/subscription.ee.ts index 216e5e52..a8d9de60 100644 --- a/packages/backend/src/models/subscription.ee.ts +++ b/packages/backend/src/models/subscription.ee.ts @@ -14,6 +14,7 @@ class Subscription extends Base { nextBillAmount!: string; nextBillDate!: string; lastBillDate?: string; + cancellationEffectiveDate?: string; usageData?: UsageData[]; currentUsageData?: UsageData; @@ -43,6 +44,7 @@ class Subscription extends Base { nextBillAmount: { type: 'string' }, nextBillDate: { type: 'string' }, lastBillDate: { type: 'string' }, + cancellationEffectiveDate: { type: 'string' }, }, };