@openora/core 0.4.1-canary.47 → 0.4.1-canary.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/admin-console/__tests__/backoffice.service.test.js +62 -41
- package/dist/admin-console/__tests__/backoffice.service.test.js.map +1 -1
- package/dist/admin-console/contract/index.d.ts +2 -1
- package/dist/admin-console/contract/index.d.ts.map +1 -1
- package/dist/admin-console/contract/index.js +2 -9
- package/dist/admin-console/contract/index.js.map +1 -1
- package/dist/admin-console/router/index.d.ts +1 -0
- package/dist/admin-console/router/index.d.ts.map +1 -1
- package/dist/admin-console/service/backoffice.service.d.ts.map +1 -1
- package/dist/admin-console/service/backoffice.service.js +1 -0
- package/dist/admin-console/service/backoffice.service.js.map +1 -1
- package/dist/analytics/__tests__/funnel-analytics.service.test.js +3 -3
- package/dist/analytics/__tests__/funnel-analytics.service.test.js.map +1 -1
- package/dist/analytics/contract/funnel.d.ts +3 -3
- package/dist/analytics/contract/funnel.js +1 -1
- package/dist/analytics/contract/funnel.js.map +1 -1
- package/dist/analytics/contract/index.d.ts +1 -1
- package/dist/analytics/router/index.d.ts +1 -1
- package/dist/analytics/service/funnel-analytics.service.js +1 -1
- package/dist/analytics/service/funnel-analytics.service.js.map +1 -1
- package/dist/audit/contract/index.d.ts +2 -2
- package/dist/audit/router/index.d.ts +1 -1
- package/dist/casino/gaming/__tests__/admin-reporting.test.js +114 -75
- package/dist/casino/gaming/__tests__/admin-reporting.test.js.map +1 -1
- package/dist/casino/gaming/admin-reporting.d.ts.map +1 -1
- package/dist/casino/gaming/admin-reporting.js +6 -3
- package/dist/casino/gaming/admin-reporting.js.map +1 -1
- package/dist/casino/server.d.ts +1 -0
- package/dist/casino/server.d.ts.map +1 -1
- package/dist/casino/server.js +1 -0
- package/dist/casino/server.js.map +1 -1
- package/dist/contracts/adapters/admin-game-reporting.d.ts +1 -0
- package/dist/contracts/adapters/admin-game-reporting.d.ts.map +1 -1
- package/dist/contracts/adapters/admin-game-reporting.js.map +1 -1
- package/dist/contracts/schemas/game.d.ts.map +1 -1
- package/dist/contracts/schemas/game.js +0 -6
- package/dist/contracts/schemas/game.js.map +1 -1
- package/dist/iam/__tests__/admin-player-activity.test.js +111 -43
- package/dist/iam/__tests__/admin-player-activity.test.js.map +1 -1
- package/dist/iam/adapters/admin-player-activity.d.ts.map +1 -1
- package/dist/iam/adapters/admin-player-activity.js +21 -14
- package/dist/iam/adapters/admin-player-activity.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,87 +1,126 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { describe, it, expect, beforeAll, afterAll, beforeEach } from 'vitest';
|
|
3
|
+
import { sql } from 'drizzle-orm';
|
|
4
|
+
import { createTestDb } from '@openora/core/testing';
|
|
5
|
+
import { migrate } from '../migrate.js';
|
|
6
|
+
import { game, gameRound } from '../schema/index.js';
|
|
3
7
|
import { DrizzleAdminGameReporting } from '../admin-reporting.js';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
builder['orderBy'] = vi.fn((arg) => {
|
|
14
|
-
orderByArgs.push(arg);
|
|
15
|
-
return builder;
|
|
16
|
-
});
|
|
17
|
-
builder['where'] = vi.fn((arg) => {
|
|
18
|
-
whereArgs.push(arg);
|
|
19
|
-
return builder;
|
|
20
|
-
});
|
|
21
|
-
// oxlint-disable-next-line unicorn/no-thenable -- builder must be awaitable to mimic Drizzle.
|
|
22
|
-
builder['then'] = (resolve) => resolve(rows);
|
|
23
|
-
const db = { ...builder };
|
|
24
|
-
return { drizzle: mock({ db }), whereArgs, orderByArgs };
|
|
8
|
+
let db;
|
|
9
|
+
let reporting;
|
|
10
|
+
const AT = (iso) => new Date(iso);
|
|
11
|
+
async function seedGame(overrides = {}) {
|
|
12
|
+
const [row] = await db.drizzle.db
|
|
13
|
+
.insert(game)
|
|
14
|
+
.values({ name: 'Aces', provider: 'p', category: 'slots', ...overrides })
|
|
15
|
+
.returning();
|
|
16
|
+
return row;
|
|
25
17
|
}
|
|
26
|
-
function
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
18
|
+
async function seedRound(gameId, overrides = {}) {
|
|
19
|
+
const [row] = await db.drizzle.db
|
|
20
|
+
.insert(gameRound)
|
|
21
|
+
.values({
|
|
22
|
+
gameId,
|
|
23
|
+
userId: randomUUID(),
|
|
24
|
+
status: 'completed',
|
|
25
|
+
betAmount: '100',
|
|
26
|
+
winAmount: '0',
|
|
27
|
+
currency: 'USD',
|
|
28
|
+
startedAt: AT('2026-01-01T00:00:00.000Z'),
|
|
29
|
+
...overrides,
|
|
30
|
+
})
|
|
31
|
+
.returning();
|
|
32
|
+
return row;
|
|
37
33
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
]);
|
|
34
|
+
beforeAll(async () => {
|
|
35
|
+
db = await createTestDb([migrate]);
|
|
36
|
+
reporting = new DrizzleAdminGameReporting(db.drizzle);
|
|
37
|
+
});
|
|
38
|
+
afterAll(async () => {
|
|
39
|
+
await db.drop();
|
|
40
|
+
});
|
|
41
|
+
beforeEach(async () => {
|
|
42
|
+
await db.drizzle.db.execute(sql `TRUNCATE ${gameRound}, ${game} RESTART IDENTITY CASCADE`);
|
|
43
|
+
});
|
|
44
|
+
describe('DrizzleAdminGameReporting.listGamePerformance (real PG)', () => {
|
|
45
|
+
it('sums volume/revenue and counts distinct players/rounds for completed rounds', async () => {
|
|
46
|
+
const g = await seedGame();
|
|
47
|
+
await seedRound(g.id, { betAmount: '100', winAmount: '20' });
|
|
48
|
+
await seedRound(g.id, { betAmount: '50', winAmount: '80' });
|
|
49
|
+
const [row] = await reporting.listGamePerformance({});
|
|
50
|
+
expect(row).toMatchObject({
|
|
51
|
+
gameId: g.id,
|
|
52
|
+
name: 'Aces',
|
|
53
|
+
gameType: 'casino',
|
|
54
|
+
uniquePlayers: 2,
|
|
55
|
+
roundsPlayed: 2,
|
|
56
|
+
});
|
|
57
|
+
expect(Number(row?.volume)).toBe(150);
|
|
58
|
+
expect(Number(row?.revenue)).toBe(50);
|
|
54
59
|
});
|
|
55
|
-
it('keeps
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
-
const
|
|
59
|
-
expect(
|
|
60
|
+
it('keeps revenue negative when a game pays out more than it takes in (GGR can go negative)', async () => {
|
|
61
|
+
const g = await seedGame();
|
|
62
|
+
await seedRound(g.id, { betAmount: '10', winAmount: '100' });
|
|
63
|
+
const [row] = await reporting.listGamePerformance({});
|
|
64
|
+
expect(Number(row?.revenue)).toBe(-90);
|
|
65
|
+
});
|
|
66
|
+
it('still lists a game with zero completed rounds in range, with all-zero metrics', async () => {
|
|
67
|
+
const g = await seedGame({ name: 'Empty' });
|
|
68
|
+
await seedRound(g.id, { status: 'active' });
|
|
69
|
+
const [row] = await reporting.listGamePerformance({});
|
|
70
|
+
expect(row).toMatchObject({ gameId: g.id, uniquePlayers: 0, roundsPlayed: 0 });
|
|
71
|
+
expect(Number(row?.volume)).toBe(0);
|
|
72
|
+
expect(Number(row?.revenue)).toBe(0);
|
|
73
|
+
});
|
|
74
|
+
it('ignores non-completed rounds when summing metrics', async () => {
|
|
75
|
+
const g = await seedGame();
|
|
76
|
+
await seedRound(g.id, { status: 'active', betAmount: '999' });
|
|
77
|
+
await seedRound(g.id, { status: 'cancelled', betAmount: '999' });
|
|
78
|
+
const counted = await seedRound(g.id, { status: 'completed', betAmount: '10' });
|
|
79
|
+
const [row] = await reporting.listGamePerformance({});
|
|
80
|
+
expect(row?.roundsPlayed).toBe(1);
|
|
81
|
+
expect(Number(row?.volume)).toBe(10);
|
|
82
|
+
void counted;
|
|
60
83
|
});
|
|
61
|
-
it('
|
|
62
|
-
const {
|
|
63
|
-
|
|
64
|
-
await reporting.listGamePerformance({ gameType: 'sportsbook' });
|
|
65
|
-
expect(
|
|
84
|
+
it('filters by gameType, dropping non-matching games entirely', async () => {
|
|
85
|
+
const casino = await seedGame({ gameType: 'casino' });
|
|
86
|
+
await seedGame({ gameType: 'sportsbook' });
|
|
87
|
+
const rows = await reporting.listGamePerformance({ gameType: 'sportsbook' });
|
|
88
|
+
expect(rows.map((r) => r.gameId)).not.toContain(casino.id);
|
|
66
89
|
});
|
|
67
|
-
it('
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
await
|
|
71
|
-
|
|
90
|
+
it('scopes rounds by dateFrom/dateTo without dropping the game', async () => {
|
|
91
|
+
const g = await seedGame();
|
|
92
|
+
await seedRound(g.id, { betAmount: '10', startedAt: AT('2025-01-01T00:00:00.000Z') });
|
|
93
|
+
await seedRound(g.id, { betAmount: '20', startedAt: AT('2026-01-15T00:00:00.000Z') });
|
|
94
|
+
const [row] = await reporting.listGamePerformance({
|
|
95
|
+
dateFrom: AT('2026-01-01T00:00:00.000Z'),
|
|
96
|
+
dateTo: AT('2026-02-01T00:00:00.000Z'),
|
|
97
|
+
});
|
|
98
|
+
expect(row?.roundsPlayed).toBe(1);
|
|
99
|
+
expect(Number(row?.volume)).toBe(20);
|
|
100
|
+
});
|
|
101
|
+
it('scopes rounds by currency without dropping the game or mixing currencies', async () => {
|
|
102
|
+
const g = await seedGame();
|
|
103
|
+
await seedRound(g.id, { betAmount: '100', currency: 'USD' });
|
|
104
|
+
await seedRound(g.id, { betAmount: '50', currency: 'EUR' });
|
|
105
|
+
const [row] = await reporting.listGamePerformance({ currency: 'USD' });
|
|
106
|
+
expect(row?.roundsPlayed).toBe(1);
|
|
107
|
+
expect(Number(row?.volume)).toBe(100);
|
|
72
108
|
});
|
|
73
109
|
it('sorts by the requested column and direction', async () => {
|
|
74
|
-
const {
|
|
75
|
-
const
|
|
76
|
-
await
|
|
77
|
-
|
|
110
|
+
const low = await seedGame({ name: 'Low' });
|
|
111
|
+
const high = await seedGame({ name: 'High' });
|
|
112
|
+
await seedRound(low.id, { betAmount: '10' });
|
|
113
|
+
await seedRound(high.id, { betAmount: '100' });
|
|
114
|
+
const rows = await reporting.listGamePerformance({ sortBy: 'volume', sortDir: 'asc' });
|
|
115
|
+
expect(rows.map((r) => r.gameId)).toEqual([low.id, high.id]);
|
|
78
116
|
});
|
|
79
|
-
it('defaults to
|
|
80
|
-
const {
|
|
81
|
-
const
|
|
82
|
-
await
|
|
83
|
-
|
|
84
|
-
|
|
117
|
+
it('defaults to sorting by volume descending when sortBy is omitted', async () => {
|
|
118
|
+
const low = await seedGame({ name: 'Low' });
|
|
119
|
+
const high = await seedGame({ name: 'High' });
|
|
120
|
+
await seedRound(low.id, { betAmount: '10' });
|
|
121
|
+
await seedRound(high.id, { betAmount: '100' });
|
|
122
|
+
const rows = await reporting.listGamePerformance({});
|
|
123
|
+
expect(rows.map((r) => r.gameId)).toEqual([high.id, low.id]);
|
|
85
124
|
});
|
|
86
125
|
});
|
|
87
126
|
//# sourceMappingURL=admin-reporting.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-reporting.test.js","sourceRoot":"","sources":["../../../../src/casino/gaming/__tests__/admin-reporting.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"admin-reporting.test.js","sourceRoot":"","sources":["../../../../src/casino/gaming/__tests__/admin-reporting.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-reporting.d.ts","sourceRoot":"","sources":["../../../src/casino/gaming/admin-reporting.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAKtD,qBAAa,yBAA0B,YAAW,kBAAkB;IACtD,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,cAAc;IAE9C,mBAAmB,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"admin-reporting.d.ts","sourceRoot":"","sources":["../../../src/casino/gaming/admin-reporting.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAKtD,qBAAa,yBAA0B,YAAW,kBAAkB;IACtD,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,cAAc;IAE9C,mBAAmB,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;CA4DxF"}
|
|
@@ -8,15 +8,18 @@ export class DrizzleAdminGameReporting {
|
|
|
8
8
|
}
|
|
9
9
|
async listGamePerformance(filter) {
|
|
10
10
|
const db = this.drizzle.db;
|
|
11
|
-
// status/date filters scope which ROUNDS count towards a game's metrics,
|
|
12
|
-
// live in the join condition, not WHERE - a game with zero completed rounds
|
|
13
|
-
// range still appears with all-zero metrics rather than being dropped from the
|
|
11
|
+
// status/date/currency filters scope which ROUNDS count towards a game's metrics,
|
|
12
|
+
// so they live in the join condition, not WHERE - a game with zero completed rounds
|
|
13
|
+
// in range still appears with all-zero metrics rather than being dropped from the
|
|
14
14
|
// report. `gameType` narrows which GAMES appear at all, so it stays in WHERE.
|
|
15
15
|
const joinConditions = [
|
|
16
16
|
eq(gameRound.gameId, game.id),
|
|
17
17
|
eq(gameRound.status, 'completed'),
|
|
18
18
|
filter.dateFrom ? gte(gameRound.startedAt, filter.dateFrom) : undefined,
|
|
19
19
|
filter.dateTo ? lte(gameRound.startedAt, filter.dateTo) : undefined,
|
|
20
|
+
// No currency filter mixes bet/win amounts across currencies into one unconverted
|
|
21
|
+
// sum - the operator UI shows a disclaimer in that case; this is intentional.
|
|
22
|
+
filter.currency ? eq(gameRound.currency, filter.currency) : undefined,
|
|
20
23
|
].filter(Boolean);
|
|
21
24
|
const where = filter.gameType ? eq(game.gameType, filter.gameType) : undefined;
|
|
22
25
|
const volume = sql `coalesce(sum(${gameRound.betAmount}), 0)`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-reporting.js","sourceRoot":"","sources":["../../../src/casino/gaming/admin-reporting.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEpD,qBAAqB;AACrB,MAAM,OAAO,yBAAyB;IACP;IAA7B,YAA6B,OAAuB;QAAvB,YAAO,GAAP,OAAO,CAAgB;IAAG,CAAC;IAExD,KAAK,CAAC,mBAAmB,CAAC,MAA6B;QACrD,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAE3B,
|
|
1
|
+
{"version":3,"file":"admin-reporting.js","sourceRoot":"","sources":["../../../src/casino/gaming/admin-reporting.ts"],"names":[],"mappings":"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"}
|
package/dist/casino/server.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/casino/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/casino/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC"}
|
package/dist/casino/server.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/casino/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/casino/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-game-reporting.d.ts","sourceRoot":"","sources":["../../../src/contracts/adapters/admin-game-reporting.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAOnD,eAAO,MAAM,4BAA4B,qFAO/B,CAAC;AACX,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,4BAA4B,CAAC,CAAC,MAAM,CAAC,CAAC;AAElF,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,EAAE,IAAI,CAAC;IAChB,MAAM,CAAC,EAAE,IAAI,CAAC;IACd,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,MAAM,CAAC,EAAE,qBAAqB,CAAC;IAC/B,OAAO,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CAC1B,CAAC;AAMF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,mBAAmB,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;CACnF,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC,kBAAkB,CAAuC,CAAC"}
|
|
1
|
+
{"version":3,"file":"admin-game-reporting.d.ts","sourceRoot":"","sources":["../../../src/contracts/adapters/admin-game-reporting.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAOnD,eAAO,MAAM,4BAA4B,qFAO/B,CAAC;AACX,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,4BAA4B,CAAC,CAAC,MAAM,CAAC,CAAC;AAElF,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,EAAE,IAAI,CAAC;IAChB,MAAM,CAAC,EAAE,IAAI,CAAC;IACd,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,qBAAqB,CAAC;IAC/B,OAAO,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CAC1B,CAAC;AAMF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,mBAAmB,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;CACnF,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC,kBAAkB,CAAuC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-game-reporting.js","sourceRoot":"","sources":["../../../src/contracts/adapters/admin-game-reporting.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAc,MAAM,YAAY,CAAC;AAGrD,0EAA0E;AAC1E,gFAAgF;AAChF,2EAA2E;AAC3E,6CAA6C;AAE7C,MAAM,CAAC,MAAM,4BAA4B,GAAG;IAC1C,MAAM;IACN,UAAU;IACV,QAAQ;IACR,SAAS;IACT,eAAe;IACf,cAAc;CACN,CAAC;
|
|
1
|
+
{"version":3,"file":"admin-game-reporting.js","sourceRoot":"","sources":["../../../src/contracts/adapters/admin-game-reporting.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAc,MAAM,YAAY,CAAC;AAGrD,0EAA0E;AAC1E,gFAAgF;AAChF,2EAA2E;AAC3E,6CAA6C;AAE7C,MAAM,CAAC,MAAM,4BAA4B,GAAG;IAC1C,MAAM;IACN,UAAU;IACV,QAAQ;IACR,SAAS;IACT,eAAe;IACf,cAAc;CACN,CAAC;AA8BX,MAAM,CAAC,MAAM,oBAAoB,GAA8B,WAAW,CAAC,sBAAsB,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"game.d.ts","sourceRoot":"","sources":["../../../src/contracts/schemas/game.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"game.d.ts","sourceRoot":"","sources":["../../../src/contracts/schemas/game.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,eAAO,MAAM,UAAU,+CAAgD,CAAC;AACxE,eAAO,MAAM,cAAc;;;;EAAqB,CAAC;AACjD,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC"}
|
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
// Canonical game-type enum. Kept in the isomorphic contracts zone (not the gaming
|
|
2
|
-
// module's local contract/) because it is consumed cross-domain: the ADMIN_GAME_REPORTING
|
|
3
|
-
// port (contracts/adapters, isomorphic - can never import a domain) and admin-console's
|
|
4
|
-
// contract both need it, same reasoning as WALLET_TRANSACTION_TYPES in wallet-tx.ts. The
|
|
5
|
-
// casino/gaming module re-derives its `game` pgEnum from this same tuple so the DB enum,
|
|
6
|
-
// this contract, and every consumer share one source of truth.
|
|
7
1
|
import * as z from 'zod';
|
|
8
2
|
export const GAME_TYPES = ['original', 'casino', 'sportsbook'];
|
|
9
3
|
export const GameTypeSchema = z.enum(GAME_TYPES);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"game.js","sourceRoot":"","sources":["../../../src/contracts/schemas/game.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"game.js","sourceRoot":"","sources":["../../../src/contracts/schemas/game.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,YAAY,CAAU,CAAC;AACxE,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC"}
|
|
@@ -1,58 +1,126 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { describe, it, expect, beforeAll, afterAll, beforeEach } from 'vitest';
|
|
3
|
+
import { sql } from 'drizzle-orm';
|
|
4
|
+
import { createTestDb } from '@openora/core/testing';
|
|
5
|
+
import { migrate as migrateIdentity } from '@openora/core/pam/migrate/identity';
|
|
6
|
+
import { user, session } from '@openora/core/pam/schema/identity';
|
|
3
7
|
import { DrizzleAdminPlayerActivity } from '../adapters/admin-player-activity.js';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
8
|
+
let db;
|
|
9
|
+
let activity;
|
|
10
|
+
const AT = (iso) => new Date(iso);
|
|
11
|
+
async function seedUser(createdAt) {
|
|
12
|
+
const [row] = await db.drizzle.db
|
|
13
|
+
.insert(user)
|
|
14
|
+
.values({ name: 'U', email: `${randomUUID()}@x.dev`, createdAt })
|
|
15
|
+
.returning();
|
|
16
|
+
return row;
|
|
7
17
|
}
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
it('runs a single query even without an explicit date range (defaults applied)', async () => {
|
|
16
|
-
const { drizzle, execute } = makeDrizzle([]);
|
|
17
|
-
const svc = new DrizzleAdminPlayerActivity(drizzle);
|
|
18
|
-
await svc.getRegistrationsOverTime({});
|
|
19
|
-
expect(execute).toHaveBeenCalledOnce();
|
|
18
|
+
async function seedSession(userId, updatedAt) {
|
|
19
|
+
await db.drizzle.db.insert(session).values({
|
|
20
|
+
userId,
|
|
21
|
+
token: randomUUID(),
|
|
22
|
+
expiresAt: new Date(updatedAt.getTime() + 24 * 60 * 60 * 1000),
|
|
23
|
+
createdAt: updatedAt,
|
|
24
|
+
updatedAt,
|
|
20
25
|
});
|
|
26
|
+
}
|
|
27
|
+
beforeAll(async () => {
|
|
28
|
+
db = await createTestDb([migrateIdentity]);
|
|
29
|
+
activity = new DrizzleAdminPlayerActivity(db.drizzle);
|
|
21
30
|
});
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
const { drizzle } = makeDrizzle([{ date: '2026-01-01', dau: '1', wau: '4', mau: '10' }]);
|
|
25
|
-
const svc = new DrizzleAdminPlayerActivity(drizzle);
|
|
26
|
-
const rows = await svc.getActiveUsersTrend({});
|
|
27
|
-
expect(rows).toEqual([{ date: '2026-01-01', dau: 1, wau: 4, mau: 10 }]);
|
|
28
|
-
});
|
|
31
|
+
afterAll(async () => {
|
|
32
|
+
await db.drop();
|
|
29
33
|
});
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
+
beforeEach(async () => {
|
|
35
|
+
await db.drizzle.db.execute(sql `TRUNCATE ${session}, ${user} RESTART IDENTITY CASCADE`);
|
|
36
|
+
});
|
|
37
|
+
describe('DrizzleAdminPlayerActivity.getRegistrationsOverTime (real PG)', () => {
|
|
38
|
+
it('counts registrations per day and includes zero-registration days', async () => {
|
|
39
|
+
await seedUser(AT('2026-01-01T10:00:00.000Z'));
|
|
40
|
+
await seedUser(AT('2026-01-01T15:00:00.000Z'));
|
|
41
|
+
await seedUser(AT('2026-01-03T00:00:00.000Z'));
|
|
42
|
+
const rows = await activity.getRegistrationsOverTime({
|
|
43
|
+
dateFrom: AT('2026-01-01T00:00:00.000Z'),
|
|
44
|
+
dateTo: AT('2026-01-03T00:00:00.000Z'),
|
|
45
|
+
});
|
|
46
|
+
expect(rows).toEqual([
|
|
47
|
+
{ date: '2026-01-01', registrations: 2 },
|
|
48
|
+
{ date: '2026-01-02', registrations: 0 },
|
|
49
|
+
{ date: '2026-01-03', registrations: 1 },
|
|
34
50
|
]);
|
|
35
|
-
|
|
36
|
-
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
describe('DrizzleAdminPlayerActivity.getActiveUsersTrend (real PG)', () => {
|
|
54
|
+
it('computes distinct DAU/WAU/MAU per day from session activity', async () => {
|
|
55
|
+
const alice = await seedUser(AT('2025-11-01T00:00:00.000Z'));
|
|
56
|
+
const bob = await seedUser(AT('2025-11-01T00:00:00.000Z'));
|
|
57
|
+
// Alice active on the target day; Bob active 5 days earlier (inside WAU/MAU, outside DAU).
|
|
58
|
+
await seedSession(alice.id, AT('2026-01-10T12:00:00.000Z'));
|
|
59
|
+
await seedSession(bob.id, AT('2026-01-05T12:00:00.000Z'));
|
|
60
|
+
const rows = await activity.getActiveUsersTrend({
|
|
61
|
+
dateFrom: AT('2026-01-10T00:00:00.000Z'),
|
|
62
|
+
dateTo: AT('2026-01-10T00:00:00.000Z'),
|
|
63
|
+
});
|
|
64
|
+
expect(rows).toEqual([{ date: '2026-01-10', dau: 1, wau: 2, mau: 2 }]);
|
|
65
|
+
});
|
|
66
|
+
it('excludes a session outside every window from all three counts', async () => {
|
|
67
|
+
const alice = await seedUser(AT('2025-11-01T00:00:00.000Z'));
|
|
68
|
+
await seedSession(alice.id, AT('2025-12-01T00:00:00.000Z'));
|
|
69
|
+
const rows = await activity.getActiveUsersTrend({
|
|
70
|
+
dateFrom: AT('2026-01-10T00:00:00.000Z'),
|
|
71
|
+
dateTo: AT('2026-01-10T00:00:00.000Z'),
|
|
72
|
+
});
|
|
73
|
+
expect(rows).toEqual([{ date: '2026-01-10', dau: 0, wau: 0, mau: 0 }]);
|
|
74
|
+
});
|
|
75
|
+
it('counts a user with two sessions on the same day only once', async () => {
|
|
76
|
+
const alice = await seedUser(AT('2025-11-01T00:00:00.000Z'));
|
|
77
|
+
await seedSession(alice.id, AT('2026-01-10T08:00:00.000Z'));
|
|
78
|
+
await seedSession(alice.id, AT('2026-01-10T18:00:00.000Z'));
|
|
79
|
+
const rows = await activity.getActiveUsersTrend({
|
|
80
|
+
dateFrom: AT('2026-01-10T00:00:00.000Z'),
|
|
81
|
+
dateTo: AT('2026-01-10T00:00:00.000Z'),
|
|
82
|
+
});
|
|
83
|
+
expect(rows).toEqual([{ date: '2026-01-10', dau: 1, wau: 1, mau: 1 }]);
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
describe('DrizzleAdminPlayerActivity.getRetentionCohorts (real PG)', () => {
|
|
87
|
+
it('does not count the registration-day session itself as a return', async () => {
|
|
88
|
+
const alice = await seedUser(AT('2026-01-01T10:00:00.000Z'));
|
|
89
|
+
// Only session is the one created at registration - should NOT count as returned.
|
|
90
|
+
await seedSession(alice.id, AT('2026-01-01T10:00:00.000Z'));
|
|
91
|
+
const rows = await activity.getRetentionCohorts({ dateFrom: AT('2026-01-01T00:00:00.000Z'), dateTo: AT('2026-01-02T00:00:00.000Z') }, 7);
|
|
37
92
|
expect(rows).toEqual([
|
|
38
|
-
{ cohortDate: '2026-01-01', cohortSize:
|
|
93
|
+
{ cohortDate: '2026-01-01', cohortSize: 1, returned: 0, returnRate: 0, isComplete: true },
|
|
39
94
|
]);
|
|
40
95
|
});
|
|
96
|
+
it('counts a session the next calendar day even if less than 24h after registration', async () => {
|
|
97
|
+
const alice = await seedUser(AT('2026-01-01T23:00:00.000Z'));
|
|
98
|
+
await seedSession(alice.id, AT('2026-01-02T09:00:00.000Z'));
|
|
99
|
+
const rows = await activity.getRetentionCohorts({ dateFrom: AT('2026-01-01T00:00:00.000Z'), dateTo: AT('2026-01-02T00:00:00.000Z') }, 7);
|
|
100
|
+
expect(rows[0]).toMatchObject({ cohortSize: 1, returned: 1, returnRate: 1 });
|
|
101
|
+
});
|
|
102
|
+
it('counts a session on the day after registration as returned', async () => {
|
|
103
|
+
const alice = await seedUser(AT('2026-01-01T10:00:00.000Z'));
|
|
104
|
+
await seedSession(alice.id, AT('2026-01-02T10:00:00.000Z'));
|
|
105
|
+
const rows = await activity.getRetentionCohorts({ dateFrom: AT('2026-01-01T00:00:00.000Z'), dateTo: AT('2026-01-02T00:00:00.000Z') }, 7);
|
|
106
|
+
expect(rows[0]).toMatchObject({ cohortSize: 1, returned: 1, returnRate: 1 });
|
|
107
|
+
});
|
|
108
|
+
it('excludes a session after the retention window from the count', async () => {
|
|
109
|
+
const alice = await seedUser(AT('2026-01-01T10:00:00.000Z'));
|
|
110
|
+
await seedSession(alice.id, AT('2026-01-10T10:00:00.000Z'));
|
|
111
|
+
const rows = await activity.getRetentionCohorts({ dateFrom: AT('2026-01-01T00:00:00.000Z'), dateTo: AT('2026-01-02T00:00:00.000Z') }, 7);
|
|
112
|
+
expect(rows[0]).toMatchObject({ cohortSize: 1, returned: 0, returnRate: 0 });
|
|
113
|
+
});
|
|
41
114
|
it('flags an incomplete cohort whose window has not elapsed yet', async () => {
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
const rows = await svc.getRetentionCohorts({}, 30);
|
|
115
|
+
const now = new Date();
|
|
116
|
+
await seedUser(now);
|
|
117
|
+
const rows = await activity.getRetentionCohorts({ dateFrom: now, dateTo: now }, 30);
|
|
118
|
+
expect(rows).toHaveLength(1);
|
|
47
119
|
expect(rows[0]?.isComplete).toBe(false);
|
|
48
120
|
});
|
|
49
|
-
it('
|
|
50
|
-
const {
|
|
51
|
-
|
|
52
|
-
]);
|
|
53
|
-
const svc = new DrizzleAdminPlayerActivity(drizzle);
|
|
54
|
-
const rows = await svc.getRetentionCohorts({}, 30);
|
|
55
|
-
expect(rows[0]?.returnRate).toBe(0);
|
|
121
|
+
it('has no rows when nobody registered in the requested range', async () => {
|
|
122
|
+
const rows = await activity.getRetentionCohorts({ dateFrom: AT('2026-01-01T00:00:00.000Z'), dateTo: AT('2026-01-01T00:00:00.000Z') }, 30);
|
|
123
|
+
expect(rows).toEqual([]);
|
|
56
124
|
});
|
|
57
125
|
});
|
|
58
126
|
//# sourceMappingURL=admin-player-activity.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-player-activity.test.js","sourceRoot":"","sources":["../../../src/iam/__tests__/admin-player-activity.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"admin-player-activity.test.js","sourceRoot":"","sources":["../../../src/iam/__tests__/admin-player-activity.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-player-activity.d.ts","sourceRoot":"","sources":["../../../src/iam/adapters/admin-player-activity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,0BAA0B,EAC1B,kBAAkB,EACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"admin-player-activity.d.ts","sourceRoot":"","sources":["../../../src/iam/adapters/admin-player-activity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,0BAA0B,EAC1B,kBAAkB,EACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAgBtD,qBAAa,0BAA2B,YAAW,mBAAmB;IACxD,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,cAAc;IAE9C,wBAAwB,CAC5B,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,0BAA0B,EAAE,CAAC;IAiBlC,mBAAmB,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAuCnF,mBAAmB,CACvB,MAAM,EAAE,oBAAoB,EAC5B,UAAU,EAAE,CAAC,GAAG,EAAE,GACjB,OAAO,CAAC,kBAAkB,EAAE,CAAC;CA2CjC"}
|