diff --git a/core/server/data/migrations/versions/4.44/2022-04-08-11-54-add-cancelled-events.js b/core/server/data/migrations/versions/4.44/2022-04-08-11-54-add-cancelled-events.js new file mode 100644 index 0000000000..b13b45aefb --- /dev/null +++ b/core/server/data/migrations/versions/4.44/2022-04-08-11-54-add-cancelled-events.js @@ -0,0 +1,51 @@ +const ObjectID = require('bson-objectid').default; +const logging = require('@tryghost/logging'); + +const {createTransactionalMigration} = require('../../utils'); + +module.exports = createTransactionalMigration( + async function up(knex) { + const cancelledSubscriptions = await knex + .select( + 'members.id as member_id', + 'members_stripe_customers_subscriptions.id', + 'members_stripe_customers_subscriptions.stripe_price_id', + 'members_stripe_customers_subscriptions.plan_currency', + 'members_stripe_customers_subscriptions.updated_at' + ) + .from('members_stripe_customers_subscriptions') + .join('members_stripe_customers', 'members_stripe_customers.customer_id', '=', 'members_stripe_customers_subscriptions.customer_id') + .join('members', 'members_stripe_customers.member_id', '=', 'members.id') + .where('members_stripe_customers_subscriptions.cancel_at_period_end', true) + .whereNot('members_stripe_customers_subscriptions.status', 'canceled'); + + if (cancelledSubscriptions.length === 0) { + logging.info('No missing cancelled events - skipping migration'); + return; + } + + const eventsToInsert = cancelledSubscriptions.map((subscription) => { + const event = { + id: (new ObjectID()).toHexString(), + type: 'canceled', + member_id: subscription.member_id, + subscription_id: subscription.id, + from_plan: subscription.stripe_price_id, + to_plan: subscription.stripe_price_id, + currency: subscription.plan_currency, + source: 'migration', + mrr_delta: 0, + created_at: subscription.updated_at + }; + + return event; + }); + + logging.info(`Found ${eventsToInsert.length} missing cancellation events`); + await knex('members_paid_subscription_events').insert(eventsToInsert); + }, + async function down(knex) { + logging.info('Deleting all members_paid_subscription_events with a "type" of "cancelled"'); + await knex('members_paid_subscription_events').where({type: 'canceled', source: 'migration'}).del(); + } +);