@openora/core 0.4.1-canary.67 → 0.4.1-canary.69

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 (81) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/audit/__tests__/audit.service.int.test.js +80 -0
  3. package/dist/audit/__tests__/audit.service.int.test.js.map +1 -1
  4. package/dist/audit/plugin.d.ts.map +1 -1
  5. package/dist/audit/plugin.js +50 -4
  6. package/dist/audit/plugin.js.map +1 -1
  7. package/dist/contracts/schemas/events.d.ts +17 -0
  8. package/dist/contracts/schemas/events.d.ts.map +1 -1
  9. package/dist/contracts/schemas/events.js +19 -0
  10. package/dist/contracts/schemas/events.js.map +1 -1
  11. package/dist/engagement/contracts.d.ts +1 -0
  12. package/dist/engagement/contracts.d.ts.map +1 -1
  13. package/dist/engagement/contracts.js +1 -0
  14. package/dist/engagement/contracts.js.map +1 -1
  15. package/dist/engagement/index.d.ts +1 -0
  16. package/dist/engagement/index.d.ts.map +1 -1
  17. package/dist/engagement/index.js +1 -0
  18. package/dist/engagement/index.js.map +1 -1
  19. package/dist/engagement/notifications/__tests__/notifications.service.int.test.js +34 -0
  20. package/dist/engagement/notifications/__tests__/notifications.service.int.test.js.map +1 -1
  21. package/dist/engagement/notifications/contract/index.d.ts +9 -1
  22. package/dist/engagement/notifications/contract/index.d.ts.map +1 -1
  23. package/dist/engagement/notifications/contract/index.js +2 -0
  24. package/dist/engagement/notifications/contract/index.js.map +1 -1
  25. package/dist/engagement/notifications/plugin.d.ts.map +1 -1
  26. package/dist/engagement/notifications/plugin.js +24 -0
  27. package/dist/engagement/notifications/plugin.js.map +1 -1
  28. package/dist/engagement/notifications/router/index.d.ts +2 -0
  29. package/dist/engagement/notifications/router/index.d.ts.map +1 -1
  30. package/dist/engagement/server.d.ts +1 -0
  31. package/dist/engagement/server.d.ts.map +1 -1
  32. package/dist/engagement/server.js +1 -0
  33. package/dist/engagement/server.js.map +1 -1
  34. package/dist/engagement/social/__tests__/social.router.int.test.d.ts +2 -0
  35. package/dist/engagement/social/__tests__/social.router.int.test.d.ts.map +1 -0
  36. package/dist/engagement/social/__tests__/social.router.int.test.js +97 -0
  37. package/dist/engagement/social/__tests__/social.router.int.test.js.map +1 -0
  38. package/dist/engagement/social/__tests__/social.service.int.test.d.ts +2 -0
  39. package/dist/engagement/social/__tests__/social.service.int.test.d.ts.map +1 -0
  40. package/dist/engagement/social/__tests__/social.service.int.test.js +233 -0
  41. package/dist/engagement/social/__tests__/social.service.int.test.js.map +1 -0
  42. package/dist/engagement/social/contract/index.d.ts +73 -0
  43. package/dist/engagement/social/contract/index.d.ts.map +1 -0
  44. package/dist/engagement/social/contract/index.js +54 -0
  45. package/dist/engagement/social/contract/index.js.map +1 -0
  46. package/dist/engagement/social/drizzle/migrations/0000_fine_jamie_braddock.sql +24 -0
  47. package/dist/engagement/social/drizzle/migrations/0001_lame_eddie_brock.sql +10 -0
  48. package/dist/engagement/social/drizzle/migrations/0002_foamy_saracen.sql +1 -0
  49. package/dist/engagement/social/drizzle/migrations/meta/0000_snapshot.json +232 -0
  50. package/dist/engagement/social/drizzle/migrations/meta/0001_snapshot.json +129 -0
  51. package/dist/engagement/social/drizzle/migrations/meta/0002_snapshot.json +134 -0
  52. package/dist/engagement/social/drizzle/migrations/meta/_journal.json +27 -0
  53. package/dist/engagement/social/drizzle.config.d.ts +4 -0
  54. package/dist/engagement/social/drizzle.config.d.ts.map +1 -0
  55. package/dist/engagement/social/drizzle.config.js +21 -0
  56. package/dist/engagement/social/drizzle.config.js.map +1 -0
  57. package/dist/engagement/social/index.d.ts +3 -0
  58. package/dist/engagement/social/index.d.ts.map +1 -0
  59. package/dist/engagement/social/index.js +6 -0
  60. package/dist/engagement/social/index.js.map +1 -0
  61. package/dist/engagement/social/migrate.d.ts +5 -0
  62. package/dist/engagement/social/migrate.d.ts.map +1 -0
  63. package/dist/engagement/social/migrate.js +17 -0
  64. package/dist/engagement/social/migrate.js.map +1 -0
  65. package/dist/engagement/social/plugin.d.ts +111 -0
  66. package/dist/engagement/social/plugin.d.ts.map +1 -0
  67. package/dist/engagement/social/plugin.js +16 -0
  68. package/dist/engagement/social/plugin.js.map +1 -0
  69. package/dist/engagement/social/router/index.d.ts +31 -0
  70. package/dist/engagement/social/router/index.d.ts.map +1 -0
  71. package/dist/engagement/social/router/index.js +31 -0
  72. package/dist/engagement/social/router/index.js.map +1 -0
  73. package/dist/engagement/social/schema/index.d.ts +128 -0
  74. package/dist/engagement/social/schema/index.d.ts.map +1 -0
  75. package/dist/engagement/social/schema/index.js +36 -0
  76. package/dist/engagement/social/schema/index.js.map +1 -0
  77. package/dist/engagement/social/service/social.service.d.ts +39 -0
  78. package/dist/engagement/social/service/social.service.d.ts.map +1 -0
  79. package/dist/engagement/social/service/social.service.js +251 -0
  80. package/dist/engagement/social/service/social.service.js.map +1 -0
  81. package/package.json +21 -1
