@openora/core 0.4.1-canary.39 → 0.4.1-canary.41

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 (248) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/admin-console/contract/index.d.ts +2 -0
  3. package/dist/admin-console/contract/index.d.ts.map +1 -1
  4. package/dist/admin-console/router/index.d.ts +1 -0
  5. package/dist/admin-console/router/index.d.ts.map +1 -1
  6. package/dist/admin-console/service/backoffice.service.d.ts +1 -1
  7. package/dist/audit/plugin.d.ts.map +1 -1
  8. package/dist/audit/plugin.js +48 -1
  9. package/dist/audit/plugin.js.map +1 -1
  10. package/dist/common/errors/errors.classes.js +3 -3
  11. package/dist/common/errors/errors.classes.js.map +1 -1
  12. package/dist/common/errors/errors.mapper.js +1 -1
  13. package/dist/common/errors/errors.mapper.js.map +1 -1
  14. package/dist/compliance/__tests__/hmac-kyc-webhook-verifier.test.js +66 -12
  15. package/dist/compliance/__tests__/hmac-kyc-webhook-verifier.test.js.map +1 -1
  16. package/dist/compliance/__tests__/kyc-admin.router.test.d.ts +2 -0
  17. package/dist/compliance/__tests__/kyc-admin.router.test.d.ts.map +1 -0
  18. package/dist/compliance/__tests__/kyc-admin.router.test.js +191 -0
  19. package/dist/compliance/__tests__/kyc-admin.router.test.js.map +1 -0
  20. package/dist/compliance/__tests__/kyc-webhook.router.test.d.ts +2 -0
  21. package/dist/compliance/__tests__/kyc-webhook.router.test.d.ts.map +1 -0
  22. package/dist/compliance/__tests__/kyc-webhook.router.test.js +148 -0
  23. package/dist/compliance/__tests__/kyc-webhook.router.test.js.map +1 -0
  24. package/dist/compliance/__tests__/kyc.service.test.js +16 -10
  25. package/dist/compliance/__tests__/kyc.service.test.js.map +1 -1
  26. package/dist/compliance/__tests__/rg.router.test.js +5 -1
  27. package/dist/compliance/__tests__/rg.router.test.js.map +1 -1
  28. package/dist/compliance/adapters/hmac-kyc-webhook-verifier.d.ts +16 -3
  29. package/dist/compliance/adapters/hmac-kyc-webhook-verifier.d.ts.map +1 -1
  30. package/dist/compliance/adapters/hmac-kyc-webhook-verifier.js +47 -5
  31. package/dist/compliance/adapters/hmac-kyc-webhook-verifier.js.map +1 -1
  32. package/dist/compliance/contract/index.d.ts +312 -0
  33. package/dist/compliance/contract/index.d.ts.map +1 -1
  34. package/dist/compliance/contract/index.js +50 -1
  35. package/dist/compliance/contract/index.js.map +1 -1
  36. package/dist/compliance/drizzle/migrations/0002_condemned_monster_badoon.sql +3 -0
  37. package/dist/compliance/drizzle/migrations/0003_public_spirit.sql +1 -0
  38. package/dist/compliance/drizzle/migrations/meta/0002_snapshot.json +673 -0
  39. package/dist/compliance/drizzle/migrations/meta/0003_snapshot.json +679 -0
  40. package/dist/compliance/drizzle/migrations/meta/_journal.json +14 -0
  41. package/dist/compliance/plugin.d.ts.map +1 -1
  42. package/dist/compliance/plugin.js +23 -3
  43. package/dist/compliance/plugin.js.map +1 -1
  44. package/dist/compliance/router/index.d.ts +186 -2
  45. package/dist/compliance/router/index.d.ts.map +1 -1
  46. package/dist/compliance/router/index.js +52 -3
  47. package/dist/compliance/router/index.js.map +1 -1
  48. package/dist/compliance/schema/index.d.ts +65 -3
  49. package/dist/compliance/schema/index.d.ts.map +1 -1
  50. package/dist/compliance/schema/index.js +8 -0
  51. package/dist/compliance/schema/index.js.map +1 -1
  52. package/dist/compliance/service/kyc.service.d.ts +153 -8
  53. package/dist/compliance/service/kyc.service.d.ts.map +1 -1
  54. package/dist/compliance/service/kyc.service.js +264 -32
  55. package/dist/compliance/service/kyc.service.js.map +1 -1
  56. package/dist/contracts/adapters/audit.d.ts +1 -1
  57. package/dist/contracts/adapters/audit.d.ts.map +1 -1
  58. package/dist/contracts/adapters/audit.js.map +1 -1
  59. package/dist/contracts/adapters/identity-reader.d.ts +9 -3
  60. package/dist/contracts/adapters/identity-reader.d.ts.map +1 -1
  61. package/dist/contracts/adapters/identity-reader.js.map +1 -1
  62. package/dist/contracts/adapters/index.d.ts +4 -2
  63. package/dist/contracts/adapters/index.d.ts.map +1 -1
  64. package/dist/contracts/adapters/index.js +2 -1
  65. package/dist/contracts/adapters/index.js.map +1 -1
  66. package/dist/contracts/adapters/kyc.d.ts +90 -5
  67. package/dist/contracts/adapters/kyc.d.ts.map +1 -1
  68. package/dist/contracts/adapters/kyc.js +23 -0
  69. package/dist/contracts/adapters/kyc.js.map +1 -1
  70. package/dist/contracts/adapters/tag-evaluation-commands.d.ts +10 -0
  71. package/dist/contracts/adapters/tag-evaluation-commands.d.ts.map +1 -0
  72. package/dist/contracts/adapters/tag-evaluation-commands.js +11 -0
  73. package/dist/contracts/adapters/tag-evaluation-commands.js.map +1 -0
  74. package/dist/contracts/adapters/wallet-reader.d.ts +8 -0
  75. package/dist/contracts/adapters/wallet-reader.d.ts.map +1 -1
  76. package/dist/contracts/adapters/wallet-reader.js.map +1 -1
  77. package/dist/contracts/schemas/__tests__/events.test.js +1 -1
  78. package/dist/contracts/schemas/__tests__/player-schemas.test.d.ts +2 -0
  79. package/dist/contracts/schemas/__tests__/player-schemas.test.d.ts.map +1 -0
  80. package/dist/contracts/schemas/__tests__/player-schemas.test.js +30 -0
  81. package/dist/contracts/schemas/__tests__/player-schemas.test.js.map +1 -0
  82. package/dist/contracts/schemas/events.d.ts +84 -0
  83. package/dist/contracts/schemas/events.d.ts.map +1 -1
  84. package/dist/contracts/schemas/events.js +24 -2
  85. package/dist/contracts/schemas/events.js.map +1 -1
  86. package/dist/contracts/schemas/platform-config.d.ts +13 -1
  87. package/dist/contracts/schemas/platform-config.d.ts.map +1 -1
  88. package/dist/contracts/schemas/player.d.ts +36 -3
  89. package/dist/contracts/schemas/player.d.ts.map +1 -1
  90. package/dist/contracts/schemas/player.js +14 -0
  91. package/dist/contracts/schemas/player.js.map +1 -1
  92. package/dist/contracts/schemas/tag.d.ts +85 -1
  93. package/dist/contracts/schemas/tag.d.ts.map +1 -1
  94. package/dist/contracts/schemas/tag.js +12 -0
  95. package/dist/contracts/schemas/tag.js.map +1 -1
  96. package/dist/engagement/notifications/contract/index.d.ts +5 -1
  97. package/dist/engagement/notifications/contract/index.d.ts.map +1 -1
  98. package/dist/engagement/notifications/contract/index.js +5 -1
  99. package/dist/engagement/notifications/contract/index.js.map +1 -1
  100. package/dist/engagement/notifications/plugin.d.ts.map +1 -1
  101. package/dist/engagement/notifications/plugin.js +43 -3
  102. package/dist/engagement/notifications/plugin.js.map +1 -1
  103. package/dist/engagement/notifications/router/index.d.ts +1 -0
  104. package/dist/engagement/notifications/router/index.d.ts.map +1 -1
  105. package/dist/iam/service/iam.service.d.ts +1 -1
  106. package/dist/pam/identity/__tests__/admin-user-directory.test.js +1 -1
  107. package/dist/pam/identity/adapters/identity-reader.service.d.ts +6 -4
  108. package/dist/pam/identity/adapters/identity-reader.service.d.ts.map +1 -1
  109. package/dist/pam/identity/adapters/identity-reader.service.js +19 -1
  110. package/dist/pam/identity/adapters/identity-reader.service.js.map +1 -1
  111. package/dist/pam/identity/admin-user-directory.d.ts +1 -1
  112. package/dist/pam/identity/admin-user-directory.d.ts.map +1 -1
  113. package/dist/pam/identity/admin-user-directory.js +6 -3
  114. package/dist/pam/identity/admin-user-directory.js.map +1 -1
  115. package/dist/pam/identity/service/identity.service.d.ts.map +1 -1
  116. package/dist/pam/identity/service/identity.service.js +4 -0
  117. package/dist/pam/identity/service/identity.service.js.map +1 -1
  118. package/dist/pam/player-management/__tests__/kyc-status-writer.test.js +5 -2
  119. package/dist/pam/player-management/__tests__/kyc-status-writer.test.js.map +1 -1
  120. package/dist/pam/player-management/__tests__/player.router.test.js +27 -20
  121. package/dist/pam/player-management/__tests__/player.router.test.js.map +1 -1
  122. package/dist/pam/player-management/__tests__/player.service.test.js +30 -31
  123. package/dist/pam/player-management/__tests__/player.service.test.js.map +1 -1
  124. package/dist/pam/player-management/contract/index.d.ts +37 -9
  125. package/dist/pam/player-management/contract/index.d.ts.map +1 -1
  126. package/dist/pam/player-management/contract/index.js +0 -1
  127. package/dist/pam/player-management/contract/index.js.map +1 -1
  128. package/dist/pam/player-management/plugin.d.ts.map +1 -1
  129. package/dist/pam/player-management/plugin.js +3 -2
  130. package/dist/pam/player-management/plugin.js.map +1 -1
  131. package/dist/pam/player-management/router/index.d.ts +32 -10
  132. package/dist/pam/player-management/router/index.d.ts.map +1 -1
  133. package/dist/pam/player-management/router/index.js +48 -16
  134. package/dist/pam/player-management/router/index.js.map +1 -1
  135. package/dist/pam/player-management/service/kyc-status-writer.d.ts +3 -2
  136. package/dist/pam/player-management/service/kyc-status-writer.d.ts.map +1 -1
  137. package/dist/pam/player-management/service/kyc-status-writer.js +24 -10
  138. package/dist/pam/player-management/service/kyc-status-writer.js.map +1 -1
  139. package/dist/pam/player-management/service/player.service.d.ts +10 -9
  140. package/dist/pam/player-management/service/player.service.d.ts.map +1 -1
  141. package/dist/pam/player-management/service/player.service.js +24 -12
  142. package/dist/pam/player-management/service/player.service.js.map +1 -1
  143. package/dist/pam/profile/contract/index.d.ts +2 -0
  144. package/dist/pam/profile/contract/index.d.ts.map +1 -1
  145. package/dist/pam/profile/drizzle/migrations/0001_powerful_tiger_shark.sql +1 -0
  146. package/dist/pam/profile/drizzle/migrations/meta/0001_snapshot.json +191 -0
  147. package/dist/pam/profile/drizzle/migrations/meta/_journal.json +7 -0
  148. package/dist/pam/profile/react/profile.d.ts +2 -2
  149. package/dist/pam/profile/router/index.d.ts +2 -0
  150. package/dist/pam/profile/router/index.d.ts.map +1 -1
  151. package/dist/pam/profile/schema/index.d.ts +3 -3
  152. package/dist/pam/profile/schema/index.d.ts.map +1 -1
  153. package/dist/pam/profile/service/profile.service.d.ts +2 -2
  154. package/dist/pam/shared/player-mapper.d.ts +1 -1
  155. package/dist/pam/tag/__tests__/tag-evaluation.service.test.js +619 -19
  156. package/dist/pam/tag/__tests__/tag-evaluation.service.test.js.map +1 -1
  157. package/dist/pam/tag/__tests__/tag-mappers.test.js +25 -0
  158. package/dist/pam/tag/__tests__/tag-mappers.test.js.map +1 -1
  159. package/dist/pam/tag/__tests__/tag.router.test.js +71 -1
  160. package/dist/pam/tag/__tests__/tag.router.test.js.map +1 -1
  161. package/dist/pam/tag/__tests__/tag.service.test.js +342 -15
  162. package/dist/pam/tag/__tests__/tag.service.test.js.map +1 -1
  163. package/dist/pam/tag/contract/index.d.ts +123 -0
  164. package/dist/pam/tag/contract/index.d.ts.map +1 -1
  165. package/dist/pam/tag/contract/index.js +3 -0
  166. package/dist/pam/tag/contract/index.js.map +1 -1
  167. package/dist/pam/tag/contract/player-tag-assign-metadata.d.ts +37 -0
  168. package/dist/pam/tag/contract/player-tag-assign-metadata.d.ts.map +1 -0
  169. package/dist/pam/tag/contract/player-tag-assign-metadata.js +20 -0
  170. package/dist/pam/tag/contract/player-tag-assign-metadata.js.map +1 -0
  171. package/dist/pam/tag/drizzle/migrations/0002_silent_skaar.sql +4 -0
  172. package/dist/pam/tag/drizzle/migrations/0003_overconfident_guardian.sql +3 -0
  173. package/dist/pam/tag/drizzle/migrations/0004_curvy_wither.sql +2 -0
  174. package/dist/pam/tag/drizzle/migrations/meta/0002_snapshot.json +335 -0
  175. package/dist/pam/tag/drizzle/migrations/meta/0003_snapshot.json +343 -0
  176. package/dist/pam/tag/drizzle/migrations/meta/0004_snapshot.json +345 -0
  177. package/dist/pam/tag/drizzle/migrations/meta/_journal.json +21 -0
  178. package/dist/pam/tag/migrate.d.ts.map +1 -1
  179. package/dist/pam/tag/migrate.js +34 -0
  180. package/dist/pam/tag/migrate.js.map +1 -1
  181. package/dist/pam/tag/plugin.d.ts.map +1 -1
  182. package/dist/pam/tag/plugin.js +43 -16
  183. package/dist/pam/tag/plugin.js.map +1 -1
  184. package/dist/pam/tag/router/index.d.ts +105 -0
  185. package/dist/pam/tag/router/index.d.ts.map +1 -1
  186. package/dist/pam/tag/router/index.js +34 -18
  187. package/dist/pam/tag/router/index.js.map +1 -1
  188. package/dist/pam/tag/schema/index.d.ts +42 -3
  189. package/dist/pam/tag/schema/index.d.ts.map +1 -1
  190. package/dist/pam/tag/schema/index.js +13 -2
  191. package/dist/pam/tag/schema/index.js.map +1 -1
  192. package/dist/pam/tag/seed/data/default-tag-rules.d.ts.map +1 -1
  193. package/dist/pam/tag/seed/data/default-tag-rules.js +42 -0
  194. package/dist/pam/tag/seed/data/default-tag-rules.js.map +1 -1
  195. package/dist/pam/tag/seed/data/default-tags.d.ts.map +1 -1
  196. package/dist/pam/tag/seed/data/default-tags.js +6 -0
  197. package/dist/pam/tag/seed/data/default-tags.js.map +1 -1
  198. package/dist/pam/tag/service/tag-evaluation.service.d.ts +141 -16
  199. package/dist/pam/tag/service/tag-evaluation.service.d.ts.map +1 -1
  200. package/dist/pam/tag/service/tag-evaluation.service.js +472 -47
  201. package/dist/pam/tag/service/tag-evaluation.service.js.map +1 -1
  202. package/dist/pam/tag/service/tag-mappers.d.ts +1 -1
  203. package/dist/pam/tag/service/tag-mappers.d.ts.map +1 -1
  204. package/dist/pam/tag/service/tag-mappers.js +1 -0
  205. package/dist/pam/tag/service/tag-mappers.js.map +1 -1
  206. package/dist/pam/tag/service/tag-rule.service.d.ts +3 -3
  207. package/dist/pam/tag/service/tag.service.d.ts +141 -11
  208. package/dist/pam/tag/service/tag.service.d.ts.map +1 -1
  209. package/dist/pam/tag/service/tag.service.js +242 -23
  210. package/dist/pam/tag/service/tag.service.js.map +1 -1
  211. package/dist/server/auth/permissions.d.ts +12 -0
  212. package/dist/server/auth/permissions.d.ts.map +1 -1
  213. package/dist/server/auth/permissions.js +2 -0
  214. package/dist/server/auth/permissions.js.map +1 -1
  215. package/dist/server/db/__tests__/migrate.test.js +79 -2
  216. package/dist/server/db/__tests__/migrate.test.js.map +1 -1
  217. package/dist/server/db/migrate.d.ts +11 -0
  218. package/dist/server/db/migrate.d.ts.map +1 -1
  219. package/dist/server/db/migrate.js +3 -0
  220. package/dist/server/db/migrate.js.map +1 -1
  221. package/dist/server/kernel/bullmq-job-queue.d.ts.map +1 -1
  222. package/dist/server/kernel/bullmq-job-queue.js +17 -0
  223. package/dist/server/kernel/bullmq-job-queue.js.map +1 -1
  224. package/dist/server/plugin-host/__tests__/core-plugins.test.js +1 -1
  225. package/dist/server/plugin-host/__tests__/core-plugins.test.js.map +1 -1
  226. package/dist/server/plugin-host/define-plugin.d.ts +2 -2
  227. package/dist/server/plugin-host/define-plugin.d.ts.map +1 -1
  228. package/dist/server/plugin-host/define-plugin.js.map +1 -1
  229. package/dist/wallet/__tests__/wallet-auto-withdrawal.test.js +60 -0
  230. package/dist/wallet/__tests__/wallet-auto-withdrawal.test.js.map +1 -1
  231. package/dist/wallet/__tests__/wallet.service.test.js +59 -0
  232. package/dist/wallet/__tests__/wallet.service.test.js.map +1 -1
  233. package/dist/wallet/adapters/wallet-reader.service.d.ts +1 -0
  234. package/dist/wallet/adapters/wallet-reader.service.d.ts.map +1 -1
  235. package/dist/wallet/adapters/wallet-reader.service.js +18 -1
  236. package/dist/wallet/adapters/wallet-reader.service.js.map +1 -1
  237. package/dist/wallet/contract/index.d.ts +4 -0
  238. package/dist/wallet/contract/index.d.ts.map +1 -1
  239. package/dist/wallet/plugin.d.ts.map +1 -1
  240. package/dist/wallet/plugin.js +7 -4
  241. package/dist/wallet/plugin.js.map +1 -1
  242. package/dist/wallet/router/index.d.ts +2 -0
  243. package/dist/wallet/router/index.d.ts.map +1 -1
  244. package/dist/wallet/service/wallet.service.d.ts +5 -4
  245. package/dist/wallet/service/wallet.service.d.ts.map +1 -1
  246. package/dist/wallet/service/wallet.service.js +28 -8
  247. package/dist/wallet/service/wallet.service.js.map +1 -1
  248. package/package.json +1 -1
