diff --git a/core/server/data/migrations/versions/4.6/01-remove-comped-status.js b/core/server/data/migrations/versions/4.6/01-remove-comped-status.js new file mode 100644 index 0000000000..9d8543305e --- /dev/null +++ b/core/server/data/migrations/versions/4.6/01-remove-comped-status.js @@ -0,0 +1,46 @@ +const logging = require('../../../../../shared/logging'); +const {createTransactionalMigration} = require('../../utils.js'); + +module.exports = createTransactionalMigration( + async function up(knex) { + logging.info('Updating all member "comped" statuses to "paid"'); + await knex('members') + .update('status', 'paid') + .where('status', 'comped'); + }, + async function down(knex) { + 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); + + if (compedMemberIds.length === 0) { + logging.info('No Members found with Complimentary subscriptions'); + return; + } + + logging.info(`Updating ${compedMemberIds.length} Members status from 'paid' -> 'comped'`); + + await knex('members') + .update('status', 'comped') + .whereIn('id', compedMemberIds); + } +); diff --git a/core/server/data/schema/schema.js b/core/server/data/schema/schema.js index 979577a81e..7c22553450 100644 --- a/core/server/data/schema/schema.js +++ b/core/server/data/schema/schema.js @@ -345,7 +345,7 @@ module.exports = { email: {type: 'string', maxlength: 191, nullable: false, unique: true, validations: {isEmail: true}}, status: { type: 'string', maxlength: 50, nullable: false, defaultTo: 'free', validations: { - isIn: [['free', 'paid', 'comped']] + isIn: [['free', 'paid']] } }, name: {type: 'string', maxlength: 191, nullable: true}, @@ -399,12 +399,12 @@ module.exports = { member_id: {type: 'string', maxlength: 24, nullable: false, references: 'members.id', cascadeDelete: true}, from_status: { type: 'string', maxlength: 50, nullable: true, validations: { - isIn: [['free', 'paid', 'comped']] + isIn: [['free', 'paid']] } }, to_status: { type: 'string', maxlength: 50, nullable: true, validations: { - isIn: [['free', 'paid', 'comped']] + isIn: [['free', 'paid']] } }, created_at: {type: 'dateTime', nullable: false} diff --git a/core/server/models/member-status-event.js b/core/server/models/member-status-event.js index b0e04d8c4e..994a6db669 100644 --- a/core/server/models/member-status-event.js +++ b/core/server/models/member-status-event.js @@ -17,15 +17,12 @@ const MemberStatusEvent = ghostBookshelf.Model.extend({ return qb.clear('select') .select(knex.raw('DATE(created_at) as date')) .select(knex.raw(`SUM( - CASE WHEN to_status='paid' THEN 1 - WHEN from_status='paid' THEN -1 - ELSE 0 END + CASE WHEN to_status IN ('paid', 'comped') THEN 1 + WHEN from_status IN ('paid', 'comped') THEN -1 + ELSE 0 + END ) as paid_delta`)) - .select(knex.raw(`SUM( - CASE WHEN to_status='comped' THEN 1 - WHEN from_status='comped' THEN -1 - ELSE 0 END - ) as comped_delta`)) + .select(knex.raw(`0 as comped_delta`)) .select(knex.raw(`SUM( CASE WHEN to_status='free' THEN 1 WHEN from_status='free' THEN -1 diff --git a/test/api-acceptance/admin/members_spec.js b/test/api-acceptance/admin/members_spec.js index d1f6817c5d..7b3977f8c8 100644 --- a/test/api-acceptance/admin/members_spec.js +++ b/test/api-acceptance/admin/members_spec.js @@ -98,7 +98,7 @@ describe('Members API', function () { const jsonResponse = res.body; should.exist(jsonResponse); should.exist(jsonResponse.members); - jsonResponse.members.should.have.length(4); + jsonResponse.members.should.have.length(5); jsonResponse.members[0].email.should.equal('paid@test.com'); jsonResponse.members[1].email.should.equal('trialing@test.com'); localUtils.API.checkResponse(jsonResponse, 'members'); diff --git a/test/utils/fixtures/data-generator.js b/test/utils/fixtures/data-generator.js index b555814504..b71be0352b 100644 --- a/test/utils/fixtures/data-generator.js +++ b/test/utils/fixtures/data-generator.js @@ -340,7 +340,7 @@ DataGenerator.Content = { email: 'comped@test.com', name: 'Vinz Clortho', uuid: 'f6f91461-d7d8-4a3f-aa5d-8e582c40b344', - status: 'comped' + status: 'paid' }, { id: ObjectId().toHexString(),