Skip to content

Commit 63a1086

Browse files
authored
Added gift members to total_members helper (TryGhost#27482)
ref https://linear.app/ghost/issue/BER-3478 Updated the `total_members` helper to include `gift` members in the count
1 parent 9e007dd commit 63a1086

8 files changed

Lines changed: 28 additions & 11 deletions

File tree

apps/admin-x-framework/src/api/stats.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ export type MemberCountHistoryResponseType = {
3333
paid: number;
3434
free: number;
3535
comped: number;
36+
gift: number;
3637
}
3738
};
3839
}

apps/admin-x-framework/src/test/msw-utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ export const fixtures = {
8585
{date: '2024-01-01', paid: 100, free: 500, comped: 10, paid_subscribed: 5, paid_canceled: 2},
8686
{date: '2024-01-02', paid: 102, free: 505, comped: 10, paid_subscribed: 3, paid_canceled: 1}
8787
],
88-
meta: {totals: {paid: 102, free: 505, comped: 10}}
88+
meta: {totals: {paid: 102, free: 505, comped: 10, gift: 8}}
8989
},
9090

9191
mrrHistory: {

apps/admin-x-framework/src/test/responses/member_count_history.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@
4545
"totals": {
4646
"paid": 110,
4747
"free": 530,
48-
"comped": 12
48+
"comped": 12,
49+
"gift": 8
4950
}
5051
}
5152
}

ghost/core/core/frontend/utils/member-count.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,15 @@ const {api} = require('../services/proxy');
66
* free: number;
77
* paid: number;
88
* comped: number;
9+
* gift: number;
910
* total: number;
1011
* }>}
1112
*/
1213
async function getMemberStats() {
1314
let memberStats = this.data || await api.stats.memberCountHistory.query();
14-
const {free, paid, comped} = memberStats.meta.totals;
15-
let total = free + paid + comped;
16-
return {free, paid, comped, total};
15+
const {free, paid, comped, gift} = memberStats.meta.totals;
16+
let total = free + paid + comped + gift;
17+
return {free, paid, comped, gift, total};
1718
}
1819

1920
/**

ghost/core/core/server/services/stats/members-stats-service.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,13 @@ class MembersStatsService {
2222
const paidEvent = rows.find(c => c.status === 'paid');
2323
const freeEvent = rows.find(c => c.status === 'free');
2424
const compedEvent = rows.find(c => c.status === 'comped');
25+
const giftEvent = rows.find(c => c.status === 'gift');
2526

2627
return {
2728
paid: paidEvent ? paidEvent.total : 0,
2829
free: freeEvent ? freeEvent.total : 0,
29-
comped: compedEvent ? compedEvent.total : 0
30+
comped: compedEvent ? compedEvent.total : 0,
31+
gift: giftEvent ? giftEvent.total : 0
3032
};
3133
}
3234

@@ -279,6 +281,7 @@ module.exports = MembersStatsService;
279281
* @property {number} paid Total paid members
280282
* @property {number} free Total free members
281283
* @property {number} comped Total comped members
284+
* @property {number} gift Total gift members
282285
*/
283286

284287
/**

ghost/core/test/e2e-api/admin/__snapshots__/stats.test.js.snap

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ Object {
4444
"totals": Object {
4545
"comped": 0,
4646
"free": 3,
47+
"gift": 0,
4748
"paid": 5,
4849
},
4950
},
@@ -64,7 +65,7 @@ exports[`Stats API Can fetch member count history 2: [headers] 1`] = `
6465
Object {
6566
"access-control-allow-origin": "http://127.0.0.1:2369",
6667
"cache-control": "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0",
67-
"content-length": "149",
68+
"content-length": "158",
6869
"content-type": "application/json; charset=utf-8",
6970
"content-version": StringMatching /v\\\\d\\+\\\\\\.\\\\d\\+/,
7071
"etag": StringMatching /\\(\\?:W\\\\/\\)\\?"\\(\\?:\\[ !#-\\\\x7E\\\\x80-\\\\xFF\\]\\*\\|\\\\r\\\\n\\[\\\\t \\]\\|\\\\\\\\\\.\\)\\*"/,

ghost/core/test/unit/frontend/utils/member-count.test.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@ const getMemberStatsMock = [
3535
describe('Member Count', function () {
3636
it('should return total members', async function () {
3737
const meta = {data: {
38-
meta: {totals: {paid: 1000, free: 500, comped: 500}}
38+
meta: {totals: {paid: 1000, free: 500, comped: 500, gift: 100}}
3939
}};
4040
const members = await getMemberStats.call(meta);
41-
assert.equal(members.total, 2000);
41+
assert.equal(members.total, 2100);
4242
});
4343

4444
it('should return rounded numbers in correct format', function () {

ghost/core/test/unit/server/services/stats/members.test.js

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ describe('MembersStatsService', function () {
1212
/**
1313
* @type {MembersStatsService.TotalMembersByStatus}
1414
*/
15-
const currentCounts = {paid: 0, free: 0, comped: 0};
15+
const currentCounts = {paid: 0, free: 0, comped: 0, gift: 0};
1616
/**
1717
* @type {MembersStatsService.MemberStatusDelta[]}
1818
*/
@@ -49,6 +49,11 @@ describe('MembersStatsService', function () {
4949
});
5050

5151
beforeEach(async function () {
52+
currentCounts.paid = 0;
53+
currentCounts.free = 0;
54+
currentCounts.comped = 0;
55+
currentCounts.gift = 0;
56+
5257
db = knex({client: 'sqlite3', connection: {filename: ':memory:'}, useNullAsDefault: true});
5358
membersStatsService = new MembersStatsService({knex: db});
5459

@@ -81,8 +86,12 @@ describe('MembersStatsService', function () {
8186
id: 'id',
8287
status: 'comped'
8388
}));
89+
const giftMembers = Array.from({length: currentCounts.gift}).map(() => ({
90+
id: 'id',
91+
status: 'gift'
92+
}));
8493

85-
await db('members').insert(paidMembers.concat(freeMembers, compedMembers));
94+
await db('members').insert(paidMembers.concat(freeMembers, compedMembers, giftMembers));
8695

8796
/**
8897
* @typedef {object} StatusEvent
@@ -125,6 +134,7 @@ describe('MembersStatsService', function () {
125134
currentCounts.paid = 1;
126135
currentCounts.free = 2;
127136
currentCounts.comped = 3;
137+
currentCounts.gift = 4;
128138

129139
await setupDB();
130140

0 commit comments

Comments
 (0)