@@ -1,12 +1,50 @@
1
- import { findOneOrThrow, makeNotFoundError, pageToOffset, alreadyInUseError, } from '@openora/core/server';
1
+ import { findOneOrThrow, makeNotFoundError, makeConflictError, pageToOffset, alreadyInUseError, } from '@openora/core/server';
2
2
  import { and, asc, count, desc, eq, inArray, isNull, notInArray } from 'drizzle-orm';
3
+ import { DatabaseError } from 'pg';
3
4
  import { player } from '@openora/core/pam/schema/profile';
4
5
  import { playerTag, tag } from '../schema/index.js';
5
6
  import { mapDbError } from '@openora/core/common/errors';
6
7
  import { toTag, toPlayerTagWithTag, SYSTEM_ACTOR_ID } from './tag-mappers.js';
8
+ function pgErrorCode(e) {
9
+ if (e instanceof DatabaseError) {
10
+ return e.code;
11
+ }
12
+ // drizzle-orm wraps every driver-thrown error in DrizzleQueryError, exposing the
13
+ // real pg DatabaseError only via `.cause`.
14
+ if (e instanceof Error && e.cause instanceof DatabaseError) {
15
+ return e.cause.code;
16
+ }
17
+ return undefined;
18
+ }
7
19
  export const TagNotFoundError = makeNotFoundError('Tag');
