@openora/core 0.4.1-canary.112 → 0.4.1-canary.113

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 (91) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/admin-console/plugin.d.ts +6 -0
  3. package/dist/admin-console/plugin.d.ts.map +1 -1
  4. package/dist/analytics/plugin.d.ts +6 -0
  5. package/dist/analytics/plugin.d.ts.map +1 -1
  6. package/dist/audit/plugin.d.ts +6 -0
  7. package/dist/audit/plugin.d.ts.map +1 -1
  8. package/dist/casino/gaming/plugin.d.ts +6 -0
  9. package/dist/casino/gaming/plugin.d.ts.map +1 -1
  10. package/dist/casino/lobby/plugin.d.ts +6 -0
  11. package/dist/casino/lobby/plugin.d.ts.map +1 -1
  12. package/dist/cms/plugin.d.ts +6 -0
  13. package/dist/cms/plugin.d.ts.map +1 -1
  14. package/dist/compliance/plugin.d.ts +6 -0
  15. package/dist/compliance/plugin.d.ts.map +1 -1
  16. package/dist/contracts/schemas/platform-config.d.ts +19 -0
  17. package/dist/contracts/schemas/platform-config.d.ts.map +1 -1
  18. package/dist/contracts/schemas/platform-config.js +17 -0
  19. package/dist/contracts/schemas/platform-config.js.map +1 -1
  20. package/dist/engagement/chat/__tests__/chat.service.int.test.js +117 -0
  21. package/dist/engagement/chat/__tests__/chat.service.int.test.js.map +1 -1
  22. package/dist/engagement/chat/plugin.d.ts +6 -0
  23. package/dist/engagement/chat/plugin.d.ts.map +1 -1
  24. package/dist/engagement/chat/service/chat.service.d.ts +2 -2
  25. package/dist/engagement/chat/service/chat.service.d.ts.map +1 -1
  26. package/dist/engagement/chat/service/chat.service.js +61 -1
  27. package/dist/engagement/chat/service/chat.service.js.map +1 -1
  28. package/dist/engagement/chat-commands/plugin.d.ts +6 -0
  29. package/dist/engagement/chat-commands/plugin.d.ts.map +1 -1
  30. package/dist/engagement/notifications/__tests__/notification-event-map.test.d.ts +2 -0
  31. package/dist/engagement/notifications/__tests__/notification-event-map.test.d.ts.map +1 -0
  32. package/dist/engagement/notifications/__tests__/notification-event-map.test.js +235 -0
  33. package/dist/engagement/notifications/__tests__/notification-event-map.test.js.map +1 -0
  34. package/dist/engagement/notifications/__tests__/notifications.router.int.test.d.ts +2 -0
  35. package/dist/engagement/notifications/__tests__/notifications.router.int.test.d.ts.map +1 -0
  36. package/dist/engagement/notifications/__tests__/notifications.router.int.test.js +142 -0
  37. package/dist/engagement/notifications/__tests__/notifications.router.int.test.js.map +1 -0
  38. package/dist/engagement/notifications/__tests__/notifications.service.int.test.js +113 -7
  39. package/dist/engagement/notifications/__tests__/notifications.service.int.test.js.map +1 -1
  40. package/dist/engagement/notifications/contract/index.d.ts +98 -17
  41. package/dist/engagement/notifications/contract/index.d.ts.map +1 -1
  42. package/dist/engagement/notifications/contract/index.js +34 -4
  43. package/dist/engagement/notifications/contract/index.js.map +1 -1
  44. package/dist/engagement/notifications/drizzle/migrations/0001_classy_pixie.sql +1 -0
  45. package/dist/engagement/notifications/drizzle/migrations/0002_open_madame_web.sql +2 -0
  46. package/dist/engagement/notifications/drizzle/migrations/meta/0001_snapshot.json +98 -0
  47. package/dist/engagement/notifications/drizzle/migrations/meta/0002_snapshot.json +119 -0
  48. package/dist/engagement/notifications/drizzle/migrations/meta/_journal.json +14 -0
  49. package/dist/engagement/notifications/plugin.d.ts +20 -3
  50. package/dist/engagement/notifications/plugin.d.ts.map +1 -1
  51. package/dist/engagement/notifications/plugin.js +219 -75
  52. package/dist/engagement/notifications/plugin.js.map +1 -1
  53. package/dist/engagement/notifications/react/notifications.d.ts +20 -0
  54. package/dist/engagement/notifications/react/notifications.d.ts.map +1 -0
  55. package/dist/engagement/notifications/react/notifications.js +39 -0
  56. package/dist/engagement/notifications/react/notifications.js.map +1 -0
  57. package/dist/engagement/notifications/router/index.d.ts +70 -17
  58. package/dist/engagement/notifications/router/index.d.ts.map +1 -1
  59. package/dist/engagement/notifications/router/index.js +37 -16
  60. package/dist/engagement/notifications/router/index.js.map +1 -1
  61. package/dist/engagement/notifications/schema/index.d.ts +36 -0
  62. package/dist/engagement/notifications/schema/index.d.ts.map +1 -1
  63. package/dist/engagement/notifications/schema/index.js +7 -2
  64. package/dist/engagement/notifications/schema/index.js.map +1 -1
  65. package/dist/engagement/notifications/service/notifications.service.d.ts +27 -19
  66. package/dist/engagement/notifications/service/notifications.service.d.ts.map +1 -1
  67. package/dist/engagement/notifications/service/notifications.service.js +41 -11
  68. package/dist/engagement/notifications/service/notifications.service.js.map +1 -1
  69. package/dist/engagement/react.d.ts +2 -0
  70. package/dist/engagement/react.d.ts.map +1 -0
  71. package/dist/engagement/react.js +3 -0
  72. package/dist/engagement/react.js.map +1 -0
  73. package/dist/engagement/social/plugin.d.ts +6 -0
  74. package/dist/engagement/social/plugin.d.ts.map +1 -1
  75. package/dist/iam/plugin.d.ts +6 -0
  76. package/dist/iam/plugin.d.ts.map +1 -1
  77. package/dist/pam/identity/plugin.d.ts +6 -0
  78. package/dist/pam/identity/plugin.d.ts.map +1 -1
  79. package/dist/pam/player-management/plugin.d.ts +6 -0
  80. package/dist/pam/player-management/plugin.d.ts.map +1 -1
  81. package/dist/pam/player-note/plugin.d.ts +6 -0
  82. package/dist/pam/player-note/plugin.d.ts.map +1 -1
  83. package/dist/pam/profile/plugin.d.ts +6 -0
  84. package/dist/pam/profile/plugin.d.ts.map +1 -1
  85. package/dist/pam/tag/plugin.d.ts +6 -0
  86. package/dist/pam/tag/plugin.d.ts.map +1 -1
  87. package/dist/server/runtime/core-token-catalog.d.ts +6 -0
  88. package/dist/server/runtime/core-token-catalog.d.ts.map +1 -1
  89. package/dist/wallet/plugin.d.ts +6 -0
  90. package/dist/wallet/plugin.d.ts.map +1 -1
  91. package/package.json +6 -1
