diff --git a/core/server/data/migrations/versions/4.0/03-populate-status-column-for-members.js b/core/server/data/migrations/versions/4.0/03-populate-status-column-for-members.js index 8ede32a9e7..248f392a95 100644 --- a/core/server/data/migrations/versions/4.0/03-populate-status-column-for-members.js +++ b/core/server/data/migrations/versions/4.0/03-populate-status-column-for-members.js @@ -24,10 +24,34 @@ module.exports = createTransactionalMigration( } )).map(({id}) => id); + const compedMemberIds = (await knex('members') + .select('members.id') + .innerJoin( + 'members_stripe_customers', + 'members.id', + 'members_stripe_customers.member_id' + ).innerJoin( + 'members_stripe_customers_subscriptions', + function () { + this.on( + 'members_stripe_customers.customer_id', + 'members_stripe_customers_subscriptions.customer_id' + ).onIn( + 'members_stripe_customers_subscriptions.status', + ['active', 'trialing', 'past_due', 'unpaid'] + ); + } + ).where( + 'members_stripe_customers_subscriptions.plan_nickname', + '=', + 'Complimentary' + )).map(({id}) => id); + // Umm? Well... The current version of SQLite3 bundled with Ghost supports // a maximum of 999 variables, we use one variable for the SET value // and so we're left with 998 for our WHERE IN clause values const chunkSize = 998; + const paidMemberIdChunks = chunk(paidMemberIds, chunkSize); for (const paidMemberIdsChunk of paidMemberIdChunks) { @@ -35,6 +59,14 @@ module.exports = createTransactionalMigration( .update('status', 'paid') .whereIn('id', paidMemberIdsChunk); } + + const compedMemberIdChunks = chunk(compedMemberIds, chunkSize); + + for (const compedMemberIdsChunk of compedMemberIdChunks) { + await knex('members') + .update('status', 'comped') + .whereIn('id', compedMemberIdsChunk); + } }, async function down(knex) { logging.info('Updating all members status to "free"');