8
20
  export const TagAlreadyInUseError = alreadyInUseError('Tag');
9
21
  export const TagAssignmentNotFoundError = makeNotFoundError('Tag Assignment');
22
+ // Distinct from TagAlreadyInUseError above (a player already holding this tag active) -
23
+ // this is the tag CATALOG key colliding on create.
24
+ export const TagKeyConflictError = makeConflictError('TagKeyConflictError', 'Tag key already exists');
25
+ // A tag can't be deleted while a playerTag/tagRule row still references it
26
+ // (onDelete: 'restrict' in the schema).
27
+ export const TagInUseError = makeConflictError('TagInUseError', 'Tag is still referenced by a player tag or tag rule and cannot be deleted');
28
+ // "First evidence wins per breach dimension, but a dimension that was never recorded gets
29
+ // filled in the moment it's observed." Never overwrites an already-populated dimension with
30
+ // fresher numbers - once a dimension has ever been recorded, the resweep treats it as sticky.
31
+ // Returns the SAME `existing` reference when nothing new was merged in, so the caller can
32
+ // detect a no-op write via reference equality.
33
+ function mergeAssignMetadata(existing, incoming) {
34
+ if (!incoming) {
35
+ return existing;
36
+ }
37
+ if (!existing) {
38
+ return incoming;
39
+ }
40
+ if (existing.amountBreach && existing.countBreach) {
41
+ return existing;
42
+ }
43
+ return {
44
+ amountBreach: existing.amountBreach ?? incoming.amountBreach,
45
+ countBreach: existing.countBreach ?? incoming.countBreach,
46
+ };
47
+ }
10
48
  export class TagService {
11
49
  drizzle;
12
50
  event;
@@ -33,27 +71,59 @@ export class TagService {
33
71
  }
34
72
  return result;
35
73
  }