@@ -117,6 +117,12 @@ declare const _default: {
117
117
  termsVersion: string;
118
118
  requireEmailVerification: boolean;
119
119
  } | undefined;
120
+ notifications?: {
121
+ retention?: {
122
+ days: number;
123
+ cron: string;
124
+ } | undefined;
125
+ } | undefined;
120
126
  supportedLanguages?: string[] | undefined;
121
127
  }, string>;
122
128
  PLAYER_ACTIVITY_TRACKER: import("@openora/core/contracts").Token<import("@openora/core/contracts").PlayerActivityTracker>;
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/admin-console/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,wBAkB8C"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/admin-console/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,wBAkB8C"}
@@ -117,6 +117,12 @@ declare const _default: {
117
117
  termsVersion: string;
118
118
  requireEmailVerification: boolean;
119
119
  } | undefined;
120
+ notifications?: {
121
+ retention?: {
122
+ days: number;
123
+ cron: string;
124
+ } | undefined;
125
+ } | undefined;
120
126
  supportedLanguages?: string[] | undefined;
121
127
  }, string>;
122
128
  PLAYER_ACTIVITY_TRACKER: import("@openora/core/contracts").Token<import("@openora/core/contracts").PlayerActivityTracker>;
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/analytics/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,wBAY8C"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/analytics/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,wBAY8C"}
@@ -118,6 +118,12 @@ declare const _default: {
118
118
  termsVersion: string;
119
119
  requireEmailVerification: boolean;
120
120
  } | undefined;
