ghost
Version:
The professional publishing platform
74 lines (66 loc) • 2.82 kB
JavaScript
const {chunk} = require('lodash');
const {createTransactionalMigration} = require('../../utils');
const logging = require('@tryghost/logging');
module.exports = createTransactionalMigration(async function up(knex) {
// eslint-disable-next-line no-restricted-syntax
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'
).andWhere(
'members.status',
'!=',
'comped'
)).map(({id}) => id);
if (!compedMemberIds.length) {
logging.warn('No Complimentary members found with incorrect status');
return;
} else {
logging.info(`Found ${compedMemberIds.length} Complimentary members with the incorrect status`);
}
// 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 compedMemberIdChunks = chunk(compedMemberIds, chunkSize);
// eslint-disable-next-line no-restricted-syntax
for (const compedMemberIdsChunk of compedMemberIdChunks) {
await knex('members')
.update('status', 'comped')
.whereIn('id', compedMemberIdsChunk);
}
// eslint-disable-next-line no-restricted-syntax
for (const memberId of compedMemberIds) {
const mostRecentStatusEvent = await knex('members_status_events')
.select('*')
.where('member_id', memberId)
.orderBy('created_at', 'desc')
.limit(1)
.first();
if (!mostRecentStatusEvent) {
logging.warn(`Could not find a status event for member ${memberId} - skipping this member`);
} else if (mostRecentStatusEvent.to_status !== 'comped') {
logging.info(`Updating members_status_event ${mostRecentStatusEvent.id}`);
await knex('members_status_events')
.update('to_status', 'comped')
.where('id', mostRecentStatusEvent.id);
}
}
}, async function down() {});