@headless-lms/adapter-db 0.3.0 → 0.5.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 (123) hide show
  1. package/dist/client.d.ts +8 -2
  2. package/dist/client.js +10 -2
  3. package/dist/client.js.map +1 -1
  4. package/dist/index.d.ts +10 -4
  5. package/dist/index.js +9 -3
  6. package/dist/repositories/admin.d.ts +12 -4
  7. package/dist/repositories/admin.js +165 -23
  8. package/dist/repositories/admin.js.map +1 -1
  9. package/dist/repositories/assets.d.ts +2 -2
  10. package/dist/repositories/assets.js +11 -5
  11. package/dist/repositories/assets.js.map +1 -1
  12. package/dist/repositories/automations.d.ts +0 -1
  13. package/dist/repositories/automations.js +2 -18
  14. package/dist/repositories/automations.js.map +1 -1
  15. package/dist/repositories/chats.d.ts +14 -5
  16. package/dist/repositories/chats.js +194 -85
  17. package/dist/repositories/chats.js.map +1 -1
  18. package/dist/repositories/content.d.ts +24 -7
  19. package/dist/repositories/content.js +229 -48
  20. package/dist/repositories/content.js.map +1 -1
  21. package/dist/repositories/credentials.js +1 -1
  22. package/dist/repositories/devices.d.ts +17 -0
  23. package/dist/repositories/devices.js +75 -0
  24. package/dist/repositories/devices.js.map +1 -0
  25. package/dist/repositories/digest-runs.d.ts +14 -0
  26. package/dist/repositories/digest-runs.js +39 -0
  27. package/dist/repositories/digest-runs.js.map +1 -0
  28. package/dist/repositories/discussion.d.ts +7 -2
  29. package/dist/repositories/discussion.js +18 -7
  30. package/dist/repositories/discussion.js.map +1 -1
  31. package/dist/repositories/entitlements.d.ts +11 -9
  32. package/dist/repositories/entitlements.js +56 -59
  33. package/dist/repositories/entitlements.js.map +1 -1
  34. package/dist/repositories/event-reports.d.ts +16 -0
  35. package/dist/repositories/event-reports.js +199 -0
  36. package/dist/repositories/event-reports.js.map +1 -0
  37. package/dist/repositories/grant-covers.d.ts +4 -3
  38. package/dist/repositories/grant-covers.js +7 -4
  39. package/dist/repositories/grant-covers.js.map +1 -1
  40. package/dist/repositories/identity.js +1 -1
  41. package/dist/repositories/inserted-row.d.ts +5 -0
  42. package/dist/repositories/inserted-row.js +7 -0
  43. package/dist/repositories/inserted-row.js.map +1 -0
  44. package/dist/repositories/integrations.js +1 -1
  45. package/dist/repositories/member.d.ts +12 -4
  46. package/dist/repositories/member.js +19 -7
  47. package/dist/repositories/member.js.map +1 -1
  48. package/dist/repositories/members.d.ts +2 -5
  49. package/dist/repositories/members.js +39 -94
  50. package/dist/repositories/members.js.map +1 -1
  51. package/dist/repositories/mentions.d.ts +17 -0
  52. package/dist/repositories/mentions.js +55 -0
  53. package/dist/repositories/mentions.js.map +1 -0
  54. package/dist/repositories/notification-settings.d.ts +19 -0
  55. package/dist/repositories/notification-settings.js +67 -0
  56. package/dist/repositories/notification-settings.js.map +1 -0
  57. package/dist/repositories/notifications.d.ts +23 -16
  58. package/dist/repositories/notifications.js +152 -44
  59. package/dist/repositories/notifications.js.map +1 -1
  60. package/dist/repositories/org-user-profile.d.ts +0 -17
  61. package/dist/repositories/org-user-profile.js +0 -1
  62. package/dist/repositories/org-user-profile.js.map +1 -1
  63. package/dist/repositories/organizations.d.ts +4 -4
  64. package/dist/repositories/organizations.js +25 -47
  65. package/dist/repositories/organizations.js.map +1 -1
  66. package/dist/repositories/outbox.d.ts +5 -1
  67. package/dist/repositories/outbox.js +12 -3
  68. package/dist/repositories/outbox.js.map +1 -1
  69. package/dist/repositories/posts.d.ts +4 -8
  70. package/dist/repositories/posts.js +26 -29
  71. package/dist/repositories/posts.js.map +1 -1
  72. package/dist/repositories/progress.js +1 -1
  73. package/dist/repositories/roles.d.ts +35 -0
  74. package/dist/repositories/roles.js +244 -0
  75. package/dist/repositories/roles.js.map +1 -0
  76. package/dist/repositories/settings.js +1 -1
  77. package/dist/repositories/subscriptions.d.ts +18 -0
  78. package/dist/repositories/subscriptions.js +72 -0
  79. package/dist/repositories/subscriptions.js.map +1 -0
  80. package/dist/schema/assets.d.ts +17 -0
  81. package/dist/schema/assets.js +1 -0
  82. package/dist/schema/assets.js.map +1 -1
  83. package/dist/schema/automations.d.ts +524 -19
  84. package/dist/schema/automations.js +73 -7
  85. package/dist/schema/automations.js.map +1 -1
  86. package/dist/schema/content.d.ts +437 -3
  87. package/dist/schema/content.js +70 -3
  88. package/dist/schema/content.js.map +1 -1
  89. package/dist/schema/discussion.d.ts +295 -128
  90. package/dist/schema/discussion.js +63 -26
  91. package/dist/schema/discussion.js.map +1 -1
  92. package/dist/schema/identity.d.ts +109 -109
  93. package/dist/schema/identity.js +28 -70
  94. package/dist/schema/identity.js.map +1 -1
  95. package/dist/schema/index.d.ts +7 -6
  96. package/dist/schema/index.js +16 -7
  97. package/dist/schema/index.js.map +1 -1
  98. package/dist/schema/organizations.d.ts +5 -22
  99. package/dist/schema/organizations.js +1 -13
  100. package/dist/schema/organizations.js.map +1 -1
  101. package/dist/schema/roles.d.ts +369 -0
  102. package/dist/schema/roles.js +71 -0
  103. package/dist/schema/roles.js.map +1 -0
  104. package/drizzle/0011_digest_runs.sql +8 -0
  105. package/drizzle/0012_subscriptions.sql +16 -0
  106. package/drizzle/0013_mentions.sql +10 -0
  107. package/drizzle/0014_notification_settings_devices.sql +36 -0
  108. package/drizzle/0015_automations_drop_source.sql +2 -0
  109. package/drizzle/0016_notifications_automations.sql +48 -0
  110. package/drizzle/0017_configurable_roles.sql +38 -0
  111. package/drizzle/0018_messages_client_id.sql +2 -0
  112. package/drizzle/0019_events.sql +44 -0
  113. package/drizzle/meta/0011_snapshot.json +8868 -0
  114. package/drizzle/meta/0012_snapshot.json +8873 -0
  115. package/drizzle/meta/0013_snapshot.json +8943 -0
  116. package/drizzle/meta/0014_snapshot.json +9305 -0
  117. package/drizzle/meta/0015_snapshot.json +9270 -0
  118. package/drizzle/meta/0016_snapshot.json +9230 -0
  119. package/drizzle/meta/0017_snapshot.json +9518 -0
  120. package/drizzle/meta/0018_snapshot.json +9557 -0
  121. package/drizzle/meta/0019_snapshot.json +9919 -0
  122. package/drizzle/meta/_journal.json +63 -0
  123. package/package.json +2 -2