121
+ notifications?: {
122
+ retention?: {
123
+ days: number;
124
+ cron: string;
125
+ } | undefined;
126
+ } | undefined;
121
127
  supportedLanguages?: string[] | undefined;
122
128
  }, string>;
123
129
  PLAYER_ACTIVITY_TRACKER: import("@openora/core/contracts").Token<import("@openora/core/contracts").PlayerActivityTracker>;
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/audit/plugin.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgB,KAAK,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAS5E,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EACb,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACzB,OAAO,CAAC,WAAW,CAAC,CA2nBtB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0FD,wBAoC8C"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/audit/plugin.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgB,KAAK,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAS5E,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EACb,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACzB,OAAO,CAAC,WAAW,CAAC,CA2nBtB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0FD,wBAoC8C"}
@@ -118,6 +118,12 @@ declare const _default: {
118
118
  termsVersion: string;
119
119
  requireEmailVerification: boolean;
120
120
  } | undefined;
121
+ notifications?: {
122
+ retention?: {
123
+ days: number;
124
+ cron: string;
125
+ } | undefined;
126
+ } | undefined;
121
127
  supportedLanguages?: string[] | undefined;
122
128
  }, string>;
123
129
  PLAYER_ACTIVITY_TRACKER: import("@openora/core/contracts").Token<import("@openora/core/contracts").PlayerActivityTracker>;
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/casino/gaming/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBA,wBAqB8C"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/casino/gaming/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBA,wBAqB8C"}
@@ -116,6 +116,12 @@ declare const _default: {
116
116
  termsVersion: string;
117
117
  requireEmailVerification: boolean;
118
118
  } | undefined;
119
+ notifications?: {
120
+ retention?: {
121
+ days: number;
122
+ cron: string;
123
+ } | undefined;
124
+ } | undefined;
119
125
  supportedLanguages?: string[] | undefined;
120
126
  }, string>;
121
127
  PLAYER_ACTIVITY_TRACKER: import("@openora/core/contracts").Token<import("@openora/core/contracts").PlayerActivityTracker>;
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/casino/lobby/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,wBAO8C"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/casino/lobby/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,wBAO8C"}
@@ -116,6 +116,12 @@ declare const _default: {
116
116
  termsVersion: string;
117
117
  requireEmailVerification: boolean;
118
118
  } | undefined;
119
+ notifications?: {
120
+ retention?: {
121
+ days: number;
122
+ cron: string;
123
+ } | undefined;
124
+ } | undefined;
119
125
  supportedLanguages?: string[] | undefined;
120
126
  }, string>;
121
127
  PLAYER_ACTIVITY_TRACKER: import("@openora/core/contracts").Token<import("@openora/core/contracts").PlayerActivityTracker>;
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/cms/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,wBAU8C"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/cms/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,wBAU8C"}
@@ -119,6 +119,12 @@ declare const _default: {
119
119
  termsVersion: string;
120
120
  requireEmailVerification: boolean;
121
121
  } | undefined;
122
+ notifications?: {
123
+ retention?: {
124
+ days: number;
125
+ cron: string;
126
+ } | undefined;
127
+ } | undefined;
122
128
  supportedLanguages?: string[] | undefined;
123
129
  }, string>;
124
130
  PLAYER_ACTIVITY_TRACKER: import("@openora/core/contracts").Token<import("@openora/core/contracts").PlayerActivityTracker>;
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/compliance/plugin.ts"],"names":[],"mappings":"AAGA,OAAO,EAoBL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACvB,MAAM,yBAAyB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCjC,wBA6K8C"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/compliance/plugin.ts"],"names":[],"mappings":"AAGA,OAAO,EAoBL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACvB,MAAM,yBAAyB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCjC,wBA6K8C"}
@@ -52,6 +52,13 @@ export declare const WalletConfigSchema: z.ZodObject<{
52
52
  }, z.core.$strict>>;
53
53
  }, z.core.$strict>;
54
54
  export type WalletConfig = z.infer<typeof WalletConfigSchema>;