@@ -0,0 +1,251 @@
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';
4
+ import { player } from '@openora/core/pam/schema/profile';
5
+ import { friendship } from '../schema/index.js';
6
+ // The caller targeted themselves (SendFriendRequestInputSchema.targetUserId === callerId).
7
+ export const SelfFriendRequestError = createDomainError('SelfFriendRequestError', () => 'You cannot send a friend request to yourself');
8
+ // A genuinely nonexistent target only - never thrown for a target that exists but
9
+ // can't be requested (moderated or blocking), so an API consumer can trust that a
10
+ // NOT_FOUND means "no such player" and not have to guess.
11
+ export const FriendRequestTargetNotFoundError = makeNotFoundError('FriendRequestTarget');
12
+ // The target exists but can't receive requests right now - covers BOTH "suspended
13
+ // or closed" and "target has blocked the caller" behind the SAME code/message so
14
+ // callers still cannot distinguish a blocking account from a moderated one (the
15
+ // block itself stays undisclosed); this only stops lying that the account is
16
+ // missing entirely.
17
+ export const FriendRequestUnavailableError = makeConflictError('FRIEND_REQUEST_UNAVAILABLE', 'This player cannot receive friend requests right now');
18
+ // The caller's own chat block is disclosed because it is the caller's state.
19
+ export const BlockedBySelfError = makeConflictError('BLOCKED_BY_SELF', 'You have blocked this player - unblock them first');
20
+ export const AlreadyFriendsError = makeConflictError('ALREADY_FRIENDS', 'You are already friends with this player');
21
+ export const RequestAlreadyPendingError = makeConflictError('REQUEST_ALREADY_PENDING', 'A friend request to this player is already pending');
22
+ 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).
29
+ function pgErrorCode(e) {
30
+ if (typeof e !== 'object' || e === null) {
31
+ return undefined;
32
+ }
33
+ if ('code' in e && typeof e.code === 'string') {
34
+ return e.code;
35
+ }
36
+ if ('cause' in e) {
37
+ return pgErrorCode(e.cause);
38
+ }
39
+ return undefined;
40
+ }
41
+ function isUniqueConstraintViolation(e) {
42
+ return pgErrorCode(e) === '23505';
43
+ }
44
+ function toFriendshipDto(row) {
45
+ return serializeRow(row, {
46
+ dateFields: ['createdAt', 'acceptedAt', 'refusedAt'],
47
+ });
48
+ }
49
+ // Finds the single row for a pair regardless of who is requester/addressee - the
50
+ // canonical-pair unique index guarantees at most one match.
51
+ function pairCondition(userA, userB) {
52
+ return or(and(eq(friendship.requesterId, userA), eq(friendship.addresseeId, userB)), and(eq(friendship.requesterId, userB), eq(friendship.addresseeId, userA)));
53
+ }
54
+ export class SocialService {
55
+ drizzle;
56
+ events;
57
+ constructor(drizzle, events) {
58
+ this.drizzle = drizzle;
59
+ this.events = events;
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
+ async sendFriendRequest(callerId, targetUserId) {
71
+ if (targetUserId === callerId) {
72
+ throw new SelfFriendRequestError();
73
+ }
74
+ // Batched: caller + target resolved in one query rather than two round trips.
75
+ const players = await this.drizzle.db
76
+ .select({ userId: player.userId, displayName: player.displayName, status: player.status })
77
+ .from(player)
78
+ .where(inArray(player.userId, [callerId, targetUserId]));
79
+ const targetPlayer = players.find((p) => p.userId === targetUserId);
80
+ const callerPlayer = players.find((p) => p.userId === callerId);
81
+ if (!targetPlayer) {
82
+ throw new FriendRequestTargetNotFoundError(targetUserId);
83
+ }
84
+ if (targetPlayer.status === 'suspended' || targetPlayer.status === 'closed') {
85
+ throw new FriendRequestUnavailableError();
86
+ }
87
+ if (!callerPlayer) {
88
+ // Invariant: an authenticated caller always has a player row. Not a domain
89
+ // error (nothing the caller can act on) - fail loudly instead of masking it.
90
+ throw new Error(`Player profile missing for authenticated caller: ${callerId}`);
91
+ }
92
+ // Both directions checked in one query: at most the two rows for this pair exist.
93
+ const blocks = await this.drizzle.db
94
+ .select({ blockerId: chatUserBlock.blockerId, blockedId: chatUserBlock.blockedId })
95
+ .from(chatUserBlock)
96
+ .where(and(isNull(chatUserBlock.removedAt), pairBlockCondition(callerId, targetUserId)));
97
+ if (blocks.some((b) => b.blockerId === targetUserId && b.blockedId === callerId)) {
98
+ // Target has blocked the caller - never disclosed, same error as "suspended".
99
+ throw new FriendRequestUnavailableError();
100
+ }
101
+ if (blocks.some((b) => b.blockerId === callerId && b.blockedId === targetUserId)) {
102
+ throw new BlockedBySelfError();
103
+ }
104
+ let inserted;
105
+ try {
106
+ const rows = await this.drizzle.db
107
+ .insert(friendship)
108
+ .values({ requesterId: callerId, addresseeId: targetUserId })
109
+ .returning();
110
+ inserted = rows[0];
111
+ }
112
+ catch (error) {
113
+ if (!isUniqueConstraintViolation(error)) {
114
+ throw error;
115
+ }
116
+ }
117
+ if (inserted) {
118
+ this.events.emit('social.friend_request.sent', {
119
+ friendshipId: inserted.id,
120
+ requesterId: inserted.requesterId,
121
+ addresseeId: inserted.addresseeId,
122
+ requesterDisplayName: callerPlayer.displayName,
123
+ });
124
+ return toFriendshipDto(inserted);
125
+ }
126
+ const accepted = await this.resolveExistingPair(callerId, targetUserId);
127
+ this.events.emit('social.friend_request.accepted', {
128
+ friendshipId: accepted.id,
129
+ requesterId: accepted.requesterId,
130
+ addresseeId: accepted.addresseeId,
131
+ accepterId: callerId,
132
+ accepterDisplayName: callerPlayer.displayName,
133
+ });
134
+ return toFriendshipDto(accepted);
135
+ }
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
+ async resolveExistingPair(callerId, targetUserId) {
143
+ return this.drizzle.db.transaction(async (tx) => {
144
+ const rows = await tx
145
+ .select()
146
+ .from(friendship)
147
+ .where(pairCondition(callerId, targetUserId))
148
+ .for('update')
149
+ .limit(1);
150
+ const existing = rows[0];
151
+ if (!existing) {
152
+ // The row that caused the violation is gone (eg concurrently removed) -
153
+ // safe to surface as "no longer pending", the caller can retry.
154
+ throw new RequestAlreadyPendingError();
155
+ }
156
+ if (existing.refusedAt !== null) {
157
+ throw new FriendRequestRefusedError();
158
+ }
159
+ if (existing.acceptedAt !== null) {
160
+ throw new AlreadyFriendsError();
161
+ }
162
+ if (existing.requesterId === callerId) {
163
+ throw new RequestAlreadyPendingError();
164
+ }
165
+ // Mutual/simultaneous case: existing.requesterId === targetUserId - the
166
+ // pending row was already addressed TO the caller.
167
+ const updatedRows = await tx
168
+ .update(friendship)
169
+ .set({ acceptedAt: new Date(), refusedAt: null })
170
+ .where(eq(friendship.id, existing.id))
171
+ .returning();
172
+ const updated = updatedRows[0];
173
+ if (!updated) {
174
+ throw new RequestAlreadyPendingError();
175
+ }
176
+ return updated;
177
+ });
178
+ }
179
+ /**
180
+ * Batch relationship lookup for a set of target users, from the caller's point
181
+ * of view. Reads are batched (one query per table, `IN (...)` over the target
182
+ * ids) rather than N+1 per target.
183
+ */
184
+ async getRelationships(callerId, targetUserIds) {
185
+ const uniqueTargetIds = [...new Set(targetUserIds)];
186
+ const players = await this.drizzle.db
187
+ .select({ userId: player.userId, status: player.status })
188
+ .from(player)
189
+ .where(inArray(player.userId, uniqueTargetIds));
190
+ const playerByUserId = new Map(players.map((p) => [p.userId, p]));
191
+ const friendships = await this.drizzle.db
192
+ .select()
193
+ .from(friendship)
194
+ .where(or(and(eq(friendship.requesterId, callerId), inArray(friendship.addresseeId, uniqueTargetIds)), and(inArray(friendship.requesterId, uniqueTargetIds), eq(friendship.addresseeId, callerId))));
195
+ const friendshipByTargetId = new Map();
196
+ for (const row of friendships) {
197
+ const targetId = row.requesterId === callerId ? row.addresseeId : row.requesterId;
198
+ friendshipByTargetId.set(targetId, row);
199
+ }
200
+ const blocks = await this.drizzle.db
201
+ .select({ blockerId: chatUserBlock.blockerId, blockedId: chatUserBlock.blockedId })
202
+ .from(chatUserBlock)
203
+ .where(and(isNull(chatUserBlock.removedAt), or(and(eq(chatUserBlock.blockerId, callerId), inArray(chatUserBlock.blockedId, uniqueTargetIds)), and(inArray(chatUserBlock.blockerId, uniqueTargetIds), eq(chatUserBlock.blockedId, callerId)))));
204
+ const blockedByMe = new Set(blocks.filter((b) => b.blockerId === callerId).map((b) => b.blockedId));
205
+ const blockedByTarget = new Set(blocks.filter((b) => b.blockedId === callerId).map((b) => b.blockerId));
206
+ return targetUserIds.map((userId) => {
207
+ const targetPlayer = playerByUserId.get(userId);
208
+ if (!targetPlayer ||
209
+ targetPlayer.status === 'suspended' ||
210
+ targetPlayer.status === 'closed' ||
211
+ blockedByTarget.has(userId)) {
212
+ return { userId, status: 'unavailable', friendshipId: null, canSendRequest: false };
213
+ }
214
+ if (blockedByMe.has(userId)) {
215
+ return { userId, status: 'blocked_by_me', friendshipId: null, canSendRequest: false };
216
+ }
217
+ const existing = friendshipByTargetId.get(userId);
218
+ if (existing?.refusedAt !== null && existing?.refusedAt !== undefined) {
219
+ return { userId, status: 'refused', friendshipId: existing.id, canSendRequest: false };
220
+ }
221
+ if (existing?.acceptedAt !== null && existing?.acceptedAt !== undefined) {
222
+ return { userId, status: 'friends', friendshipId: existing.id, canSendRequest: false };
223
+ }
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 {
238
+ userId,
239
+ status: 'pending_incoming',
240
+ friendshipId: existing.id,
241
+ canSendRequest: false,
242
+ };
243
+ }
244
+ return { userId, status: 'none', friendshipId: null, canSendRequest: true };
245
+ });
246
+ }
247
+ }
248
+ function pairBlockCondition(callerId, targetUserId) {
249
+ return or(and(eq(chatUserBlock.blockerId, targetUserId), eq(chatUserBlock.blockedId, callerId)), and(eq(chatUserBlock.blockerId, callerId), eq(chatUserBlock.blockedId, targetUserId)));
250
+ }
251
+ //# sourceMappingURL=social.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"social.service.js","sourceRoot":"","sources":["../../../../src/engagement/social/service/social.service.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openora/core",
3
- "version": "0.4.1-canary.67",
3
+ "version": "0.4.1-canary.69",
4
4
  "description": "Open-source, headless, plugin-based, AI-native iGaming framework - domain modules, plugin engine, Zod-first contracts, typed React SDK",
