@openora/core 0.4.1-canary.77 → 0.4.1-canary.79

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 (123) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/admin-console/plugin.d.ts +2 -0
  3. package/dist/admin-console/plugin.d.ts.map +1 -1
  4. package/dist/analytics/plugin.d.ts +2 -0
  5. package/dist/analytics/plugin.d.ts.map +1 -1
  6. package/dist/audit/__tests__/audit.service.int.test.js +44 -0
  7. package/dist/audit/__tests__/audit.service.int.test.js.map +1 -1
  8. package/dist/audit/plugin.d.ts +2 -0
  9. package/dist/audit/plugin.d.ts.map +1 -1
  10. package/dist/audit/plugin.js +36 -0
  11. package/dist/audit/plugin.js.map +1 -1
  12. package/dist/casino/gaming/plugin.d.ts +2 -0
  13. package/dist/casino/gaming/plugin.d.ts.map +1 -1
  14. package/dist/casino/lobby/plugin.d.ts +2 -0
  15. package/dist/casino/lobby/plugin.d.ts.map +1 -1
  16. package/dist/cms/plugin.d.ts +2 -0
  17. package/dist/cms/plugin.d.ts.map +1 -1
  18. package/dist/compliance/plugin.d.ts +2 -0
  19. package/dist/compliance/plugin.d.ts.map +1 -1
  20. package/dist/contracts/adapters/index.d.ts +4 -0
  21. package/dist/contracts/adapters/index.d.ts.map +1 -1
  22. package/dist/contracts/adapters/index.js +2 -0
  23. package/dist/contracts/adapters/index.js.map +1 -1
  24. package/dist/contracts/adapters/player-activity.d.ts +6 -0
  25. package/dist/contracts/adapters/player-activity.d.ts.map +1 -0
  26. package/dist/contracts/adapters/player-activity.js +3 -0
  27. package/dist/contracts/adapters/player-activity.js.map +1 -0
  28. package/dist/contracts/adapters/social-commands.d.ts +12 -0
  29. package/dist/contracts/adapters/social-commands.d.ts.map +1 -0
  30. package/dist/contracts/adapters/social-commands.js +7 -0
  31. package/dist/contracts/adapters/social-commands.js.map +1 -0
  32. package/dist/contracts/schemas/events.d.ts +26 -0
  33. package/dist/contracts/schemas/events.d.ts.map +1 -1
  34. package/dist/contracts/schemas/events.js +17 -9
  35. package/dist/contracts/schemas/events.js.map +1 -1
  36. package/dist/engagement/chat/__tests__/chat.service.int.test.js +123 -2
  37. package/dist/engagement/chat/__tests__/chat.service.int.test.js.map +1 -1
  38. package/dist/engagement/chat/contract/index.d.ts +4 -0
  39. package/dist/engagement/chat/contract/index.d.ts.map +1 -1
  40. package/dist/engagement/chat/contract/index.js +2 -0
  41. package/dist/engagement/chat/contract/index.js.map +1 -1
  42. package/dist/engagement/chat/plugin.d.ts +2 -0
  43. package/dist/engagement/chat/plugin.d.ts.map +1 -1
  44. package/dist/engagement/chat/plugin.js +2 -2
  45. package/dist/engagement/chat/plugin.js.map +1 -1
  46. package/dist/engagement/chat/router/index.d.ts +2 -0
  47. package/dist/engagement/chat/router/index.d.ts.map +1 -1
  48. package/dist/engagement/chat/service/chat.service.d.ts +6 -2
  49. package/dist/engagement/chat/service/chat.service.d.ts.map +1 -1
  50. package/dist/engagement/chat/service/chat.service.js +29 -8
  51. package/dist/engagement/chat/service/chat.service.js.map +1 -1
  52. package/dist/engagement/chat-commands/plugin.d.ts +2 -0
  53. package/dist/engagement/chat-commands/plugin.d.ts.map +1 -1
  54. package/dist/engagement/notifications/plugin.d.ts +2 -0
  55. package/dist/engagement/notifications/plugin.d.ts.map +1 -1
  56. package/dist/engagement/social/__tests__/social.plugin.int.test.d.ts +2 -0
  57. package/dist/engagement/social/__tests__/social.plugin.int.test.d.ts.map +1 -0
  58. package/dist/engagement/social/__tests__/social.plugin.int.test.js +106 -0
  59. package/dist/engagement/social/__tests__/social.plugin.int.test.js.map +1 -0
  60. package/dist/engagement/social/__tests__/social.router.int.test.js +124 -2
  61. package/dist/engagement/social/__tests__/social.router.int.test.js.map +1 -1
  62. package/dist/engagement/social/__tests__/social.service.int.test.js +587 -6
  63. package/dist/engagement/social/__tests__/social.service.int.test.js.map +1 -1
  64. package/dist/engagement/social/contract/index.d.ts +114 -0
  65. package/dist/engagement/social/contract/index.d.ts.map +1 -1
  66. package/dist/engagement/social/contract/index.js +53 -0
  67. package/dist/engagement/social/contract/index.js.map +1 -1
  68. package/dist/engagement/social/drizzle/migrations/0003_fuzzy_shadow_king.sql +4 -0
  69. package/dist/engagement/social/drizzle/migrations/0004_friendship-cancel-constraint.sql +2 -0
  70. package/dist/engagement/social/drizzle/migrations/meta/0003_snapshot.json +145 -0
  71. package/dist/engagement/social/drizzle/migrations/meta/0004_snapshot.json +145 -0
  72. package/dist/engagement/social/drizzle/migrations/meta/_journal.json +14 -0
  73. package/dist/engagement/social/plugin.d.ts +52 -50
  74. package/dist/engagement/social/plugin.d.ts.map +1 -1
  75. package/dist/engagement/social/plugin.js +8 -7
  76. package/dist/engagement/social/plugin.js.map +1 -1
  77. package/dist/engagement/social/router/index.d.ts +67 -0
  78. package/dist/engagement/social/router/index.d.ts.map +1 -1
  79. package/dist/engagement/social/router/index.js +38 -1
  80. package/dist/engagement/social/router/index.js.map +1 -1
  81. package/dist/engagement/social/schema/index.d.ts +17 -0
  82. package/dist/engagement/social/schema/index.d.ts.map +1 -1
  83. package/dist/engagement/social/schema/index.js +5 -17
  84. package/dist/engagement/social/schema/index.js.map +1 -1
  85. package/dist/engagement/social/service/social.service.d.ts +32 -18
  86. package/dist/engagement/social/service/social.service.d.ts.map +1 -1
  87. package/dist/engagement/social/service/social.service.js +283 -48
  88. package/dist/engagement/social/service/social.service.js.map +1 -1
  89. package/dist/engagement/social-transfers/plugin.d.ts +2 -0
  90. package/dist/engagement/social-transfers/plugin.d.ts.map +1 -1
  91. package/dist/iam/plugin.d.ts +2 -0
  92. package/dist/iam/plugin.d.ts.map +1 -1
  93. package/dist/pam/identity/adapters/identity-reader.service.d.ts.map +1 -1
  94. package/dist/pam/identity/adapters/identity-reader.service.js +5 -2
  95. package/dist/pam/identity/adapters/identity-reader.service.js.map +1 -1
  96. package/dist/pam/identity/plugin.d.ts +2 -0
  97. package/dist/pam/identity/plugin.d.ts.map +1 -1
  98. package/dist/pam/player-management/__tests__/player.service.int.test.js +29 -0
  99. package/dist/pam/player-management/__tests__/player.service.int.test.js.map +1 -1
  100. package/dist/pam/player-management/plugin.d.ts +2 -0
  101. package/dist/pam/player-management/plugin.d.ts.map +1 -1
  102. package/dist/pam/player-management/plugin.js +6 -4
  103. package/dist/pam/player-management/plugin.js.map +1 -1
  104. package/dist/pam/player-management/service/player.service.d.ts +3 -2
  105. package/dist/pam/player-management/service/player.service.d.ts.map +1 -1
  106. package/dist/pam/player-management/service/player.service.js +7 -1
  107. package/dist/pam/player-management/service/player.service.js.map +1 -1
  108. package/dist/pam/player-note/plugin.d.ts +2 -0
  109. package/dist/pam/player-note/plugin.d.ts.map +1 -1
  110. package/dist/pam/profile/plugin.d.ts +2 -0
  111. package/dist/pam/profile/plugin.d.ts.map +1 -1
  112. package/dist/pam/tag/plugin.d.ts +2 -0
  113. package/dist/pam/tag/plugin.d.ts.map +1 -1
  114. package/dist/server/runtime/core-token-catalog.d.ts +2 -0
  115. package/dist/server/runtime/core-token-catalog.d.ts.map +1 -1
  116. package/dist/server/runtime/core-token-catalog.js +3 -1
  117. package/dist/server/runtime/core-token-catalog.js.map +1 -1
  118. package/dist/server/runtime/create-app.d.ts.map +1 -1
  119. package/dist/server/runtime/create-app.js +7 -1
  120. package/dist/server/runtime/create-app.js.map +1 -1
  121. package/dist/wallet/plugin.d.ts +2 -0
  122. package/dist/wallet/plugin.d.ts.map +1 -1
  123. package/package.json +1 -1
