Ghost/core/server/models/member-status-event.js
Fabien 'egg' O'Carroll 71ba9f3d17
Readded support for comped status in event aggregate (#13142)
refs https://github.com/TryGhost/Team/issues/880

The aggregate for `paid_delta` was incorrect as it did not handle the
case where an event went from paid->comped or from comped->paid. This
resulted in an overcount for paid members.
2021-07-15 15:17:51 +01:00

65 lines
2.2 KiB
JavaScript

const errors = require('@tryghost/errors');
const ghostBookshelf = require('./base');
const MemberStatusEvent = ghostBookshelf.Model.extend({
tableName: 'members_status_events',
member() {
return this.belongsTo('Member', 'member_id', 'id');
},
customQuery(qb, options) {
if (options.aggregateStatusCounts) {
if (options.limit || options.filter) {
throw new errors.IncorrectUsageError('aggregateStatusCounts does not work when passed a filter or limit');
}
const knex = ghostBookshelf.knex;
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
) 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(`SUM(
CASE WHEN to_status='free' THEN 1
WHEN from_status='free' THEN -1
ELSE 0 END
) as free_delta`))
.groupByRaw('DATE(created_at)')
.orderByRaw('DATE(created_at)');
}
}
}, {
permittedOptions(methodName) {
const options = ghostBookshelf.Model.permittedOptions.call(this, methodName);
if (methodName === 'findAll') {
return options.concat('aggregateStatusCounts');
}
return options;
},
async edit() {
throw new errors.IncorrectUsageError('Cannot edit MemberStatusEvent');
},
async destroy() {
throw new errors.IncorrectUsageError('Cannot destroy MemberStatusEvent');
}
});
const MemberStatusEvents = ghostBookshelf.Collection.extend({
model: MemberStatusEvent
});
module.exports = {
MemberStatusEvent: ghostBookshelf.model('MemberStatusEvent', MemberStatusEvent),
MemberStatusEvents: ghostBookshelf.collection('MemberStatusEvents', MemberStatusEvents)
};