@headless-lms/adapter-db 0.2.0 → 0.3.0

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 (104) hide show
  1. package/dist/index.d.ts +7 -6
  2. package/dist/index.js +7 -6
  3. package/dist/repositories/admin.d.ts +23 -0
  4. package/dist/repositories/admin.js +393 -0
  5. package/dist/repositories/admin.js.map +1 -0
  6. package/dist/repositories/assets.d.ts +6 -2
  7. package/dist/repositories/assets.js +50 -9
  8. package/dist/repositories/assets.js.map +1 -1
  9. package/dist/repositories/automations.d.ts +6 -2
  10. package/dist/repositories/automations.js +45 -2
  11. package/dist/repositories/automations.js.map +1 -1
  12. package/dist/repositories/chats.d.ts +55 -0
  13. package/dist/repositories/chats.js +454 -0
  14. package/dist/repositories/chats.js.map +1 -0
  15. package/dist/repositories/content.d.ts +24 -1
  16. package/dist/repositories/content.js +293 -9
  17. package/dist/repositories/content.js.map +1 -1
  18. package/dist/repositories/discussion.d.ts +10 -3
  19. package/dist/repositories/discussion.js +70 -15
  20. package/dist/repositories/discussion.js.map +1 -1
  21. package/dist/repositories/entitlements.d.ts +29 -9
  22. package/dist/repositories/entitlements.js +207 -17
  23. package/dist/repositories/entitlements.js.map +1 -1
  24. package/dist/repositories/grant-covers.d.ts +20 -0
  25. package/dist/repositories/grant-covers.js +55 -0
  26. package/dist/repositories/grant-covers.js.map +1 -0
  27. package/dist/repositories/identity.d.ts +4 -2
  28. package/dist/repositories/identity.js +32 -1
  29. package/dist/repositories/identity.js.map +1 -1
  30. package/dist/repositories/member.d.ts +16 -0
  31. package/dist/repositories/member.js +63 -0
  32. package/dist/repositories/member.js.map +1 -0
  33. package/dist/repositories/members.js +2 -2
  34. package/dist/repositories/members.js.map +1 -1
  35. package/dist/repositories/notifications.d.ts +23 -0
  36. package/dist/repositories/notifications.js +70 -0
  37. package/dist/repositories/notifications.js.map +1 -0
  38. package/dist/repositories/org-user-profile.d.ts +214 -1
  39. package/dist/repositories/org-user-profile.js +23 -2
  40. package/dist/repositories/org-user-profile.js.map +1 -1
  41. package/dist/repositories/organizations.d.ts +3 -2
  42. package/dist/repositories/organizations.js +20 -8
  43. package/dist/repositories/organizations.js.map +1 -1
  44. package/dist/repositories/pg-errors.js +3 -1
  45. package/dist/repositories/pg-errors.js.map +1 -1
  46. package/dist/repositories/posts.d.ts +39 -0
  47. package/dist/repositories/posts.js +255 -0
  48. package/dist/repositories/posts.js.map +1 -0
  49. package/dist/schema/assets.d.ts +19 -2
  50. package/dist/schema/assets.js +10 -4
  51. package/dist/schema/assets.js.map +1 -1
  52. package/dist/schema/automations.d.ts +38 -0
  53. package/dist/schema/automations.js +5 -1
  54. package/dist/schema/automations.js.map +1 -1
  55. package/dist/schema/better-auth.d.ts +1613 -238
  56. package/dist/schema/better-auth.js +107 -22
  57. package/dist/schema/better-auth.js.map +1 -1
  58. package/dist/schema/content.d.ts +642 -5
  59. package/dist/schema/content.js +119 -10
  60. package/dist/schema/content.js.map +1 -1
  61. package/dist/schema/discussion.d.ts +2045 -55
  62. package/dist/schema/discussion.js +426 -11
  63. package/dist/schema/discussion.js.map +1 -1
  64. package/dist/schema/entitlements.d.ts +432 -1
  65. package/dist/schema/entitlements.js +109 -4
  66. package/dist/schema/entitlements.js.map +1 -1
  67. package/dist/schema/identity.d.ts +517 -1
  68. package/dist/schema/identity.js +118 -2
  69. package/dist/schema/identity.js.map +1 -1
  70. package/dist/schema/index.d.ts +6 -6
  71. package/dist/schema/index.js +30 -7
  72. package/dist/schema/organizations.d.ts +4 -4
  73. package/dist/schema/organizations.js +2 -0
  74. package/dist/schema/organizations.js.map +1 -1
  75. package/drizzle/0003_community.sql +340 -0
  76. package/drizzle/0004_assets_sources.sql +1 -0
  77. package/drizzle/0005_notices_and_seed_index.sql +12 -0
  78. package/drizzle/0006_community_review_fixes.sql +24 -0
  79. package/drizzle/0007_notifications.sql +37 -0
  80. package/drizzle/0008_content_access.sql +13 -0
  81. package/drizzle/0009_community_indexes.sql +56 -0
  82. package/drizzle/0010_mcp_access.sql +114 -0
  83. package/drizzle/meta/0003_snapshot.json +7061 -0
  84. package/drizzle/meta/0004_snapshot.json +7068 -0
  85. package/drizzle/meta/0005_snapshot.json +7180 -0
  86. package/drizzle/meta/0006_snapshot.json +7298 -0
  87. package/drizzle/meta/0007_snapshot.json +7620 -0
  88. package/drizzle/meta/0008_snapshot.json +7666 -0
  89. package/drizzle/meta/0009_snapshot.json +8185 -0
  90. package/drizzle/meta/0010_snapshot.json +8813 -0
  91. package/drizzle/meta/_journal.json +57 -1
  92. package/package.json +2 -2
  93. package/dist/repositories/course-analytics.d.ts +0 -15
  94. package/dist/repositories/course-analytics.js +0 -137
  95. package/dist/repositories/course-analytics.js.map +0 -1
  96. package/dist/repositories/dashboard.d.ts +0 -14
  97. package/dist/repositories/dashboard.js +0 -57
  98. package/dist/repositories/dashboard.js.map +0 -1
  99. package/dist/repositories/learn.d.ts +0 -19
  100. package/dist/repositories/learn.js +0 -56
  101. package/dist/repositories/learn.js.map +0 -1
  102. package/dist/repositories/students.d.ts +0 -16
  103. package/dist/repositories/students.js +0 -160
  104. package/dist/repositories/students.js.map +0 -1
@@ -1,13 +1,177 @@
1
+ import { assets } from "./assets.js";
2
+ import { activities, communities, spaceTopics, spaces } from "./content.js";
1
3
  import { orgUsers, organizations } from "./organizations.js";
2
- import { activities } from "./content.js";
3
- import { sql } from "drizzle-orm";
4
- import { check, foreignKey, index, pgTable, primaryKey, text, timestamp, unique } from "drizzle-orm/pg-core";
4
+ import { desc, sql } from "drizzle-orm";
5
+ import { boolean, check, foreignKey, index, integer, jsonb, pgTable, primaryKey, text, timestamp, unique } from "drizzle-orm/pg-core";
5
6
  import { genId } from "@headless-lms/core/shared/id";
6
7
  //#region src/schema/discussion.ts