55
+ export declare const NotificationsConfigSchema: z.ZodObject<{
56
+ retention: z.ZodOptional<z.ZodObject<{
57
+ days: z.ZodDefault<z.ZodNumber>;
58
+ cron: z.ZodDefault<z.ZodString>;
59
+ }, z.core.$strict>>;
60
+ }, z.core.$strict>;
61
+ export type NotificationsConfig = z.infer<typeof NotificationsConfigSchema>;
55
62
  export declare const RegistrationConfigSchema: z.ZodObject<{
56
63
  termsVersion: z.ZodString;
57
64
  requireEmailVerification: z.ZodDefault<z.ZodBoolean>;
@@ -111,6 +118,12 @@ export declare const PlatformConfigSchema: z.ZodObject<{
111
118
  termsVersion: z.ZodString;
112
119
  requireEmailVerification: z.ZodDefault<z.ZodBoolean>;
113
120
  }, z.core.$strict>>;
121
+ notifications: z.ZodOptional<z.ZodObject<{
122
+ retention: z.ZodOptional<z.ZodObject<{
123
+ days: z.ZodDefault<z.ZodNumber>;
124
+ cron: z.ZodDefault<z.ZodString>;
125
+ }, z.core.$strict>>;
126
+ }, z.core.$strict>>;
114
127
  supportedLanguages: z.ZodOptional<z.ZodArray<z.ZodString>>;
115
128
  chat: z.ZodDefault<z.ZodObject<{
116
129
  allowedAttachmentHosts: z.ZodDefault<z.ZodArray<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>>;
@@ -180,6 +193,12 @@ export declare const PLATFORM_CONFIG: import("../adapters/token.js").Token<{
180
193
  termsVersion: string;
181
194
  requireEmailVerification: boolean;
182
195
  } | undefined;
196
+ notifications?: {
197
+ retention?: {
198
+ days: number;
199
+ cron: string;
200
+ } | undefined;
201
+ } | undefined;
183
202
  supportedLanguages?: string[] | undefined;
184
203
  }, string>;
185
204
  //# sourceMappingURL=platform-config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"platform-config.d.ts","sourceRoot":"","sources":["../../../src/contracts/schemas/platform-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB;;;;;;;;;;;;GAYG;AAEH,eAAO,MAAM,kBAAkB,wCAAoC,CAAC;AAEpE,eAAO,MAAM,WAAW;;;;;kBAUb,CAAC;AAEZ,eAAO,MAAM,eAAe;;;;;kBAcjB,CAAC;AAEZ,eAAO,MAAM,0BAA0B;;;;kBAQ5B,CAAC;AAEZ,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE9E,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;kBAkEpB,CAAC;AAEZ,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,eAAO,MAAM,wBAAwB;;;kBAU1B,CAAC;AA2BZ,eAAO,MAAM,gBAAgB;;kBAKlB,CAAC;AACZ,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAoD7B,CAAC;AAEL,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAEvE;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,mBAAmB,GAAG,cAAc,CAShF;AAED,8EAA8E;AAC9E,eAAO,MAAM,qBAAqB,EAAE,cAAyC,CAAC;AAE9E,+EAA+E;AAC/E,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAAiD,CAAC"}
1
+ {"version":3,"file":"platform-config.d.ts","sourceRoot":"","sources":["../../../src/contracts/schemas/platform-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB;;;;;;;;;;;;GAYG;AAEH,eAAO,MAAM,kBAAkB,wCAAoC,CAAC;AAEpE,eAAO,MAAM,WAAW;;;;;kBAUb,CAAC;AAEZ,eAAO,MAAM,eAAe;;;;;kBAcjB,CAAC;AAEZ,eAAO,MAAM,0BAA0B;;;;kBAQ5B,CAAC;AAEZ,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE9E,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;kBAkEpB,CAAC;AAEZ,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,eAAO,MAAM,yBAAyB;;;;;kBAc3B,CAAC;AAEZ,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,eAAO,MAAM,wBAAwB;;;kBAU1B,CAAC;AA2BZ,eAAO,MAAM,gBAAgB;;kBAKlB,CAAC;AACZ,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAsD7B,CAAC;AAEL,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAEvE;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,mBAAmB,GAAG,cAAc,CAShF;AAED,8EAA8E;AAC9E,eAAO,MAAM,qBAAqB,EAAE,cAAyC,CAAC;AAE9E,+EAA+E;AAC/E,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAAiD,CAAC"}
@@ -118,6 +118,21 @@ export const WalletConfigSchema = z
118
118
  .optional(),
119
119
  })