5
5
  "keywords": [
6
6
  "ai-native",
@@ -593,6 +593,26 @@
593
593
  "types": "./dist/engagement/social-transfers/migrate.d.ts",
594
594
  "import": "./dist/engagement/social-transfers/migrate.js",
595
595
  "default": "./dist/engagement/social-transfers/migrate.js"
596
+ },
597
+ "./engagement/contracts/social": {
598
+ "types": "./dist/engagement/social/contract/index.d.ts",
599
+ "import": "./dist/engagement/social/contract/index.js",
600
+ "default": "./dist/engagement/social/contract/index.js"
601
+ },
602
+ "./engagement/schema/social": {
603
+ "types": "./dist/engagement/social/schema/index.d.ts",
604
+ "import": "./dist/engagement/social/schema/index.js",
605
+ "default": "./dist/engagement/social/schema/index.js"
606
+ },
607
+ "./engagement/plugins/social": {
608
+ "types": "./dist/engagement/social/plugin.d.ts",
609
+ "import": "./dist/engagement/social/plugin.js",
610
+ "default": "./dist/engagement/social/plugin.js"
611
+ },
612
+ "./engagement/migrate/social": {
613
+ "types": "./dist/engagement/social/migrate.d.ts",
614
+ "import": "./dist/engagement/social/migrate.js",
615
+ "default": "./dist/engagement/social/migrate.js"
596
616
  }
597
617
  },
598
618
  "publishConfig": {