8
+ const posts = pgTable("posts", {
9
+ orgId: text("org_id").notNull().references(() => organizations.id),
10
+ id: text("id").notNull().$defaultFn(() => genId("post")),
11
+ communityId: text("community_id").notNull(),
12
+ spaceId: text("space_id").notNull(),
13
+ orgUserId: text("org_user_id").notNull(),
14
+ topicId: text("topic_id"),
15
+ title: text("title").notNull(),
16
+ body: text("body").notNull(),
17
+ extra: jsonb("extra").$type().notNull().default({}),
18
+ coverAssetId: text("cover_asset_id"),
19
+ status: text("status", { enum: [
20
+ "draft",
21
+ "scheduled",
22
+ "pending",
23
+ "published",
24
+ "removed"
25
+ ] }).notNull().default("draft"),
26
+ scheduledAt: timestamp("scheduled_at", { withTimezone: true }),
27
+ publishedAt: timestamp("published_at", { withTimezone: true }),
28
+ removedBy: text("removed_by"),
29
+ pinned: boolean("pinned").notNull().default(false),
30
+ commentsClosed: boolean("comments_closed"),
31
+ reactionsEnabled: boolean("reactions_enabled"),
32
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
33
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow().$onUpdate(() => /* @__PURE__ */ new Date())
34
+ }, (t) => ({
35
+ pk: primaryKey({ columns: [t.orgId, t.id] }),
36
+ spaceFk: foreignKey({
37
+ columns: [
38
+ t.orgId,
39
+ t.spaceId,
40
+ t.communityId
41
+ ],
42
+ foreignColumns: [
43
+ spaces.orgId,
44
+ spaces.id,
45
+ spaces.communityId
46
+ ]
47
+ }).onDelete("cascade"),
48
+ authorFk: foreignKey({
49
+ columns: [t.orgId, t.orgUserId],
50
+ foreignColumns: [orgUsers.orgId, orgUsers.id]
51
+ }),
52
+ topicFk: foreignKey({
53
+ columns: [
54
+ t.orgId,
55
+ t.spaceId,
56
+ t.topicId
57
+ ],
58
+ foreignColumns: [
59
+ spaceTopics.orgId,
60
+ spaceTopics.spaceId,
61
+ spaceTopics.id
62
+ ]
63
+ }),
64
+ coverAssetFk: foreignKey({
65
+ columns: [t.orgId, t.coverAssetId],
66
+ foreignColumns: [assets.orgId, assets.id]
67
+ }),
68
+ removedByFk: foreignKey({
69
+ columns: [t.orgId, t.removedBy],
70
+ foreignColumns: [orgUsers.orgId, orgUsers.id]
71
+ }).onDelete("set null"),
72
+ removedCk: check("posts_removed_by_check", sql`${t.removedBy} is null or ${t.status} = 'removed'`),
73
+ scheduledCk: check("posts_scheduled_check", sql`${t.status} <> 'scheduled' or ${t.scheduledAt} is not null`),
74
+ feedIdx: index("posts_feed_idx").on(t.orgId, t.spaceId, t.status, desc(t.pinned), desc(t.publishedAt)),
75
+ dueIdx: index("posts_due_idx").on(t.orgId, t.status, t.scheduledAt),
76
+ authorIdx: index("posts_author_idx").on(t.orgId, t.orgUserId, t.createdAt),
77
+ coverAssetIdx: index("posts_cover_asset_idx").on(t.orgId, t.coverAssetId)
78
+ }));
79
+ const postReactions = pgTable("post_reactions", {
80
+ orgId: text("org_id").notNull().references(() => organizations.id),
81
+ postId: text("post_id").notNull(),
82
+ orgUserId: text("org_user_id").notNull(),
83
+ emoji: text("emoji").notNull(),
84
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
85
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow().$onUpdate(() => /* @__PURE__ */ new Date())
86
+ }, (t) => ({
87
+ pk: primaryKey({ columns: [
88
+ t.orgId,
89
+ t.postId,
90
+ t.orgUserId
91
+ ] }),
92
+ postFk: foreignKey({
93
+ columns: [t.orgId, t.postId],
94
+ foreignColumns: [posts.orgId, posts.id]
95
+ }).onDelete("cascade"),
96
+ orgUserFk: foreignKey({
97
+ columns: [t.orgId, t.orgUserId],
98
+ foreignColumns: [orgUsers.orgId, orgUsers.id]
99
+ }).onDelete("cascade")
100
+ }));
101
+ const postFollows = pgTable("post_follows", {
102
+ orgId: text("org_id").notNull().references(() => organizations.id),
103
+ postId: text("post_id").notNull(),
104
+ orgUserId: text("org_user_id").notNull(),
105
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
106
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow().$onUpdate(() => /* @__PURE__ */ new Date())
107
+ }, (t) => ({
108
+ pk: primaryKey({ columns: [
109
+ t.orgId,
110
+ t.postId,
111
+ t.orgUserId
112
+ ] }),
113
+ postFk: foreignKey({
114
+ columns: [t.orgId, t.postId],
115
+ foreignColumns: [posts.orgId, posts.id]
116
+ }).onDelete("cascade"),
117
+ orgUserFk: foreignKey({
118
+ columns: [t.orgId, t.orgUserId],
119
+ foreignColumns: [orgUsers.orgId, orgUsers.id]
120
+ }).onDelete("cascade")
121
+ }));
122
+ const postBookmarks = pgTable("post_bookmarks", {
123
+ orgId: text("org_id").notNull().references(() => organizations.id),
124
+ postId: text("post_id").notNull(),
125
+ orgUserId: text("org_user_id").notNull(),
126
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
127
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow().$onUpdate(() => /* @__PURE__ */ new Date())
128
+ }, (t) => ({
129
+ pk: primaryKey({ columns: [
130
+ t.orgId,
131
+ t.postId,
132
+ t.orgUserId
133
+ ] }),
134
+ postFk: foreignKey({
135
+ columns: [t.orgId, t.postId],
136
+ foreignColumns: [posts.orgId, posts.id]
137
+ }).onDelete("cascade"),
138
+ orgUserFk: foreignKey({
139
+ columns: [t.orgId, t.orgUserId],
140
+ foreignColumns: [orgUsers.orgId, orgUsers.id]
141
+ }).onDelete("cascade"),
142
+ userIdx: index("post_bookmarks_user_idx").on(t.orgId, t.orgUserId, t.createdAt)
143
+ }));
144
+ const postFlags = pgTable("post_flags", {
145
+ orgId: text("org_id").notNull().references(() => organizations.id),
146
+ id: text("id").notNull().$defaultFn(() => genId("postFlag")),
147
+ postId: text("post_id").notNull(),
148
+ orgUserId: text("org_user_id").notNull(),
149
+ reason: text("reason").notNull().default(""),
150
+ resolvedAt: timestamp("resolved_at", { withTimezone: true }),
151
+ resolution: text("resolution", { enum: ["dismissed", "removed"] }),
152
+ resolvedBy: text("resolved_by"),
153
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
154
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow().$onUpdate(() => /* @__PURE__ */ new Date())
155
+ }, (t) => ({
156
+ pk: primaryKey({ columns: [t.orgId, t.id] }),
157
+ reporterUq: unique().on(t.orgId, t.postId, t.orgUserId),
158
+ postFk: foreignKey({
159
+ columns: [t.orgId, t.postId],
160
+ foreignColumns: [posts.orgId, posts.id]
161
+ }).onDelete("cascade"),
162
+ reporterFk: foreignKey({
163
+ columns: [t.orgId, t.orgUserId],
164
+ foreignColumns: [orgUsers.orgId, orgUsers.id]
165
+ }).onDelete("cascade"),
166
+ resolvedCk: check("post_flags_resolved_check", sql`(${t.resolvedAt} is null) = (${t.resolution} is null) and (${t.resolvedAt} is null) = (${t.resolvedBy} is null)`),
167
+ openIdx: index("post_flags_open_idx").on(t.orgId, t.postId, t.resolvedAt)
168
+ }));
7
169
  const comments = pgTable("comments", {
8
170
  orgId: text("org_id").notNull().references(() => organizations.id),
9
171
  id: text("id").notNull().$defaultFn(() => genId("comment")),
10
- activityId: text("activity_id").notNull(),
172
+ activityId: text("activity_id"),
173
+ postId: text("post_id"),
174
+ communityId: text("community_id"),
11
175
  parentId: text("parent_id"),
12
176
  orgUserId: text("org_user_id").notNull(),
13
177
  body: text("body").notNull(),
@@ -25,6 +189,14 @@ const comments = pgTable("comments", {
25
189
  columns: [t.orgId, t.activityId],
26
190
  foreignColumns: [activities.orgId, activities.id]
27
191
  }).onDelete("cascade"),
192
+ postFk: foreignKey({
193
+ columns: [t.orgId, t.postId],
194
+ foreignColumns: [posts.orgId, posts.id]
195
+ }).onDelete("cascade"),
196
+ communityFk: foreignKey({
197
+ columns: [t.orgId, t.communityId],
198
+ foreignColumns: [communities.orgId, communities.id]
199
+ }).onDelete("cascade"),
28
200
  authorFk: foreignKey({
29
201
  columns: [t.orgId, t.orgUserId],
30
202
  foreignColumns: [orgUsers.orgId, orgUsers.id]
@@ -32,14 +204,19 @@ const comments = pgTable("comments", {
32
204
  removedByFk: foreignKey({
33
205
  columns: [t.orgId, t.removedBy],
34
206
  foreignColumns: [orgUsers.orgId, orgUsers.id]
35
- }),
207
+ }).onDelete("set null"),
36
208
  parentFk: foreignKey({
37
209
  columns: [t.orgId, t.parentId],
38
210
  foreignColumns: [t.orgId, t.id]
39
211
  }),
40
- removedCk: check("comments_removed_by_check", sql`(${t.status} = 'removed') = (${t.removedBy} is not null)`),
212
+ removedCk: check("comments_removed_by_check", sql`${t.removedBy} is null or ${t.status} = 'removed'`),
213
+ targetCk: check("comments_target_check", sql`num_nonnulls(${t.activityId}, ${t.postId}) = 1`),
214
+ communityCk: check("comments_community_check", sql`${t.postId} is null or ${t.communityId} is not null`),
41
215
  activityIdx: index("comments_activity_idx").on(t.orgId, t.activityId, t.status, t.createdAt),
42
- queueIdx: index("comments_queue_idx").on(t.orgId, t.status, t.createdAt)
216
+ postIdx: index("comments_post_idx").on(t.orgId, t.postId, t.status, t.createdAt),
217
+ queueIdx: index("comments_queue_idx").on(t.orgId, t.status, t.createdAt),
218
+ communityIdx: index("comments_community_idx").on(t.orgId, t.communityId),
219
+ parentIdx: index("comments_parent_idx").on(t.orgId, t.parentId, t.createdAt)
43
220
  }));
44
221
  const commentReactions = pgTable("comment_reactions", {
45
222
  orgId: text("org_id").notNull().references(() => organizations.id),
@@ -61,15 +238,17 @@ const commentReactions = pgTable("comment_reactions", {
61
238
  authorFk: foreignKey({
62
239
  columns: [t.orgId, t.orgUserId],
63
240
  foreignColumns: [orgUsers.orgId, orgUsers.id]
64
- })
241
+ }).onDelete("cascade")
65
242
  }));