74
+ /**
75
+ * Active holders (auth `userId`, not `player.id`) of tagKey, each with the
76
+ * assignMetadata recorded at assignment time. Internal to this module - used only by
77
+ * TagEvaluationService for the daily high_risk resweep to gate removal on WHICH breach
78
+ * condition originally fired (an amount breach, or a null/legacy row, must never be
79
+ * auto-cleared); deliberately not exposed on the PLAYER_TAGS port since no other module
80
+ * needs "list holders of tag X" today.
81
+ */
82
+ async listActiveHoldersByTagKey(tagKey) {
83
+ const rows = await this.drizzle.db
84
+ .select({ userId: player.userId, assignMetadata: playerTag.assignMetadata })
85
+ .from(playerTag)
86
+ .innerJoin(tag, eq(playerTag.tagId, tag.id))
87
+ .innerJoin(player, eq(player.id, playerTag.playerId))
88
+ .where(and(eq(tag.key, tagKey), isNull(playerTag.removedAt)));
89
+ return rows.map((r) => ({ userId: r.userId, assignMetadata: r.assignMetadata ?? null }));
90
+ }
36
91
  async _findTagByKeyOrThrow(tagKey, trx) {
37
92
  const results = await trx.select().from(tag).where(eq(tag.key, tagKey)).limit(1);
38
93
  return toTag(findOneOrThrow(results, new TagNotFoundError(tagKey)));
39
94
  }