@@ -1,8 +1,10 @@
1
- import { and, eq, inArray, isNull, or } from 'drizzle-orm';
2
- import { createDomainError, makeConflictError, makeNotFoundError, serializeRow, } from '@openora/core/server';
3
- import { chatUserBlock } from '@openora/core/engagement/schema/chat';
1
+ import { and, count, desc, eq, inArray, isNotNull, isNull, or, SQL, sql } from 'drizzle-orm';
2
+ import { createDomainError, createLogger, makeConflictError, makeNotFoundError, pageToOffset, serializeRow, } from '@openora/core/server';
3
+ import { chatUserBlock, chatUserIgnore } from '@openora/core/engagement/schema/chat';
4
4
  import { player } from '@openora/core/pam/schema/profile';
5
5
  import { friendship } from '../schema/index.js';
6
+ const logger = createLogger('social');
7
+ const ONLINE_STATUS_WINDOW_MS = 3 * 60 * 1000;
6
8
  // The caller targeted themselves (SendFriendRequestInputSchema.targetUserId === callerId).
7
9
  export const SelfFriendRequestError = createDomainError('SelfFriendRequestError', () => 'You cannot send a friend request to yourself');
8
10
  // A genuinely nonexistent target only - never thrown for a target that exists but
@@ -20,12 +22,8 @@ export const BlockedBySelfError = makeConflictError('BLOCKED_BY_SELF', 'You have
20
22
  export const AlreadyFriendsError = makeConflictError('ALREADY_FRIENDS', 'You are already friends with this player');
21
23
  export const RequestAlreadyPendingError = makeConflictError('REQUEST_ALREADY_PENDING', 'A friend request to this player is already pending');
22
24
  export const FriendRequestRefusedError = makeConflictError('FRIEND_REQUEST_REFUSED', 'This friend request was refused');
23
- // Postgres unique-violation. friendship has exactly one unique index
24
- // (friendship_pair_key), so any 23505 on an insert into it is unambiguous - no
25
- // constraint-name check needed. drizzle-orm wraps the driver error in a
26
- // DrizzleQueryError, so the pg error (and its `.code`) is on `.cause`, not the
27
- // thrown error itself - checked against a real Postgres unique-index violation
28
- // in social.service.int.test.ts (a mocked query builder can't catch this).
25
+ export const FriendshipNotFoundError = makeNotFoundError('Friendship');
26
+ export const FriendRequestNotFoundError = makeNotFoundError('FriendRequest');
29
27
  function pgErrorCode(e) {
30
28
  if (typeof e !== 'object' || e === null) {
31
29
  return undefined;
@@ -54,19 +52,12 @@ function pairCondition(userA, userB) {
54
52
  export class SocialService {
55
53
  drizzle;
56
54
  events;
57
- constructor(drizzle, events) {
55
+ identityReader;
56
+ constructor(drizzle, events, identityReader) {
58
57
  this.drizzle = drizzle;
59
58
  this.events = events;
59
+ this.identityReader = identityReader;
60
60
  }
61
- /**
62
- * Sends a friend request from `callerId` to `targetUserId`. The insert is
63
- * attempted directly against the canonical-pair unique index (no pre-SELECT,
64
- * avoiding a TOCTOU race); a unique-violation means a row for this pair already
65
- * exists, which is resolved by re-reading it - including the mutual/simultaneous
66
- * case where the existing row was already addressed TO the caller, which
67
- * auto-accepts instead of conflicting. Events are emitted strictly after the
68
- * mutating statement/transaction has committed.
69
- */
70
61
  async sendFriendRequest(callerId, targetUserId) {
71
62
  if (targetUserId === callerId) {
72
63
  throw new SelfFriendRequestError();
@@ -133,18 +124,12 @@ export class SocialService {
133
124
  });
134
125
  return toFriendshipDto(accepted);
135
126
  }
136
- /**
137
- * Re-reads the row a unique-violation on `friendship_pair_key` proved already
138
- * exists and resolves it: already accepted -> conflict, same-direction duplicate
139
- * -> conflict, opposite-direction (mutual/simultaneous request) -> auto-accept.
140
- * `FOR UPDATE` serializes this against a concurrent resolution of the same pair.
141
- */
142
127
  async resolveExistingPair(callerId, targetUserId) {
143
128
  return this.drizzle.db.transaction(async (tx) => {
144
129
  const rows = await tx
145
130
  .select()
146
131
  .from(friendship)
147
- .where(pairCondition(callerId, targetUserId))
132
+ .where(and(pairCondition(callerId, targetUserId), isNull(friendship.removedAt)))
148
133
  .for('update')
149
134
  .limit(1);
150
135
  const existing = rows[0];
@@ -191,7 +176,7 @@ export class SocialService {
191
176
  const friendships = await this.drizzle.db
192
177
  .select()
193
178
  .from(friendship)
194
- .where(or(and(eq(friendship.requesterId, callerId), inArray(friendship.addresseeId, uniqueTargetIds)), and(inArray(friendship.requesterId, uniqueTargetIds), eq(friendship.addresseeId, callerId))));
179
+ .where(and(or(and(eq(friendship.requesterId, callerId), inArray(friendship.addresseeId, uniqueTargetIds)), and(inArray(friendship.requesterId, uniqueTargetIds), eq(friendship.addresseeId, callerId))), isNull(friendship.removedAt)));
195
180
  const friendshipByTargetId = new Map();
196
181
  for (const row of friendships) {
197
182
  const targetId = row.requesterId === callerId ? row.addresseeId : row.requesterId;
@@ -215,34 +200,284 @@ export class SocialService {
215
200
  return { userId, status: 'blocked_by_me', friendshipId: null, canSendRequest: false };
216
201
  }
217
202
  const existing = friendshipByTargetId.get(userId);
218
- if (existing?.refusedAt !== null && existing?.refusedAt !== undefined) {
203
+ if (!existing) {
204
+ return { userId, status: 'none', friendshipId: null, canSendRequest: true };
205
+ }
206
+ if (existing.refusedAt !== null) {
219
207
  return { userId, status: 'refused', friendshipId: existing.id, canSendRequest: false };
220
208
  }
221
- if (existing?.acceptedAt !== null && existing?.acceptedAt !== undefined) {
209
+ if (existing.acceptedAt !== null) {
222
210
  return { userId, status: 'friends', friendshipId: existing.id, canSendRequest: false };
223
211
  }
224
- if (existing?.acceptedAt === null &&
225
- existing?.refusedAt === null &&
226
- existing?.requesterId === callerId) {
227
- return {
228
- userId,
229
- status: 'pending_outgoing',
230
- friendshipId: existing.id,
231
- canSendRequest: false,
232
- };
233
- }
234
- if (existing?.acceptedAt === null &&
235
- existing?.refusedAt === null &&
236
- existing?.requesterId === userId) {
237
- return {
212
+ const status = existing.requesterId === callerId ? 'pending_outgoing' : 'pending_incoming';
213
+ return { userId, status, friendshipId: existing.id, canSendRequest: false };
214
+ });
215
+ }
216
+ async dissolveFriendship(tx, userA, userB, actorId, reason) {
217
+ const rows = await tx
218
+ .update(friendship)
219
+ .set({ removedAt: new Date() })
220
+ .where(and(pairCondition(userA, userB), isNull(friendship.removedAt), isNotNull(friendship.acceptedAt)))
221
+ .returning();
222
+ const removed = rows[0];
223
+ if (!removed) {
224
+ return undefined;
225
+ }
226
+ return {
227
+ friendshipId: removed.id,
228
+ actorId,
229
+ actorPlayerId: await this.identityReader.getPlayerIdByUserIdSafe(actorId),
230
+ otherUserId: removed.requesterId === actorId ? removed.addresseeId : removed.requesterId,
231
+ reason,
232
+ };
233
+ }
234
+ async removeFriend(callerId, targetUserId) {
235
+ const dissolved = await this.dissolveFriendship(this.drizzle.db, callerId, targetUserId, callerId, 'removed_by_player');
236
+ if (!dissolved) {
237
+ throw new FriendshipNotFoundError(targetUserId);
238
+ }
239
+ this.events.emit('social.friendship.removed', dissolved);
240
+ }
241
+ async dissolveFriendshipOnBlock(tx, blockerId, blockedId) {
242
+ const dissolved = await this.dissolveFriendship(tx, blockerId, blockedId, blockerId, 'blocked');
243
+ return dissolved ?? null;
244
+ }
245
+ async listFriends(callerId, { page, limit }) {
246
+ const where = and(or(eq(friendship.requesterId, callerId), eq(friendship.addresseeId, callerId)), isNotNull(friendship.acceptedAt), isNull(friendship.removedAt));
247
+ const [rows, countRows] = await Promise.all([
248
+ this.drizzle.db
249
+ .select({
250
+ id: friendship.id,
251
+ requesterId: friendship.requesterId,
252
+ addresseeId: friendship.addresseeId,
253
+ createdAt: friendship.createdAt,
254
+ })
255
+ .from(friendship)
256
+ .where(where)
257
+ .orderBy(desc(friendship.createdAt))
258
+ .limit(limit)
259
+ .offset(pageToOffset(page, limit)),
260
+ this.drizzle.db.select({ n: count() }).from(friendship).where(where),
261
+ ]);
262
+ const otherUserIds = rows.map((row) => row.requesterId === callerId ? row.addresseeId : row.requesterId);
263
+ const [players, ignores] = otherUserIds.length > 0
264
+ ? await Promise.all([
265
+ this.drizzle.db
266
+ .select({
267
+ userId: player.userId,
268
+ displayName: player.displayName,
269
+ lastSeenAt: player.lastSeenAt,
270
+ status: player.status,
271
+ })
272
+ .from(player)
273
+ .where(inArray(player.userId, otherUserIds)),
274
+ this.drizzle.db
275
+ .select({ ignoredId: chatUserIgnore.ignoredId })
276
+ .from(chatUserIgnore)
277
+ .where(and(eq(chatUserIgnore.ignorerId, callerId), isNull(chatUserIgnore.removedAt), inArray(chatUserIgnore.ignoredId, otherUserIds))),
278
+ ])
279
+ : [[], []];
280
+ const playerByUserId = new Map(players.map((p) => [p.userId, p]));
281
+ const ignoredIds = new Set(ignores.map((i) => i.ignoredId));
282
+ const now = Date.now();
283
+ const items = rows.flatMap((row) => {
284
+ const userId = row.requesterId === callerId ? row.addresseeId : row.requesterId;
285
+ const targetPlayer = playerByUserId.get(userId);
286
+ if (!targetPlayer) {
287
+ logger.error({ friendshipId: row.id, userId }, 'listFriends: player row missing for friend');
288
+ return [];
289
+ }
290
+ if (targetPlayer.status === 'suspended' || targetPlayer.status === 'closed') {
291
+ return [];
292
+ }
293
+ const isOnline = targetPlayer.lastSeenAt !== null &&
294
+ now - targetPlayer.lastSeenAt.getTime() <= ONLINE_STATUS_WINDOW_MS;
295
+ return [
296
+ serializeRow({
238
297
  userId,
239
- status: 'pending_incoming',
240
- friendshipId: existing.id,
241
- canSendRequest: false,
242
- };
298
+ friendshipId: row.id,
299
+ displayName: targetPlayer.displayName,
300
+ status: isOnline ? 'online' : 'offline',
301
+ lastSeenAt: targetPlayer.lastSeenAt,
302
+ isIgnored: ignoredIds.has(userId),
303
+ }, { dateFields: ['lastSeenAt'] }),
304
+ ];
305
+ });
306
+ return { items, total: Number(countRows[0]?.n ?? 0), page, limit };
307
+ }
308
+ async acceptFriendRequest(callerId, friendshipId) {
309
+ const [pending] = await this.drizzle.db
310
+ .select({ requesterId: friendship.requesterId })
311
+ .from(friendship)
312
+ .where(and(eq(friendship.id, friendshipId), eq(friendship.addresseeId, callerId), isNull(friendship.acceptedAt), isNull(friendship.refusedAt), isNull(friendship.removedAt)));
313
+ if (!pending) {
314
+ throw new FriendRequestNotFoundError(friendshipId);
315
+ }
316
+ const blocks = await this.drizzle.db
317
+ .select({ blockerId: chatUserBlock.blockerId })
318
+ .from(chatUserBlock)
319
+ .where(and(isNull(chatUserBlock.removedAt), pairBlockCondition(callerId, pending.requesterId)));
320
+ if (blocks.length > 0) {
321
+ throw new FriendRequestUnavailableError();
322
+ }
323
+ const rows = await this.drizzle.db
324
+ .update(friendship)
325
+ .set({ acceptedAt: new Date() })
326
+ .where(and(eq(friendship.id, friendshipId), eq(friendship.addresseeId, callerId), isNull(friendship.acceptedAt), isNull(friendship.refusedAt), isNull(friendship.removedAt)))
327
+ .returning();
328
+ const updated = rows[0];
329
+ if (!updated) {
330
+ throw new FriendRequestNotFoundError(friendshipId);
331
+ }
332
+ const [callerPlayer] = await this.drizzle.db
333
+ .select({ displayName: player.displayName })
334
+ .from(player)
335
+ .where(eq(player.userId, callerId));
336
+ if (!callerPlayer) {
337
+ // Invariant: an authenticated caller always has a player row (see
338
+ // sendFriendRequest's same guard).
339
+ throw new Error(`Player profile missing for authenticated caller: ${callerId}`);
340
+ }
341
+ this.events.emit('social.friend_request.accepted', {
342
+ friendshipId: updated.id,
343
+ requesterId: updated.requesterId,
344
+ addresseeId: updated.addresseeId,
345
+ accepterId: callerId,
346
+ accepterDisplayName: callerPlayer.displayName,
347
+ });
348
+ return toFriendshipDto(updated);
349
+ }
350
+ async declineFriendRequest(callerId, friendshipId) {
351
+ // removedAt (not refusedAt - the two are mutually exclusive, see the
352
+ // friendship_removed_excludes_refused_key check constraint) frees the pair's
353
+ // partial-unique slot, same as cancelFriendRequest - decline and cancel both
354
+ // let either side send a new request afterwards.
355
+ const rows = await this.drizzle.db
356
+ .update(friendship)
357
+ .set({ removedAt: new Date() })
358
+ .where(and(eq(friendship.id, friendshipId), eq(friendship.addresseeId, callerId), isNull(friendship.acceptedAt), isNull(friendship.refusedAt), isNull(friendship.removedAt)))
359
+ .returning();
360
+ const updated = rows[0];
361
+ if (!updated) {
362
+ throw new FriendRequestNotFoundError(friendshipId);
363
+ }
364
+ this.events.emit('social.friend_request.declined', {
365
+ friendshipId: updated.id,
366
+ requesterId: updated.requesterId,
367
+ addresseeId: updated.addresseeId,
368
+ });
369
+ }
370
+ async cancelFriendRequest(callerId, friendshipId) {
371
+ const rows = await this.drizzle.db
372
+ .update(friendship)
373
+ .set({ removedAt: new Date() })
374
+ .where(and(eq(friendship.id, friendshipId), eq(friendship.requesterId, callerId), isNull(friendship.acceptedAt), isNull(friendship.refusedAt), isNull(friendship.removedAt)))
375
+ .returning();
376
+ const updated = rows[0];
377
+ if (!updated) {
378
+ throw new FriendRequestNotFoundError(friendshipId);
379
+ }
380
+ this.events.emit('social.friend_request.cancelled', {
381
+ friendshipId: updated.id,
382
+ requesterId: updated.requesterId,
383
+ addresseeId: updated.addresseeId,
384
+ });
385
+ }
386
+ async listFriendRequests(callerId, { direction, page, limit }) {
387
+ const directionColumn = direction === 'incoming' ? friendship.addresseeId : friendship.requesterId;
388
+ const where = and(eq(directionColumn, callerId), isNull(friendship.acceptedAt), isNull(friendship.refusedAt), isNull(friendship.removedAt));
389
+ const [rows, countRows] = await Promise.all([
390
+ this.drizzle.db
391
+ .select({
392
+ id: friendship.id,
393
+ requesterId: friendship.requesterId,
394
+ addresseeId: friendship.addresseeId,
395
+ createdAt: friendship.createdAt,
396
+ })
397
+ .from(friendship)
398
+ .where(where)
399
+ .orderBy(desc(friendship.createdAt))
400
+ .limit(limit)
401
+ .offset(pageToOffset(page, limit)),
402
+ this.drizzle.db.select({ n: count() }).from(friendship).where(where),
403
+ ]);
404
+ const counterpartIds = rows.map((row) => direction === 'incoming' ? row.requesterId : row.addresseeId);
405
+ const [players, mutualCounts, blocks] = await Promise.all([
406
+ counterpartIds.length > 0
407
+ ? this.drizzle.db
408
+ .select({
409
+ userId: player.userId,
410
+ displayName: player.displayName,
411
+ status: player.status,
412
+ })
413
+ .from(player)
414
+ .where(inArray(player.userId, counterpartIds))
415
+ : Promise.resolve([]),
416
+ direction === 'incoming' && counterpartIds.length > 0
417
+ ? this.getMutualFriendsCounts(callerId, counterpartIds)
418
+ : Promise.resolve(new Map()),
419
+ counterpartIds.length > 0
420
+ ? this.drizzle.db
421
+ .select({ blockerId: chatUserBlock.blockerId, blockedId: chatUserBlock.blockedId })
422
+ .from(chatUserBlock)
423
+ .where(and(isNull(chatUserBlock.removedAt), or(and(eq(chatUserBlock.blockerId, callerId), inArray(chatUserBlock.blockedId, counterpartIds)), and(inArray(chatUserBlock.blockerId, counterpartIds), eq(chatUserBlock.blockedId, callerId)))))
424
+ : Promise.resolve([]),
425
+ ]);
426
+ const playerByUserId = new Map(players.map((p) => [p.userId, p]));
427
+ // Either direction hides the pair - a blocked player never appears in requests on both sides
428
+ const blockedCounterpartIds = new Set(blocks.map((b) => (b.blockerId === callerId ? b.blockedId : b.blockerId)));
429
+ const items = rows.flatMap((row) => {
430
+ const counterpartId = direction === 'incoming' ? row.requesterId : row.addresseeId;
431
+ const counterpartPlayer = playerByUserId.get(counterpartId);
432
+ if (!counterpartPlayer) {
433
+ logger.error({ friendshipId: row.id, counterpartId }, 'listFriendRequests: player row missing for counterpart');
434
+ return [];
435
+ }
436
+ if (counterpartPlayer.status === 'suspended' || counterpartPlayer.status === 'closed') {
437
+ return [];
438
+ }
439
+ if (blockedCounterpartIds.has(counterpartId)) {
440
+ return [];
243
441
  }
244
- return { userId, status: 'none', friendshipId: null, canSendRequest: true };
442
+ return [
443
+ serializeRow({
444
+ friendshipId: row.id,
445
+ userId: counterpartId,
446
+ displayName: counterpartPlayer.displayName,
447
+ direction,
448
+ createdAt: row.createdAt,
449
+ mutualFriendsCount: direction === 'incoming' ? (mutualCounts.get(counterpartId) ?? 0) : null,
450
+ }, { dateFields: ['createdAt'] }),
451
+ ];
245
452
  });
453
+ return { items, total: Number(countRows[0]?.n ?? 0), page, limit };
454
+ }
455
+ async getMutualFriendsCounts(callerId, requesterIds) {
456
+ const requesterInSet = inArray(friendship.requesterId, requesterIds);
457
+ const callerFriends = this.drizzle.db
458
+ .select({
459
+ friendId: new SQL.Aliased(sql `CASE WHEN ${eq(friendship.requesterId, callerId)} THEN ${friendship.addresseeId} ELSE ${friendship.requesterId} END`, 'caller_friend_id'),
460
+ })
461
+ .from(friendship)
462
+ .where(and(or(eq(friendship.requesterId, callerId), eq(friendship.addresseeId, callerId)), isNotNull(friendship.acceptedAt), isNull(friendship.removedAt)))
463
+ .as('caller_friends');
464
+ const requesterFriends = this.drizzle.db
465
+ .select({
466
+ otherId: new SQL.Aliased(sql `CASE WHEN ${requesterInSet} THEN ${friendship.requesterId} ELSE ${friendship.addresseeId} END`, 'other_id'),
467
+ friendId: new SQL.Aliased(sql `CASE WHEN ${requesterInSet} THEN ${friendship.addresseeId} ELSE ${friendship.requesterId} END`, 'requester_friend_id'),
468
+ })
469
+ .from(friendship)
470
+ .where(and(or(inArray(friendship.requesterId, requesterIds), inArray(friendship.addresseeId, requesterIds)), isNotNull(friendship.acceptedAt), isNull(friendship.removedAt)))
471
+ .as('requester_friends');
472
+ const rows = await this.drizzle.db
473
+ .select({
474
+ requesterId: requesterFriends.otherId,
475
+ mutualCount: sql `count(distinct ${callerFriends.friendId})`,
476
+ })
477
+ .from(requesterFriends)
478
+ .innerJoin(callerFriends, eq(requesterFriends.friendId, callerFriends.friendId))
479
+ .groupBy(requesterFriends.otherId);
480
+ return new Map(rows.map((row) => [row.requesterId, Number(row.mutualCount)]));
246
481
  }
247
482
  }
248
483
  function pairBlockCondition(callerId, targetUserId) {
@@ -1 +1 @@
1
- {"version":3,"file":"social.service.js","sourceRoot":"","sources":["../../../../src/engagement/social/service/social.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"social.service.js","sourceRoot":"","sources":["../../../../src/engagement/social/service/social.service.ts"],"names":[],"mappings":"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"}
@@ -93,6 +93,7 @@ declare const _default: {
93
93
  } | undefined;
94
94
  supportedLanguages?: string[] | undefined;
95
95
  }, string>;
96
+ PLAYER_ACTIVITY_TRACKER: import("@openora/core/contracts").Token<import("@openora/core/contracts").PlayerActivityTracker>;
96
97
  PLAYER_TAGS: import("@openora/core/contracts").Token<import("@openora/core/contracts").PlayerTags>;
97
98
  PLAY_ELIGIBILITY: import("@openora/core/contracts").Token<import("@openora/core/contracts").PlayEligibilityPort>;
98
99
  RAIN_COMMANDS: import("@openora/core/contracts").Token<import("@openora/core/contracts").RainCommands>;
@@ -103,6 +104,7 @@ declare const _default: {
103
104
  SEND_EMAIL: import("@openora/core/contracts").Token<import("@openora/core/contracts").SendEmailPort>;
104
105
  SESSION_COMMANDS: import("@openora/core/contracts").Token<import("@openora/core/contracts").SessionCommands>;
105
106
  SMS_ADAPTER: import("@openora/core/contracts").Token<import("@openora/core/contracts").SmsAdapter>;
107
+ SOCIAL_COMMANDS: import("@openora/core/contracts").Token<import("@openora/core/contracts").SocialCommands>;
106
108
  TAG_EVALUATION_COMMANDS: import("@openora/core/contracts").Token<import("@openora/core/contracts").TagEvaluationCommands>;
107
109
  WALLET_COMMANDS: import("@openora/core/contracts").Token<import("@openora/core/contracts").WalletCommands>;
108
110
  WALLET_READER: import("@openora/core/contracts").Token<import("@openora/core/contracts").WalletReader, string>;
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/engagement/social-transfers/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BA,wBA0B8C"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/engagement/social-transfers/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BA,wBA0B8C"}
@@ -93,6 +93,7 @@ declare const _default: {
93
93
  } | undefined;
94
94
  supportedLanguages?: string[] | undefined;
95
95
  }, string>;
96
+ PLAYER_ACTIVITY_TRACKER: import("@openora/core/contracts").Token<import("@openora/core/contracts").PlayerActivityTracker>;
96
97
  PLAYER_TAGS: import("@openora/core/contracts").Token<import("@openora/core/contracts").PlayerTags>;
97
98
  PLAY_ELIGIBILITY: import("@openora/core/contracts").Token<import("@openora/core/contracts").PlayEligibilityPort>;
98
99
  RAIN_COMMANDS: import("@openora/core/contracts").Token<import("@openora/core/contracts").RainCommands>;
@@ -103,6 +104,7 @@ declare const _default: {
103
104
  SEND_EMAIL: import("@openora/core/contracts").Token<import("@openora/core/contracts").SendEmailPort>;
104
105
  SESSION_COMMANDS: import("@openora/core/contracts").Token<import("@openora/core/contracts").SessionCommands>;
105
106
  SMS_ADAPTER: import("@openora/core/contracts").Token<import("@openora/core/contracts").SmsAdapter>;
107
+ SOCIAL_COMMANDS: import("@openora/core/contracts").Token<import("@openora/core/contracts").SocialCommands>;
106
108
  TAG_EVALUATION_COMMANDS: import("@openora/core/contracts").Token<import("@openora/core/contracts").TagEvaluationCommands>;
107
109
  WALLET_COMMANDS: import("@openora/core/contracts").Token<import("@openora/core/contracts").WalletCommands>;
108
110
  WALLET_READER: import("@openora/core/contracts").Token<import("@openora/core/contracts").WalletReader, string>;
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/iam/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,wBA2D8C"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/iam/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,wBA2D8C"}
@@ -1 +1 @@
1
- {"version":3,"file":"identity-reader.service.d.ts","sourceRoot":"","sources":["../../../../src/pam/identity/adapters/identity-reader.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAOvF,qBAAa,qBAAsB,YAAW,cAAc;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,cAAc;IAE9C,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAQxD,yBAAyB,CAAC,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAyBjE,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IASrE,uBAAuB,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IASzE,0BAA0B,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IASzE,8BAA8B,CAClC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;CAUzB"}
1
+ {"version":3,"file":"identity-reader.service.d.ts","sourceRoot":"","sources":["../../../../src/pam/identity/adapters/identity-reader.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAOvF,qBAAa,qBAAsB,YAAW,cAAc;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,cAAc;IAE9C,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAQxD,yBAAyB,CAAC,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IA4BjE,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IASrE,uBAAuB,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IASzE,0BAA0B,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IASzE,8BAA8B,CAClC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;CAUzB"}
@@ -1,5 +1,5 @@
1
1
  import { createLogger } from '@openora/core/server';
2
- import { and, eq, isNull, lt, max, ne, or } from 'drizzle-orm';
2
+ import { and, eq, isNull, lt, max, ne, or, SQL } from 'drizzle-orm';
3
3
  import { session, user } from '../schema/index.js';
4
4
  import { player } from '@openora/core/pam/schema/profile';
5
5
  const logger = createLogger('identity-reader');
@@ -19,7 +19,10 @@ export class IdentityReaderService {
19
19
  // Join users to their most-recent session. Players with no session at all
20
20
  // (registered but never logged in) are included via the LEFT JOIN + isNull check.
21
21
  const lastSessionPerUser = this.drizzle.db
22
- .select({ userId: session.userId, lastAt: max(session.createdAt).as('last_at') })
22
+ .select({
23
+ userId: session.userId,
24
+ lastAt: new SQL.Aliased(max(session.createdAt), 'last_at'),
25
+ })
23
26
  .from(session)
24
27
  .groupBy(session.userId)
25
28
  .as('s');
@@ -1 +1 @@
1
- {"version":3,"file":"identity-reader.service.js","sourceRoot":"","sources":["../../../../src/pam/identity/adapters/identity-reader.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"identity-reader.service.js","sourceRoot":"","sources":["../../../../src/pam/identity/adapters/identity-reader.service.ts"],"names":[],"mappings":"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"}
@@ -92,6 +92,7 @@ declare const _default: {
92
92
  } | undefined;
93
93
  supportedLanguages?: string[] | undefined;
94
94
  }, string>;
95
+ PLAYER_ACTIVITY_TRACKER: import("@openora/core/contracts").Token<import("@openora/core/contracts").PlayerActivityTracker>;
95
96
  PLAYER_TAGS: import("@openora/core/contracts").Token<import("@openora/core/contracts").PlayerTags>;
96
97
  PLAY_ELIGIBILITY: import("@openora/core/contracts").Token<import("@openora/core/contracts").PlayEligibilityPort>;
97
98
  RAIN_COMMANDS: import("@openora/core/contracts").Token<import("@openora/core/contracts").RainCommands>;
@@ -102,6 +103,7 @@ declare const _default: {
102
103
  SEND_EMAIL: import("@openora/core/contracts").Token<import("@openora/core/contracts").SendEmailPort>;
103
104
  SESSION_COMMANDS: import("@openora/core/contracts").Token<import("@openora/core/contracts").SessionCommands>;
104
105
  SMS_ADAPTER: import("@openora/core/contracts").Token<import("@openora/core/contracts").SmsAdapter>;
106
+ SOCIAL_COMMANDS: import("@openora/core/contracts").Token<import("@openora/core/contracts").SocialCommands>;
105
107
  TAG_EVALUATION_COMMANDS: import("@openora/core/contracts").Token<import("@openora/core/contracts").TagEvaluationCommands>;
106
108
  WALLET_COMMANDS: import("@openora/core/contracts").Token<import("@openora/core/contracts").WalletCommands>;
107
109
  WALLET_READER: import("@openora/core/contracts").Token<import("@openora/core/contracts").WalletReader, string>;
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/pam/identity/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA,wBA2E8C"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/pam/identity/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA,wBA2E8C"}
@@ -138,6 +138,35 @@ describe('PlayerService.remove (real PG)', () => {
138
138
  await expect(svc.remove(randomUUID(), ACTOR_ID)).rejects.toBeInstanceOf(PlayerNotFoundError);
139
139
  });
140
140
  });
141
+ describe('PlayerService.touchLastSeen (real PG)', () => {
142
+ it('writes lastSeenAt when it was previously null', async () => {
143
+ const { svc } = makeService();
144
+ const seeded = await seedPlayer(randomUUID());
145
+ await svc.touchLastSeen(seeded.userId);
146
+ const row = await rowById(seeded.id);
147
+ expect(row?.lastSeenAt).toBeInstanceOf(Date);
148
+ });
149
+ it('writes lastSeenAt when it is stale (older than 1 minute)', async () => {
150
+ const { svc } = makeService();
151
+ const staleTimestamp = new Date(Date.now() - 5 * 60 * 1000);
152
+ const seeded = await seedPlayer(randomUUID(), { lastSeenAt: staleTimestamp });
153
+ await svc.touchLastSeen(seeded.userId);
154
+ const row = await rowById(seeded.id);
155
+ expect(row?.lastSeenAt?.getTime()).toBeGreaterThan(staleTimestamp.getTime());
156
+ });
157
+ it('skips the write (throttle) when lastSeenAt is recent', async () => {
158
+ const { svc } = makeService();
159
+ const recentTimestamp = new Date();
160
+ const seeded = await seedPlayer(randomUUID(), { lastSeenAt: recentTimestamp });
161
+ await svc.touchLastSeen(seeded.userId);
162
+ const row = await rowById(seeded.id);
163
+ expect(row?.lastSeenAt?.getTime()).toBe(recentTimestamp.getTime());
164
+ });
165
+ it('is a no-op for a nonexistent userId (never throws)', async () => {
166
+ const { svc } = makeService();
167
+ await expect(svc.touchLastSeen(randomUUID())).resolves.toBeUndefined();
168
+ });
169
+ });
141
170
  describe('PlayerService.getByUserId (real PG)', () => {
142
171
  it('returns the player enriched with the identity email', async () => {
143
172
  const { svc } = makeService();