66
- const commentReports = pgTable("comment_reports", {
243
+ const commentFlags = pgTable("comment_flags", {
67
244
  orgId: text("org_id").notNull().references(() => organizations.id),
68
245
  id: text("id").notNull().$defaultFn(() => genId("commentReport")),
69
246
  commentId: text("comment_id").notNull(),
70
247
  orgUserId: text("org_user_id").notNull(),
71
248
  reason: text("reason").notNull().default(""),
72
249
  resolvedAt: timestamp("resolved_at", { withTimezone: true }),
250
+ resolution: text("resolution", { enum: ["dismissed", "removed"] }),
251
+ resolvedBy: text("resolved_by"),
73
252
  createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
74
253
  updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow().$onUpdate(() => /* @__PURE__ */ new Date())
75
254
  }, (t) => ({
@@ -82,10 +261,246 @@ const commentReports = pgTable("comment_reports", {
82
261
  reporterFk: foreignKey({
83
262
  columns: [t.orgId, t.orgUserId],
84
263
  foreignColumns: [orgUsers.orgId, orgUsers.id]
264
+ }).onDelete("cascade"),
265
+ resolvedCk: check("comment_flags_resolved_check", sql`(${t.resolvedAt} is null) = (${t.resolution} is null) and (${t.resolvedBy} is null or ${t.resolvedAt} is not null)`),
266
+ openIdx: index("comment_flags_open_idx").on(t.orgId, t.commentId, t.resolvedAt)
267
+ }));
268
+ const chats = pgTable("chats", {
269
+ orgId: text("org_id").notNull().references(() => organizations.id),
270
+ id: text("id").notNull().$defaultFn(() => genId("chat")),
271
+ communityId: text("community_id").notNull(),
272
+ kind: text("kind", { enum: ["direct", "group"] }).notNull(),
273
+ status: text("status", { enum: [
274
+ "pending",
275
+ "open",
276
+ "closed"
277
+ ] }).notNull().default("open"),
278
+ createdBy: text("created_by"),
279
+ lockedAt: timestamp("locked_at", { withTimezone: true }),
280
+ lockedBy: text("locked_by"),
281
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
282
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow().$onUpdate(() => /* @__PURE__ */ new Date())
283
+ }, (t) => ({
284
+ pk: primaryKey({ columns: [t.orgId, t.id] }),
285
+ communityUq: unique().on(t.orgId, t.id, t.communityId),
286
+ communityFk: foreignKey({
287
+ columns: [t.orgId, t.communityId],
288
+ foreignColumns: [communities.orgId, communities.id]
289
+ }).onDelete("cascade"),
290
+ createdByFk: foreignKey({
291
+ columns: [t.orgId, t.createdBy],
292
+ foreignColumns: [orgUsers.orgId, orgUsers.id]
293
+ }).onDelete("set null"),
294
+ lockedByFk: foreignKey({
295
+ columns: [t.orgId, t.lockedBy],
296
+ foreignColumns: [orgUsers.orgId, orgUsers.id]
297
+ }).onDelete("set null"),
298
+ lockedCk: check("chats_locked_check", sql`${t.lockedBy} is null or ${t.lockedAt} is not null`)
299
+ }));
300
+ const chatUsers = pgTable("chat_users", {
301
+ orgId: text("org_id").notNull().references(() => organizations.id),
302
+ communityId: text("community_id").notNull(),
303
+ chatId: text("chat_id").notNull(),
304
+ orgUserId: text("org_user_id").notNull(),
305
+ joinedAt: timestamp("joined_at", { withTimezone: true }).notNull().defaultNow(),
306
+ leftAt: timestamp("left_at", { withTimezone: true }),
307
+ lastReadMessageId: text("last_read_message_id"),
308
+ muted: boolean("muted").notNull().default(false),
309
+ mutedUntil: timestamp("muted_until", { withTimezone: true }),
310
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
311
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow().$onUpdate(() => /* @__PURE__ */ new Date())
312
+ }, (t) => ({
313
+ pk: primaryKey({ columns: [
314
+ t.orgId,
315
+ t.chatId,
316
+ t.orgUserId
317
+ ] }),
318
+ chatFk: foreignKey({
319
+ columns: [
320
+ t.orgId,
321
+ t.chatId,
322
+ t.communityId
323
+ ],
324
+ foreignColumns: [
325
+ chats.orgId,
326
+ chats.id,
327
+ chats.communityId
328
+ ]
329
+ }).onDelete("cascade"),
330
+ orgUserFk: foreignKey({
331
+ columns: [t.orgId, t.orgUserId],
332
+ foreignColumns: [orgUsers.orgId, orgUsers.id]
333
+ }).onDelete("cascade"),
334
+ userIdx: index("chat_users_user_idx").on(t.orgId, t.communityId, t.orgUserId)
335
+ }));
336
+ const messages = pgTable("messages", {
337
+ orgId: text("org_id").notNull().references(() => organizations.id),
338
+ id: text("id").notNull().$defaultFn(() => genId("message")),
339
+ communityId: text("community_id").notNull(),
340
+ chatId: text("chat_id").notNull(),
341
+ orgUserId: text("org_user_id").notNull(),
342
+ body: text("body").notNull(),
343
+ replyToId: text("reply_to_id"),
344
+ editedAt: timestamp("edited_at", { withTimezone: true }),
345
+ deletedAt: timestamp("deleted_at", { withTimezone: true }),
346
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
347
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow().$onUpdate(() => /* @__PURE__ */ new Date())
348
+ }, (t) => ({
349
+ pk: primaryKey({ columns: [t.orgId, t.id] }),
350
+ communityUq: unique().on(t.orgId, t.id, t.communityId),
351
+ chatFk: foreignKey({
352
+ columns: [
353
+ t.orgId,
354
+ t.chatId,
355
+ t.communityId
356
+ ],
357
+ foreignColumns: [
358
+ chats.orgId,
359
+ chats.id,
360
+ chats.communityId
361
+ ]
362
+ }).onDelete("cascade"),
363
+ authorFk: foreignKey({
364
+ columns: [t.orgId, t.orgUserId],
365
+ foreignColumns: [orgUsers.orgId, orgUsers.id]
366
+ }),
367
+ replyFk: foreignKey({
368
+ columns: [t.orgId, t.replyToId],
369
+ foreignColumns: [t.orgId, t.id]
370
+ }),
371
+ chatIdx: index("messages_chat_idx").on(t.orgId, t.chatId, t.createdAt),
372
+ replyIdx: index("messages_reply_idx").on(t.orgId, t.replyToId)
373
+ }));
374
+ const messageAttachments = pgTable("message_attachments", {
375
+ orgId: text("org_id").notNull().references(() => organizations.id),
376
+ communityId: text("community_id").notNull(),
377
+ messageId: text("message_id").notNull(),
378
+ assetId: text("asset_id").notNull(),
379
+ seq: integer("seq").notNull().default(0),
380
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
381
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow().$onUpdate(() => /* @__PURE__ */ new Date())
382
+ }, (t) => ({
383
+ pk: primaryKey({ columns: [
384
+ t.orgId,
385
+ t.messageId,
386
+ t.assetId
387
+ ] }),
388
+ messageFk: foreignKey({
389
+ columns: [
390
+ t.orgId,
391
+ t.messageId,
392
+ t.communityId
393
+ ],
394
+ foreignColumns: [
395
+ messages.orgId,
396
+ messages.id,
397
+ messages.communityId
398
+ ]
399
+ }).onDelete("cascade"),
400
+ assetFk: foreignKey({
401
+ columns: [t.orgId, t.assetId],
402
+ foreignColumns: [assets.orgId, assets.id]
85
403
  }),
86
- openIdx: index("comment_reports_open_idx").on(t.orgId, t.commentId, t.resolvedAt)
404
+ assetIdx: index("message_attachments_asset_idx").on(t.orgId, t.assetId)
405
+ }));
406
+ const messageReactions = pgTable("message_reactions", {
407
+ orgId: text("org_id").notNull().references(() => organizations.id),
408
+ communityId: text("community_id").notNull(),
409
+ messageId: text("message_id").notNull(),
410
+ orgUserId: text("org_user_id").notNull(),
411
+ emoji: text("emoji").notNull(),
412
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
413
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow().$onUpdate(() => /* @__PURE__ */ new Date())
414
+ }, (t) => ({
415
+ pk: primaryKey({ columns: [
416
+ t.orgId,
417
+ t.messageId,
418
+ t.orgUserId
419
+ ] }),
420
+ messageFk: foreignKey({
421
+ columns: [
422
+ t.orgId,
423
+ t.messageId,
424
+ t.communityId
425
+ ],
426
+ foreignColumns: [
427
+ messages.orgId,
428
+ messages.id,
429
+ messages.communityId
430
+ ]
431
+ }).onDelete("cascade"),
432
+ orgUserFk: foreignKey({
433
+ columns: [t.orgId, t.orgUserId],
434
+ foreignColumns: [orgUsers.orgId, orgUsers.id]
435
+ }).onDelete("cascade")
436
+ }));
437
+ const messageFlags = pgTable("message_flags", {
438
+ orgId: text("org_id").notNull().references(() => organizations.id),
439
+ id: text("id").notNull().$defaultFn(() => genId("messageFlag")),
440
+ communityId: text("community_id").notNull(),
441
+ messageId: text("message_id").notNull(),
442
+ orgUserId: text("org_user_id").notNull(),
443
+ reason: text("reason").notNull().default(""),
444
+ resolvedAt: timestamp("resolved_at", { withTimezone: true }),
445
+ resolution: text("resolution", { enum: [
446
+ "dismissed",
447
+ "deleted",
448
+ "locked"
449
+ ] }),
450
+ resolvedBy: text("resolved_by"),
451
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
452
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow().$onUpdate(() => /* @__PURE__ */ new Date())
453
+ }, (t) => ({
454
+ pk: primaryKey({ columns: [t.orgId, t.id] }),
455
+ reporterUq: unique().on(t.orgId, t.messageId, t.orgUserId),
456
+ messageFk: foreignKey({
457
+ columns: [
458
+ t.orgId,
459
+ t.messageId,
460
+ t.communityId
461
+ ],
462
+ foreignColumns: [
463
+ messages.orgId,
464
+ messages.id,
465
+ messages.communityId
466
+ ]
467
+ }).onDelete("cascade"),
468
+ reporterFk: foreignKey({
469
+ columns: [t.orgId, t.orgUserId],
470
+ foreignColumns: [orgUsers.orgId, orgUsers.id]
471
+ }).onDelete("cascade"),
472
+ resolvedCk: check("message_flags_resolved_check", sql`(${t.resolvedAt} is null) = (${t.resolution} is null) and (${t.resolvedAt} is null) = (${t.resolvedBy} is null)`),
473
+ openIdx: index("message_flags_open_idx").on(t.orgId, t.communityId, t.messageId, t.resolvedAt)
474
+ }));
475
+ const blockedUsers = pgTable("blocked_users", {
476
+ orgId: text("org_id").notNull().references(() => organizations.id),
477
+ communityId: text("community_id").notNull(),
478
+ blockerOrgUserId: text("blocker_org_user_id").notNull(),
479
+ blockedOrgUserId: text("blocked_org_user_id").notNull(),
480
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
481
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow().$onUpdate(() => /* @__PURE__ */ new Date())
482
+ }, (t) => ({
483
+ pk: primaryKey({ columns: [
484
+ t.orgId,
485
+ t.communityId,
486
+ t.blockerOrgUserId,
487
+ t.blockedOrgUserId
488
+ ] }),
489
+ communityFk: foreignKey({
490
+ columns: [t.orgId, t.communityId],
491
+ foreignColumns: [communities.orgId, communities.id]
492
+ }).onDelete("cascade"),
493
+ blockerFk: foreignKey({
494
+ columns: [t.orgId, t.blockerOrgUserId],
495
+ foreignColumns: [orgUsers.orgId, orgUsers.id]
496
+ }).onDelete("cascade"),
497
+ blockedFk: foreignKey({
498
+ columns: [t.orgId, t.blockedOrgUserId],
499
+ foreignColumns: [orgUsers.orgId, orgUsers.id]
500
+ }).onDelete("cascade"),
501
+ blockedIdx: index("blocked_users_blocked_idx").on(t.orgId, t.communityId, t.blockedOrgUserId)
87
502
  }));
88
503
  //#endregion
89
- export { commentReactions, commentReports, comments };
504
+ export { blockedUsers, chatUsers, chats, commentFlags, commentReactions, comments, messageAttachments, messageFlags, messageReactions, messages, postBookmarks, postFlags, postFollows, postReactions, posts };
90
505
 
91
506
  //# sourceMappingURL=discussion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"discussion.js","names":[],"sources":["../../src/schema/discussion.ts"],"sourcesContent":["// discussion tables — comments on an activity, their reactions and reports.\n// Configuration is not here: the course's comment settings ride on the course's\n// `content` settings row, and an activity's override rides on the activity's\n// own settings blob.\n//\n// The author is always an org user, so one column covers both\n// learners and staff. Staff-ness is NOT stored — it is read from the author's\n// current role. A removed comment keeps its row so replies below it survive;\n// only the body stops being served.\n//\n// No course_id: which course an activity sits in is content's fact and changes\n// when a course is restructured. The staff comment list joins to modules to\n// scope by course.\nimport {\n pgTable,\n text,\n timestamp,\n primaryKey,\n foreignKey,\n unique,\n index,\n check,\n} from \"drizzle-orm/pg-core\";\nimport { sql } from \"drizzle-orm\";\nimport type { Comment, CommentReaction, CommentReport } from \"@headless-lms/core/schemas\";\nimport { genId } from \"@headless-lms/core/shared/id\";\nimport { organizations, orgUsers } from \"./organizations.js\";\nimport { activities } from \"./content.js\";\nimport type { Expect, NoDrift } from \"./drift.js\";\n\nexport const comments = pgTable(\n \"comments\",\n {\n orgId: text(\"org_id\")\n .notNull()\n .references(() => organizations.id),\n id: text(\"id\")\n .notNull()\n .$defaultFn(() => genId(\"comment\")),\n activityId: text(\"activity_id\").notNull(),\n parentId: text(\"parent_id\"),\n orgUserId: text(\"org_user_id\").notNull(),\n body: text(\"body\").notNull(),\n status: text(\"status\", { enum: [\"pending\", \"published\", \"removed\"] })\n .notNull()\n .default(\"published\"),\n removedBy: text(\"removed_by\"),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true })\n .notNull()\n .defaultNow()\n .$onUpdate(() => new Date()),\n },\n (t) => ({\n pk: primaryKey({ columns: [t.orgId, t.id] }),\n // Removing an activity removes its discussion (spec, boundary 1).\n activityFk: foreignKey({\n columns: [t.orgId, t.activityId],\n foreignColumns: [activities.orgId, activities.id],\n }).onDelete(\"cascade\"),\n authorFk: foreignKey({\n columns: [t.orgId, t.orgUserId],\n foreignColumns: [orgUsers.orgId, orgUsers.id],\n }),\n removedByFk: foreignKey({\n columns: [t.orgId, t.removedBy],\n foreignColumns: [orgUsers.orgId, orgUsers.id],\n }),\n // No cascade: removing a parent must not delete its replies.\n parentFk: foreignKey({\n columns: [t.orgId, t.parentId],\n foreignColumns: [t.orgId, t.id],\n }),\n // removed_by is set if and only if the comment is removed.\n removedCk: check(\n \"comments_removed_by_check\",\n sql`(${t.status} = 'removed') = (${t.removedBy} is not null)`,\n ),\n activityIdx: index(\"comments_activity_idx\").on(t.orgId, t.activityId, t.status, t.createdAt),\n // The staff list filters by status org-wide, then narrows by course through\n // the activity join — so the index leads on status, not on a stored course.\n queueIdx: index(\"comments_queue_idx\").on(t.orgId, t.status, t.createdAt),\n }),\n);\n\nexport const commentReactions = pgTable(\n \"comment_reactions\",\n {\n orgId: text(\"org_id\")\n .notNull()\n .references(() => organizations.id),\n commentId: text(\"comment_id\").notNull(),\n orgUserId: text(\"org_user_id\").notNull(),\n emoji: text(\"emoji\").notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true })\n .notNull()\n .defaultNow()\n .$onUpdate(() => new Date()),\n },\n (t) => ({\n // One reaction per person, per comment.\n pk: primaryKey({ columns: [t.orgId, t.commentId, t.orgUserId] }),\n commentFk: foreignKey({\n columns: [t.orgId, t.commentId],\n foreignColumns: [comments.orgId, comments.id],\n }).onDelete(\"cascade\"),\n authorFk: foreignKey({\n columns: [t.orgId, t.orgUserId],\n foreignColumns: [orgUsers.orgId, orgUsers.id],\n }),\n }),\n);\n\nexport const commentReports = pgTable(\n \"comment_reports\",\n {\n orgId: text(\"org_id\")\n .notNull()\n .references(() => organizations.id),\n id: text(\"id\")\n .notNull()\n .$defaultFn(() => genId(\"commentReport\")),\n commentId: text(\"comment_id\").notNull(),\n orgUserId: text(\"org_user_id\").notNull(),\n reason: text(\"reason\").notNull().default(\"\"),\n resolvedAt: timestamp(\"resolved_at\", { withTimezone: true }),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true })\n .notNull()\n .defaultNow()\n .$onUpdate(() => new Date()),\n },\n (t) => ({\n pk: primaryKey({ columns: [t.orgId, t.id] }),\n // One report per person, per comment.\n reporterUq: unique().on(t.orgId, t.commentId, t.orgUserId),\n commentFk: foreignKey({\n columns: [t.orgId, t.commentId],\n foreignColumns: [comments.orgId, comments.id],\n }).onDelete(\"cascade\"),\n reporterFk: foreignKey({\n columns: [t.orgId, t.orgUserId],\n foreignColumns: [orgUsers.orgId, orgUsers.id],\n }),\n openIdx: index(\"comment_reports_open_idx\").on(t.orgId, t.commentId, t.resolvedAt),\n }),\n);\n\ntype _CommentsDrift = Expect<NoDrift<typeof comments.$inferSelect, Comment>>;\ntype _CommentReactionsDrift = Expect<\n NoDrift<typeof commentReactions.$inferSelect, CommentReaction>\n>;\ntype _CommentReportsDrift = Expect<NoDrift<typeof commentReports.$inferSelect, CommentReport>>;\n"],"mappings":"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"}
1
+ {"version":3,"file":"discussion.js","names":[],"sources":["../../src/schema/discussion.ts"],"sourcesContent":["// discussion tables — comments on an activity, their reactions and reports.\n// Configuration is not here: the course's comment settings ride on the course's\n// `content` settings row, and an activity's override rides on the activity's\n// own settings blob.\n//\n// The author is always an org user, so one column covers both\n// learners and staff. Staff-ness is NOT stored — it is read from the author's\n// current role. A removed comment keeps its row so replies below it survive;\n// only the body stops being served.\n//\n// No course_id: which course an activity sits in is content's fact and changes\n// when a course is restructured. The staff comment list joins to modules to\n// scope by course.\nimport { desc, sql } from \"drizzle-orm\";\nimport {\n pgTable,\n text,\n integer,\n boolean,\n jsonb,\n timestamp,\n primaryKey,\n foreignKey,\n unique,\n index,\n check,\n} from \"drizzle-orm/pg-core\";\nimport type {\n BlockedUser,\n Chat,\n ChatUser,\n Comment,\n CommentReaction,\n CommentReport,\n Message,\n MessageAttachment,\n MessageFlag,\n MessageReaction,\n Post,\n PostBookmark,\n PostFlag,\n PostFollow,\n PostReaction,\n} from \"@headless-lms/core/schemas\";\nimport { genId } from \"@headless-lms/core/shared/id\";\nimport { organizations, orgUsers } from \"./organizations.js\";\nimport { activities, communities, spaceTopics, spaces } from \"./content.js\";\nimport { assets } from \"./assets.js\";\nimport type { Expect, NoDrift } from \"./drift.js\";\n\nexport const posts = pgTable(\n \"posts\",\n {\n orgId: text(\"org_id\")\n .notNull()\n .references(() => organizations.id),\n id: text(\"id\")\n .notNull()\n .$defaultFn(() => genId(\"post\")),\n communityId: text(\"community_id\").notNull(),\n spaceId: text(\"space_id\").notNull(),\n orgUserId: text(\"org_user_id\").notNull(),\n topicId: text(\"topic_id\"),\n title: text(\"title\").notNull(),\n body: text(\"body\").notNull(),\n extra: jsonb(\"extra\").$type<Post[\"extra\"]>().notNull().default({}),\n coverAssetId: text(\"cover_asset_id\"),\n status: text(\"status\", {\n enum: [\"draft\", \"scheduled\", \"pending\", \"published\", \"removed\"],\n })\n .notNull()\n .default(\"draft\"),\n scheduledAt: timestamp(\"scheduled_at\", { withTimezone: true }),\n publishedAt: timestamp(\"published_at\", { withTimezone: true }),\n removedBy: text(\"removed_by\"),\n pinned: boolean(\"pinned\").notNull().default(false),\n commentsClosed: boolean(\"comments_closed\"),\n reactionsEnabled: boolean(\"reactions_enabled\"),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true })\n .notNull()\n .defaultNow()\n .$onUpdate(() => new Date()),\n },\n (t) => ({\n pk: primaryKey({ columns: [t.orgId, t.id] }),\n spaceFk: foreignKey({\n columns: [t.orgId, t.spaceId, t.communityId],\n foreignColumns: [spaces.orgId, spaces.id, spaces.communityId],\n }).onDelete(\"cascade\"),\n authorFk: foreignKey({\n columns: [t.orgId, t.orgUserId],\n foreignColumns: [orgUsers.orgId, orgUsers.id],\n }),\n topicFk: foreignKey({\n columns: [t.orgId, t.spaceId, t.topicId],\n foreignColumns: [spaceTopics.orgId, spaceTopics.spaceId, spaceTopics.id],\n }),\n coverAssetFk: foreignKey({\n columns: [t.orgId, t.coverAssetId],\n foreignColumns: [assets.orgId, assets.id],\n }),\n // SET NULL is narrowed to the nullable column in 0009_community_indexes.sql; drizzle cannot express it.\n removedByFk: foreignKey({\n columns: [t.orgId, t.removedBy],\n foreignColumns: [orgUsers.orgId, orgUsers.id],\n }).onDelete(\"set null\"),\n removedCk: check(\n \"posts_removed_by_check\",\n sql`${t.removedBy} is null or ${t.status} = 'removed'`,\n ),\n scheduledCk: check(\n \"posts_scheduled_check\",\n sql`${t.status} <> 'scheduled' or ${t.scheduledAt} is not null`,\n ),\n feedIdx: index(\"posts_feed_idx\").on(\n t.orgId,\n t.spaceId,\n t.status,\n desc(t.pinned),\n desc(t.publishedAt),\n ),\n dueIdx: index(\"posts_due_idx\").on(t.orgId, t.status, t.scheduledAt),\n authorIdx: index(\"posts_author_idx\").on(t.orgId, t.orgUserId, t.createdAt),\n coverAssetIdx: index(\"posts_cover_asset_idx\").on(t.orgId, t.coverAssetId),\n }),\n);\n\nexport const postReactions = pgTable(\n \"post_reactions\",\n {\n orgId: text(\"org_id\")\n .notNull()\n .references(() => organizations.id),\n postId: text(\"post_id\").notNull(),\n orgUserId: text(\"org_user_id\").notNull(),\n emoji: text(\"emoji\").notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true })\n .notNull()\n .defaultNow()\n .$onUpdate(() => new Date()),\n },\n (t) => ({\n pk: primaryKey({ columns: [t.orgId, t.postId, t.orgUserId] }),\n postFk: foreignKey({\n columns: [t.orgId, t.postId],\n foreignColumns: [posts.orgId, posts.id],\n }).onDelete(\"cascade\"),\n orgUserFk: foreignKey({\n columns: [t.orgId, t.orgUserId],\n foreignColumns: [orgUsers.orgId, orgUsers.id],\n }).onDelete(\"cascade\"),\n }),\n);\n\nexport const postFollows = pgTable(\n \"post_follows\",\n {\n orgId: text(\"org_id\")\n .notNull()\n .references(() => organizations.id),\n postId: text(\"post_id\").notNull(),\n orgUserId: text(\"org_user_id\").notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true })\n .notNull()\n .defaultNow()\n .$onUpdate(() => new Date()),\n },\n (t) => ({\n pk: primaryKey({ columns: [t.orgId, t.postId, t.orgUserId] }),\n postFk: foreignKey({\n columns: [t.orgId, t.postId],\n foreignColumns: [posts.orgId, posts.id],\n }).onDelete(\"cascade\"),\n orgUserFk: foreignKey({\n columns: [t.orgId, t.orgUserId],\n foreignColumns: [orgUsers.orgId, orgUsers.id],\n }).onDelete(\"cascade\"),\n }),\n);\n\nexport const postBookmarks = pgTable(\n \"post_bookmarks\",\n {\n orgId: text(\"org_id\")\n .notNull()\n .references(() => organizations.id),\n postId: text(\"post_id\").notNull(),\n orgUserId: text(\"org_user_id\").notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true })\n .notNull()\n .defaultNow()\n .$onUpdate(() => new Date()),\n },\n (t) => ({\n pk: primaryKey({ columns: [t.orgId, t.postId, t.orgUserId] }),\n postFk: foreignKey({\n columns: [t.orgId, t.postId],\n foreignColumns: [posts.orgId, posts.id],\n }).onDelete(\"cascade\"),\n orgUserFk: foreignKey({\n columns: [t.orgId, t.orgUserId],\n foreignColumns: [orgUsers.orgId, orgUsers.id],\n }).onDelete(\"cascade\"),\n userIdx: index(\"post_bookmarks_user_idx\").on(t.orgId, t.orgUserId, t.createdAt),\n }),\n);\n\nexport const postFlags = pgTable(\n \"post_flags\",\n {\n orgId: text(\"org_id\")\n .notNull()\n .references(() => organizations.id),\n id: text(\"id\")\n .notNull()\n .$defaultFn(() => genId(\"postFlag\")),\n postId: text(\"post_id\").notNull(),\n orgUserId: text(\"org_user_id\").notNull(),\n reason: text(\"reason\").notNull().default(\"\"),\n resolvedAt: timestamp(\"resolved_at\", { withTimezone: true }),\n resolution: text(\"resolution\", { enum: [\"dismissed\", \"removed\"] }),\n resolvedBy: text(\"resolved_by\"),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true })\n .notNull()\n .defaultNow()\n .$onUpdate(() => new Date()),\n },\n (t) => ({\n pk: primaryKey({ columns: [t.orgId, t.id] }),\n reporterUq: unique().on(t.orgId, t.postId, t.orgUserId),\n postFk: foreignKey({\n columns: [t.orgId, t.postId],\n foreignColumns: [posts.orgId, posts.id],\n }).onDelete(\"cascade\"),\n reporterFk: foreignKey({\n columns: [t.orgId, t.orgUserId],\n foreignColumns: [orgUsers.orgId, orgUsers.id],\n }).onDelete(\"cascade\"),\n resolvedCk: check(\n \"post_flags_resolved_check\",\n sql`(${t.resolvedAt} is null) = (${t.resolution} is null) and (${t.resolvedAt} is null) = (${t.resolvedBy} is null)`,\n ),\n openIdx: index(\"post_flags_open_idx\").on(t.orgId, t.postId, t.resolvedAt),\n }),\n);\n\nexport const comments = pgTable(\n \"comments\",\n {\n orgId: text(\"org_id\")\n .notNull()\n .references(() => organizations.id),\n id: text(\"id\")\n .notNull()\n .$defaultFn(() => genId(\"comment\")),\n activityId: text(\"activity_id\"),\n postId: text(\"post_id\"),\n communityId: text(\"community_id\"),\n parentId: text(\"parent_id\"),\n orgUserId: text(\"org_user_id\").notNull(),\n body: text(\"body\").notNull(),\n status: text(\"status\", { enum: [\"pending\", \"published\", \"removed\"] })\n .notNull()\n .default(\"published\"),\n removedBy: text(\"removed_by\"),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true })\n .notNull()\n .defaultNow()\n .$onUpdate(() => new Date()),\n },\n (t) => ({\n pk: primaryKey({ columns: [t.orgId, t.id] }),\n activityFk: foreignKey({\n columns: [t.orgId, t.activityId],\n foreignColumns: [activities.orgId, activities.id],\n }).onDelete(\"cascade\"),\n postFk: foreignKey({\n columns: [t.orgId, t.postId],\n foreignColumns: [posts.orgId, posts.id],\n }).onDelete(\"cascade\"),\n communityFk: foreignKey({\n columns: [t.orgId, t.communityId],\n foreignColumns: [communities.orgId, communities.id],\n }).onDelete(\"cascade\"),\n authorFk: foreignKey({\n columns: [t.orgId, t.orgUserId],\n foreignColumns: [orgUsers.orgId, orgUsers.id],\n }),\n // SET NULL is narrowed to the nullable column in 0009_community_indexes.sql; drizzle cannot express it.\n removedByFk: foreignKey({\n columns: [t.orgId, t.removedBy],\n foreignColumns: [orgUsers.orgId, orgUsers.id],\n }).onDelete(\"set null\"),\n parentFk: foreignKey({\n columns: [t.orgId, t.parentId],\n foreignColumns: [t.orgId, t.id],\n }),\n removedCk: check(\n \"comments_removed_by_check\",\n sql`${t.removedBy} is null or ${t.status} = 'removed'`,\n ),\n targetCk: check(\"comments_target_check\", sql`num_nonnulls(${t.activityId}, ${t.postId}) = 1`),\n communityCk: check(\n \"comments_community_check\",\n sql`${t.postId} is null or ${t.communityId} is not null`,\n ),\n activityIdx: index(\"comments_activity_idx\").on(t.orgId, t.activityId, t.status, t.createdAt),\n postIdx: index(\"comments_post_idx\").on(t.orgId, t.postId, t.status, t.createdAt),\n queueIdx: index(\"comments_queue_idx\").on(t.orgId, t.status, t.createdAt),\n communityIdx: index(\"comments_community_idx\").on(t.orgId, t.communityId),\n parentIdx: index(\"comments_parent_idx\").on(t.orgId, t.parentId, t.createdAt),\n }),\n);\n\nexport const commentReactions = pgTable(\n \"comment_reactions\",\n {\n orgId: text(\"org_id\")\n .notNull()\n .references(() => organizations.id),\n commentId: text(\"comment_id\").notNull(),\n orgUserId: text(\"org_user_id\").notNull(),\n emoji: text(\"emoji\").notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true })\n .notNull()\n .defaultNow()\n .$onUpdate(() => new Date()),\n },\n (t) => ({\n pk: primaryKey({ columns: [t.orgId, t.commentId, t.orgUserId] }),\n commentFk: foreignKey({\n columns: [t.orgId, t.commentId],\n foreignColumns: [comments.orgId, comments.id],\n }).onDelete(\"cascade\"),\n authorFk: foreignKey({\n columns: [t.orgId, t.orgUserId],\n foreignColumns: [orgUsers.orgId, orgUsers.id],\n }).onDelete(\"cascade\"),\n }),\n);\n\nexport const commentFlags = pgTable(\n \"comment_flags\",\n {\n orgId: text(\"org_id\")\n .notNull()\n .references(() => organizations.id),\n id: text(\"id\")\n .notNull()\n .$defaultFn(() => genId(\"commentReport\")),\n commentId: text(\"comment_id\").notNull(),\n orgUserId: text(\"org_user_id\").notNull(),\n reason: text(\"reason\").notNull().default(\"\"),\n resolvedAt: timestamp(\"resolved_at\", { withTimezone: true }),\n resolution: text(\"resolution\", { enum: [\"dismissed\", \"removed\"] }),\n resolvedBy: text(\"resolved_by\"),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true })\n .notNull()\n .defaultNow()\n .$onUpdate(() => new Date()),\n },\n (t) => ({\n pk: primaryKey({ columns: [t.orgId, t.id] }),\n reporterUq: unique().on(t.orgId, t.commentId, t.orgUserId),\n commentFk: foreignKey({\n columns: [t.orgId, t.commentId],\n foreignColumns: [comments.orgId, comments.id],\n }).onDelete(\"cascade\"),\n reporterFk: foreignKey({\n columns: [t.orgId, t.orgUserId],\n foreignColumns: [orgUsers.orgId, orgUsers.id],\n }).onDelete(\"cascade\"),\n resolvedCk: check(\n \"comment_flags_resolved_check\",\n sql`(${t.resolvedAt} is null) = (${t.resolution} is null) and (${t.resolvedBy} is null or ${t.resolvedAt} is not null)`,\n ),\n openIdx: index(\"comment_flags_open_idx\").on(t.orgId, t.commentId, t.resolvedAt),\n }),\n);\n\nexport const chats = pgTable(\n \"chats\",\n {\n orgId: text(\"org_id\")\n .notNull()\n .references(() => organizations.id),\n id: text(\"id\")\n .notNull()\n .$defaultFn(() => genId(\"chat\")),\n communityId: text(\"community_id\").notNull(),\n kind: text(\"kind\", { enum: [\"direct\", \"group\"] }).notNull(),\n status: text(\"status\", { enum: [\"pending\", \"open\", \"closed\"] })\n .notNull()\n .default(\"open\"),\n createdBy: text(\"created_by\"),\n lockedAt: timestamp(\"locked_at\", { withTimezone: true }),\n lockedBy: text(\"locked_by\"),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true })\n .notNull()\n .defaultNow()\n .$onUpdate(() => new Date()),\n },\n (t) => ({\n pk: primaryKey({ columns: [t.orgId, t.id] }),\n communityUq: unique().on(t.orgId, t.id, t.communityId),\n communityFk: foreignKey({\n columns: [t.orgId, t.communityId],\n foreignColumns: [communities.orgId, communities.id],\n }).onDelete(\"cascade\"),\n // SET NULL is narrowed to the nullable column in 0009_community_indexes.sql; drizzle cannot express it.\n createdByFk: foreignKey({\n columns: [t.orgId, t.createdBy],\n foreignColumns: [orgUsers.orgId, orgUsers.id],\n }).onDelete(\"set null\"),\n lockedByFk: foreignKey({\n columns: [t.orgId, t.lockedBy],\n foreignColumns: [orgUsers.orgId, orgUsers.id],\n }).onDelete(\"set null\"),\n lockedCk: check(\"chats_locked_check\", sql`${t.lockedBy} is null or ${t.lockedAt} is not null`),\n }),\n);\n\nexport const chatUsers = pgTable(\n \"chat_users\",\n {\n orgId: text(\"org_id\")\n .notNull()\n .references(() => organizations.id),\n communityId: text(\"community_id\").notNull(),\n chatId: text(\"chat_id\").notNull(),\n orgUserId: text(\"org_user_id\").notNull(),\n joinedAt: timestamp(\"joined_at\", { withTimezone: true }).notNull().defaultNow(),\n leftAt: timestamp(\"left_at\", { withTimezone: true }),\n lastReadMessageId: text(\"last_read_message_id\"),\n muted: boolean(\"muted\").notNull().default(false),\n mutedUntil: timestamp(\"muted_until\", { withTimezone: true }),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true })\n .notNull()\n .defaultNow()\n .$onUpdate(() => new Date()),\n },\n (t) => ({\n pk: primaryKey({ columns: [t.orgId, t.chatId, t.orgUserId] }),\n chatFk: foreignKey({\n columns: [t.orgId, t.chatId, t.communityId],\n foreignColumns: [chats.orgId, chats.id, chats.communityId],\n }).onDelete(\"cascade\"),\n orgUserFk: foreignKey({\n columns: [t.orgId, t.orgUserId],\n foreignColumns: [orgUsers.orgId, orgUsers.id],\n }).onDelete(\"cascade\"),\n userIdx: index(\"chat_users_user_idx\").on(t.orgId, t.communityId, t.orgUserId),\n }),\n);\n\nexport const messages = pgTable(\n \"messages\",\n {\n orgId: text(\"org_id\")\n .notNull()\n .references(() => organizations.id),\n id: text(\"id\")\n .notNull()\n .$defaultFn(() => genId(\"message\")),\n communityId: text(\"community_id\").notNull(),\n chatId: text(\"chat_id\").notNull(),\n orgUserId: text(\"org_user_id\").notNull(),\n body: text(\"body\").notNull(),\n replyToId: text(\"reply_to_id\"),\n editedAt: timestamp(\"edited_at\", { withTimezone: true }),\n deletedAt: timestamp(\"deleted_at\", { withTimezone: true }),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true })\n .notNull()\n .defaultNow()\n .$onUpdate(() => new Date()),\n },\n (t) => ({\n pk: primaryKey({ columns: [t.orgId, t.id] }),\n communityUq: unique().on(t.orgId, t.id, t.communityId),\n chatFk: foreignKey({\n columns: [t.orgId, t.chatId, t.communityId],\n foreignColumns: [chats.orgId, chats.id, chats.communityId],\n }).onDelete(\"cascade\"),\n authorFk: foreignKey({\n columns: [t.orgId, t.orgUserId],\n foreignColumns: [orgUsers.orgId, orgUsers.id],\n }),\n replyFk: foreignKey({\n columns: [t.orgId, t.replyToId],\n foreignColumns: [t.orgId, t.id],\n }),\n chatIdx: index(\"messages_chat_idx\").on(t.orgId, t.chatId, t.createdAt),\n replyIdx: index(\"messages_reply_idx\").on(t.orgId, t.replyToId),\n }),\n);\n\nexport const messageAttachments = pgTable(\n \"message_attachments\",\n {\n orgId: text(\"org_id\")\n .notNull()\n .references(() => organizations.id),\n communityId: text(\"community_id\").notNull(),\n messageId: text(\"message_id\").notNull(),\n assetId: text(\"asset_id\").notNull(),\n seq: integer(\"seq\").notNull().default(0),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true })\n .notNull()\n .defaultNow()\n .$onUpdate(() => new Date()),\n },\n (t) => ({\n pk: primaryKey({ columns: [t.orgId, t.messageId, t.assetId] }),\n messageFk: foreignKey({\n columns: [t.orgId, t.messageId, t.communityId],\n foreignColumns: [messages.orgId, messages.id, messages.communityId],\n }).onDelete(\"cascade\"),\n assetFk: foreignKey({\n columns: [t.orgId, t.assetId],\n foreignColumns: [assets.orgId, assets.id],\n }),\n assetIdx: index(\"message_attachments_asset_idx\").on(t.orgId, t.assetId),\n }),\n);\n\nexport const messageReactions = pgTable(\n \"message_reactions\",\n {\n orgId: text(\"org_id\")\n .notNull()\n .references(() => organizations.id),\n communityId: text(\"community_id\").notNull(),\n messageId: text(\"message_id\").notNull(),\n orgUserId: text(\"org_user_id\").notNull(),\n emoji: text(\"emoji\").notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true })\n .notNull()\n .defaultNow()\n .$onUpdate(() => new Date()),\n },\n (t) => ({\n pk: primaryKey({ columns: [t.orgId, t.messageId, t.orgUserId] }),\n messageFk: foreignKey({\n columns: [t.orgId, t.messageId, t.communityId],\n foreignColumns: [messages.orgId, messages.id, messages.communityId],\n }).onDelete(\"cascade\"),\n orgUserFk: foreignKey({\n columns: [t.orgId, t.orgUserId],\n foreignColumns: [orgUsers.orgId, orgUsers.id],\n }).onDelete(\"cascade\"),\n }),\n);\n\nexport const messageFlags = pgTable(\n \"message_flags\",\n {\n orgId: text(\"org_id\")\n .notNull()\n .references(() => organizations.id),\n id: text(\"id\")\n .notNull()\n .$defaultFn(() => genId(\"messageFlag\")),\n communityId: text(\"community_id\").notNull(),\n messageId: text(\"message_id\").notNull(),\n orgUserId: text(\"org_user_id\").notNull(),\n reason: text(\"reason\").notNull().default(\"\"),\n resolvedAt: timestamp(\"resolved_at\", { withTimezone: true }),\n resolution: text(\"resolution\", { enum: [\"dismissed\", \"deleted\", \"locked\"] }),\n resolvedBy: text(\"resolved_by\"),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true })\n .notNull()\n .defaultNow()\n .$onUpdate(() => new Date()),\n },\n (t) => ({\n pk: primaryKey({ columns: [t.orgId, t.id] }),\n reporterUq: unique().on(t.orgId, t.messageId, t.orgUserId),\n messageFk: foreignKey({\n columns: [t.orgId, t.messageId, t.communityId],\n foreignColumns: [messages.orgId, messages.id, messages.communityId],\n }).onDelete(\"cascade\"),\n reporterFk: foreignKey({\n columns: [t.orgId, t.orgUserId],\n foreignColumns: [orgUsers.orgId, orgUsers.id],\n }).onDelete(\"cascade\"),\n resolvedCk: check(\n \"message_flags_resolved_check\",\n sql`(${t.resolvedAt} is null) = (${t.resolution} is null) and (${t.resolvedAt} is null) = (${t.resolvedBy} is null)`,\n ),\n openIdx: index(\"message_flags_open_idx\").on(t.orgId, t.communityId, t.messageId, t.resolvedAt),\n }),\n);\n\nexport const blockedUsers = pgTable(\n \"blocked_users\",\n {\n orgId: text(\"org_id\")\n .notNull()\n .references(() => organizations.id),\n communityId: text(\"community_id\").notNull(),\n blockerOrgUserId: text(\"blocker_org_user_id\").notNull(),\n blockedOrgUserId: text(\"blocked_org_user_id\").notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true })\n .notNull()\n .defaultNow()\n .$onUpdate(() => new Date()),\n },\n (t) => ({\n pk: primaryKey({\n columns: [t.orgId, t.communityId, t.blockerOrgUserId, t.blockedOrgUserId],\n }),\n communityFk: foreignKey({\n columns: [t.orgId, t.communityId],\n foreignColumns: [communities.orgId, communities.id],\n }).onDelete(\"cascade\"),\n blockerFk: foreignKey({\n columns: [t.orgId, t.blockerOrgUserId],\n foreignColumns: [orgUsers.orgId, orgUsers.id],\n }).onDelete(\"cascade\"),\n blockedFk: foreignKey({\n columns: [t.orgId, t.blockedOrgUserId],\n foreignColumns: [orgUsers.orgId, orgUsers.id],\n }).onDelete(\"cascade\"),\n blockedIdx: index(\"blocked_users_blocked_idx\").on(t.orgId, t.communityId, t.blockedOrgUserId),\n }),\n);\n\ntype _PostsDrift = Expect<NoDrift<typeof posts.$inferSelect, Post>>;\ntype _PostReactionsDrift = Expect<NoDrift<typeof postReactions.$inferSelect, PostReaction>>;\ntype _PostFollowsDrift = Expect<NoDrift<typeof postFollows.$inferSelect, PostFollow>>;\ntype _PostBookmarksDrift = Expect<NoDrift<typeof postBookmarks.$inferSelect, PostBookmark>>;\ntype _PostFlagsDrift = Expect<NoDrift<typeof postFlags.$inferSelect, PostFlag>>;\ntype _CommentsDrift = Expect<NoDrift<typeof comments.$inferSelect, Comment>>;\ntype _CommentReactionsDrift = Expect<\n NoDrift<typeof commentReactions.$inferSelect, CommentReaction>\n>;\ntype _CommentFlagsDrift = Expect<NoDrift<typeof commentFlags.$inferSelect, CommentReport>>;\ntype _ChatsDrift = Expect<NoDrift<typeof chats.$inferSelect, Chat>>;\ntype _ChatUsersDrift = Expect<NoDrift<typeof chatUsers.$inferSelect, ChatUser>>;\ntype _MessagesDrift = Expect<NoDrift<typeof messages.$inferSelect, Message>>;\ntype _MessageAttachmentsDrift = Expect<\n NoDrift<typeof messageAttachments.$inferSelect, MessageAttachment>\n>;\ntype _MessageReactionsDrift = Expect<\n NoDrift<typeof messageReactions.$inferSelect, MessageReaction>\n>;\ntype _MessageFlagsDrift = Expect<NoDrift<typeof messageFlags.$inferSelect, MessageFlag>>;\ntype _BlockedUsersDrift = Expect<NoDrift<typeof blockedUsers.$inferSelect, BlockedUser>>;\n"],"mappings":"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"}