40
- async createTag(args) {
95
+ async createTag(args, actorId) {
41
96
  try {
42
97
  const db = this.drizzle.db;
43
98
  const [created] = await db.insert(tag).values(args).returning();
44
- return toTag(created);
99
+ const result = toTag(created);
100
+ void this.event.emit('tag.created', { key: result.key, isSticky: result.isSticky, actorId });
101
+ return result;
45
102
  }
46
103
  catch (e) {
104
+ if (pgErrorCode(e) === '23505') {
105
+ throw new TagKeyConflictError();
106
+ }
47
107
  mapDbError(e);
48
108
  }
49
109
  }
50
- async deleteTag(args) {
110
+ async deleteTag(args, actorId) {
51
111
  try {
52
112
  const db = this.drizzle.db;
53
- await db.delete(tag).where(eq(tag.key, args.key));
113
+ // .returning() is the only signal a genuine delete happened - without it a
114
+ // no-op delete of a missing key would still fall through and emit tag.deleted,
115
+ // which the audit module records as a real deletion that never occurred.
116
+ const deleted = await db.delete(tag).where(eq(tag.key, args.key)).returning();
117
+ if (deleted.length === 0) {
118
+ throw new TagNotFoundError(args.key);
119
+ }
120
+ void this.event.emit('tag.deleted', { key: args.key, actorId });
54
121
  return true;
55
122
  }
56
123
  catch (e) {
124
+ if (pgErrorCode(e) === '23503') {
125
+ throw new TagInUseError();
126
+ }
57
127
  mapDbError(e);
58
128
  }
59
129
  }
@@ -99,26 +169,64 @@ export class TagService {
99
169
  .orderBy(asc(tag.key));
100
170
  return rows.map(toTag);
101
171
  }
172
+ // Core idempotent assign, shared by assignPlayerTag (own transaction) and
173
+ // assignPlayerTagInTx (caller-supplied transaction). Does NOT emit - callers decide
174
+ // when, since assignPlayerTagInTx's caller owns a transaction this method has no
175
+ // visibility into committing.
176
+ //
177
+ // Returns a status instead of throwing for the "already active" case: throwing here
178
+ // would roll back the merge UPDATE below along with the whole transaction when this
179
+ // runs inside assignPlayerTag's own db.transaction(...). Returning lets that
180
+ // transaction commit the metadata enrichment first; the public methods translate
181
+ // 'already_active' into TagAlreadyInUseError only after the transaction has resolved.
182
+ async _assignPlayerTagOnTx(trx, args) {
183
+ const { tagKey, ...restArgs } = args;
184
+ const foundTag = await this._findTagByKeyOrThrow(tagKey, trx);
185
+ // Fast/friendly pre-check only - the real guard is the partial unique index
186
+ // (player_tag_active_key) backing the onConflictDoNothing below. Without it, two
187
+ // concurrent calls (or the same at-least-once event redelivered) can both pass
188
+ // this SELECT before either commits, creating duplicate active rows.
189
+ const [existing] = await trx
190
+ .select()
191
+ .from(playerTag)
192
+ .where(and(eq(playerTag.tagId, foundTag.id), eq(playerTag.playerId, args.playerId), isNull(playerTag.removedAt)))
193
+ .limit(1);
194
+ if (existing) {
195
+ // A later event can reveal a breach dimension absent from the original assignment;
196
+ // without merging it in, the resweep would act on stale metadata and could wrongly
197
+ // clear a still-risky player.
198
+ const merged = mergeAssignMetadata(existing.assignMetadata, args.assignMetadata);
199
+ if (merged !== existing.assignMetadata) {
200
+ await trx
201
+ .update(playerTag)
202
+ .set({ assignMetadata: merged })
203
+ .where(eq(playerTag.id, existing.id));
204
+ }
205
+ return { status: 'already_active' };
206
+ }
207
+ // The loser of a genuine race hits the unique index here instead: its insert is a
208
+ // no-op (empty returning()), so it also reports 'already_active' - tryAssignTag
209
+ // already treats the resulting TagAlreadyInUseError as an idempotent no-op.
210
+ const [created] = await trx
211
+ .insert(playerTag)
212
+ .values({ ...restArgs, tagId: foundTag.id })
213
+ .onConflictDoNothing({
214
+ target: [playerTag.tagId, playerTag.playerId],
215
+ where: isNull(playerTag.removedAt),
216
+ })
217
+ .returning();
218
+ if (!created) {
219
+ return { status: 'already_active' };
220
+ }
221
+ return { status: 'created', row: toPlayerTagWithTag(created, foundTag.key) };
222
+ }
102
223
  async assignPlayerTag(args, meta) {
103
224
  try {
104
- const { tagKey, ...restArgs } = args;
105
225
  const db = this.drizzle.db;
106
- const result = await db.transaction(async (trx) => {
107
- const foundTag = await this._findTagByKeyOrThrow(tagKey, trx);
108
- const [existing] = await trx
109
- .select()
110
- .from(playerTag)
111
- .where(and(eq(playerTag.tagId, foundTag.id), eq(playerTag.playerId, args.playerId), isNull(playerTag.removedAt)))
112
- .limit(1);
113
- if (existing) {
114
- throw new TagAlreadyInUseError();
115
- }
116
- const [created] = await trx
117
- .insert(playerTag)
118
- .values({ ...restArgs, tagId: foundTag.id })
119
- .returning();
120
- return toPlayerTagWithTag(created, foundTag.key);
121
- });
226
+ const outcome = await db.transaction((trx) => this._assignPlayerTagOnTx(trx, args));
227
+ if (outcome.status === 'already_active') {
228
+ throw new TagAlreadyInUseError();
229
+ }
122
230
  void this.event.emit('tag.player.assigned', {
123
231
  playerId: args.playerId,
124
232
  tagKey: args.tagKey,
@@ -127,12 +235,58 @@ export class TagService {
127
235
  ip: meta?.ip ?? null,
128
236
  userAgent: meta?.userAgent ?? null,
129
237
  });
130
- return result;
238
+ return outcome.row;
239
+ }
240
+ catch (e) {
241
+ mapDbError(e);
242
+ }
243
+ }
244
+ /**
245
+ * Same idempotent assign as assignPlayerTag, but on a caller-supplied transaction handle
246
+ * (the TAG_EVALUATION_COMMANDS command-port idiom, ADR-0017) so the write commits
247
+ * atomically with the caller's own writes - eg wallet's withdraw() inserting the
248
+ * withdrawal request row. Emits tag.player.assigned right after the write (mirrors
249
+ * PlayerKycStatusWriter.setStatus): this method has no visibility into when the
250
+ * caller's own transaction actually commits, so - like every other caller-supplied-tx
251
+ * command port in this repo - it cannot defer the emit past that point.
252
+ */
253
+ async assignPlayerTagInTx(trx, args) {
254
+ try {
255
+ const outcome = await this._assignPlayerTagOnTx(trx, args);
256
+ if (outcome.status === 'already_active') {
257
+ throw new TagAlreadyInUseError();
258
+ }
259
+ void this.event.emit('tag.player.assigned', {
260
+ playerId: args.playerId,
261
+ tagKey: args.tagKey,
262
+ reason: args.assignReason,
263
+ actorId: args.assignActorUserId ?? SYSTEM_ACTOR_ID,
264
+ });
265
+ return outcome.row;
131
266
  }
132
267
  catch (e) {
133
268
  mapDbError(e);
134
269
  }
135
270
  }
271
+ async _removePlayerTagOnTx(trx, args) {
272
+ const foundTag = await this._findTagByKeyOrThrow(args.tagKey, trx);
273
+ const active = findOneOrThrow(await trx
274
+ .select()
275
+ .from(playerTag)
276
+ .where(and(eq(playerTag.tagId, foundTag.id), eq(playerTag.playerId, args.playerId), isNull(playerTag.removedAt)))
277
+ .limit(1), new TagAssignmentNotFoundError(args.playerId));
278
+ const [updated] = await trx
279
+ .update(playerTag)
280
+ .set({
281
+ removedAt: new Date(),
282
+ removalReason: args.removalReason,
283
+ removalActor: args.removalActor,
284
+ removalActorUserId: args.removalActorUserId,
285
+ })
286
+ .where(eq(playerTag.id, active.id))
287
+ .returning();
288
+ return toPlayerTagWithTag(updated, foundTag.key);
289
+ }
136
290
  async removePlayerTag(args, meta) {
137
291
  try {
138
292
  const db = this.drizzle.db;
@@ -169,5 +323,70 @@ export class TagService {
169
323
  mapDbError(e);
170
324
  }
171
325
  }
326
+ /**
327
+ * Atomically replaces a player's active assignment of tagKey - the same-key value
328
+ * swap the mutable `level` tag needs. Both halves run on ONE transaction: a missing
329
+ * active row makes the removal a silent no-op (unlike removePlayerTag), and a
330
+ * failure in the assign half rolls the removal back too, so the swap can never
331
+ * commit half-way and strand the player with no active row. Under a genuine
332
+ * concurrent replace for the same (tag, player), the loser serializes on the row
333
+ * lock + the player_tag_active_key unique index and throws TagAlreadyInUseError
334
+ * with NOTHING committed. Emits tag.player.removed (only when a row was actually
335
+ * removed) and tag.player.assigned after the commit.
336
+ */
337
+ async replacePlayerTag(args) {
338
+ try {
339
+ const db = this.drizzle.db;
340
+ const { removalReason, ...assignArgs } = args;
341
+ const result = await db.transaction(async (trx) => {
342
+ let removed = false;
343
+ try {
344
+ // App-level throw from findOneOrThrow, not a failed SQL statement, so
345
+ // catching it here does not abort the surrounding Postgres transaction.
346
+ await this._removePlayerTagOnTx(trx, {
347
+ playerId: args.playerId,
348
+ tagKey: args.tagKey,
349
+ removalReason,
350
+ removalActor: args.assignActor,
351
+ removalActorUserId: args.assignActorUserId,
352
+ });
353
+ removed = true;
354
+ }
355
+ catch (e) {
356
+ if (!(e instanceof TagAssignmentNotFoundError)) {
357
+ throw e;
358
+ }
359
+ }
360
+ const assigned = await this._assignPlayerTagOnTx(trx, assignArgs);
361
+ if (assigned.status === 'already_active') {
362
+ // Unlike assignPlayerTag/assignPlayerTagInTx (where a lost race is an
363
+ // idempotent no-op that must still let a metadata merge commit), a lost
364
+ // race HERE must roll back the whole swap, including the removal above -
365
+ // see the class doc: nothing may commit half-way. Throwing inside this
366
+ // db.transaction callback is exactly how that rollback happens.
367
+ throw new TagAlreadyInUseError();
368
+ }
369
+ return { row: assigned.row, removed };
370
+ });
371
+ if (result.removed) {
372
+ void this.event.emit('tag.player.removed', {
373
+ playerId: args.playerId,
374
+ tagKey: args.tagKey,
375
+ reason: removalReason,
376
+ actorId: args.assignActorUserId ?? SYSTEM_ACTOR_ID,
377
+ });
378
+ }
379
+ void this.event.emit('tag.player.assigned', {
380
+ playerId: args.playerId,
381
+ tagKey: args.tagKey,
382
+ reason: args.assignReason,
383
+ actorId: args.assignActorUserId ?? SYSTEM_ACTOR_ID,
384
+ });
385
+ return result.row;
386
+ }
387
+ catch (e) {
388
+ mapDbError(e);
389
+ }
390
+ }
172
391
  }
173
392
  //# sourceMappingURL=tag.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tag.service.js","sourceRoot":"","sources":["../../../../src/pam/tag/service/tag.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tag.service.js","sourceRoot":"","sources":["../../../../src/pam/tag/service/tag.service.ts"],"names":[],"mappings":"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"}
@@ -16,6 +16,7 @@ export declare const statement: {
16
16
  readonly sessions: readonly ["view", "revoke"];
17
17
  readonly 'player-note': readonly ["view", "create"];
18
18
  readonly 'tag-rule': readonly ["view", "update"];
19
+ readonly tag: readonly ["view", "create", "delete"];
19
20
  readonly 'chat-room': readonly ["view", "create", "update", "delete"];
20
21
  };
21
22
  export declare const ac: {
@@ -37,6 +38,7 @@ export declare const ac: {
37
38
  readonly sessions: readonly ["view", "revoke"];
38
39
  readonly 'player-note': readonly ["view", "create"];
39
40
  readonly 'tag-rule': readonly ["view", "update"];
41
+ readonly tag: readonly ["view", "create", "delete"];
40
42
  readonly 'chat-room': readonly ["view", "create", "update", "delete"];
41
43
  }, TRoleStatements>): import("better-auth/plugins/access").Role<import("better-auth/plugins/access").ExactRoleStatements<TRoleStatements>, {
42
44
  readonly player: readonly ["view", "update", "ban", "adjust-balance"];
@@ -56,6 +58,7 @@ export declare const ac: {
56
58
  readonly sessions: readonly ["view", "revoke"];
57
59
  readonly 'player-note': readonly ["view", "create"];
58
60
  readonly 'tag-rule': readonly ["view", "update"];
61
+ readonly tag: readonly ["view", "create", "delete"];
59
62
  readonly 'chat-room': readonly ["view", "create", "update", "delete"];
60
63
  }>;
61
64
  statements: {
@@ -76,6 +79,7 @@ export declare const ac: {
76
79
  readonly sessions: readonly ["view", "revoke"];
77
80
  readonly 'player-note': readonly ["view", "create"];
78
81
  readonly 'tag-rule': readonly ["view", "update"];
82
+ readonly tag: readonly ["view", "create", "delete"];
79
83
  readonly 'chat-room': readonly ["view", "create", "update", "delete"];
80
84
  };
81
85
  };
@@ -97,6 +101,7 @@ export declare const adminRole: import("better-auth/plugins/access").Role<import
97
101
  readonly sessions: ["view", "revoke"];
98
102
  readonly 'player-note': ["view", "create"];
99
103
  readonly 'tag-rule': ["view", "update"];
104
+ readonly tag: ["view", "create", "delete"];
100
105
  readonly 'chat-room': ["view", "create", "update", "delete"];
101
106
  }>, {
102
107
  readonly player: readonly ["view", "update", "ban", "adjust-balance"];
@@ -116,6 +121,7 @@ export declare const adminRole: import("better-auth/plugins/access").Role<import
116
121
  readonly sessions: readonly ["view", "revoke"];
117
122
  readonly 'player-note': readonly ["view", "create"];
118
123
  readonly 'tag-rule': readonly ["view", "update"];
124
+ readonly tag: readonly ["view", "create", "delete"];
119
125
  readonly 'chat-room': readonly ["view", "create", "update", "delete"];
120
126
  }>;
121
127
  export declare const supportRole: import("better-auth/plugins/access").Role<import("better-auth/plugins/access").ExactRoleStatements<{
@@ -142,6 +148,7 @@ export declare const supportRole: import("better-auth/plugins/access").Role<impo
142
148
  readonly sessions: readonly ["view", "revoke"];
143
149
  readonly 'player-note': readonly ["view", "create"];
144
150
  readonly 'tag-rule': readonly ["view", "update"];
151
+ readonly tag: readonly ["view", "create", "delete"];
145
152
  readonly 'chat-room': readonly ["view", "create", "update", "delete"];
146
153
  }>;
147
154
  export declare const contentManagerRole: import("better-auth/plugins/access").Role<import("better-auth/plugins/access").ExactRoleStatements<{
@@ -165,6 +172,7 @@ export declare const contentManagerRole: import("better-auth/plugins/access").Ro
165
172
  readonly sessions: readonly ["view", "revoke"];
166
173
  readonly 'player-note': readonly ["view", "create"];
167
174
  readonly 'tag-rule': readonly ["view", "update"];
175
+ readonly tag: readonly ["view", "create", "delete"];
168
176
  readonly 'chat-room': readonly ["view", "create", "update", "delete"];
169
177
  }>;
170
178
  export declare const roles: {
@@ -186,6 +194,7 @@ export declare const roles: {
186
194
  readonly sessions: ["view", "revoke"];
187
195
  readonly 'player-note': ["view", "create"];
188
196
  readonly 'tag-rule': ["view", "update"];
197
+ readonly tag: ["view", "create", "delete"];
189
198
  readonly 'chat-room': ["view", "create", "update", "delete"];
190
199
  }>, {
191
200
  readonly player: readonly ["view", "update", "ban", "adjust-balance"];
@@ -205,6 +214,7 @@ export declare const roles: {
205
214
  readonly sessions: readonly ["view", "revoke"];
206
215
  readonly 'player-note': readonly ["view", "create"];
207
216
  readonly 'tag-rule': readonly ["view", "update"];
217
+ readonly tag: readonly ["view", "create", "delete"];
208
218
  readonly 'chat-room': readonly ["view", "create", "update", "delete"];
209
219
  }>;
210
220
  readonly support: import("better-auth/plugins/access").Role<import("better-auth/plugins/access").ExactRoleStatements<{
@@ -231,6 +241,7 @@ export declare const roles: {
231
241
  readonly sessions: readonly ["view", "revoke"];
232
242
  readonly 'player-note': readonly ["view", "create"];
233
243
  readonly 'tag-rule': readonly ["view", "update"];
244
+ readonly tag: readonly ["view", "create", "delete"];
234
245
  readonly 'chat-room': readonly ["view", "create", "update", "delete"];
235
246
  }>;
236
247
  readonly 'content-manager': import("better-auth/plugins/access").Role<import("better-auth/plugins/access").ExactRoleStatements<{
@@ -254,6 +265,7 @@ export declare const roles: {
254
265
  readonly sessions: readonly ["view", "revoke"];
255
266
  readonly 'player-note': readonly ["view", "create"];
256
267
  readonly 'tag-rule': readonly ["view", "update"];
268
+ readonly tag: readonly ["view", "create", "delete"];
257
269
  readonly 'chat-room': readonly ["view", "create", "update", "delete"];
258
270
  }>;
259
271
  };
@@ -1 +1 @@
1
- {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../../src/server/auth/permissions.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;CAmBZ,CAAC;AAEX,eAAO,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAiC,CAAC;AAEjD,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmBpB,CAAC;AAEH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;EAMtB,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;EAG7B,CAAC;AAEH,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAIR,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,KAAK,CAAC;AAC1C,MAAM,MAAM,YAAY,GAAG,MAAM,OAAO,SAAS,CAAC;AAClD,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,YAAY,IAAI,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC"}
1
+ {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../../src/server/auth/permissions.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;CAoBZ,CAAC;AAEX,eAAO,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAiC,CAAC;AAEjD,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoBpB,CAAC;AAEH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;EAMtB,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;EAG7B,CAAC;AAEH,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAIR,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,KAAK,CAAC;AAC1C,MAAM,MAAM,YAAY,GAAG,MAAM,OAAO,SAAS,CAAC;AAClD,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,YAAY,IAAI,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC"}
@@ -17,6 +17,7 @@ export const statement = {
17
17
  sessions: ['view', 'revoke'],
18
18
  'player-note': ['view', 'create'],
19
19
  'tag-rule': ['view', 'update'],
20
+ tag: ['view', 'create', 'delete'],
20
21
  'chat-room': ['view', 'create', 'update', 'delete'],
21
22
  };
22
23
  export const ac = createAccessControl(statement);
@@ -38,6 +39,7 @@ export const adminRole = ac.newRole({
38
39
  sessions: ['view', 'revoke'],
39
40
  'player-note': ['view', 'create'],
40
41
  'tag-rule': ['view', 'update'],
42
+ tag: ['view', 'create', 'delete'],
41
43
  'chat-room': ['view', 'create', 'update', 'delete'],
42
44
  });
43
45
  export const supportRole = ac.newRole({
@@ -1 +1 @@
1
- {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../../src/server/auth/permissions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,MAAM,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,gBAAgB,CAAU;IAC5D,WAAW,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAU;IACxC,IAAI,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAU;IAC5C,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAU;IAC3D,UAAU,EAAE,CAAC,MAAM,EAAE,gBAAgB,EAAE,WAAW,CAAU;IAC5D,MAAM,EAAE,CAAC,MAAM,CAAU;IACzB,UAAU,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAU;IACvE,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAU;IAC/D,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAU;IAClC,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAU;IACjE,aAAa,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAU;IACtD,SAAS,EAAE,CAAC,MAAM,CAAU;IAC5B,UAAU,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,CAAU;IACrD,SAAS,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAU;IACtC,QAAQ,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAU;IACrC,aAAa,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAU;IAC1C,UAAU,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAU;IACvC,WAAW,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAU;CACpD,CAAC;AAEX,MAAM,CAAC,MAAM,EAAE,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;AAEjD,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC;IAClC,MAAM,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,gBAAgB,CAAC;IACnD,WAAW,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC/B,IAAI,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC;IACnC,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC;IAClD,UAAU,EAAE,CAAC,MAAM,EAAE,gBAAgB,EAAE,WAAW,CAAC;IACnD,MAAM,EAAE,CAAC,MAAM,CAAC;IAChB,UAAU,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC;IAC9D,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC;IACtD,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC;IACzB,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC;IACxD,aAAa,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC;IAC7C,SAAS,EAAE,CAAC,MAAM,CAAC;IACnB,UAAU,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,CAAC;IAC5C,SAAS,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC7B,QAAQ,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC5B,aAAa,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC;IACjC,UAAU,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC9B,WAAW,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC;CACpD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAAC;IACpC,MAAM,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC1B,WAAW,EAAE,CAAC,MAAM,CAAC;IACrB,UAAU,EAAE,CAAC,MAAM,CAAC;IACpB,MAAM,EAAE,CAAC,MAAM,CAAC;IAChB,SAAS,EAAE,CAAC,MAAM,CAAC;CACpB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC,OAAO,CAAC;IAC3C,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC;IAClD,IAAI,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC;CACpC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,KAAK,EAAE,SAAS;IAChB,OAAO,EAAE,WAAW;IACpB,iBAAiB,EAAE,kBAAkB;CAC7B,CAAC"}
1
+ {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../../src/server/auth/permissions.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,82 @@
1
- import { describe, expect, it, vi } from 'vitest';
2
- import { applyMigrationsIndividually, withMigrationAdvisoryLock } from '../migrate.js';
1
+ import { describe, expect, it, vi, beforeEach } from 'vitest';
2
+ const { calls, poolInstances, failOnSql, FakePool, readMigrationFilesMock } = vi.hoisted(() => {
3
+ const calls = [];
4
+ const poolInstances = [];
5
+ const failOnSql = { value: null };
6
+ class FakeClient {
7
+ query = vi.fn(async (sql) => {
8
+ if (failOnSql.value !== null && sql === failOnSql.value) {
9
+ throw new Error(`boom: ${sql}`);
10
+ }
11
+ calls.push(sql);
12
+ return { rows: [] };
13
+ });
14
+ release = vi.fn();
15
+ }
16
+ class FakePool {
17
+ opts;
18
+ query = vi.fn(async (sql) => {
19
+ if (failOnSql.value !== null && sql === failOnSql.value) {
20
+ throw new Error(`boom: ${sql}`);
21
+ }
22
+ calls.push(sql);
23
+ return { rows: [] };
24
+ });
25
+ connect = vi.fn(async () => new FakeClient());
26
+ end = vi.fn(async () => {
27
+ calls.push('end');
28
+ });
29
+ constructor(opts) {
30
+ this.opts = opts;
31
+ poolInstances.push(this);
32
+ }
33
+ }
34
+ const readMigrationFilesMock = vi.fn(() => []);
35
+ return { calls, poolInstances, failOnSql, FakePool, readMigrationFilesMock };
36
+ });
37
+ vi.mock('pg', () => ({ Pool: FakePool }));
38
+ vi.mock('drizzle-orm/migrator', () => ({ readMigrationFiles: readMigrationFilesMock }));
39
+ const { runMigrations, applyMigrationsIndividually, withMigrationAdvisoryLock } = await import('../migrate.js');
40
+ describe('runMigrations', () => {
41
+ beforeEach(() => {
42
+ calls.length = 0;
43
+ poolInstances.length = 0;
44
+ failOnSql.value = null;
45
+ readMigrationFilesMock.mockClear();
46
+ });
47
+ it('runs extensions, then preSql, before reading pending migrations', async () => {
48
+ await runMigrations({
49
+ migrationsFolder: '/tmp/migrations',
50
+ databaseUrl: 'postgres://test',
51
+ extensions: ['pg_trgm'],
52
+ preSql: ['UPDATE foo SET bar = 1', 'UPDATE baz SET qux = 2'],
53
+ });
54
+ const presqlIndex = calls.indexOf('UPDATE foo SET bar = 1');
55
+ const readIndex = calls.indexOf('SELECT hash FROM "drizzle"."__drizzle_migrations"');
56
+ expect(calls).toContain('CREATE EXTENSION IF NOT EXISTS pg_trgm');
57
+ expect(calls).toEqual(expect.arrayContaining(['UPDATE foo SET bar = 1', 'UPDATE baz SET qux = 2']));
58
+ expect(presqlIndex).toBeLessThan(readIndex);
59
+ expect(calls).toContain('end');
60
+ });
61
+ it('is a no-op (beyond bookkeeping) when preSql is omitted', async () => {
62
+ await runMigrations({
63
+ migrationsFolder: '/tmp/migrations',
64
+ databaseUrl: 'postgres://test',
65
+ });
66
+ expect(calls).not.toContain(undefined);
67
+ expect(calls).toContain('end');
68
+ });
69
+ it('closes the pool even when a preSql statement throws, and never reads pending migrations', async () => {
70
+ failOnSql.value = 'THIS WILL FAIL';
71
+ await expect(runMigrations({
72
+ migrationsFolder: '/tmp/migrations',
73
+ databaseUrl: 'postgres://test',
74
+ preSql: ['THIS WILL FAIL'],
75
+ })).rejects.toThrow('boom: THIS WILL FAIL');
76
+ expect(readMigrationFilesMock).not.toHaveBeenCalled();
77
+ expect(calls).toContain('end');
78
+ });
79
+ });
3
80
  const migrations = [
4
81
  {
5
82
  sql: ["ALTER TYPE room_category ADD VALUE 'private-chats';"],
@@ -1 +1 @@
1
- {"version":3,"file":"migrate.test.js","sourceRoot":"","sources":["../../../../src/server/db/__tests__/migrate.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAElD,OAAO,EAAE,2BAA2B,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAEvF,MAAM,UAAU,GAAoB;IAClC;QACE,GAAG,EAAE,CAAC,qDAAqD,CAAC;QAC5D,YAAY,EAAE,CAAC;QACf,IAAI,EAAE,KAAK;QACX,GAAG,EAAE,IAAI;KACV;IACD;QACE,GAAG,EAAE,CAAC,kDAAkD,CAAC;QACzD,YAAY,EAAE,CAAC;QACf,IAAI,EAAE,KAAK;QACX,GAAG,EAAE,IAAI;KACV;CACF,CAAC;AAEF,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,KAAK,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC;QAE3C,MAAM,2BAA2B,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;QAEzD,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,CAAC,uBAAuB,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,MAAM,CAAC,KAAK,CAAC,CAAC,uBAAuB,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,KAAK,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC;QAE5C,MAAM,yBAAyB,CAAC,EAAE,KAAK,EAAE,EAAE,mCAAmC,EAAE,MAAM,CAAC,CAAC;QAExF,MAAM,CAAC,KAAK,CAAC,CAAC,uBAAuB,CAAC,CAAC,EAAE,uCAAuC,EAAE;YAChF,mCAAmC;SACpC,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,EAAE,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,CAAC,uBAAuB,CAAC,CAAC,EAAE,yCAAyC,EAAE;YAClF,mCAAmC;SACpC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,KAAK,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAE9C,MAAM,MAAM,CACV,yBAAyB,CAAC,EAAE,KAAK,EAAE,EAAE,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACnF,MAAM,OAAO,CAAC;QAChB,CAAC,CAAC,CACH,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAE3B,MAAM,CAAC,KAAK,CAAC,CAAC,uBAAuB,CAAC,CAAC,EAAE,yCAAyC,EAAE;YAClF,mCAAmC;SACpC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"migrate.test.js","sourceRoot":"","sources":["../../../../src/server/db/__tests__/migrate.test.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,17 @@ export type RunMigrationsOptions = {
15
15
  * trgm index) declares it here instead of hand-editing a regenerated migration.
16
16
  */
17
17
  extensions?: string[];
18
+ /**
19
+ * Raw SQL statements to run, in order, before the migrator applies any pending migration.
20
+ * Unlike `extensions` (a bare identifier interpolated into a fixed `CREATE EXTENSION`
21
+ * template, hence the strict name check), each entry here is a full statement the caller is
22
+ * trusted to have written safely - these are literal string constants in module source, never
23
+ * user input. This is for data cleanup drizzle-kit has no way to generate because it isn't a
24
+ * schema diff at all (eg deduping rows that violate a new constraint a pending migration is
25
+ * about to add) - a module declares it here instead of hand-editing a regenerated migration,
26
+ * same rationale as `extensions`, different problem shape.
27
+ */
28
+ preSql?: string[];
18
29
  };
19
30
  type SqlClient = {
20
31
  query(sql: string, values?: unknown[]): Promise<unknown>;
@@ -1 +1 @@
1
- {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../../src/server/db/migrate.ts"],"names":[],"mappings":"AAMA,OAAO,eAAe,CAAC;AAEvB,OAAO,EAAsB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAG9E,MAAM,MAAM,oBAAoB,GAAG;IACjC,yFAAyF;IACzF,gBAAgB,EAAE,MAAM,CAAC;IACzB,yEAAyE;IACzE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,6DAA6D;IAC7D,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB,CAAC;AAcF,KAAK,SAAS,GAAG;IACf,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1D,CAAC;AAEF;;;GAGG;AACH,wBAAsB,yBAAyB,CAAC,CAAC,EAC/C,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,cAQzB;AAED,wBAAsB,2BAA2B,CAAC,EAChD,UAAU,EACV,KAAK,GACN,EAAE;IACD,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,KAAK,EAAE,CAAC,SAAS,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACpD,iBAIA;AAED,mHAAmH;AACnH,wBAAsB,aAAa,CAAC,IAAI,EAAE,oBAAoB,iBAiE7D;AAED,sHAAsH;AACtH,wBAAgB,OAAO,CAAC,WAAW,CAAC,EAAE,MAAM,iBAO3C"}
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../../src/server/db/migrate.ts"],"names":[],"mappings":"AAMA,OAAO,eAAe,CAAC;AAEvB,OAAO,EAAsB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAG9E,MAAM,MAAM,oBAAoB,GAAG;IACjC,yFAAyF;IACzF,gBAAgB,EAAE,MAAM,CAAC;IACzB,yEAAyE;IACzE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,6DAA6D;IAC7D,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB;;;;;;;;;OASG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC;AAcF,KAAK,SAAS,GAAG;IACf,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1D,CAAC;AAEF;;;GAGG;AACH,wBAAsB,yBAAyB,CAAC,CAAC,EAC/C,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,cAQzB;AAED,wBAAsB,2BAA2B,CAAC,EAChD,UAAU,EACV,KAAK,GACN,EAAE;IACD,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,KAAK,EAAE,CAAC,SAAS,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACpD,iBAIA;AAED,mHAAmH;AACnH,wBAAsB,aAAa,CAAC,IAAI,EAAE,oBAAoB,iBAoE7D;AAED,sHAAsH;AACtH,wBAAgB,OAAO,CAAC,WAAW,CAAC,EAAE,MAAM,iBAO3C"}