@openora/core 0.4.1-canary.41 → 0.4.1-canary.42
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.router.test.js +13 -1
- package/dist/admin-console/__tests__/backoffice.router.test.js.map +1 -1
- package/dist/admin-console/__tests__/backoffice.service.test.js +110 -10
- package/dist/admin-console/__tests__/backoffice.service.test.js.map +1 -1
- package/dist/admin-console/contract/index.d.ts +164 -0
- package/dist/admin-console/contract/index.d.ts.map +1 -1
- package/dist/admin-console/contract/index.js +66 -1
- package/dist/admin-console/contract/index.js.map +1 -1
- package/dist/admin-console/plugin.d.ts.map +1 -1
- package/dist/admin-console/plugin.js +3 -3
- package/dist/admin-console/plugin.js.map +1 -1
- package/dist/admin-console/router/index.d.ts +64 -0
- package/dist/admin-console/router/index.d.ts.map +1 -1
- package/dist/admin-console/router/index.js +8 -0
- package/dist/admin-console/router/index.js.map +1 -1
- package/dist/admin-console/service/backoffice.service.d.ts +14 -3
- package/dist/admin-console/service/backoffice.service.d.ts.map +1 -1
- package/dist/admin-console/service/backoffice.service.js +29 -1
- package/dist/admin-console/service/backoffice.service.js.map +1 -1
- package/dist/casino/gaming/__tests__/admin-reporting.test.d.ts +2 -0
- package/dist/casino/gaming/__tests__/admin-reporting.test.d.ts.map +1 -0
- package/dist/casino/gaming/__tests__/admin-reporting.test.js +87 -0
- package/dist/casino/gaming/__tests__/admin-reporting.test.js.map +1 -0
- package/dist/casino/gaming/admin-reporting.d.ts +8 -0
- package/dist/casino/gaming/admin-reporting.d.ts.map +1 -0
- package/dist/casino/gaming/admin-reporting.js +62 -0
- package/dist/casino/gaming/admin-reporting.js.map +1 -0
- package/dist/casino/gaming/contract/index.d.ts +16 -0
- package/dist/casino/gaming/contract/index.d.ts.map +1 -1
- package/dist/casino/gaming/contract/index.js +3 -1
- package/dist/casino/gaming/contract/index.js.map +1 -1
- package/dist/casino/gaming/drizzle/migrations/0002_yummy_lifeguard.sql +4 -0
- package/dist/casino/gaming/drizzle/migrations/meta/0002_snapshot.json +237 -0
- package/dist/casino/gaming/drizzle/migrations/meta/_journal.json +7 -0
- package/dist/casino/gaming/plugin.d.ts.map +1 -1
- package/dist/casino/gaming/plugin.js +3 -1
- package/dist/casino/gaming/plugin.js.map +1 -1
- package/dist/casino/gaming/router/index.d.ts +10 -0
- package/dist/casino/gaming/router/index.d.ts.map +1 -1
- package/dist/casino/gaming/schema/index.d.ts +18 -0
- package/dist/casino/gaming/schema/index.d.ts.map +1 -1
- package/dist/casino/gaming/schema/index.js +11 -1
- package/dist/casino/gaming/schema/index.js.map +1 -1
- package/dist/casino/gaming/service/gaming.service.d.ts +2 -0
- package/dist/casino/gaming/service/gaming.service.d.ts.map +1 -1
- package/dist/casino/gaming/service/gaming.service.js +1 -0
- package/dist/casino/gaming/service/gaming.service.js.map +1 -1
- package/dist/contracts/adapters/admin-game-reporting.d.ts +25 -0
- package/dist/contracts/adapters/admin-game-reporting.d.ts.map +1 -0
- package/dist/contracts/adapters/admin-game-reporting.js +15 -0
- package/dist/contracts/adapters/admin-game-reporting.js.map +1 -0
- package/dist/contracts/adapters/admin-player-activity.d.ts +29 -0
- package/dist/contracts/adapters/admin-player-activity.d.ts.map +1 -0
- package/dist/contracts/adapters/admin-player-activity.js +3 -0
- package/dist/contracts/adapters/admin-player-activity.js.map +1 -0
- package/dist/contracts/adapters/index.d.ts +4 -0
- package/dist/contracts/adapters/index.d.ts.map +1 -1
- package/dist/contracts/adapters/index.js +2 -0
- package/dist/contracts/adapters/index.js.map +1 -1
- package/dist/contracts/schemas/common.d.ts +2 -0
- package/dist/contracts/schemas/common.d.ts.map +1 -1
- package/dist/contracts/schemas/common.js +6 -0
- package/dist/contracts/schemas/common.js.map +1 -1
- package/dist/contracts/schemas/game.d.ts +9 -0
- package/dist/contracts/schemas/game.d.ts.map +1 -0
- package/dist/contracts/schemas/game.js +10 -0
- package/dist/contracts/schemas/game.js.map +1 -0
- package/dist/contracts/schemas/index.d.ts +1 -0
- package/dist/contracts/schemas/index.d.ts.map +1 -1
- package/dist/contracts/schemas/index.js +1 -0
- package/dist/contracts/schemas/index.js.map +1 -1
- package/dist/iam/__tests__/admin-player-activity.test.d.ts +2 -0
- package/dist/iam/__tests__/admin-player-activity.test.d.ts.map +1 -0
- package/dist/iam/__tests__/admin-player-activity.test.js +58 -0
- package/dist/iam/__tests__/admin-player-activity.test.js.map +1 -0
- package/dist/iam/adapters/admin-player-activity.d.ts +10 -0
- package/dist/iam/adapters/admin-player-activity.d.ts.map +1 -0
- package/dist/iam/adapters/admin-player-activity.js +99 -0
- package/dist/iam/adapters/admin-player-activity.js.map +1 -0
- package/dist/iam/plugin.d.ts.map +1 -1
- package/dist/iam/plugin.js +3 -1
- package/dist/iam/plugin.js.map +1 -1
- package/dist/iam/service/iam.service.d.ts +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../../src/contracts/schemas/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AACnC,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;AAIhD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;AAG1D,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;AAGlE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACzB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACjC,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC;KAC/B,MAAM,EAAE;KACR,KAAK,CACJ,mBAAmB,EACnB,qEAAqE,CACtE,CAAC;AAGJ,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,yBAAyB;IACzB,yBAAyB;IACzB,gBAAgB;IAChB,mBAAmB;CACX,CAAC;AACX,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../../src/contracts/schemas/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AACnC,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;AAIhD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;AAG1D,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;AAGlE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACzB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACjC,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC;KAC/B,MAAM,EAAE;KACR,KAAK,CACJ,mBAAmB,EACnB,qEAAqE,CACtE,CAAC;AAGJ,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,yBAAyB;IACzB,yBAAyB;IACzB,gBAAgB;IAChB,mBAAmB;CACX,CAAC;AACX,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;AAGhE,wFAAwF;AACxF,yFAAyF;AACzF,sFAAsF;AACtF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC;KACrC,MAAM,EAAE;KACR,KAAK,CACJ,qBAAqB,EACrB,8EAA8E,CAC/E,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import * as z from 'zod';
|
|
2
|
+
export declare const GAME_TYPES: readonly ["original", "casino", "sportsbook"];
|
|
3
|
+
export declare const GameTypeSchema: z.ZodEnum<{
|
|
4
|
+
original: "original";
|
|
5
|
+
casino: "casino";
|
|
6
|
+
sportsbook: "sportsbook";
|
|
7
|
+
}>;
|
|
8
|
+
export type GameType = z.infer<typeof GameTypeSchema>;
|
|
9
|
+
//# sourceMappingURL=game.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"game.d.ts","sourceRoot":"","sources":["../../../src/contracts/schemas/game.ts"],"names":[],"mappings":"AAMA,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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
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
|
+
import * as z from 'zod';
|
|
8
|
+
export const GAME_TYPES = ['original', 'casino', 'sportsbook'];
|
|
9
|
+
export const GameTypeSchema = z.enum(GAME_TYPES);
|
|
10
|
+
//# sourceMappingURL=game.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"game.js","sourceRoot":"","sources":["../../../src/contracts/schemas/game.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,0FAA0F;AAC1F,wFAAwF;AACxF,yFAAyF;AACzF,yFAAyF;AACzF,+DAA+D;AAC/D,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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/contracts/schemas/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,UAAU,CAAC;AACzB,cAAc,sBAAsB,CAAC;AACrC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/contracts/schemas/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,qBAAqB,CAAC;AACpC,cAAc,UAAU,CAAC;AACzB,cAAc,sBAAsB,CAAC;AACrC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/contracts/schemas/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,UAAU,CAAC;AACzB,cAAc,sBAAsB,CAAC;AACrC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/contracts/schemas/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,qBAAqB,CAAC;AACpC,cAAc,UAAU,CAAC;AACzB,cAAc,sBAAsB,CAAC;AACrC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-player-activity.test.d.ts","sourceRoot":"","sources":["../../../src/iam/__tests__/admin-player-activity.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
+
import { mock } from '../../testing/mock.js';
|
|
3
|
+
import { DrizzleAdminPlayerActivity } from '../adapters/admin-player-activity.js';
|
|
4
|
+
function makeDrizzle(rows) {
|
|
5
|
+
const execute = vi.fn().mockResolvedValue({ rows });
|
|
6
|
+
return { drizzle: mock({ db: { execute } }), execute };
|
|
7
|
+
}
|
|
8
|
+
describe('DrizzleAdminPlayerActivity.getRegistrationsOverTime', () => {
|
|
9
|
+
it('maps rows to { date, registrations } with a numeric count', async () => {
|
|
10
|
+
const { drizzle } = makeDrizzle([{ date: '2026-01-01', registrations: '3' }]);
|
|
11
|
+
const svc = new DrizzleAdminPlayerActivity(drizzle);
|
|
12
|
+
const rows = await svc.getRegistrationsOverTime({});
|
|
13
|
+
expect(rows).toEqual([{ date: '2026-01-01', registrations: 3 }]);
|
|
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();
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
describe('DrizzleAdminPlayerActivity.getActiveUsersTrend', () => {
|
|
23
|
+
it('maps rows to { date, dau, wau, mau } as numbers', async () => {
|
|
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
|
+
});
|
|
29
|
+
});
|
|
30
|
+
describe('DrizzleAdminPlayerActivity.getRetentionCohorts', () => {
|
|
31
|
+
it('computes returnRate from cohortSize/returned and passes through isComplete', async () => {
|
|
32
|
+
const { drizzle } = makeDrizzle([
|
|
33
|
+
{ cohort_date: '2026-01-01', cohort_size: '10', returned: '4', is_complete: true },
|
|
34
|
+
]);
|
|
35
|
+
const svc = new DrizzleAdminPlayerActivity(drizzle);
|
|
36
|
+
const rows = await svc.getRetentionCohorts({}, 7);
|
|
37
|
+
expect(rows).toEqual([
|
|
38
|
+
{ cohortDate: '2026-01-01', cohortSize: 10, returned: 4, returnRate: 0.4, isComplete: true },
|
|
39
|
+
]);
|
|
40
|
+
});
|
|
41
|
+
it('flags an incomplete cohort whose window has not elapsed yet', async () => {
|
|
42
|
+
const { drizzle } = makeDrizzle([
|
|
43
|
+
{ cohort_date: '2026-07-20', cohort_size: '5', returned: '1', is_complete: false },
|
|
44
|
+
]);
|
|
45
|
+
const svc = new DrizzleAdminPlayerActivity(drizzle);
|
|
46
|
+
const rows = await svc.getRetentionCohorts({}, 30);
|
|
47
|
+
expect(rows[0]?.isComplete).toBe(false);
|
|
48
|
+
});
|
|
49
|
+
it('returns a 0 rate for an empty cohort instead of dividing by zero', async () => {
|
|
50
|
+
const { drizzle } = makeDrizzle([
|
|
51
|
+
{ cohort_date: '2026-01-01', cohort_size: '0', returned: '0', is_complete: false },
|
|
52
|
+
]);
|
|
53
|
+
const svc = new DrizzleAdminPlayerActivity(drizzle);
|
|
54
|
+
const rows = await svc.getRetentionCohorts({}, 30);
|
|
55
|
+
expect(rows[0]?.returnRate).toBe(0);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
//# sourceMappingURL=admin-player-activity.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ActiveUsersTrendPoint, AdminPlayerActivity, PlayerActivityFilter, RegistrationsOverTimePoint, RetentionCohortRow } from '@openora/core/contracts';
|
|
2
|
+
import { DrizzleService } from '@openora/core/server';
|
|
3
|
+
export declare class DrizzleAdminPlayerActivity implements AdminPlayerActivity {
|
|
4
|
+
private readonly drizzle;
|
|
5
|
+
constructor(drizzle: DrizzleService);
|
|
6
|
+
getRegistrationsOverTime(filter: PlayerActivityFilter): Promise<RegistrationsOverTimePoint[]>;
|
|
7
|
+
getActiveUsersTrend(filter: PlayerActivityFilter): Promise<ActiveUsersTrendPoint[]>;
|
|
8
|
+
getRetentionCohorts(filter: PlayerActivityFilter, windowDays: 7 | 30): Promise<RetentionCohortRow[]>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=admin-player-activity.d.ts.map
|
|
@@ -0,0 +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;AAkBtD,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;IA6BnF,mBAAmB,CACvB,MAAM,EAAE,oBAAoB,EAC5B,UAAU,EAAE,CAAC,GAAG,EAAE,GACjB,OAAO,CAAC,kBAAkB,EAAE,CAAC;CA4CjC"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { sql } from 'drizzle-orm';
|
|
2
|
+
// Read-only cross-domain read of the user/session tables via the public /schema
|
|
3
|
+
// subpath (allowed per ADR-0020/0025) - iam already depends on identity (plugin.ts),
|
|
4
|
+
// which owns these tables. Mirrors how identity's DrizzleAdminUserDirectory reads
|
|
5
|
+
// the profile module's `player` table.
|
|
6
|
+
import { session, user } from '@openora/core/pam/schema/identity';
|
|
7
|
+
const DEFAULT_RANGE_DAYS = 30;
|
|
8
|
+
function resolveRange(filter) {
|
|
9
|
+
const to = filter.dateTo ?? new Date();
|
|
10
|
+
const from = filter.dateFrom ?? new Date(to.getTime() - DEFAULT_RANGE_DAYS * 24 * 60 * 60 * 1000);
|
|
11
|
+
return { from, to };
|
|
12
|
+
}
|
|
13
|
+
// See ADR-0017/0025. iam/AGENTS.md documents why this port lives here even though
|
|
14
|
+
// identity owns the underlying tables.
|
|
15
|
+
export class DrizzleAdminPlayerActivity {
|
|
16
|
+
drizzle;
|
|
17
|
+
constructor(drizzle) {
|
|
18
|
+
this.drizzle = drizzle;
|
|
19
|
+
}
|
|
20
|
+
async getRegistrationsOverTime(filter) {
|
|
21
|
+
const { from, to } = resolveRange(filter);
|
|
22
|
+
const result = await this.drizzle.db.execute(sql `
|
|
23
|
+
select gs::date::text as date, count(${user.id})::int as registrations
|
|
24
|
+
from generate_series(${from}::date, ${to}::date, interval '1 day') as gs
|
|
25
|
+
left join ${user} on date_trunc('day', ${user.createdAt}) = gs
|
|
26
|
+
group by gs
|
|
27
|
+
order by gs
|
|
28
|
+
`);
|
|
29
|
+
return result.rows.map((r) => ({ date: r.date, registrations: Number(r.registrations) }));
|
|
30
|
+
}
|
|
31
|
+
// "Active" = a session row whose `updatedAt` falls in the trailing window. Chosen over
|
|
32
|
+
// `createdAt` because better-auth refreshes a session's `updatedAt` on continued use
|
|
33
|
+
// (schema/index.ts `$onUpdateFn`), so it approximates ongoing activity across the
|
|
34
|
+
// session's lifetime; `createdAt` would only capture the single login moment. This is
|
|
35
|
+
// the same "active" definition reused below for retention's "has a session row" check.
|
|
36
|
+
async getActiveUsersTrend(filter) {
|
|
37
|
+
const { from, to } = resolveRange(filter);
|
|
38
|
+
const result = await this.drizzle.db.execute(sql `
|
|
39
|
+
select
|
|
40
|
+
gs::date::text as date,
|
|
41
|
+
(select count(distinct ${session.userId}) from ${session}
|
|
42
|
+
where ${session.updatedAt} >= gs and ${session.updatedAt} < gs + interval '1 day') as dau,
|
|
43
|
+
(select count(distinct ${session.userId}) from ${session}
|
|
44
|
+
where ${session.updatedAt} >= gs - interval '6 days'
|
|
45
|
+
and ${session.updatedAt} < gs + interval '1 day') as wau,
|
|
46
|
+
(select count(distinct ${session.userId}) from ${session}
|
|
47
|
+
where ${session.updatedAt} >= gs - interval '29 days'
|
|
48
|
+
and ${session.updatedAt} < gs + interval '1 day') as mau
|
|
49
|
+
from generate_series(${from}::date, ${to}::date, interval '1 day') as gs
|
|
50
|
+
order by gs
|
|
51
|
+
`);
|
|
52
|
+
return result.rows.map((r) => ({
|
|
53
|
+
date: r.date,
|
|
54
|
+
dau: Number(r.dau),
|
|
55
|
+
wau: Number(r.wau),
|
|
56
|
+
mau: Number(r.mau),
|
|
57
|
+
}));
|
|
58
|
+
}
|
|
59
|
+
async getRetentionCohorts(filter, windowDays) {
|
|
60
|
+
const { from, to } = resolveRange(filter);
|
|
61
|
+
const result = await this.drizzle.db.execute(sql `
|
|
62
|
+
with cohort_users as (
|
|
63
|
+
select ${user.id} as user_id, date_trunc('day', ${user.createdAt}) as cohort_date,
|
|
64
|
+
${user.createdAt} as registered_at
|
|
65
|
+
from ${user}
|
|
66
|
+
where ${user.createdAt} >= ${from} and ${user.createdAt} <= ${to}
|
|
67
|
+
),
|
|
68
|
+
returned_users as (
|
|
69
|
+
select distinct cu.user_id
|
|
70
|
+
from cohort_users cu
|
|
71
|
+
inner join ${session} s
|
|
72
|
+
on s.user_id = cu.user_id
|
|
73
|
+
and s.updated_at >= cu.registered_at
|
|
74
|
+
and s.updated_at <= cu.registered_at + interval '1 day' * ${windowDays}
|
|
75
|
+
)
|
|
76
|
+
select
|
|
77
|
+
cu.cohort_date::date::text as cohort_date,
|
|
78
|
+
count(cu.user_id) as cohort_size,
|
|
79
|
+
count(ru.user_id) as returned,
|
|
80
|
+
(cu.cohort_date + interval '1 day' * ${windowDays} <= now()) as is_complete
|
|
81
|
+
from cohort_users cu
|
|
82
|
+
left join returned_users ru on ru.user_id = cu.user_id
|
|
83
|
+
group by cu.cohort_date
|
|
84
|
+
order by cu.cohort_date
|
|
85
|
+
`);
|
|
86
|
+
return result.rows.map((r) => {
|
|
87
|
+
const cohortSize = Number(r.cohort_size);
|
|
88
|
+
const returned = Number(r.returned);
|
|
89
|
+
return {
|
|
90
|
+
cohortDate: r.cohort_date,
|
|
91
|
+
cohortSize,
|
|
92
|
+
returned,
|
|
93
|
+
returnRate: cohortSize > 0 ? returned / cohortSize : 0,
|
|
94
|
+
isComplete: r.is_complete,
|
|
95
|
+
};
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=admin-player-activity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-player-activity.js","sourceRoot":"","sources":["../../../src/iam/adapters/admin-player-activity.ts"],"names":[],"mappings":"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"}
|
package/dist/iam/plugin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/iam/plugin.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/iam/plugin.ts"],"names":[],"mappings":";AAeA,wBAyDG"}
|
package/dist/iam/plugin.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { definePlugin, EVENT_BUS, DRIZZLE, ADMIN_GUARD, createLogger } from '@openora/core/server';
|
|
2
|
-
import { ADMIN_PERMISSION_RESOLVER, SEND_EMAIL, SESSION_COMMANDS, CACHE, domainEventSchemas, } from '@openora/core/contracts';
|
|
2
|
+
import { ADMIN_PERMISSION_RESOLVER, ADMIN_PLAYER_ACTIVITY, SEND_EMAIL, SESSION_COMMANDS, CACHE, domainEventSchemas, } from '@openora/core/contracts';
|
|
3
3
|
import { IamService, DbAdminPermissionResolver } from './service/iam.service.js';
|
|
4
4
|
import { createIamRouter } from './router/index.js';
|
|
5
|
+
import { DrizzleAdminPlayerActivity } from './adapters/admin-player-activity.js';
|
|
5
6
|
const logger = createLogger('iam');
|
|
6
7
|
export default definePlugin({
|
|
7
8
|
id: 'iam',
|
|
@@ -41,6 +42,7 @@ export default definePlugin({
|
|
|
41
42
|
.invalidateRole(parsed.data.roleId)
|
|
42
43
|
.catch((err) => logger.error({ err }, 'grant cache purge failed'));
|
|
43
44
|
});
|
|
45
|
+
ctx.provide(ADMIN_PLAYER_ACTIVITY, (c) => new DrizzleAdminPlayerActivity(c.get(DRIZZLE)));
|
|
44
46
|
ctx.routers.add('iam', (c) => createIamRouter(new IamService(c.get(DRIZZLE), c.get(EVENT_BUS), c.get(SEND_EMAIL), c.get(SESSION_COMMANDS)), c.get(ADMIN_GUARD)));
|
|
45
47
|
},
|
|
46
48
|
});
|
package/dist/iam/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/iam/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACnG,OAAO,EACL,yBAAyB,EACzB,UAAU,EACV,gBAAgB,EAChB,KAAK,EACL,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/iam/plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -39,7 +39,7 @@ export declare class IamService {
|
|
|
39
39
|
private assertSuperAdmin;
|
|
40
40
|
listCatalog(): {
|
|
41
41
|
modules: {
|
|
42
|
-
resource: "admin" | "player" | "withdrawal" | "bonus" | "report" | "audit" | "compliance" | "tag" | "analytics" | "player-note" | "transaction" | "game" | "content" | "game-config" | "
|
|
42
|
+
resource: "admin" | "player" | "withdrawal" | "bonus" | "sportsbook" | "report" | "audit" | "compliance" | "tag" | "analytics" | "player-note" | "transaction" | "game" | "content" | "game-config" | "affiliate" | "sessions" | "tag-rule" | "chat-room";
|
|
43
43
|
actions: string[];
|
|
44
44
|
readActions: string[];
|
|
45
45
|
}[];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openora/core",
|
|
3
|
-
"version": "0.4.1-canary.
|
|
3
|
+
"version": "0.4.1-canary.42",
|
|
4
4
|
"description": "Open-source, headless, plugin-based, AI-native iGaming framework - domain modules, plugin engine, Zod-first contracts, typed React SDK",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai-native",
|