@openora/core 0.4.1-canary.40 → 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 +166 -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 +65 -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 +15 -4
- 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/audit/plugin.d.ts.map +1 -1
- package/dist/audit/plugin.js +21 -1
- package/dist/audit/plugin.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/compliance/__tests__/hmac-kyc-webhook-verifier.test.js +66 -12
- package/dist/compliance/__tests__/hmac-kyc-webhook-verifier.test.js.map +1 -1
- package/dist/compliance/__tests__/kyc-admin.router.test.d.ts +2 -0
- package/dist/compliance/__tests__/kyc-admin.router.test.d.ts.map +1 -0
- package/dist/compliance/__tests__/kyc-admin.router.test.js +191 -0
- package/dist/compliance/__tests__/kyc-admin.router.test.js.map +1 -0
- package/dist/compliance/__tests__/kyc-webhook.router.test.d.ts +2 -0
- package/dist/compliance/__tests__/kyc-webhook.router.test.d.ts.map +1 -0
- package/dist/compliance/__tests__/kyc-webhook.router.test.js +148 -0
- package/dist/compliance/__tests__/kyc-webhook.router.test.js.map +1 -0
- package/dist/compliance/__tests__/kyc.service.test.js +11 -10
- package/dist/compliance/__tests__/kyc.service.test.js.map +1 -1
- package/dist/compliance/__tests__/rg.router.test.js +5 -1
- package/dist/compliance/__tests__/rg.router.test.js.map +1 -1
- package/dist/compliance/adapters/hmac-kyc-webhook-verifier.d.ts +16 -3
- package/dist/compliance/adapters/hmac-kyc-webhook-verifier.d.ts.map +1 -1
- package/dist/compliance/adapters/hmac-kyc-webhook-verifier.js +47 -5
- package/dist/compliance/adapters/hmac-kyc-webhook-verifier.js.map +1 -1
- package/dist/compliance/contract/index.d.ts +312 -0
- package/dist/compliance/contract/index.d.ts.map +1 -1
- package/dist/compliance/contract/index.js +50 -1
- package/dist/compliance/contract/index.js.map +1 -1
- package/dist/compliance/drizzle/migrations/0002_condemned_monster_badoon.sql +3 -0
- package/dist/compliance/drizzle/migrations/0003_public_spirit.sql +1 -0
- package/dist/compliance/drizzle/migrations/meta/0002_snapshot.json +673 -0
- package/dist/compliance/drizzle/migrations/meta/0003_snapshot.json +679 -0
- package/dist/compliance/drizzle/migrations/meta/_journal.json +14 -0
- package/dist/compliance/plugin.d.ts.map +1 -1
- package/dist/compliance/plugin.js +23 -3
- package/dist/compliance/plugin.js.map +1 -1
- package/dist/compliance/router/index.d.ts +186 -2
- package/dist/compliance/router/index.d.ts.map +1 -1
- package/dist/compliance/router/index.js +52 -3
- package/dist/compliance/router/index.js.map +1 -1
- package/dist/compliance/schema/index.d.ts +65 -3
- package/dist/compliance/schema/index.d.ts.map +1 -1
- package/dist/compliance/schema/index.js +8 -0
- package/dist/compliance/schema/index.js.map +1 -1
- package/dist/compliance/service/kyc.service.d.ts +153 -8
- package/dist/compliance/service/kyc.service.d.ts.map +1 -1
- package/dist/compliance/service/kyc.service.js +264 -32
- package/dist/compliance/service/kyc.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/audit.d.ts +1 -1
- package/dist/contracts/adapters/audit.d.ts.map +1 -1
- package/dist/contracts/adapters/audit.js.map +1 -1
- package/dist/contracts/adapters/index.d.ts +6 -2
- package/dist/contracts/adapters/index.d.ts.map +1 -1
- package/dist/contracts/adapters/index.js +3 -1
- package/dist/contracts/adapters/index.js.map +1 -1
- package/dist/contracts/adapters/kyc.d.ts +90 -5
- package/dist/contracts/adapters/kyc.d.ts.map +1 -1
- package/dist/contracts/adapters/kyc.js +23 -0
- package/dist/contracts/adapters/kyc.js.map +1 -1
- package/dist/contracts/schemas/__tests__/events.test.js +1 -1
- package/dist/contracts/schemas/__tests__/player-schemas.test.d.ts +2 -0
- package/dist/contracts/schemas/__tests__/player-schemas.test.d.ts.map +1 -0
- package/dist/contracts/schemas/__tests__/player-schemas.test.js +30 -0
- package/dist/contracts/schemas/__tests__/player-schemas.test.js.map +1 -0
- 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/events.d.ts +27 -0
- package/dist/contracts/schemas/events.d.ts.map +1 -1
- package/dist/contracts/schemas/events.js +12 -2
- package/dist/contracts/schemas/events.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/contracts/schemas/platform-config.d.ts +5 -1
- package/dist/contracts/schemas/platform-config.d.ts.map +1 -1
- package/dist/contracts/schemas/player.d.ts +26 -1
- package/dist/contracts/schemas/player.d.ts.map +1 -1
- package/dist/contracts/schemas/player.js +14 -0
- package/dist/contracts/schemas/player.js.map +1 -1
- package/dist/contracts/schemas/tag.d.ts +21 -1
- package/dist/contracts/schemas/tag.d.ts.map +1 -1
- package/dist/contracts/schemas/tag.js +2 -0
- package/dist/contracts/schemas/tag.js.map +1 -1
- package/dist/engagement/notifications/contract/index.d.ts +5 -1
- package/dist/engagement/notifications/contract/index.d.ts.map +1 -1
- package/dist/engagement/notifications/contract/index.js +5 -1
- package/dist/engagement/notifications/contract/index.js.map +1 -1
- package/dist/engagement/notifications/plugin.d.ts.map +1 -1
- package/dist/engagement/notifications/plugin.js +43 -3
- package/dist/engagement/notifications/plugin.js.map +1 -1
- package/dist/engagement/notifications/router/index.d.ts +1 -0
- package/dist/engagement/notifications/router/index.d.ts.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/dist/pam/identity/__tests__/admin-user-directory.test.js +1 -1
- package/dist/pam/identity/admin-user-directory.d.ts +1 -1
- package/dist/pam/identity/admin-user-directory.d.ts.map +1 -1
- package/dist/pam/identity/admin-user-directory.js +6 -3
- package/dist/pam/identity/admin-user-directory.js.map +1 -1
- package/dist/pam/player-management/__tests__/kyc-status-writer.test.js +5 -2
- package/dist/pam/player-management/__tests__/kyc-status-writer.test.js.map +1 -1
- package/dist/pam/player-management/__tests__/player.router.test.js +27 -20
- package/dist/pam/player-management/__tests__/player.router.test.js.map +1 -1
- package/dist/pam/player-management/__tests__/player.service.test.js +4 -31
- package/dist/pam/player-management/__tests__/player.service.test.js.map +1 -1
- package/dist/pam/player-management/contract/index.d.ts +16 -8
- package/dist/pam/player-management/contract/index.d.ts.map +1 -1
- package/dist/pam/player-management/contract/index.js +0 -1
- package/dist/pam/player-management/contract/index.js.map +1 -1
- package/dist/pam/player-management/plugin.d.ts.map +1 -1
- package/dist/pam/player-management/plugin.js +3 -2
- package/dist/pam/player-management/plugin.js.map +1 -1
- package/dist/pam/player-management/router/index.d.ts +15 -9
- package/dist/pam/player-management/router/index.d.ts.map +1 -1
- package/dist/pam/player-management/router/index.js +48 -16
- package/dist/pam/player-management/router/index.js.map +1 -1
- package/dist/pam/player-management/service/kyc-status-writer.d.ts +3 -2
- package/dist/pam/player-management/service/kyc-status-writer.d.ts.map +1 -1
- package/dist/pam/player-management/service/kyc-status-writer.js +24 -10
- package/dist/pam/player-management/service/kyc-status-writer.js.map +1 -1
- package/dist/pam/player-management/service/player.service.d.ts +8 -9
- package/dist/pam/player-management/service/player.service.d.ts.map +1 -1
- package/dist/pam/player-management/service/player.service.js +11 -12
- package/dist/pam/player-management/service/player.service.js.map +1 -1
- package/dist/pam/profile/contract/index.d.ts +2 -0
- package/dist/pam/profile/contract/index.d.ts.map +1 -1
- package/dist/pam/profile/drizzle/migrations/0001_powerful_tiger_shark.sql +1 -0
- package/dist/pam/profile/drizzle/migrations/meta/0001_snapshot.json +191 -0
- package/dist/pam/profile/drizzle/migrations/meta/_journal.json +7 -0
- package/dist/pam/profile/react/profile.d.ts +2 -2
- package/dist/pam/profile/router/index.d.ts +2 -0
- package/dist/pam/profile/router/index.d.ts.map +1 -1
- package/dist/pam/profile/schema/index.d.ts +3 -3
- package/dist/pam/profile/schema/index.d.ts.map +1 -1
- package/dist/pam/profile/service/profile.service.d.ts +2 -2
- package/dist/pam/shared/player-mapper.d.ts +1 -1
- package/dist/pam/tag/__tests__/tag-evaluation.service.test.js +20 -3
- package/dist/pam/tag/__tests__/tag-evaluation.service.test.js.map +1 -1
- package/dist/pam/tag/contract/index.d.ts +26 -0
- package/dist/pam/tag/contract/index.d.ts.map +1 -1
- package/dist/pam/tag/drizzle/migrations/0004_curvy_wither.sql +2 -0
- package/dist/pam/tag/drizzle/migrations/meta/0004_snapshot.json +345 -0
- package/dist/pam/tag/drizzle/migrations/meta/_journal.json +7 -0
- package/dist/pam/tag/plugin.d.ts.map +1 -1
- package/dist/pam/tag/plugin.js +10 -2
- package/dist/pam/tag/plugin.js.map +1 -1
- package/dist/pam/tag/router/index.d.ts +24 -0
- package/dist/pam/tag/router/index.d.ts.map +1 -1
- package/dist/pam/tag/schema/index.d.ts +3 -3
- package/dist/pam/tag/schema/index.d.ts.map +1 -1
- package/dist/pam/tag/seed/data/default-tag-rules.d.ts.map +1 -1
- package/dist/pam/tag/seed/data/default-tag-rules.js +14 -0
- package/dist/pam/tag/seed/data/default-tag-rules.js.map +1 -1
- package/dist/pam/tag/seed/data/default-tags.d.ts.map +1 -1
- package/dist/pam/tag/seed/data/default-tags.js +2 -0
- package/dist/pam/tag/seed/data/default-tags.js.map +1 -1
- package/dist/pam/tag/service/tag-evaluation.service.d.ts +33 -9
- package/dist/pam/tag/service/tag-evaluation.service.d.ts.map +1 -1
- package/dist/pam/tag/service/tag-evaluation.service.js +125 -19
- package/dist/pam/tag/service/tag-evaluation.service.js.map +1 -1
- package/dist/pam/tag/service/tag-mappers.d.ts +1 -1
- package/dist/pam/tag/service/tag-rule.service.d.ts +3 -3
- package/dist/pam/tag/service/tag.service.d.ts +8 -8
- package/dist/server/kernel/bullmq-job-queue.d.ts.map +1 -1
- package/dist/server/kernel/bullmq-job-queue.js +17 -0
- package/dist/server/kernel/bullmq-job-queue.js.map +1 -1
- package/dist/server/plugin-host/define-plugin.d.ts +2 -2
- package/dist/server/plugin-host/define-plugin.d.ts.map +1 -1
- package/dist/server/plugin-host/define-plugin.js.map +1 -1
- package/dist/wallet/__tests__/wallet.service.test.js +18 -0
- package/dist/wallet/__tests__/wallet.service.test.js.map +1 -1
- package/dist/wallet/contract/index.d.ts +4 -0
- package/dist/wallet/contract/index.d.ts.map +1 -1
- package/dist/wallet/router/index.d.ts +2 -0
- package/dist/wallet/router/index.d.ts.map +1 -1
- package/dist/wallet/service/wallet.service.d.ts +1 -2
- package/dist/wallet/service/wallet.service.d.ts.map +1 -1
- package/dist/wallet/service/wallet.service.js +17 -7
- package/dist/wallet/service/wallet.service.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../src/engagement/notifications/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,6BAA6B,EAC7B,kBAAkB,
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../src/engagement/notifications/plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ export declare function createNotificationsRouter(notifications: NotificationsSe
|
|
|
7
7
|
type: import("zod").ZodEnum<{
|
|
8
8
|
"withdrawal.approved": "withdrawal.approved";
|
|
9
9
|
"withdrawal.rejected": "withdrawal.rejected";
|
|
10
|
+
"kyc.resubmission_requested": "kyc.resubmission_requested";
|
|
10
11
|
}>;
|
|
11
12
|
title: import("zod").ZodString;
|
|
12
13
|
body: import("zod").ZodString;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/engagement/notifications/router/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAwB,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAE7E,OAAO,EACL,oBAAoB,EAGrB,MAAM,qCAAqC,CAAC;AAE7C,wBAAgB,yBAAyB,CAAC,aAAa,EAAE,oBAAoB
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/engagement/notifications/router/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAwB,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAE7E,OAAO,EACL,oBAAoB,EAGrB,MAAM,qCAAqC,CAAC;AAE7C,wBAAgB,yBAAyB,CAAC,aAAa,EAAE,oBAAoB;;;;;;;;;;;;;;;;;;;;;;EAmC5E"}
|
|
@@ -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":"AAAA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACnG,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,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;AACpD,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AAEjF,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;AAEnC,eAAe,YAAY,CAAC;IAC1B,EAAE,EAAE,KAAK;IACT,SAAS,EAAE,CAAC,UAAU,CAAC;IACvB,QAAQ,CAAC,GAAG;QACV,gFAAgF;QAChF,gFAAgF;QAChF,iFAAiF;QACjF,+EAA+E;QAC/E,IAAI,WAAW,GAAqC,IAAI,CAAC;QACzD,4EAA4E;QAC5E,sDAAsD;QACtD,GAAG,CAAC,OAAO,CAAC,yBAAyB,EAAE,CAAC,CAAC,EAAE,EAAE;YAC3C,WAAW,GAAG,IAAI,yBAAyB,CACzC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EACd,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CACxC,CAAC;YACF,OAAO,WAAW,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,oFAAoF;QACpF,sFAAsF;QACtF,oFAAoF;QACpF,KAAK,MAAM,KAAK,IAAI,CAAC,mBAAmB,EAAE,kBAAkB,CAAU,EAAE,CAAC;YACvE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE;gBAC/B,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;gBAC5D,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;oBACpC,OAAO;gBACT,CAAC;gBACD,WAAW;qBACR,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;qBAClC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,0BAA0B,CAAC,CAAC,CAAC;YACvE,CAAC,CAAC,CAAC;QACL,CAAC;QACD,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,8BAA8B,EAAE,CAAC,OAAO,EAAE,EAAE;YACxD,MAAM,MAAM,GAAG,kBAAkB,CAAC,8BAA8B,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACrF,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;gBACpC,OAAO;YACT,CAAC;YACD,WAAW;iBACR,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;iBAClC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,0BAA0B,CAAC,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,0BAA0B,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAE1F,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAC3B,eAAe,CACb,IAAI,UAAU,CACZ,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EACd,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,EAChB,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,EACjB,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,CACxB,EACD,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CACnB,CACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -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
|
}[];
|
|
@@ -43,7 +43,7 @@ export declare class DrizzleAdminUserDirectory implements AdminUserDirectory {
|
|
|
43
43
|
lockoutUntil: Date | null;
|
|
44
44
|
} | null>;
|
|
45
45
|
lookupPlayers(userIds: readonly string[]): Promise<{
|
|
46
|
-
kycStatus: "pending" | "not_started" | "verified" | "rejected" | "resubmission_requested" | "manually_overridden" | null;
|
|
46
|
+
kycStatus: "pending" | "not_started" | "approved" | "verified" | "rejected" | "resubmission_requested" | "manually_overridden" | null;
|
|
47
47
|
userId: string;
|
|
48
48
|
username: string;
|
|
49
49
|
email: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-user-directory.d.ts","sourceRoot":"","sources":["../../../src/pam/identity/admin-user-directory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAEpG,OAAO,EAAE,cAAc,EAAgB,MAAM,sBAAsB,CAAC;AACpE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAuBrD,qBAAa,yBAA0B,YAAW,kBAAkB;IAEhE,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,QAAQ;IAG7B,KAAK;IAKL,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,oBAAoB;;;;;;;;;;;;;IAmCrE,GAAG,CAAC,EAAE,EAAE,MAAM;;;;;;;;;;IAKd,MAAM,CACV,EAAE,EAAE,MAAM,EACV,KAAK,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,EAC5C,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,UAAU;;;;;;;;;;IAgCb,aAAa,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE;;;;;;;
|
|
1
|
+
{"version":3,"file":"admin-user-directory.d.ts","sourceRoot":"","sources":["../../../src/pam/identity/admin-user-directory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAEpG,OAAO,EAAE,cAAc,EAAgB,MAAM,sBAAsB,CAAC;AACpE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAuBrD,qBAAa,yBAA0B,YAAW,kBAAkB;IAEhE,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,QAAQ;IAG7B,KAAK;IAKL,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,oBAAoB;;;;;;;;;;;;;IAmCrE,GAAG,CAAC,EAAE,EAAE,MAAM;;;;;;;;;;IAKd,MAAM,CACV,EAAE,EAAE,MAAM,EACV,KAAK,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,EAC5C,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,UAAU;;;;;;;;;;IAgCb,aAAa,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE;;;;;;;IAgCxC,aAAa,CAAC,KAAK,EAAE,MAAM;CAoBlC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { KycStatusSchema, UserRoleSchema } from '@openora/core/contracts';
|
|
1
|
+
import { KycStatusSchema, UserRoleSchema, normalizeKycStatus } from '@openora/core/contracts';
|
|
2
2
|
import { pageToOffset } from '@openora/core/server';
|
|
3
3
|
import { asc, count, desc, eq, ilike, inArray } from 'drizzle-orm';
|
|
4
4
|
import { user } from './schema/index.js';
|
|
@@ -113,11 +113,14 @@ export class DrizzleAdminUserDirectory {
|
|
|
113
113
|
.where(inArray(player.userId, [...userIds]));
|
|
114
114
|
return rows.map((r) => {
|
|
115
115
|
// The player table stores kycStatus as free text; coerce unknown values to null
|
|
116
|
-
// so the port's KycStatus contract holds without a cast.
|
|
116
|
+
// so the port's KycStatus contract holds without a cast. Normalize the deprecated
|
|
117
|
+
// `verified` value to `approved` here - the single read boundary every admin
|
|
118
|
+
// consumer (wallet queue filter, tag evaluation, admin-console) goes through -
|
|
119
|
+
// so a legacy row is indistinguishable from a fresh one downstream.
|
|
117
120
|
const kyc = KycStatusSchema.safeParse(r.kycStatus);
|
|
118
121
|
return {
|
|
119
122
|
...r,
|
|
120
|
-
kycStatus: kyc.success ? kyc.data : null,
|
|
123
|
+
kycStatus: kyc.success ? normalizeKycStatus(kyc.data) : null,
|
|
121
124
|
};
|
|
122
125
|
});
|
|
123
126
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-user-directory.js","sourceRoot":"","sources":["../../../src/pam/identity/admin-user-directory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"admin-user-directory.js","sourceRoot":"","sources":["../../../src/pam/identity/admin-user-directory.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ import { player } from '@openora/core/pam/schema/profile';
|
|
|
6
6
|
import { migrate as migrateProfile } from '@openora/core/pam/migrate/profile';
|
|
7
7
|
import { makeEventBus } from '../../../testing/mock.js';
|
|
8
8
|
import { PlayerKycStatusWriter } from '../service/kyc-status-writer.js';
|
|
9
|
+
import { PlayerNotFoundError } from '../service/player.service.js';
|
|
9
10
|
let db;
|
|
10
11
|
function makeWriter() {
|
|
11
12
|
const events = makeEventBus();
|
|
@@ -43,6 +44,8 @@ describe('PlayerKycStatusWriter.setStatus (real PG)', () => {
|
|
|
43
44
|
actorId,
|
|
44
45
|
status: 'verified',
|
|
45
46
|
previousStatus: 'pending',
|
|
47
|
+
reason: null,
|
|
48
|
+
source: 'manual',
|
|
46
49
|
});
|
|
47
50
|
});
|
|
48
51
|
it('is a silent no-op when the status is unchanged', async () => {
|
|
@@ -51,9 +54,9 @@ describe('PlayerKycStatusWriter.setStatus (real PG)', () => {
|
|
|
51
54
|
await writer.setStatus(userId, 'verified', { actorId: null, source: 'vendor' });
|
|
52
55
|
expect(events.emit).not.toHaveBeenCalled();
|
|
53
56
|
});
|
|
54
|
-
it('
|
|
57
|
+
it('throws PlayerNotFoundError for a user with no player profile and emits nothing', async () => {
|
|
55
58
|
const { writer, events } = makeWriter();
|
|
56
|
-
await writer.setStatus(randomUUID(), 'verified', { actorId: null, source: 'vendor' });
|
|
59
|
+
await expect(writer.setStatus(randomUUID(), 'verified', { actorId: null, source: 'vendor' })).rejects.toBeInstanceOf(PlayerNotFoundError);
|
|
57
60
|
expect(events.emit).not.toHaveBeenCalled();
|
|
58
61
|
});
|
|
59
62
|
it('leaves other players untouched', async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kyc-status-writer.test.js","sourceRoot":"","sources":["../../../../src/pam/player-management/__tests__/kyc-status-writer.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,YAAY,EAAe,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"kyc-status-writer.test.js","sourceRoot":"","sources":["../../../../src/pam/player-management/__tests__/kyc-status-writer.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,YAAY,EAAe,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAEnE,IAAI,EAAU,CAAC;AAEf,SAAS,UAAU;IACjB,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,OAAO,EAAE,MAAM,EAAE,IAAI,qBAAqB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;AAC3E,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,YAAiD,EAAE;IAC3E,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE;SAC9B,MAAM,CAAC,MAAM,CAAC;SACd,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,SAAS,EAAE,CAAC;SACrE,SAAS,EAAE,CAAC;IACf,OAAO,GAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,MAAc;IACpC,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACzF,OAAO,GAAG,EAAE,SAAS,CAAC;AACxB,CAAC;AAED,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,EAAE,GAAG,MAAM,YAAY,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;AAC5C,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,KAAK,IAAI,EAAE;IAClB,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,UAAU,CAAC,KAAK,IAAI,EAAE;IACpB,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAA,YAAY,MAAM,2BAA2B,CAAC,CAAC;AAChF,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,2CAA2C,EAAE,GAAG,EAAE;IACzD,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QACxC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;QAE7B,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAE1E,MAAM,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,wBAAwB,EAAE;YACjE,MAAM;YACN,OAAO;YACP,MAAM,EAAE,UAAU;YAClB,cAAc,EAAE,SAAS;YACzB,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QACxC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;QAE/D,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEhF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gFAAgF,EAAE,KAAK,IAAI,EAAE;QAC9F,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QAExC,MAAM,MAAM,CACV,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAChF,CAAC,OAAO,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;QAC1D,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;QAEzD,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEvF,MAAM,CAAC,MAAM,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QACxC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;QAE9D,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;YAC3C,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;QACvF,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QAChC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;QAE9D,MAAM,MAAM,CACV,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;YACrC,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;YACrF,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC,CAAC,CACH,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAEnC,MAAM,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { describe, it, expect,
|
|
1
|
+
import { describe, it, expect, beforeAll, afterAll, beforeEach } from 'vitest';
|
|
2
2
|
import { randomUUID } from 'node:crypto';
|
|
3
3
|
import { eq, sql } from 'drizzle-orm';
|
|
4
|
-
import { call
|
|
4
|
+
import { call } from '@orpc/server';
|
|
5
5
|
import { createTestDb } from '@openora/core/testing';
|
|
6
6
|
import { user } from '@openora/core/pam/schema/identity';
|
|
7
7
|
import { migrate as migrateIdentity } from '@openora/core/pam/migrate/identity';
|
|
@@ -9,7 +9,7 @@ import { player } from '@openora/core/pam/schema/profile';
|
|
|
9
9
|
import { migrate as migrateProfile } from '@openora/core/pam/migrate/profile';
|
|
10
10
|
import { tag, playerTag } from '@openora/core/pam/schema/tag';
|
|
11
11
|
import { migrate as migrateTag } from '@openora/core/pam/migrate/tag';
|
|
12
|
-
import {
|
|
12
|
+
import { makeAdminGuard, makeAuditWriter, makeEventBus, testContext, } from '../../../testing/mock.js';
|
|
13
13
|
import { createPlayerRouter } from '../router/index.js';
|
|
14
14
|
import { PlayerService } from '../service/player.service.js';
|
|
15
15
|
const CTX = testContext();
|
|
@@ -26,9 +26,9 @@ beforeEach(async () => {
|
|
|
26
26
|
});
|
|
27
27
|
const guardAllowing = (allow) => makeAdminGuard({ allow, caller: { userId: CALLER } });
|
|
28
28
|
function build(adminGuard) {
|
|
29
|
-
const
|
|
30
|
-
const
|
|
31
|
-
return { router: createPlayerRouter(service, adminGuard),
|
|
29
|
+
const service = new PlayerService(db.drizzle, makeEventBus());
|
|
30
|
+
const audit = makeAuditWriter();
|
|
31
|
+
return { router: createPlayerRouter(service, adminGuard, audit), audit };
|
|
32
32
|
}
|
|
33
33
|
async function seedPlayer() {
|
|
34
34
|
const [account] = await db.drizzle.db
|
|
@@ -45,20 +45,7 @@ async function storedPlayer(id) {
|
|
|
45
45
|
const [row] = await db.drizzle.db.select().from(player).where(eq(player.id, id));
|
|
46
46
|
return row;
|
|
47
47
|
}
|
|
48
|
-
describe('player router update
|
|
49
|
-
it('rejects a kycStatus change without compliance:override-limit and writes nothing', async () => {
|
|
50
|
-
const seeded = await seedPlayer();
|
|
51
|
-
const { router, kycStatusWriter } = build(guardAllowing(['player:update']));
|
|
52
|
-
await expect(call(router.update, { playerId: seeded.id, kycStatus: 'verified' }, { context: CTX })).rejects.toBeInstanceOf(ORPCError);
|
|
53
|
-
expect(kycStatusWriter.setStatus).not.toHaveBeenCalled();
|
|
54
|
-
expect((await storedPlayer(seeded.id))?.kycStatus).toBe(seeded.kycStatus);
|
|
55
|
-
});
|
|
56
|
-
it('routes a gated kycStatus change through KYC_STATUS_WRITER', async () => {
|
|
57
|
-
const seeded = await seedPlayer();
|
|
58
|
-
const { router, kycStatusWriter } = build(guardAllowing(['player:update', 'compliance:override-limit']));
|
|
59
|
-
await call(router.update, { playerId: seeded.id, kycStatus: 'verified' }, { context: CTX });
|
|
60
|
-
expect(kycStatusWriter.setStatus).toHaveBeenCalledWith(seeded.userId, 'verified', { actorId: CALLER, source: 'manual' }, expect.anything());
|
|
61
|
-
});
|
|
48
|
+
describe('player router update', () => {
|
|
62
49
|
it('persists a non-KYC update with only player:update', async () => {
|
|
63
50
|
const seeded = await seedPlayer();
|
|
64
51
|
const { router } = build(guardAllowing(['player:update']));
|
|
@@ -66,6 +53,26 @@ describe('player router update KYC authz', () => {
|
|
|
66
53
|
expect(result.displayName).toBe('New');
|
|
67
54
|
expect((await storedPlayer(seeded.id))?.displayName).toBe('New');
|
|
68
55
|
});
|
|
56
|
+
it('records an admin.player.updated audit entry with before/after snapshots', async () => {
|
|
57
|
+
const seeded = await seedPlayer();
|
|
58
|
+
const { router, audit } = build(guardAllowing(['player:update']));
|
|
59
|
+
await call(router.update, { playerId: seeded.id, displayName: 'New' }, { context: CTX });
|
|
60
|
+
expect(audit.record).toHaveBeenCalledWith(expect.objectContaining({
|
|
61
|
+
actorId: CALLER,
|
|
62
|
+
actorType: 'admin',
|
|
63
|
+
action: 'admin.player.updated',
|
|
64
|
+
resourceType: 'player',
|
|
65
|
+
resourceId: seeded.id,
|
|
66
|
+
before: expect.objectContaining({ displayName: 'Player' }),
|
|
67
|
+
after: expect.objectContaining({ displayName: 'New' }),
|
|
68
|
+
}));
|
|
69
|
+
});
|
|
70
|
+
it('writes no audit entry when the guard rejects the caller', async () => {
|
|
71
|
+
const seeded = await seedPlayer();
|
|
72
|
+
const { router, audit } = build(guardAllowing([]));
|
|
73
|
+
await expect(call(router.update, { playerId: seeded.id, displayName: 'New' }, { context: CTX })).rejects.toBeDefined();
|
|
74
|
+
expect(audit.record).not.toHaveBeenCalled();
|
|
75
|
+
});
|
|
69
76
|
it('maps an unknown player to NOT_FOUND', async () => {
|
|
70
77
|
const { router } = build(guardAllowing(['player:update']));
|
|
71
78
|
await expect(call(router.update, { playerId: randomUUID(), displayName: 'New' }, { context: CTX })).rejects.toMatchObject({ code: 'NOT_FOUND' });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"player.router.test.js","sourceRoot":"","sources":["../../../../src/pam/player-management/__tests__/player.router.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"player.router.test.js","sourceRoot":"","sources":["../../../../src/pam/player-management/__tests__/player.router.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { describe, it, expect,
|
|
1
|
+
import { describe, it, expect, beforeAll, afterAll, beforeEach } from 'vitest';
|
|
2
2
|
import { randomUUID } from 'node:crypto';
|
|
3
3
|
import { eq, sql } from 'drizzle-orm';
|
|
4
4
|
import { createTestDb } from '@openora/core/testing';
|
|
@@ -8,13 +8,12 @@ import { player } from '@openora/core/pam/schema/profile';
|
|
|
8
8
|
import { migrate as migrateProfile } from '@openora/core/pam/migrate/profile';
|
|
9
9
|
import { tag, playerTag } from '@openora/core/pam/schema/tag';
|
|
10
10
|
import { migrate as migrateTag } from '@openora/core/pam/migrate/tag';
|
|
11
|
-
import {
|
|
11
|
+
import { makeEventBus } from '../../../testing/mock.js';
|
|
12
12
|
import { PlayerService, PlayerNotFoundError, DuplicateEmailError, } from '../service/player.service.js';
|
|
13
13
|
let db;
|
|
14
|
-
function makeService(
|
|
15
|
-
const kycStatusWriter = mock(writer);
|
|
14
|
+
function makeService() {
|
|
16
15
|
const events = makeEventBus();
|
|
17
|
-
return { svc: new PlayerService(db.drizzle,
|
|
16
|
+
return { svc: new PlayerService(db.drizzle, events), events };
|
|
18
17
|
}
|
|
19
18
|
async function seedUser(overrides = {}) {
|
|
20
19
|
const [row] = await db.drizzle.db
|
|
@@ -207,32 +206,6 @@ describe('PlayerService.update (real PG)', () => {
|
|
|
207
206
|
const { player: seeded, account } = await seedPlayerWithUser();
|
|
208
207
|
await expect(svc.update(seeded.id, { email: taken.email }, account.id)).rejects.toBeInstanceOf(DuplicateEmailError);
|
|
209
208
|
});
|
|
210
|
-
it('delegates a kycStatus change to the KYC_STATUS_WRITER on the same transaction', async () => {
|
|
211
|
-
const setStatus = vi.fn(async () => undefined);
|
|
212
|
-
const { svc } = makeService({ setStatus });
|
|
213
|
-
const { player: seeded, account } = await seedPlayerWithUser({}, { kycStatus: 'pending' });
|
|
214
|
-
await svc.update(seeded.id, { kycStatus: 'verified' }, account.id);
|
|
215
|
-
expect(setStatus).toHaveBeenCalledWith(account.id, 'verified', { actorId: account.id, source: 'manual' }, expect.anything());
|
|
216
|
-
});
|
|
217
|
-
it('does not call the KYC_STATUS_WRITER when kycStatus is unchanged', async () => {
|
|
218
|
-
const setStatus = vi.fn(async () => undefined);
|
|
219
|
-
const { svc } = makeService({ setStatus });
|
|
220
|
-
const { player: seeded, account } = await seedPlayerWithUser({}, { kycStatus: 'verified' });
|
|
221
|
-
await svc.update(seeded.id, { kycStatus: 'verified' }, account.id);
|
|
222
|
-
expect(setStatus).not.toHaveBeenCalled();
|
|
223
|
-
});
|
|
224
|
-
it('rolls the whole update back when the KYC_STATUS_WRITER throws', async () => {
|
|
225
|
-
const setStatus = vi.fn(async () => {
|
|
226
|
-
throw new Error('writer down');
|
|
227
|
-
});
|
|
228
|
-
const { svc } = makeService({ setStatus });
|
|
229
|
-
const { player: seeded, account } = await seedPlayerWithUser({}, { displayName: 'Original', kycStatus: 'pending' });
|
|
230
|
-
await expect(svc.update(seeded.id, { displayName: 'Renamed', kycStatus: 'verified' }, account.id)).rejects.toThrow('writer down');
|
|
231
|
-
expect(await rowById(seeded.id)).toMatchObject({
|
|
232
|
-
displayName: 'Original',
|
|
233
|
-
kycStatus: 'pending',
|
|
234
|
-
});
|
|
235
|
-
});
|
|
236
209
|
it('throws PlayerNotFoundError for an unknown id', async () => {
|
|
237
210
|
const { svc } = makeService();
|
|
238
211
|
await expect(svc.update(randomUUID(), { displayName: 'X' }, randomUUID())).rejects.toBeInstanceOf(PlayerNotFoundError);
|