@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.
Files changed (85) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/admin-console/__tests__/backoffice.router.test.js +13 -1
  3. package/dist/admin-console/__tests__/backoffice.router.test.js.map +1 -1
  4. package/dist/admin-console/__tests__/backoffice.service.test.js +110 -10
  5. package/dist/admin-console/__tests__/backoffice.service.test.js.map +1 -1
  6. package/dist/admin-console/contract/index.d.ts +164 -0
  7. package/dist/admin-console/contract/index.d.ts.map +1 -1
  8. package/dist/admin-console/contract/index.js +66 -1
  9. package/dist/admin-console/contract/index.js.map +1 -1
  10. package/dist/admin-console/plugin.d.ts.map +1 -1
  11. package/dist/admin-console/plugin.js +3 -3
  12. package/dist/admin-console/plugin.js.map +1 -1
  13. package/dist/admin-console/router/index.d.ts +64 -0
  14. package/dist/admin-console/router/index.d.ts.map +1 -1
  15. package/dist/admin-console/router/index.js +8 -0
  16. package/dist/admin-console/router/index.js.map +1 -1
  17. package/dist/admin-console/service/backoffice.service.d.ts +14 -3
  18. package/dist/admin-console/service/backoffice.service.d.ts.map +1 -1
  19. package/dist/admin-console/service/backoffice.service.js +29 -1
  20. package/dist/admin-console/service/backoffice.service.js.map +1 -1
  21. package/dist/casino/gaming/__tests__/admin-reporting.test.d.ts +2 -0
  22. package/dist/casino/gaming/__tests__/admin-reporting.test.d.ts.map +1 -0
  23. package/dist/casino/gaming/__tests__/admin-reporting.test.js +87 -0
  24. package/dist/casino/gaming/__tests__/admin-reporting.test.js.map +1 -0
  25. package/dist/casino/gaming/admin-reporting.d.ts +8 -0
  26. package/dist/casino/gaming/admin-reporting.d.ts.map +1 -0
  27. package/dist/casino/gaming/admin-reporting.js +62 -0
  28. package/dist/casino/gaming/admin-reporting.js.map +1 -0
  29. package/dist/casino/gaming/contract/index.d.ts +16 -0
  30. package/dist/casino/gaming/contract/index.d.ts.map +1 -1
  31. package/dist/casino/gaming/contract/index.js +3 -1
  32. package/dist/casino/gaming/contract/index.js.map +1 -1
  33. package/dist/casino/gaming/drizzle/migrations/0002_yummy_lifeguard.sql +4 -0
  34. package/dist/casino/gaming/drizzle/migrations/meta/0002_snapshot.json +237 -0
  35. package/dist/casino/gaming/drizzle/migrations/meta/_journal.json +7 -0
  36. package/dist/casino/gaming/plugin.d.ts.map +1 -1
  37. package/dist/casino/gaming/plugin.js +3 -1
  38. package/dist/casino/gaming/plugin.js.map +1 -1
  39. package/dist/casino/gaming/router/index.d.ts +10 -0
  40. package/dist/casino/gaming/router/index.d.ts.map +1 -1
  41. package/dist/casino/gaming/schema/index.d.ts +18 -0
  42. package/dist/casino/gaming/schema/index.d.ts.map +1 -1
  43. package/dist/casino/gaming/schema/index.js +11 -1
  44. package/dist/casino/gaming/schema/index.js.map +1 -1
  45. package/dist/casino/gaming/service/gaming.service.d.ts +2 -0
  46. package/dist/casino/gaming/service/gaming.service.d.ts.map +1 -1
  47. package/dist/casino/gaming/service/gaming.service.js +1 -0
  48. package/dist/casino/gaming/service/gaming.service.js.map +1 -1
  49. package/dist/contracts/adapters/admin-game-reporting.d.ts +25 -0
  50. package/dist/contracts/adapters/admin-game-reporting.d.ts.map +1 -0
  51. package/dist/contracts/adapters/admin-game-reporting.js +15 -0
  52. package/dist/contracts/adapters/admin-game-reporting.js.map +1 -0
  53. package/dist/contracts/adapters/admin-player-activity.d.ts +29 -0
  54. package/dist/contracts/adapters/admin-player-activity.d.ts.map +1 -0
  55. package/dist/contracts/adapters/admin-player-activity.js +3 -0
  56. package/dist/contracts/adapters/admin-player-activity.js.map +1 -0
  57. package/dist/contracts/adapters/index.d.ts +4 -0
  58. package/dist/contracts/adapters/index.d.ts.map +1 -1
  59. package/dist/contracts/adapters/index.js +2 -0
  60. package/dist/contracts/adapters/index.js.map +1 -1
  61. package/dist/contracts/schemas/common.d.ts +2 -0
  62. package/dist/contracts/schemas/common.d.ts.map +1 -1
  63. package/dist/contracts/schemas/common.js +6 -0
  64. package/dist/contracts/schemas/common.js.map +1 -1
  65. package/dist/contracts/schemas/game.d.ts +9 -0
  66. package/dist/contracts/schemas/game.d.ts.map +1 -0
  67. package/dist/contracts/schemas/game.js +10 -0
  68. package/dist/contracts/schemas/game.js.map +1 -0
  69. package/dist/contracts/schemas/index.d.ts +1 -0
  70. package/dist/contracts/schemas/index.d.ts.map +1 -1
  71. package/dist/contracts/schemas/index.js +1 -0
  72. package/dist/contracts/schemas/index.js.map +1 -1
  73. package/dist/iam/__tests__/admin-player-activity.test.d.ts +2 -0
  74. package/dist/iam/__tests__/admin-player-activity.test.d.ts.map +1 -0
  75. package/dist/iam/__tests__/admin-player-activity.test.js +58 -0
  76. package/dist/iam/__tests__/admin-player-activity.test.js.map +1 -0
  77. package/dist/iam/adapters/admin-player-activity.d.ts +10 -0
  78. package/dist/iam/adapters/admin-player-activity.d.ts.map +1 -0
  79. package/dist/iam/adapters/admin-player-activity.js +99 -0
  80. package/dist/iam/adapters/admin-player-activity.js.map +1 -0
  81. package/dist/iam/plugin.d.ts.map +1 -1
  82. package/dist/iam/plugin.js +3 -1
  83. package/dist/iam/plugin.js.map +1 -1
  84. package/dist/iam/service/iam.service.d.ts +1 -1
  85. 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"}
@@ -4,6 +4,7 @@ export * from './iam.js';
4
4
  export * from './compliance.js';
5
5
  export * from './player.js';
6
6
  export * from './wallet-tx.js';
7
+ export * from './game.js';
7
8
  export * from './igaming-config.js';
8
9
  export * from './tag.js';
9
10
  export * from './platform-config.js';
@@ -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"}
@@ -4,6 +4,7 @@ export * from './iam.js';
4
4
  export * from './compliance.js';
5
5
  export * from './player.js';
6
6
  export * from './wallet-tx.js';
7
+ export * from './game.js';
7
8
  export * from './igaming-config.js';
8
9
  export * from './tag.js';
9
10
  export * from './platform-config.js';
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=admin-player-activity.test.d.ts.map
@@ -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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/iam/plugin.ts"],"names":[],"mappings":";AAaA,wBAuDG"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/iam/plugin.ts"],"names":[],"mappings":";AAeA,wBAyDG"}
@@ -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
  });
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/iam/plugin.ts"],"names":[],"mappings":"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"}
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" | "sportsbook" | "affiliate" | "sessions" | "tag-rule" | "chat-room";
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.41",
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",