@@ -0,0 +1,369 @@
1
+ //#region src/schema/roles.d.ts
2
+ declare const orgRoles: import("drizzle-orm/pg-core").PgTableWithColumns<{
3
+ name: "org_roles";
4
+ schema: undefined;
5
+ columns: {
6
+ orgId: import("drizzle-orm/pg-core").PgColumn<{
7
+ name: "org_id";
8
+ tableName: "org_roles";
9
+ dataType: "string";
10
+ columnType: "PgText";
11
+ data: string;
12
+ driverParam: string;
13
+ notNull: true;
14
+ hasDefault: false;
15
+ isPrimaryKey: false;
16
+ isAutoincrement: false;
17
+ hasRuntimeDefault: false;
18
+ enumValues: [string, ...string[]];
19
+ baseColumn: never;
20
+ identity: undefined;
21
+ generated: undefined;
22
+ }, {}, {}>;
23
+ id: import("drizzle-orm/pg-core").PgColumn<{
24
+ name: "id";
25
+ tableName: "org_roles";
26
+ dataType: "string";
27
+ columnType: "PgText";
28
+ data: string;
29
+ driverParam: string;
30
+ notNull: true;
31
+ hasDefault: true;
32
+ isPrimaryKey: false;
33
+ isAutoincrement: false;
34
+ hasRuntimeDefault: true;
35
+ enumValues: [string, ...string[]];
36
+ baseColumn: never;
37
+ identity: undefined;
38
+ generated: undefined;
39
+ }, {}, {}>;
40
+ key: import("drizzle-orm/pg-core").PgColumn<{
41
+ name: "key";
42
+ tableName: "org_roles";
43
+ dataType: "string";
44
+ columnType: "PgText";
45
+ data: string;
46
+ driverParam: string;
47
+ notNull: true;
48
+ hasDefault: false;
49
+ isPrimaryKey: false;
50
+ isAutoincrement: false;
51
+ hasRuntimeDefault: false;
52
+ enumValues: [string, ...string[]];
53
+ baseColumn: never;
54
+ identity: undefined;
55
+ generated: undefined;
56
+ }, {}, {}>;
57
+ name: import("drizzle-orm/pg-core").PgColumn<{
58
+ name: "name";
59
+ tableName: "org_roles";
60
+ dataType: "string";
61
+ columnType: "PgText";
62
+ data: string;
63
+ driverParam: string;
64
+ notNull: false;
65
+ hasDefault: false;
66
+ isPrimaryKey: false;
67
+ isAutoincrement: false;
68
+ hasRuntimeDefault: false;
69
+ enumValues: [string, ...string[]];
70
+ baseColumn: never;
71
+ identity: undefined;
72
+ generated: undefined;
73
+ }, {}, {}>;
74
+ description: import("drizzle-orm/pg-core").PgColumn<{
75
+ name: "description";
76
+ tableName: "org_roles";
77
+ dataType: "string";
78
+ columnType: "PgText";
79
+ data: string;
80
+ driverParam: string;
81
+ notNull: false;
82
+ hasDefault: false;
83
+ isPrimaryKey: false;
84
+ isAutoincrement: false;
85
+ hasRuntimeDefault: false;
86
+ enumValues: [string, ...string[]];
87
+ baseColumn: never;
88
+ identity: undefined;
89
+ generated: undefined;
90
+ }, {}, {}>;
91
+ base: import("drizzle-orm/pg-core").PgColumn<{
92
+ name: "base";
93
+ tableName: "org_roles";
94
+ dataType: "string";
95
+ columnType: "PgText";
96
+ data: string;
97
+ driverParam: string;
98
+ notNull: true;
99
+ hasDefault: false;
100
+ isPrimaryKey: false;
101
+ isAutoincrement: false;
102
+ hasRuntimeDefault: false;
103
+ enumValues: [string, ...string[]];
104
+ baseColumn: never;
105
+ identity: undefined;
106
+ generated: undefined;
107
+ }, {}, {}>;
108
+ levels: import("drizzle-orm/pg-core").PgColumn<{
109
+ name: "levels";
110
+ tableName: "org_roles";
111
+ dataType: "array";
112
+ columnType: "PgArray";
113
+ data: ("course" | "download" | "event" | "community" | "org")[];
114
+ driverParam: string | string[];
115
+ notNull: false;
116
+ hasDefault: false;
117
+ isPrimaryKey: false;
118
+ isAutoincrement: false;
119
+ hasRuntimeDefault: false;
120
+ enumValues: ["org", "course", "download", "community", "event"];
121
+ baseColumn: import("drizzle-orm").Column<{
122
+ name: "levels";
123
+ tableName: "org_roles";
124
+ dataType: "string";
125
+ columnType: "PgText";
126
+ data: "course" | "download" | "event" | "community" | "org";
127
+ driverParam: string;
128
+ notNull: false;
129
+ hasDefault: false;
130
+ isPrimaryKey: false;
131
+ isAutoincrement: false;
132
+ hasRuntimeDefault: false;
133
+ enumValues: ["org", "course", "download", "community", "event"];
134
+ baseColumn: never;
135
+ identity: undefined;
136
+ generated: undefined;
137
+ }, {}, {}>;
138
+ identity: undefined;
139
+ generated: undefined;
140
+ }, {}, {
141
+ size: undefined;
142
+ baseBuilder: import("drizzle-orm/pg-core").PgColumnBuilder<{
143
+ name: "levels";
144
+ dataType: "string";
145
+ columnType: "PgText";
146
+ data: "course" | "download" | "event" | "community" | "org";
147
+ enumValues: ["org", "course", "download", "community", "event"];
148
+ driverParam: string;
149
+ }, {}, {}, import("drizzle-orm").ColumnBuilderExtraConfig>;
150
+ }>;
151
+ permissions: import("drizzle-orm/pg-core").PgColumn<{
152
+ name: "permissions";
153
+ tableName: "org_roles";
154
+ dataType: "json";
155
+ columnType: "PgJsonb";
156
+ data: Record<string, boolean>;
157
+ driverParam: unknown;
158
+ notNull: true;
159
+ hasDefault: true;
160
+ isPrimaryKey: false;
161
+ isAutoincrement: false;
162
+ hasRuntimeDefault: false;
163
+ enumValues: undefined;
164
+ baseColumn: never;
165
+ identity: undefined;
166
+ generated: undefined;
167
+ }, {}, {
168
+ $type: Record<string, boolean>;
169
+ }>;
170
+ team: import("drizzle-orm/pg-core").PgColumn<{
171
+ name: "team";
172
+ tableName: "org_roles";
173
+ dataType: "boolean";
174
+ columnType: "PgBoolean";
175
+ data: boolean;
176
+ driverParam: boolean;
177
+ notNull: false;
178
+ hasDefault: false;
179
+ isPrimaryKey: false;
180
+ isAutoincrement: false;
181
+ hasRuntimeDefault: false;
182
+ enumValues: undefined;
183
+ baseColumn: never;
184
+ identity: undefined;
185
+ generated: undefined;
186
+ }, {}, {}>;
187
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
188
+ name: "created_at";
189
+ tableName: "org_roles";
190
+ dataType: "date";
191
+ columnType: "PgTimestamp";
192
+ data: Date;
193
+ driverParam: string;
194
+ notNull: true;
195
+ hasDefault: true;
196
+ isPrimaryKey: false;
197
+ isAutoincrement: false;
198
+ hasRuntimeDefault: false;
199
+ enumValues: undefined;
200
+ baseColumn: never;
201
+ identity: undefined;
202
+ generated: undefined;
203
+ }, {}, {}>;
204
+ updatedAt: import("drizzle-orm/pg-core").PgColumn<{
205
+ name: "updated_at";
206
+ tableName: "org_roles";
207
+ dataType: "date";
208
+ columnType: "PgTimestamp";
209
+ data: Date;
210
+ driverParam: string;
211
+ notNull: true;
212
+ hasDefault: true;
213
+ isPrimaryKey: false;
214
+ isAutoincrement: false;
215
+ hasRuntimeDefault: false;
216
+ enumValues: undefined;
217
+ baseColumn: never;
218
+ identity: undefined;
219
+ generated: undefined;
220
+ }, {}, {}>;
221
+ };
222
+ dialect: "pg";
223
+ }>;
224
+ declare const roleAssignments: import("drizzle-orm/pg-core").PgTableWithColumns<{
225
+ name: "role_assignments";
226
+ schema: undefined;
227
+ columns: {
228
+ orgId: import("drizzle-orm/pg-core").PgColumn<{
229
+ name: "org_id";
230
+ tableName: "role_assignments";
231
+ dataType: "string";
232
+ columnType: "PgText";
233
+ data: string;
234
+ driverParam: string;
235
+ notNull: true;
236
+ hasDefault: false;
237
+ isPrimaryKey: false;
238
+ isAutoincrement: false;
239
+ hasRuntimeDefault: false;
240
+ enumValues: [string, ...string[]];
241
+ baseColumn: never;
242
+ identity: undefined;
243
+ generated: undefined;
244
+ }, {}, {}>;
245
+ id: import("drizzle-orm/pg-core").PgColumn<{
246
+ name: "id";
247
+ tableName: "role_assignments";
248
+ dataType: "string";
249
+ columnType: "PgText";
250
+ data: string;
251
+ driverParam: string;
252
+ notNull: true;
253
+ hasDefault: true;
254
+ isPrimaryKey: false;
255
+ isAutoincrement: false;
256
+ hasRuntimeDefault: true;
257
+ enumValues: [string, ...string[]];
258
+ baseColumn: never;
259
+ identity: undefined;
260
+ generated: undefined;
261
+ }, {}, {}>;
262
+ orgUserId: import("drizzle-orm/pg-core").PgColumn<{
263
+ name: "org_user_id";
264
+ tableName: "role_assignments";
265
+ dataType: "string";
266
+ columnType: "PgText";
267
+ data: string;
268
+ driverParam: string;
269
+ notNull: true;
270
+ hasDefault: false;
271
+ isPrimaryKey: false;
272
+ isAutoincrement: false;
273
+ hasRuntimeDefault: false;
274
+ enumValues: [string, ...string[]];
275
+ baseColumn: never;
276
+ identity: undefined;
277
+ generated: undefined;
278
+ }, {}, {}>;
279
+ roleKey: import("drizzle-orm/pg-core").PgColumn<{
280
+ name: "role_key";
281
+ tableName: "role_assignments";
282
+ dataType: "string";
283
+ columnType: "PgText";
284
+ data: string;
285
+ driverParam: string;
286
+ notNull: true;
287
+ hasDefault: false;
288
+ isPrimaryKey: false;
289
+ isAutoincrement: false;
290
+ hasRuntimeDefault: false;
291
+ enumValues: [string, ...string[]];
292
+ baseColumn: never;
293
+ identity: undefined;
294
+ generated: undefined;
295
+ }, {}, {}>;
296
+ contentId: import("drizzle-orm/pg-core").PgColumn<{
297
+ name: "content_id";
298
+ tableName: "role_assignments";
299
+ dataType: "string";
300
+ columnType: "PgText";
301
+ data: string;
302
+ driverParam: string;
303
+ notNull: false;
304
+ hasDefault: false;
305
+ isPrimaryKey: false;
306
+ isAutoincrement: false;
307
+ hasRuntimeDefault: false;
308
+ enumValues: [string, ...string[]];
309
+ baseColumn: never;
310
+ identity: undefined;
311
+ generated: undefined;
312
+ }, {}, {}>;
313
+ contentType: import("drizzle-orm/pg-core").PgColumn<{
314
+ name: "content_type";
315
+ tableName: "role_assignments";
316
+ dataType: "string";
317
+ columnType: "PgText";
318
+ data: "course" | "download" | "event" | "community";
319
+ driverParam: string;
320
+ notNull: false;
321
+ hasDefault: false;
322
+ isPrimaryKey: false;
323
+ isAutoincrement: false;
324
+ hasRuntimeDefault: false;
325
+ enumValues: ["course", "download", "community", "event"];
326
+ baseColumn: never;
327
+ identity: undefined;
328
+ generated: undefined;
329
+ }, {}, {}>;
330
+ assignedBy: import("drizzle-orm/pg-core").PgColumn<{
331
+ name: "assigned_by";
332
+ tableName: "role_assignments";
333
+ dataType: "string";
334
+ columnType: "PgText";
335
+ data: string;
336
+ driverParam: string;
337
+ notNull: true;
338
+ hasDefault: false;
339
+ isPrimaryKey: false;
340
+ isAutoincrement: false;
341
+ hasRuntimeDefault: false;
342
+ enumValues: [string, ...string[]];
343
+ baseColumn: never;
344
+ identity: undefined;
345
+ generated: undefined;
346
+ }, {}, {}>;
347
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
348
+ name: "created_at";
349
+ tableName: "role_assignments";
350
+ dataType: "date";
351
+ columnType: "PgTimestamp";
352
+ data: Date;
353
+ driverParam: string;
354
+ notNull: true;
355
+ hasDefault: true;
356
+ isPrimaryKey: false;
357
+ isAutoincrement: false;
358
+ hasRuntimeDefault: false;
359
+ enumValues: undefined;
360
+ baseColumn: never;
361
+ identity: undefined;
362
+ generated: undefined;
363
+ }, {}, {}>;
364
+ };
365
+ dialect: "pg";
366
+ }>;
367
+ //#endregion
368
+ export { orgRoles, roleAssignments };
369
+ //# sourceMappingURL=roles.d.ts.map
@@ -0,0 +1,71 @@
1
+ import { contentItems } from "./content.js";
2
+ import { orgUsers, organizations } from "./organizations.js";
3
+ import { sql } from "drizzle-orm";
4
+ import { boolean, foreignKey, index, jsonb, pgTable, primaryKey, text, timestamp, unique, uniqueIndex } from "drizzle-orm/pg-core";
5
+ import { genId } from "@headless-lms/core/shared/id";
6
+ //#region src/schema/roles.ts
7
+ const orgRoles = pgTable("org_roles", {
8
+ orgId: text("org_id").notNull().references(() => organizations.id, { onDelete: "cascade" }),
9
+ id: text("id").notNull().$defaultFn(() => genId("orgRole")),
10
+ key: text("key").notNull(),
11
+ name: text("name"),
12
+ description: text("description"),
13
+ base: text("base").notNull(),
14
+ levels: text("levels", { enum: [
15
+ "org",
16
+ "course",
17
+ "download",
18
+ "community",
19
+ "event"
20
+ ] }).array(),
21
+ permissions: jsonb("permissions").$type().notNull().default({}),
22
+ team: boolean("team"),
23
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
24
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow().$onUpdate(() => /* @__PURE__ */ new Date())
25
+ }, (t) => ({
26
+ pk: primaryKey({ columns: [t.orgId, t.id] }),
27
+ keyUq: unique("org_roles_key_uq").on(t.orgId, t.key),
28
+ nameUq: uniqueIndex("org_roles_name_uq").on(t.orgId, sql`lower(${t.name})`).where(sql`${t.name} is not null`)
29
+ }));
30
+ const roleAssignments = pgTable("role_assignments", {
31
+ orgId: text("org_id").notNull(),
32
+ id: text("id").notNull().$defaultFn(() => genId("roleAssignment")),
33
+ orgUserId: text("org_user_id").notNull(),
34
+ roleKey: text("role_key").notNull(),
35
+ contentId: text("content_id"),
36
+ contentType: text("content_type", { enum: [
37
+ "course",
38
+ "download",
39
+ "community",
40
+ "event"
41
+ ] }),
42
+ assignedBy: text("assigned_by").notNull(),
43
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow()
44
+ }, (t) => ({
45
+ pk: primaryKey({ columns: [t.orgId, t.id] }),
46
+ orgUserFk: foreignKey({
47
+ name: "role_assignments_org_user_fk",
48
+ columns: [t.orgId, t.orgUserId],
49
+ foreignColumns: [orgUsers.orgId, orgUsers.id]
50
+ }).onDelete("cascade"),
51
+ contentFk: foreignKey({
52
+ name: "role_assignments_content_fk",
53
+ columns: [
54
+ t.orgId,
55
+ t.contentId,
56
+ t.contentType
57
+ ],
58
+ foreignColumns: [
59
+ contentItems.orgId,
60
+ contentItems.id,
61
+ contentItems.type
62
+ ]
63
+ }).onDelete("cascade"),
64
+ scopeUq: unique("role_assignments_scope_uq").on(t.orgId, t.orgUserId, t.contentId).nullsNotDistinct(),
65
+ ownerUq: uniqueIndex("role_assignments_owner_uq").on(t.orgId).where(sql`${t.roleKey} = 'owner'`),
66
+ contentIdx: index("role_assignments_content_idx").on(t.orgId, t.contentId)
67
+ }));
68
+ //#endregion
69
+ export { orgRoles, roleAssignments };
70
+
71
+ //# sourceMappingURL=roles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roles.js","names":[],"sources":["../../src/schema/roles.ts"],"sourcesContent":["import { sql } from \"drizzle-orm\";\nimport {\n pgTable,\n text,\n boolean,\n jsonb,\n timestamp,\n foreignKey,\n unique,\n uniqueIndex,\n index,\n primaryKey,\n} from \"drizzle-orm/pg-core\";\nimport type { OrgRoleRow, RoleAssignment } from \"@headless-lms/core/schemas\";\nimport { genId } from \"@headless-lms/core/shared/id\";\nimport { organizations, orgUsers } from \"./organizations.js\";\nimport { contentItems } from \"./content.js\";\nimport type { Expect, NoDrift } from \"./drift.js\";\n\nexport const orgRoles = pgTable(\n \"org_roles\",\n {\n orgId: text(\"org_id\")\n .notNull()\n .references(() => organizations.id, { onDelete: \"cascade\" }),\n id: text(\"id\")\n .notNull()\n .$defaultFn(() => genId(\"orgRole\")),\n key: text(\"key\").notNull(),\n name: text(\"name\"),\n description: text(\"description\"),\n base: text(\"base\").notNull(),\n levels: text(\"levels\", { enum: [\"org\", \"course\", \"download\", \"community\", \"event\"] }).array(),\n permissions: jsonb(\"permissions\").$type<Record<string, boolean>>().notNull().default({}),\n team: boolean(\"team\"),\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 keyUq: unique(\"org_roles_key_uq\").on(t.orgId, t.key),\n nameUq: uniqueIndex(\"org_roles_name_uq\")\n .on(t.orgId, sql`lower(${t.name})`)\n .where(sql`${t.name} is not null`),\n }),\n);\n\nexport const roleAssignments = pgTable(\n \"role_assignments\",\n {\n orgId: text(\"org_id\").notNull(),\n id: text(\"id\")\n .notNull()\n .$defaultFn(() => genId(\"roleAssignment\")),\n orgUserId: text(\"org_user_id\").notNull(),\n roleKey: text(\"role_key\").notNull(),\n contentId: text(\"content_id\"),\n contentType: text(\"content_type\", { enum: [\"course\", \"download\", \"community\", \"event\"] }),\n assignedBy: text(\"assigned_by\").notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().defaultNow(),\n },\n (t) => ({\n pk: primaryKey({ columns: [t.orgId, t.id] }),\n orgUserFk: foreignKey({\n name: \"role_assignments_org_user_fk\",\n columns: [t.orgId, t.orgUserId],\n foreignColumns: [orgUsers.orgId, orgUsers.id],\n }).onDelete(\"cascade\"),\n contentFk: foreignKey({\n name: \"role_assignments_content_fk\",\n columns: [t.orgId, t.contentId, t.contentType],\n foreignColumns: [contentItems.orgId, contentItems.id, contentItems.type],\n }).onDelete(\"cascade\"),\n scopeUq: unique(\"role_assignments_scope_uq\")\n .on(t.orgId, t.orgUserId, t.contentId)\n .nullsNotDistinct(),\n ownerUq: uniqueIndex(\"role_assignments_owner_uq\")\n .on(t.orgId)\n .where(sql`${t.roleKey} = 'owner'`),\n contentIdx: index(\"role_assignments_content_idx\").on(t.orgId, t.contentId),\n }),\n);\n\ntype _OrgRolesDrift = Expect<NoDrift<typeof orgRoles.$inferSelect, OrgRoleRow>>;\ntype _RoleAssignmentsDrift = Expect<NoDrift<typeof roleAssignments.$inferSelect, RoleAssignment>>;\n"],"mappings":";;;;;;AAmBA,MAAa,WAAW,QACtB,aACA;CACE,OAAO,KAAK,QAAQ,CAAC,CAClB,QAAQ,CAAC,CACT,iBAAiB,cAAc,IAAI,EAAE,UAAU,UAAU,CAAC;CAC7D,IAAI,KAAK,IAAI,CAAC,CACX,QAAQ,CAAC,CACT,iBAAiB,MAAM,SAAS,CAAC;CACpC,KAAK,KAAK,KAAK,CAAC,CAAC,QAAQ;CACzB,MAAM,KAAK,MAAM;CACjB,aAAa,KAAK,aAAa;CAC/B,MAAM,KAAK,MAAM,CAAC,CAAC,QAAQ;CAC3B,QAAQ,KAAK,UAAU,EAAE,MAAM;EAAC;EAAO;EAAU;EAAY;EAAa;CAAO,EAAE,CAAC,CAAC,CAAC,MAAM;CAC5F,aAAa,MAAM,aAAa,CAAC,CAAC,MAA+B,CAAC,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC;CACvF,MAAM,QAAQ,MAAM;CACpB,WAAW,UAAU,cAAc,EAAE,cAAc,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,WAAW;CAChF,WAAW,UAAU,cAAc,EAAE,cAAc,KAAK,CAAC,CAAC,CACvD,QAAQ,CAAC,CACT,WAAW,CAAC,CACZ,gCAAgB,IAAI,KAAK,CAAC;AAC/B,IACC,OAAO;CACN,IAAI,WAAW,EAAE,SAAS,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;CAC3C,OAAO,OAAO,kBAAkB,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG;CACnD,QAAQ,YAAY,mBAAmB,CAAC,CACrC,GAAG,EAAE,OAAO,GAAG,SAAS,EAAE,KAAK,EAAE,CAAC,CAClC,MAAM,GAAG,GAAG,EAAE,KAAK,aAAa;AACrC,EACF;AAEA,MAAa,kBAAkB,QAC7B,oBACA;CACE,OAAO,KAAK,QAAQ,CAAC,CAAC,QAAQ;CAC9B,IAAI,KAAK,IAAI,CAAC,CACX,QAAQ,CAAC,CACT,iBAAiB,MAAM,gBAAgB,CAAC;CAC3C,WAAW,KAAK,aAAa,CAAC,CAAC,QAAQ;CACvC,SAAS,KAAK,UAAU,CAAC,CAAC,QAAQ;CAClC,WAAW,KAAK,YAAY;CAC5B,aAAa,KAAK,gBAAgB,EAAE,MAAM;EAAC;EAAU;EAAY;EAAa;CAAO,EAAE,CAAC;CACxF,YAAY,KAAK,aAAa,CAAC,CAAC,QAAQ;CACxC,WAAW,UAAU,cAAc,EAAE,cAAc,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,WAAW;AAClF,IACC,OAAO;CACN,IAAI,WAAW,EAAE,SAAS,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;CAC3C,WAAW,WAAW;EACpB,MAAM;EACN,SAAS,CAAC,EAAE,OAAO,EAAE,SAAS;EAC9B,gBAAgB,CAAC,SAAS,OAAO,SAAS,EAAE;CAC9C,CAAC,CAAC,CAAC,SAAS,SAAS;CACrB,WAAW,WAAW;EACpB,MAAM;EACN,SAAS;GAAC,EAAE;GAAO,EAAE;GAAW,EAAE;EAAW;EAC7C,gBAAgB;GAAC,aAAa;GAAO,aAAa;GAAI,aAAa;EAAI;CACzE,CAAC,CAAC,CAAC,SAAS,SAAS;CACrB,SAAS,OAAO,2BAA2B,CAAC,CACzC,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,CAAC,CACrC,iBAAiB;CACpB,SAAS,YAAY,2BAA2B,CAAC,CAC9C,GAAG,EAAE,KAAK,CAAC,CACX,MAAM,GAAG,GAAG,EAAE,QAAQ,WAAW;CACpC,YAAY,MAAM,8BAA8B,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS;AAC3E,EACF"}
@@ -0,0 +1,8 @@
1
+ CREATE TABLE "digest_runs" (
2
+ "org_id" text NOT NULL,
3
+ "community_id" text NOT NULL,
4
+ "last_due_at" timestamp with time zone NOT NULL,
5
+ CONSTRAINT "digest_runs_org_id_community_id_pk" PRIMARY KEY("org_id","community_id")
6
+ );
7
+ --> statement-breakpoint
8
+ ALTER TABLE "digest_runs" ADD CONSTRAINT "digest_runs_org_id_community_id_communities_org_id_id_fk" FOREIGN KEY ("org_id","community_id") REFERENCES "public"."communities"("org_id","id") ON DELETE cascade ON UPDATE no action;
@@ -0,0 +1,16 @@
1
+ CREATE TABLE "subscriptions" (
2
+ "org_id" text NOT NULL,
3
+ "org_user_id" text NOT NULL,
4
+ "item_type" text NOT NULL,
5
+ "item_id" text NOT NULL,
6
+ "state" text NOT NULL,
7
+ "muted_until" timestamp with time zone,
8
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
9
+ CONSTRAINT "subscriptions_org_id_org_user_id_item_type_item_id_pk" PRIMARY KEY("org_id","org_user_id","item_type","item_id")
10
+ );
11
+ --> statement-breakpoint
12
+ DROP TABLE "post_follows" CASCADE;--> statement-breakpoint
13
+ ALTER TABLE "subscriptions" ADD CONSTRAINT "subscriptions_org_id_org_user_id_org_users_org_id_id_fk" FOREIGN KEY ("org_id","org_user_id") REFERENCES "public"."org_users"("org_id","id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
14
+ CREATE INDEX "subscriptions_item_idx" ON "subscriptions" USING btree ("org_id","item_type","item_id","state");--> statement-breakpoint
15
+ ALTER TABLE "chat_users" DROP COLUMN "muted";--> statement-breakpoint
16
+ ALTER TABLE "chat_users" DROP COLUMN "muted_until";
@@ -0,0 +1,10 @@
1
+ CREATE TABLE "mentions" (
2
+ "org_id" text NOT NULL,
3
+ "item_type" text NOT NULL,
4
+ "item_id" text NOT NULL,
5
+ "org_user_id" text NOT NULL,
6
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
7
+ CONSTRAINT "mentions_org_id_item_type_item_id_org_user_id_pk" PRIMARY KEY("org_id","item_type","item_id","org_user_id")
8
+ );
9
+ --> statement-breakpoint
10
+ ALTER TABLE "mentions" ADD CONSTRAINT "mentions_org_id_org_user_id_org_users_org_id_id_fk" FOREIGN KEY ("org_id","org_user_id") REFERENCES "public"."org_users"("org_id","id") ON DELETE cascade ON UPDATE no action;
@@ -0,0 +1,36 @@
1
+ CREATE TABLE "devices" (
2
+ "org_id" text NOT NULL,
3
+ "id" text NOT NULL,
4
+ "user_id" text NOT NULL,
5
+ "provider" text NOT NULL,
6
+ "token" text NOT NULL,
7
+ "p256dh" text,
8
+ "auth" text,
9
+ "app_id" text,
10
+ "environment" text,
11
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
12
+ "last_seen_at" timestamp with time zone DEFAULT now() NOT NULL,
13
+ CONSTRAINT "devices_org_id_id_pk" PRIMARY KEY("org_id","id")
14
+ );
15
+ --> statement-breakpoint
16
+ CREATE TABLE "notification_settings" (
17
+ "org_id" text NOT NULL,
18
+ "id" text NOT NULL,
19
+ "user_id" text NOT NULL,
20
+ "community_id" text,
21
+ "space_id" text,
22
+ "category" text NOT NULL,
23
+ "channel" text NOT NULL,
24
+ "enabled" boolean NOT NULL,
25
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL,
26
+ CONSTRAINT "notification_settings_org_id_id_pk" PRIMARY KEY("org_id","id")
27
+ );
28
+ --> statement-breakpoint
29
+ ALTER TABLE "devices" ADD CONSTRAINT "devices_org_id_user_id_org_users_org_id_user_id_fk" FOREIGN KEY ("org_id","user_id") REFERENCES "public"."org_users"("org_id","user_id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
30
+ ALTER TABLE "notification_settings" ADD CONSTRAINT "notification_settings_org_id_user_id_org_users_org_id_user_id_fk" FOREIGN KEY ("org_id","user_id") REFERENCES "public"."org_users"("org_id","user_id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
31
+ ALTER TABLE "notification_settings" ADD CONSTRAINT "notification_settings_org_id_community_id_communities_org_id_id_fk" FOREIGN KEY ("org_id","community_id") REFERENCES "public"."communities"("org_id","id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
32
+ ALTER TABLE "notification_settings" ADD CONSTRAINT "notification_settings_org_id_space_id_spaces_org_id_id_fk" FOREIGN KEY ("org_id","space_id") REFERENCES "public"."spaces"("org_id","id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
33
+ CREATE UNIQUE INDEX "devices_token_idx" ON "devices" USING btree ("org_id","provider","token");--> statement-breakpoint
34
+ CREATE INDEX "devices_user_idx" ON "devices" USING btree ("org_id","user_id","last_seen_at");--> statement-breakpoint
35
+ CREATE UNIQUE INDEX "notification_settings_setting_idx" ON "notification_settings" USING btree ("org_id","user_id",coalesce("community_id", ''),coalesce("space_id", ''),"category","channel");--> statement-breakpoint
36
+ CREATE INDEX "notification_settings_switched_on_idx" ON "notification_settings" USING btree ("org_id",coalesce("community_id", ''),"category",coalesce("space_id", '')) WHERE "notification_settings"."enabled";
@@ -0,0 +1,2 @@
1
+ DROP INDEX "automations_system_seed_idx";--> statement-breakpoint
2
+ ALTER TABLE "automations" DROP COLUMN "source";
@@ -0,0 +1,48 @@
1
+ DROP TABLE "notification_preferences" CASCADE;--> statement-breakpoint
2
+ DROP TABLE "notifications" CASCADE;--> statement-breakpoint
3
+ CREATE TABLE "notification_deliveries" (
4
+ "org_id" text NOT NULL,
5
+ "id" text NOT NULL,
6
+ "notification_id" text NOT NULL,
7
+ "channel" text NOT NULL,
8
+ "status" text DEFAULT 'pending' NOT NULL,
9
+ "last_error" text,
10
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
11
+ "sent_at" timestamp with time zone,
12
+ CONSTRAINT "notification_deliveries_org_id_id_pk" PRIMARY KEY("org_id","id")
13
+ );
14
+ --> statement-breakpoint
15
+ CREATE TABLE "notifications" (
16
+ "org_id" text NOT NULL,
17
+ "id" text NOT NULL,
18
+ "user_id" text NOT NULL,
19
+ "source_event_id" text,
20
+ "type" text NOT NULL,
21
+ "scope" text NOT NULL,
22
+ "reasons" text[] NOT NULL,
23
+ "matched_reason" text NOT NULL,
24
+ "category" text NOT NULL,
25
+ "community_id" text,
26
+ "space_id" text,
27
+ "actor_org_user_id" text,
28
+ "subject_type" text,
29
+ "subject_id" text,
30
+ "parent_type" text,
31
+ "parent_id" text,
32
+ "display" jsonb NOT NULL,
33
+ "in_app" boolean NOT NULL,
34
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
35
+ "read_at" timestamp with time zone,
36
+ CONSTRAINT "notifications_org_id_id_pk" PRIMARY KEY("org_id","id")
37
+ );
38
+ --> statement-breakpoint
39
+ ALTER TABLE "notification_deliveries" ADD CONSTRAINT "notification_deliveries_org_id_notification_id_notifications_org_id_id_fk" FOREIGN KEY ("org_id","notification_id") REFERENCES "public"."notifications"("org_id","id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
40
+ ALTER TABLE "notifications" ADD CONSTRAINT "notifications_org_id_user_id_org_users_org_id_user_id_fk" FOREIGN KEY ("org_id","user_id") REFERENCES "public"."org_users"("org_id","user_id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
41
+ ALTER TABLE "notifications" ADD CONSTRAINT "notifications_org_id_community_id_communities_org_id_id_fk" FOREIGN KEY ("org_id","community_id") REFERENCES "public"."communities"("org_id","id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
42
+ ALTER TABLE "notifications" ADD CONSTRAINT "notifications_org_id_space_id_spaces_org_id_id_fk" FOREIGN KEY ("org_id","space_id") REFERENCES "public"."spaces"("org_id","id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
43
+ CREATE UNIQUE INDEX "notification_deliveries_channel_idx" ON "notification_deliveries" USING btree ("org_id","notification_id","channel");--> statement-breakpoint
44
+ CREATE UNIQUE INDEX "notifications_source_event_idx" ON "notifications" USING btree ("org_id","source_event_id","user_id",coalesce("community_id", '')) WHERE "notifications"."source_event_id" is not null;--> statement-breakpoint
45
+ CREATE INDEX "notifications_list_idx" ON "notifications" USING btree ("org_id","user_id","created_at" desc,"id" desc) WHERE "notifications"."in_app";--> statement-breakpoint
46
+ CREATE INDEX "notifications_community_idx" ON "notifications" USING btree ("org_id","user_id","community_id");--> statement-breakpoint
47
+ CREATE INDEX "notifications_category_idx" ON "notifications" USING btree ("org_id","user_id","category");--> statement-breakpoint
48
+ CREATE INDEX "notifications_reasons_idx" ON "notifications" USING gin ("reasons");
@@ -0,0 +1,38 @@
1
+ CREATE TABLE "org_roles" (
2
+ "org_id" text NOT NULL,
3
+ "id" text NOT NULL,
4
+ "key" text NOT NULL,
5
+ "name" text,
6
+ "description" text,
7
+ "base" text NOT NULL,
8
+ "levels" text[],
9
+ "permissions" jsonb DEFAULT '{}'::jsonb NOT NULL,
10
+ "team" boolean,
11
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
12
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL,
13
+ CONSTRAINT "org_roles_org_id_id_pk" PRIMARY KEY("org_id","id"),
14
+ CONSTRAINT "org_roles_key_uq" UNIQUE("org_id","key")
15
+ );
16
+ --> statement-breakpoint
17
+ CREATE TABLE "role_assignments" (
18
+ "org_id" text NOT NULL,
19
+ "id" text NOT NULL,
20
+ "org_user_id" text NOT NULL,
21
+ "role_key" text NOT NULL,
22
+ "content_id" text,
23
+ "content_type" text,
24
+ "assigned_by" text NOT NULL,
25
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
26
+ CONSTRAINT "role_assignments_org_id_id_pk" PRIMARY KEY("org_id","id"),
27
+ CONSTRAINT "role_assignments_scope_uq" UNIQUE NULLS NOT DISTINCT("org_id","org_user_id","content_id")
28
+ );
29
+ --> statement-breakpoint
30
+ ALTER TABLE "invites" ALTER COLUMN "role" SET DEFAULT 'member';--> statement-breakpoint
31
+ ALTER TABLE "assets" ADD COLUMN "content_id" text;--> statement-breakpoint
32
+ ALTER TABLE "org_roles" ADD CONSTRAINT "org_roles_org_id_organizations_id_fk" FOREIGN KEY ("org_id") REFERENCES "public"."organizations"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
33
+ ALTER TABLE "role_assignments" ADD CONSTRAINT "role_assignments_org_user_fk" FOREIGN KEY ("org_id","org_user_id") REFERENCES "public"."org_users"("org_id","id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
34
+ ALTER TABLE "role_assignments" ADD CONSTRAINT "role_assignments_content_fk" FOREIGN KEY ("org_id","content_id","content_type") REFERENCES "public"."content_items"("org_id","id","type") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
35
+ CREATE UNIQUE INDEX "org_roles_name_uq" ON "org_roles" USING btree ("org_id",lower("name")) WHERE "org_roles"."name" is not null;--> statement-breakpoint
36
+ CREATE UNIQUE INDEX "role_assignments_owner_uq" ON "role_assignments" USING btree ("org_id") WHERE "role_assignments"."role_key" = 'owner';--> statement-breakpoint
37
+ CREATE INDEX "role_assignments_content_idx" ON "role_assignments" USING btree ("org_id","content_id");--> statement-breakpoint
38
+ ALTER TABLE "org_users" DROP COLUMN "role";
@@ -0,0 +1,2 @@
1
+ ALTER TABLE "messages" ADD COLUMN "client_id" uuid;--> statement-breakpoint
2
+ CREATE UNIQUE INDEX "messages_client_id_uq" ON "messages" USING btree ("org_id","chat_id","org_user_id","client_id");