120
120
  .strict();
121
+ export const NotificationsConfigSchema = z
122
+ .object({
123
+ /**
124
+ * In-app notification retention knobs. Static config, not a DB row - nothing
125
+ * here is edited during an incident. Absent means the built-in defaults apply.
126
+ */
127
+ retention: z
128
+ .object({
129
+ days: z.number().int().positive().default(30),
130
+ cron: z.string().default('0 3 * * *'),
131
+ })
132
+ .strict()
133
+ .optional(),
134
+ })
135
+ .strict();
121
136
  export const RegistrationConfigSchema = z
122
137
  .object({
123
138
  /** Version recorded beside the player's affirmative terms acceptance. */
@@ -190,6 +205,8 @@ export const PlatformConfigSchema = z
190
205
  wallet: WalletConfigSchema.optional(),
191
206
  /** Required before public registration is enabled. */
192
207
  registration: RegistrationConfigSchema.optional(),
208
+ /** In-app notification retention knobs. Absent = built-in default (30 days). */
209
+ notifications: NotificationsConfigSchema.optional(),
193
210
  /**
194
211
  * Player-facing language codes the operator supports (eg `['en', 'es']`).
195
212
  * Undefined or empty means no restriction - any value is accepted.
@@ -1 +1 @@
1
- {"version":3,"file":"platform-config.js","sourceRoot":"","sources":["../../../src/contracts/schemas/platform-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"platform-config.js","sourceRoot":"","sources":["../../../src/contracts/schemas/platform-config.ts"],"names":[],"mappings":"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"}
@@ -487,6 +487,123 @@ describe('ChatService.sendRoomMessage (real PG)', () => {
487
487
  expect(await db.drizzle.db.select().from(chatMessage)).toHaveLength(0);
488
488
  });
489
489
  });
490
+ describe('ChatService @mention detection (real PG)', () => {
491
+ function mentionDirectory(summaries) {
492
+ return mock({
493
+ lookupPlayers: async () => [],
494
+ getPlayerByUsername: vi
495
+ .fn()
496
+ .mockImplementation((username) => Promise.resolve(summaries.find((s) => s.username.toLowerCase() === username.toLowerCase()) ?? null)),
497
+ });
498
+ }
499
+ function summaryFor(userId, username) {
500
+ return {
501
+ playerId: randomUUID(),
502
+ userId,
503
+ username,
504
+ email: `${username}@example.com`,
505
+ kycStatus: null,
506
+ language: null,
507
+ avatarUrl: null,
508
+ createdAt: new Date(),
509
+ level: 1,
510
+ currency: 'USD',
511
+ };
512
+ }
513
+ it('resolves an @username in a room message and emits chat.user.mentioned', async () => {
514
+ const bobId = randomUUID();
515
+ const { svc, events } = makeService(mentionDirectory([summaryFor(bobId, 'bob')]));
516
+ const room = await seedRoom();
517
+ const msg = await svc.sendRoomMessage({
518
+ userId: randomUUID(),
519
+ username: 'alice',
520
+ roomId: room.id,
521
+ content: 'hello @bob, welcome',
522
+ });
523
+ await waitFor(() => vi.mocked(events.emit).mock.calls.some(([topic]) => topic === 'chat.user.mentioned'));
524
+ expect(events.emit).toHaveBeenCalledWith('chat.user.mentioned', {
525
+ mentionedUserId: bobId,
526
+ byUserId: msg.userId,
527
+ roomId: room.id,
528
+ messageId: msg.id,
529
+ });
530
+ });
531
+ it('resolves an @username in a global message with a null roomId', async () => {
532
+ const bobId = randomUUID();
533
+ const { svc, events } = makeService(mentionDirectory([summaryFor(bobId, 'bob')]));
534
+ const authorId = randomUUID();
535
+ const msg = await svc.sendGlobalMessage({
536
+ userId: authorId,
537
+ username: 'alice',
538
+ content: 'hey @bob',
539
+ });
540
+ await waitFor(() => vi.mocked(events.emit).mock.calls.some(([topic]) => topic === 'chat.user.mentioned'));
541
+ expect(events.emit).toHaveBeenCalledWith('chat.user.mentioned', {
542
+ mentionedUserId: bobId,
543
+ byUserId: authorId,
544
+ roomId: null,
545
+ messageId: msg.id,
546
+ });
547
+ });
548
+ it('excludes a self-mention', async () => {
549
+ const authorId = randomUUID();
550
+ const { svc, events } = makeService(mentionDirectory([summaryFor(authorId, 'alice')]));
551
+ await svc.sendGlobalMessage({
552
+ userId: authorId,
553
+ username: 'alice',
554
+ content: 'talking to myself @alice',
555
+ });
556
+ await new Promise((resolve) => setTimeout(resolve, 20));
557
+ expect(events.emit).not.toHaveBeenCalledWith('chat.user.mentioned', expect.anything());
558
+ });
559
+ it('emits once per uniquely mentioned user even when repeated in the message', async () => {
560
+ const bobId = randomUUID();
561
+ const { svc, events } = makeService(mentionDirectory([summaryFor(bobId, 'bob')]));
562
+ await svc.sendGlobalMessage({
563
+ userId: randomUUID(),
564
+ username: 'alice',
565
+ content: '@bob @bob are you there @Bob?',
566
+ });
567
+ await waitFor(() => vi.mocked(events.emit).mock.calls.some(([topic]) => topic === 'chat.user.mentioned'));
568
+ const mentionCalls = vi
569
+ .mocked(events.emit)
570
+ .mock.calls.filter(([topic]) => topic === 'chat.user.mentioned');
571
+ expect(mentionCalls).toHaveLength(1);
572
+ });
573
+ it('silently drops an @token that does not resolve to a known username', async () => {
574
+ const { svc, events } = makeService(mentionDirectory([]));
575
+ await expect(svc.sendGlobalMessage({ userId: randomUUID(), username: 'alice', content: 'hello @nobody' })).resolves.toBeDefined();
576
+ await new Promise((resolve) => setTimeout(resolve, 20));
577
+ expect(events.emit).not.toHaveBeenCalledWith('chat.user.mentioned', expect.anything());
578
+ });
579
+ it('does not treat the domain part of an email address as a mention', async () => {
580
+ const acmeId = randomUUID();
581
+ const { svc, events } = makeService(mentionDirectory([summaryFor(acmeId, 'acme')]));
582
+ await expect(svc.sendGlobalMessage({
583
+ userId: randomUUID(),
584
+ username: 'alice',
585
+ content: 'contact me at info@acme.com',
586
+ })).resolves.toBeDefined();
587
+ await new Promise((resolve) => setTimeout(resolve, 20));
588
+ expect(events.emit).not.toHaveBeenCalledWith('chat.user.mentioned', expect.anything());
589
+ });
590
+ it('does not emit chat.user.mentioned when the mentioned user has blocked the sender', async () => {
591
+ const bobId = randomUUID();
592
+ const authorId = randomUUID();
593
+ const { svc, events } = makeService(mentionDirectory([summaryFor(bobId, 'bob')]));
594
+ await svc.blockUser(bobId, authorId);
595
+ await svc.sendGlobalMessage({ userId: authorId, username: 'alice', content: 'hello @bob' });
596
+ await new Promise((resolve) => setTimeout(resolve, 20));
597
+ expect(events.emit).not.toHaveBeenCalledWith('chat.user.mentioned', expect.anything());
598
+ });
599
+ it('fails closed (does not emit) when the block check throws', async () => {
600
+ const authorId = randomUUID();
601
+ const { svc, events } = makeService(mentionDirectory([summaryFor('not-a-valid-uuid', 'bob')]));
602
+ await expect(svc.sendGlobalMessage({ userId: authorId, username: 'alice', content: 'hello @bob' })).resolves.toBeDefined();
603
+ await new Promise((resolve) => setTimeout(resolve, 20));
604
+ expect(events.emit).not.toHaveBeenCalledWith('chat.user.mentioned', expect.anything());
605
+ });
606
+ });
490
607
  describe('ChatService.deleteMessage (real PG)', () => {
491
608
  it('soft-deletes a message for a room owner and publishes a tombstone', async () => {
492
609
  const { svc } = makeService();