@headless-lms/adapter-db 0.1.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 (115) hide show
  1. package/LICENSE +21 -0
  2. package/dist/_virtual/_rolldown/runtime.js +13 -0
  3. package/dist/client.d.ts +17 -0
  4. package/dist/client.js +11 -0
  5. package/dist/client.js.map +1 -0
  6. package/dist/index.d.ts +22 -0
  7. package/dist/index.js +22 -0
  8. package/dist/migrate.d.ts +7 -0
  9. package/dist/migrate.js +27 -0
  10. package/dist/migrate.js.map +1 -0
  11. package/dist/repositories/assets.d.ts +17 -0
  12. package/dist/repositories/assets.js +90 -0
  13. package/dist/repositories/assets.js.map +1 -0
  14. package/dist/repositories/automations.d.ts +30 -0
  15. package/dist/repositories/automations.js +165 -0
  16. package/dist/repositories/automations.js.map +1 -0
  17. package/dist/repositories/content.d.ts +52 -0
  18. package/dist/repositories/content.js +350 -0
  19. package/dist/repositories/content.js.map +1 -0
  20. package/dist/repositories/credentials.d.ts +25 -0
  21. package/dist/repositories/credentials.js +86 -0
  22. package/dist/repositories/credentials.js.map +1 -0
  23. package/dist/repositories/dashboard.d.ts +14 -0
  24. package/dist/repositories/dashboard.js +55 -0
  25. package/dist/repositories/dashboard.js.map +1 -0
  26. package/dist/repositories/discussion.d.ts +31 -0
  27. package/dist/repositories/discussion.js +201 -0
  28. package/dist/repositories/discussion.js.map +1 -0
  29. package/dist/repositories/entitlements.d.ts +23 -0
  30. package/dist/repositories/entitlements.js +129 -0
  31. package/dist/repositories/entitlements.js.map +1 -0
  32. package/dist/repositories/identity.d.ts +17 -0
  33. package/dist/repositories/identity.js +44 -0
  34. package/dist/repositories/identity.js.map +1 -0
  35. package/dist/repositories/integrations.d.ts +18 -0
  36. package/dist/repositories/integrations.js +65 -0
  37. package/dist/repositories/integrations.js.map +1 -0
  38. package/dist/repositories/learn.d.ts +19 -0
  39. package/dist/repositories/learn.js +54 -0
  40. package/dist/repositories/learn.js.map +1 -0
  41. package/dist/repositories/members.d.ts +16 -0
  42. package/dist/repositories/members.js +116 -0
  43. package/dist/repositories/members.js.map +1 -0
  44. package/dist/repositories/org-user-profile.d.ts +92 -0
  45. package/dist/repositories/org-user-profile.js +16 -0
  46. package/dist/repositories/org-user-profile.js.map +1 -0
  47. package/dist/repositories/organizations.d.ts +33 -0
  48. package/dist/repositories/organizations.js +198 -0
  49. package/dist/repositories/organizations.js.map +1 -0
  50. package/dist/repositories/outbox.d.ts +24 -0
  51. package/dist/repositories/outbox.js +56 -0
  52. package/dist/repositories/outbox.js.map +1 -0
  53. package/dist/repositories/pg-errors.d.ts +11 -0
  54. package/dist/repositories/pg-errors.js +15 -0
  55. package/dist/repositories/pg-errors.js.map +1 -0
  56. package/dist/repositories/progress.d.ts +18 -0
  57. package/dist/repositories/progress.js +59 -0
  58. package/dist/repositories/progress.js.map +1 -0
  59. package/dist/repositories/settings.d.ts +22 -0
  60. package/dist/repositories/settings.js +73 -0
  61. package/dist/repositories/settings.js.map +1 -0
  62. package/dist/repositories/students.d.ts +15 -0
  63. package/dist/repositories/students.js +83 -0
  64. package/dist/repositories/students.js.map +1 -0
  65. package/dist/schema/assets.d.ts +181 -0
  66. package/dist/schema/assets.js +24 -0
  67. package/dist/schema/assets.js.map +1 -0
  68. package/dist/schema/automations.d.ts +364 -0
  69. package/dist/schema/automations.js +42 -0
  70. package/dist/schema/automations.js.map +1 -0
  71. package/dist/schema/better-auth.d.ts +2311 -0
  72. package/dist/schema/better-auth.js +156 -0
  73. package/dist/schema/better-auth.js.map +1 -0
  74. package/dist/schema/content.d.ts +966 -0
  75. package/dist/schema/content.js +163 -0
  76. package/dist/schema/content.js.map +1 -0
  77. package/dist/schema/credentials.d.ts +113 -0
  78. package/dist/schema/credentials.js +15 -0
  79. package/dist/schema/credentials.js.map +1 -0
  80. package/dist/schema/discussion.d.ts +399 -0
  81. package/dist/schema/discussion.js +89 -0
  82. package/dist/schema/discussion.js.map +1 -0
  83. package/dist/schema/drift.d.ts +9 -0
  84. package/dist/schema/drift.js +1 -0
  85. package/dist/schema/entitlements.d.ts +147 -0
  86. package/dist/schema/entitlements.js +30 -0
  87. package/dist/schema/entitlements.js.map +1 -0
  88. package/dist/schema/identity.d.ts +130 -0
  89. package/dist/schema/identity.js +16 -0
  90. package/dist/schema/identity.js.map +1 -0
  91. package/dist/schema/index.d.ts +18 -0
  92. package/dist/schema/index.js +43 -0
  93. package/dist/schema/index.js.map +1 -0
  94. package/dist/schema/integrations.d.ts +149 -0
  95. package/dist/schema/integrations.js +25 -0
  96. package/dist/schema/integrations.js.map +1 -0
  97. package/dist/schema/organizations.d.ts +416 -0
  98. package/dist/schema/organizations.js +58 -0
  99. package/dist/schema/organizations.js.map +1 -0
  100. package/dist/schema/outbox.d.ts +166 -0
  101. package/dist/schema/outbox.js +19 -0
  102. package/dist/schema/outbox.js.map +1 -0
  103. package/dist/schema/progress.d.ts +166 -0
  104. package/dist/schema/progress.js +30 -0
  105. package/dist/schema/progress.js.map +1 -0
  106. package/dist/schema/settings.d.ts +115 -0
  107. package/dist/schema/settings.js +19 -0
  108. package/dist/schema/settings.js.map +1 -0
  109. package/dist/unit-of-work.d.ts +13 -0
  110. package/dist/unit-of-work.js +16 -0
  111. package/dist/unit-of-work.js.map +1 -0
  112. package/drizzle/0000_baseline.sql +526 -0
  113. package/drizzle/meta/0000_snapshot.json +3925 -0
  114. package/drizzle/meta/_journal.json +13 -0
  115. package/package.json +56 -0
@@ -0,0 +1,416 @@
1
+ //#region src/schema/organizations.d.ts
2
+ declare const organizations: import("drizzle-orm/pg-core").PgTableWithColumns<{
3
+ name: "organizations";
4
+ schema: undefined;
5
+ columns: {
6
+ id: import("drizzle-orm/pg-core").PgColumn<{
7
+ name: "id";
8
+ tableName: "organizations";
9
+ dataType: "string";
10
+ columnType: "PgText";
11
+ data: string;
12
+ driverParam: string;
13
+ notNull: true;
14
+ hasDefault: true;
15
+ isPrimaryKey: true;
16
+ isAutoincrement: false;
17
+ hasRuntimeDefault: true;
18
+ enumValues: [string, ...string[]];
19
+ baseColumn: never;
20
+ identity: undefined;
21
+ generated: undefined;
22
+ }, {}, {}>;
23
+ externalId: import("drizzle-orm/pg-core").PgColumn<{
24
+ name: "external_id";
25
+ tableName: "organizations";
26
+ dataType: "string";
27
+ columnType: "PgText";
28
+ data: string;
29
+ driverParam: string;
30
+ notNull: false;
31
+ hasDefault: false;
32
+ isPrimaryKey: false;
33
+ isAutoincrement: false;
34
+ hasRuntimeDefault: false;
35
+ enumValues: [string, ...string[]];
36
+ baseColumn: never;
37
+ identity: undefined;
38
+ generated: undefined;
39
+ }, {}, {}>;
40
+ name: import("drizzle-orm/pg-core").PgColumn<{
41
+ name: "name";
42
+ tableName: "organizations";
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
+ slug: import("drizzle-orm/pg-core").PgColumn<{
58
+ name: "slug";
59
+ tableName: "organizations";
60
+ dataType: "string";
61
+ columnType: "PgText";
62
+ data: string;
63
+ driverParam: string;
64
+ notNull: true;
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
+ ownerId: import("drizzle-orm/pg-core").PgColumn<{
75
+ name: "owner_id";
76
+ tableName: "organizations";
77
+ dataType: "string";
78
+ columnType: "PgText";
79
+ data: string;
80
+ driverParam: string;
81
+ notNull: true;
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
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
92
+ name: "created_at";
93
+ tableName: "organizations";
94
+ dataType: "date";
95
+ columnType: "PgTimestamp";
96
+ data: Date;
97
+ driverParam: string;
98
+ notNull: true;
99
+ hasDefault: true;
100
+ isPrimaryKey: false;
101
+ isAutoincrement: false;
102
+ hasRuntimeDefault: false;
103
+ enumValues: undefined;
104
+ baseColumn: never;
105
+ identity: undefined;
106
+ generated: undefined;
107
+ }, {}, {}>;
108
+ updatedAt: import("drizzle-orm/pg-core").PgColumn<{
109
+ name: "updated_at";
110
+ tableName: "organizations";
111
+ dataType: "date";
112
+ columnType: "PgTimestamp";
113
+ data: Date;
114
+ driverParam: string;
115
+ notNull: true;
116
+ hasDefault: true;
117
+ isPrimaryKey: false;
118
+ isAutoincrement: false;
119
+ hasRuntimeDefault: false;
120
+ enumValues: undefined;
121
+ baseColumn: never;
122
+ identity: undefined;
123
+ generated: undefined;
124
+ }, {}, {}>;
125
+ };
126
+ dialect: "pg";
127
+ }>;
128
+ declare const orgUsers: import("drizzle-orm/pg-core").PgTableWithColumns<{
129
+ name: "org_users";
130
+ schema: undefined;
131
+ columns: {
132
+ orgId: import("drizzle-orm/pg-core").PgColumn<{
133
+ name: "org_id";
134
+ tableName: "org_users";
135
+ dataType: "string";
136
+ columnType: "PgText";
137
+ data: string;
138
+ driverParam: string;
139
+ notNull: true;
140
+ hasDefault: false;
141
+ isPrimaryKey: false;
142
+ isAutoincrement: false;
143
+ hasRuntimeDefault: false;
144
+ enumValues: [string, ...string[]];
145
+ baseColumn: never;
146
+ identity: undefined;
147
+ generated: undefined;
148
+ }, {}, {}>;
149
+ id: import("drizzle-orm/pg-core").PgColumn<{
150
+ name: "id";
151
+ tableName: "org_users";
152
+ dataType: "string";
153
+ columnType: "PgText";
154
+ data: string;
155
+ driverParam: string;
156
+ notNull: true;
157
+ hasDefault: true;
158
+ isPrimaryKey: false;
159
+ isAutoincrement: false;
160
+ hasRuntimeDefault: true;
161
+ enumValues: [string, ...string[]];
162
+ baseColumn: never;
163
+ identity: undefined;
164
+ generated: undefined;
165
+ }, {}, {}>;
166
+ userId: import("drizzle-orm/pg-core").PgColumn<{
167
+ name: "user_id";
168
+ tableName: "org_users";
169
+ dataType: "string";
170
+ columnType: "PgText";
171
+ data: string;
172
+ driverParam: string;
173
+ notNull: true;
174
+ hasDefault: false;
175
+ isPrimaryKey: false;
176
+ isAutoincrement: false;
177
+ hasRuntimeDefault: false;
178
+ enumValues: [string, ...string[]];
179
+ baseColumn: never;
180
+ identity: undefined;
181
+ generated: undefined;
182
+ }, {}, {}>;
183
+ role: import("drizzle-orm/pg-core").PgColumn<{
184
+ name: "role";
185
+ tableName: "org_users";
186
+ dataType: "string";
187
+ columnType: "PgText";
188
+ data: "student" | "owner" | "admin" | "instructor";
189
+ driverParam: string;
190
+ notNull: true;
191
+ hasDefault: false;
192
+ isPrimaryKey: false;
193
+ isAutoincrement: false;
194
+ hasRuntimeDefault: false;
195
+ enumValues: ["owner", "admin", "instructor", "student"];
196
+ baseColumn: never;
197
+ identity: undefined;
198
+ generated: undefined;
199
+ }, {}, {}>;
200
+ status: import("drizzle-orm/pg-core").PgColumn<{
201
+ name: "status";
202
+ tableName: "org_users";
203
+ dataType: "string";
204
+ columnType: "PgText";
205
+ data: "invited" | "active";
206
+ driverParam: string;
207
+ notNull: true;
208
+ hasDefault: true;
209
+ isPrimaryKey: false;
210
+ isAutoincrement: false;
211
+ hasRuntimeDefault: false;
212
+ enumValues: ["invited", "active"];
213
+ baseColumn: never;
214
+ identity: undefined;
215
+ generated: undefined;
216
+ }, {}, {}>;
217
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
218
+ name: "created_at";
219
+ tableName: "org_users";
220
+ dataType: "date";
221
+ columnType: "PgTimestamp";
222
+ data: Date;
223
+ driverParam: string;
224
+ notNull: true;
225
+ hasDefault: true;
226
+ isPrimaryKey: false;
227
+ isAutoincrement: false;
228
+ hasRuntimeDefault: false;
229
+ enumValues: undefined;
230
+ baseColumn: never;
231
+ identity: undefined;
232
+ generated: undefined;
233
+ }, {}, {}>;
234
+ updatedAt: import("drizzle-orm/pg-core").PgColumn<{
235
+ name: "updated_at";
236
+ tableName: "org_users";
237
+ dataType: "date";
238
+ columnType: "PgTimestamp";
239
+ data: Date;
240
+ driverParam: string;
241
+ notNull: true;
242
+ hasDefault: true;
243
+ isPrimaryKey: false;
244
+ isAutoincrement: false;
245
+ hasRuntimeDefault: false;
246
+ enumValues: undefined;
247
+ baseColumn: never;
248
+ identity: undefined;
249
+ generated: undefined;
250
+ }, {}, {}>;
251
+ };
252
+ dialect: "pg";
253
+ }>;
254
+ declare const invites: import("drizzle-orm/pg-core").PgTableWithColumns<{
255
+ name: "invites";
256
+ schema: undefined;
257
+ columns: {
258
+ orgId: import("drizzle-orm/pg-core").PgColumn<{
259
+ name: "org_id";
260
+ tableName: "invites";
261
+ dataType: "string";
262
+ columnType: "PgText";
263
+ data: string;
264
+ driverParam: string;
265
+ notNull: true;
266
+ hasDefault: false;
267
+ isPrimaryKey: false;
268
+ isAutoincrement: false;
269
+ hasRuntimeDefault: false;
270
+ enumValues: [string, ...string[]];
271
+ baseColumn: never;
272
+ identity: undefined;
273
+ generated: undefined;
274
+ }, {}, {}>;
275
+ id: import("drizzle-orm/pg-core").PgColumn<{
276
+ name: "id";
277
+ tableName: "invites";
278
+ dataType: "string";
279
+ columnType: "PgText";
280
+ data: string;
281
+ driverParam: string;
282
+ notNull: true;
283
+ hasDefault: true;
284
+ isPrimaryKey: false;
285
+ isAutoincrement: false;
286
+ hasRuntimeDefault: true;
287
+ enumValues: [string, ...string[]];
288
+ baseColumn: never;
289
+ identity: undefined;
290
+ generated: undefined;
291
+ }, {}, {}>;
292
+ email: import("drizzle-orm/pg-core").PgColumn<{
293
+ name: "email";
294
+ tableName: "invites";
295
+ dataType: "string";
296
+ columnType: "PgText";
297
+ data: string;
298
+ driverParam: string;
299
+ notNull: true;
300
+ hasDefault: false;
301
+ isPrimaryKey: false;
302
+ isAutoincrement: false;
303
+ hasRuntimeDefault: false;
304
+ enumValues: [string, ...string[]];
305
+ baseColumn: never;
306
+ identity: undefined;
307
+ generated: undefined;
308
+ }, {}, {}>;
309
+ role: import("drizzle-orm/pg-core").PgColumn<{
310
+ name: "role";
311
+ tableName: "invites";
312
+ dataType: "string";
313
+ columnType: "PgText";
314
+ data: "student" | "admin" | "instructor";
315
+ driverParam: string;
316
+ notNull: true;
317
+ hasDefault: false;
318
+ isPrimaryKey: false;
319
+ isAutoincrement: false;
320
+ hasRuntimeDefault: false;
321
+ enumValues: ["admin", "instructor", "student"];
322
+ baseColumn: never;
323
+ identity: undefined;
324
+ generated: undefined;
325
+ }, {}, {}>;
326
+ status: import("drizzle-orm/pg-core").PgColumn<{
327
+ name: "status";
328
+ tableName: "invites";
329
+ dataType: "string";
330
+ columnType: "PgText";
331
+ data: "pending" | "accepted" | "rejected" | "canceled";
332
+ driverParam: string;
333
+ notNull: true;
334
+ hasDefault: false;
335
+ isPrimaryKey: false;
336
+ isAutoincrement: false;
337
+ hasRuntimeDefault: false;
338
+ enumValues: ["pending", "accepted", "rejected", "canceled"];
339
+ baseColumn: never;
340
+ identity: undefined;
341
+ generated: undefined;
342
+ }, {}, {}>;
343
+ invitedBy: import("drizzle-orm/pg-core").PgColumn<{
344
+ name: "invited_by";
345
+ tableName: "invites";
346
+ dataType: "string";
347
+ columnType: "PgText";
348
+ data: string;
349
+ driverParam: string;
350
+ notNull: true;
351
+ hasDefault: false;
352
+ isPrimaryKey: false;
353
+ isAutoincrement: false;
354
+ hasRuntimeDefault: false;
355
+ enumValues: [string, ...string[]];
356
+ baseColumn: never;
357
+ identity: undefined;
358
+ generated: undefined;
359
+ }, {}, {}>;
360
+ tokenHash: import("drizzle-orm/pg-core").PgColumn<{
361
+ name: "token_hash";
362
+ tableName: "invites";
363
+ dataType: "string";
364
+ columnType: "PgText";
365
+ data: string;
366
+ driverParam: string;
367
+ notNull: false;
368
+ hasDefault: false;
369
+ isPrimaryKey: false;
370
+ isAutoincrement: false;
371
+ hasRuntimeDefault: false;
372
+ enumValues: [string, ...string[]];
373
+ baseColumn: never;
374
+ identity: undefined;
375
+ generated: undefined;
376
+ }, {}, {}>;
377
+ expiresAt: import("drizzle-orm/pg-core").PgColumn<{
378
+ name: "expires_at";
379
+ tableName: "invites";
380
+ dataType: "date";
381
+ columnType: "PgTimestamp";
382
+ data: Date;
383
+ driverParam: string;
384
+ notNull: false;
385
+ hasDefault: false;
386
+ isPrimaryKey: false;
387
+ isAutoincrement: false;
388
+ hasRuntimeDefault: false;
389
+ enumValues: undefined;
390
+ baseColumn: never;
391
+ identity: undefined;
392
+ generated: undefined;
393
+ }, {}, {}>;
394
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
395
+ name: "created_at";
396
+ tableName: "invites";
397
+ dataType: "date";
398
+ columnType: "PgTimestamp";
399
+ data: Date;
400
+ driverParam: string;
401
+ notNull: true;
402
+ hasDefault: true;
403
+ isPrimaryKey: false;
404
+ isAutoincrement: false;
405
+ hasRuntimeDefault: false;
406
+ enumValues: undefined;
407
+ baseColumn: never;
408
+ identity: undefined;
409
+ generated: undefined;
410
+ }, {}, {}>;
411
+ };
412
+ dialect: "pg";
413
+ }>;
414
+ //#endregion
415
+ export { invites, orgUsers, organizations };
416
+ //# sourceMappingURL=organizations.d.ts.map
@@ -0,0 +1,58 @@
1
+ import { users } from "./identity.js";
2
+ import { sql } from "drizzle-orm";
3
+ import { pgTable, primaryKey, text, timestamp, unique, uniqueIndex } from "drizzle-orm/pg-core";
4
+ import { genId } from "@headless-lms/core/shared/id";
5
+ //#region src/schema/organizations.ts
6
+ const organizations = pgTable("organizations", {
7
+ id: text("id").primaryKey().$defaultFn(() => genId("organization")),
8
+ externalId: text("external_id").unique(),
9
+ name: text("name").notNull(),
10
+ slug: text("slug").notNull().unique(),
11
+ ownerId: text("owner_id").notNull().references(() => users.id),
12
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
13
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow().$onUpdate(() => /* @__PURE__ */ new Date())
14
+ });
15
+ const orgUsers = pgTable("org_users", {
16
+ orgId: text("org_id").notNull().references(() => organizations.id),
17
+ id: text("id").notNull().$defaultFn(() => genId("orgUser")),
18
+ userId: text("user_id").notNull().references(() => users.id),
19
+ role: text("role", { enum: [
20
+ "owner",
21
+ "admin",
22
+ "instructor",
23
+ "student"
24
+ ] }).notNull(),
25
+ status: text("status", { enum: ["invited", "active"] }).notNull().default("active"),
26
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
27
+ updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow().$onUpdate(() => /* @__PURE__ */ new Date())
28
+ }, (t) => ({
29
+ pk: primaryKey({ columns: [t.orgId, t.id] }),
30
+ userUq: unique().on(t.orgId, t.userId)
31
+ }));
32
+ const invites = pgTable("invites", {
33
+ orgId: text("org_id").notNull().references(() => organizations.id),
34
+ id: text("id").notNull().$defaultFn(() => genId("invite")),
35
+ email: text("email").notNull(),
36
+ role: text("role", { enum: [
37
+ "admin",
38
+ "instructor",
39
+ "student"
40
+ ] }).notNull(),
41
+ status: text("status", { enum: [
42
+ "pending",
43
+ "accepted",
44
+ "rejected",
45
+ "canceled"
46
+ ] }).notNull(),
47
+ invitedBy: text("invited_by").notNull().references(() => users.id),
48
+ tokenHash: text("token_hash").unique(),
49
+ expiresAt: timestamp("expires_at", { withTimezone: true }),
50
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow()
51
+ }, (t) => ({
52
+ pk: primaryKey({ columns: [t.orgId, t.id] }),
53
+ pendingEmailUq: uniqueIndex("invites_pending_email_uq").on(t.orgId, t.email).where(sql`${t.status} = 'pending'`)
54
+ }));
55
+ //#endregion
56
+ export { invites, orgUsers, organizations };
57
+
58
+ //# sourceMappingURL=organizations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"organizations.js","names":[],"sources":["../../src/schema/organizations.ts"],"sourcesContent":["import { sql } from 'drizzle-orm';\nimport {\n pgTable,\n text,\n timestamp,\n primaryKey,\n unique,\n uniqueIndex,\n} from 'drizzle-orm/pg-core';\nimport type { Invite, Organization, OrgUser } from '@headless-lms/core/schemas';\nimport { genId } from '@headless-lms/core/shared/id';\nimport { users } from './identity.js';\nimport type { Expect, NoDrift } from './drift.js';\n\nexport const organizations = pgTable('organizations', {\n id: text('id')\n .primaryKey()\n .$defaultFn(() => genId('organization')),\n // Links to the better-auth organization record.\n externalId: text('external_id').unique(),\n name: text('name').notNull(),\n slug: text('slug').notNull().unique(),\n ownerId: text('owner_id')\n .notNull()\n .references(() => users.id),\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\n// A person's link to an organization under one role\nexport const orgUsers = pgTable(\n 'org_users',\n {\n orgId: text('org_id')\n .notNull()\n .references(() => organizations.id),\n id: text('id')\n .notNull()\n .$defaultFn(() => genId('orgUser')),\n\n userId: text('user_id')\n .notNull()\n .references(() => users.id),\n role: text('role', { enum: ['owner', 'admin', 'instructor', 'student'] }).notNull(),\n // 'invited' from the moment an admin adds a student until they accept.\n // Staff rows are mirrored from an auth member record that only exists once\n // they have joined, so they are created 'active'.\n status: text('status', { enum: ['invited', 'active'] })\n .notNull()\n .default('active'),\n\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 userUq: unique().on(t.orgId, t.userId),\n }),\n);\n\nexport const invites = pgTable(\n 'invites',\n {\n orgId: text('org_id')\n .notNull()\n .references(() => organizations.id),\n id: text('id')\n .notNull()\n .$defaultFn(() => genId('invite')),\n email: text('email').notNull(),\n role: text('role', { enum: ['admin', 'instructor', 'student'] }).notNull(),\n status: text('status', {\n enum: ['pending', 'accepted', 'rejected', 'canceled'],\n }).notNull(),\n invitedBy: text('invited_by')\n .notNull()\n .references(() => users.id),\n tokenHash: text('token_hash').unique(),\n expiresAt: timestamp('expires_at', { withTimezone: true }),\n createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\n },\n (t) => ({\n pk: primaryKey({ columns: [t.orgId, t.id] }),\n // One pending invite per (org, email) — the upsert's conflict target.\n pendingEmailUq: uniqueIndex('invites_pending_email_uq')\n .on(t.orgId, t.email)\n .where(sql`${t.status} = 'pending'`),\n }),\n);\n\ntype _OrganizationsDrift = Expect<NoDrift<typeof organizations.$inferSelect, Organization>>;\ntype _OrgUsersDrift = Expect<NoDrift<typeof orgUsers.$inferSelect, OrgUser>>;\ntype _InvitesDrift = Expect<NoDrift<typeof invites.$inferSelect, Invite>>;\n\n"],"mappings":";;;;;AAcA,MAAa,gBAAgB,QAAQ,iBAAiB;CACpD,IAAI,KAAK,IAAI,CAAC,CACX,WAAW,CAAC,CACZ,iBAAiB,MAAM,cAAc,CAAC;CAEzC,YAAY,KAAK,aAAa,CAAC,CAAC,OAAO;CACvC,MAAM,KAAK,MAAM,CAAC,CAAC,QAAQ;CAC3B,MAAM,KAAK,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,OAAO;CACpC,SAAS,KAAK,UAAU,CAAC,CACtB,QAAQ,CAAC,CACT,iBAAiB,MAAM,EAAE;CAC5B,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,CAAC;AAGD,MAAa,WAAW,QACtB,aACA;CACE,OAAO,KAAK,QAAQ,CAAC,CAClB,QAAQ,CAAC,CACT,iBAAiB,cAAc,EAAE;CACpC,IAAI,KAAK,IAAI,CAAC,CACX,QAAQ,CAAC,CACT,iBAAiB,MAAM,SAAS,CAAC;CAEpC,QAAQ,KAAK,SAAS,CAAC,CACpB,QAAQ,CAAC,CACT,iBAAiB,MAAM,EAAE;CAC5B,MAAM,KAAK,QAAQ,EAAE,MAAM;EAAC;EAAS;EAAS;EAAc;CAAS,EAAE,CAAC,CAAC,CAAC,QAAQ;CAIlF,QAAQ,KAAK,UAAU,EAAE,MAAM,CAAC,WAAW,QAAQ,EAAE,CAAC,CAAC,CACpD,QAAQ,CAAC,CACT,QAAQ,QAAQ;CAEnB,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,QAAQ,OAAO,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM;AACvC,EACF;AAEA,MAAa,UAAU,QACrB,WACA;CACE,OAAO,KAAK,QAAQ,CAAC,CAClB,QAAQ,CAAC,CACT,iBAAiB,cAAc,EAAE;CACpC,IAAI,KAAK,IAAI,CAAC,CACX,QAAQ,CAAC,CACT,iBAAiB,MAAM,QAAQ,CAAC;CACnC,OAAO,KAAK,OAAO,CAAC,CAAC,QAAQ;CAC7B,MAAM,KAAK,QAAQ,EAAE,MAAM;EAAC;EAAS;EAAc;CAAS,EAAE,CAAC,CAAC,CAAC,QAAQ;CACzE,QAAQ,KAAK,UAAU,EACrB,MAAM;EAAC;EAAW;EAAY;EAAY;CAAU,EACtD,CAAC,CAAC,CAAC,QAAQ;CACX,WAAW,KAAK,YAAY,CAAC,CAC1B,QAAQ,CAAC,CACT,iBAAiB,MAAM,EAAE;CAC5B,WAAW,KAAK,YAAY,CAAC,CAAC,OAAO;CACrC,WAAW,UAAU,cAAc,EAAE,cAAc,KAAK,CAAC;CACzD,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;CAE3C,gBAAgB,YAAY,0BAA0B,CAAC,CACpD,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,CACpB,MAAM,GAAG,GAAG,EAAE,OAAO,aAAa;AACvC,EACF"}
@@ -0,0 +1,166 @@
1
+ //#region src/schema/outbox.d.ts
2
+ declare const eventOutbox: import("drizzle-orm/pg-core").PgTableWithColumns<{
3
+ name: "event_outbox";
4
+ schema: undefined;
5
+ columns: {
6
+ orgId: import("drizzle-orm/pg-core").PgColumn<{
7
+ name: "org_id";
8
+ tableName: "event_outbox";
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: "event_outbox";
26
+ dataType: "string";
27
+ columnType: "PgText";
28
+ data: string;
29
+ driverParam: string;
30
+ notNull: true;
31
+ hasDefault: true;
32
+ isPrimaryKey: true;
33
+ isAutoincrement: false;
34
+ hasRuntimeDefault: true;
35
+ enumValues: [string, ...string[]];
36
+ baseColumn: never;
37
+ identity: undefined;
38
+ generated: undefined;
39
+ }, {}, {}>;
40
+ type: import("drizzle-orm/pg-core").PgColumn<{
41
+ name: "type";
42
+ tableName: "event_outbox";
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
+ payload: import("drizzle-orm/pg-core").PgColumn<{
58
+ name: "payload";
59
+ tableName: "event_outbox";
60
+ dataType: "json";
61
+ columnType: "PgJsonb";
62
+ data: Record<string, import("@headless-lms/core/types").JsonValue>;
63
+ driverParam: unknown;
64
+ notNull: true;
65
+ hasDefault: false;
66
+ isPrimaryKey: false;
67
+ isAutoincrement: false;
68
+ hasRuntimeDefault: false;
69
+ enumValues: undefined;
70
+ baseColumn: never;
71
+ identity: undefined;
72
+ generated: undefined;
73
+ }, {}, {
74
+ $type: Record<string, import("@headless-lms/core/types").JsonValue>;
75
+ }>;
76
+ attempts: import("drizzle-orm/pg-core").PgColumn<{
77
+ name: "attempts";
78
+ tableName: "event_outbox";
79
+ dataType: "number";
80
+ columnType: "PgInteger";
81
+ data: number;
82
+ driverParam: string | number;
83
+ notNull: true;
84
+ hasDefault: true;
85
+ isPrimaryKey: false;
86
+ isAutoincrement: false;
87
+ hasRuntimeDefault: false;
88
+ enumValues: undefined;
89
+ baseColumn: never;
90
+ identity: undefined;
91
+ generated: undefined;
92
+ }, {}, {}>;
93
+ nextAttemptAt: import("drizzle-orm/pg-core").PgColumn<{
94
+ name: "next_attempt_at";
95
+ tableName: "event_outbox";
96
+ dataType: "date";
97
+ columnType: "PgTimestamp";
98
+ data: Date;
99
+ driverParam: string;
100
+ notNull: true;
101
+ hasDefault: true;
102
+ isPrimaryKey: false;
103
+ isAutoincrement: false;
104
+ hasRuntimeDefault: false;
105
+ enumValues: undefined;
106
+ baseColumn: never;
107
+ identity: undefined;
108
+ generated: undefined;
109
+ }, {}, {}>;
110
+ lastError: import("drizzle-orm/pg-core").PgColumn<{
111
+ name: "last_error";
112
+ tableName: "event_outbox";
113
+ dataType: "string";
114
+ columnType: "PgText";
115
+ data: string;
116
+ driverParam: string;
117
+ notNull: false;
118
+ hasDefault: false;
119
+ isPrimaryKey: false;
120
+ isAutoincrement: false;
121
+ hasRuntimeDefault: false;
122
+ enumValues: [string, ...string[]];
123
+ baseColumn: never;
124
+ identity: undefined;
125
+ generated: undefined;
126
+ }, {}, {}>;
127
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
128
+ name: "created_at";
129
+ tableName: "event_outbox";
130
+ dataType: "date";
131
+ columnType: "PgTimestamp";
132
+ data: Date;
133
+ driverParam: string;
134
+ notNull: true;
135
+ hasDefault: true;
136
+ isPrimaryKey: false;
137
+ isAutoincrement: false;
138
+ hasRuntimeDefault: false;
139
+ enumValues: undefined;
140
+ baseColumn: never;
141
+ identity: undefined;
142
+ generated: undefined;
143
+ }, {}, {}>;
144
+ processedAt: import("drizzle-orm/pg-core").PgColumn<{
145
+ name: "processed_at";
146
+ tableName: "event_outbox";
147
+ dataType: "date";
148
+ columnType: "PgTimestamp";
149
+ data: Date;
150
+ driverParam: string;
151
+ notNull: false;
152
+ hasDefault: false;
153
+ isPrimaryKey: false;
154
+ isAutoincrement: false;
155
+ hasRuntimeDefault: false;
156
+ enumValues: undefined;
157
+ baseColumn: never;
158
+ identity: undefined;
159
+ generated: undefined;
160
+ }, {}, {}>;
161
+ };
162
+ dialect: "pg";
163
+ }>;
164
+ //#endregion
165
+ export { eventOutbox };
166
+ //# sourceMappingURL=outbox.d.ts.map
@@ -0,0 +1,19 @@
1
+ import { sql } from "drizzle-orm";
2
+ import { index, integer, jsonb, pgTable, text, timestamp } from "drizzle-orm/pg-core";
3
+ import { genId } from "@headless-lms/core/shared/id";
4
+ //#region src/schema/outbox.ts
5
+ const eventOutbox = pgTable("event_outbox", {
6
+ orgId: text("org_id").notNull(),
7
+ id: text("id").primaryKey().$defaultFn(() => genId("event")),
8
+ type: text("type").notNull(),
9
+ payload: jsonb("payload").$type().notNull(),
10
+ attempts: integer("attempts").notNull().default(0),
11
+ nextAttemptAt: timestamp("next_attempt_at", { withTimezone: true }).notNull().defaultNow(),
12
+ lastError: text("last_error"),
13
+ createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
14
+ processedAt: timestamp("processed_at", { withTimezone: true })
15
+ }, (t) => ({ pendingIdx: index("event_outbox_pending_idx").on(t.id).where(sql`${t.processedAt} is null`) }));
16
+ //#endregion
17
+ export { eventOutbox };
18
+
19
+ //# sourceMappingURL=outbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbox.js","names":[],"sources":["../../src/schema/outbox.ts"],"sourcesContent":["import { index, integer, jsonb, pgTable, text, timestamp } from 'drizzle-orm/pg-core';\nimport { sql } from 'drizzle-orm';\nimport type { EventOutbox } from '@headless-lms/core/schemas';\nimport { genId } from '@headless-lms/core/shared/id';\nimport type { Expect, NoDrift } from './drift.js';\n\nexport const eventOutbox = pgTable(\n 'event_outbox',\n {\n orgId: text('org_id').notNull(),\n id: text('id')\n .primaryKey()\n .$defaultFn(() => genId('event')),\n type: text('type').notNull(),\n payload: jsonb('payload').$type<EventOutbox['payload']>().notNull(),\n attempts: integer('attempts').notNull().default(0),\n nextAttemptAt: timestamp('next_attempt_at', { withTimezone: true }).notNull().defaultNow(),\n lastError: text('last_error'),\n createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\n processedAt: timestamp('processed_at', { withTimezone: true }),\n },\n (t) => ({\n pendingIdx: index('event_outbox_pending_idx')\n .on(t.id)\n .where(sql`${t.processedAt} is null`),\n }),\n);\n\ntype _EventOutboxDrift = Expect<NoDrift<typeof eventOutbox.$inferSelect, EventOutbox>>;\n"],"mappings":";;;;AAMA,MAAa,cAAc,QACzB,gBACA;CACE,OAAO,KAAK,QAAQ,CAAC,CAAC,QAAQ;CAC9B,IAAI,KAAK,IAAI,CAAC,CACX,WAAW,CAAC,CACZ,iBAAiB,MAAM,OAAO,CAAC;CAClC,MAAM,KAAK,MAAM,CAAC,CAAC,QAAQ;CAC3B,SAAS,MAAM,SAAS,CAAC,CAAC,MAA8B,CAAC,CAAC,QAAQ;CAClE,UAAU,QAAQ,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC;CACjD,eAAe,UAAU,mBAAmB,EAAE,cAAc,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,WAAW;CACzF,WAAW,KAAK,YAAY;CAC5B,WAAW,UAAU,cAAc,EAAE,cAAc,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,WAAW;CAChF,aAAa,UAAU,gBAAgB,EAAE,cAAc,KAAK,CAAC;AAC/D,IACC,OAAO,EACN,YAAY,MAAM,0BAA0B,CAAC,CAC1C,GAAG,EAAE,EAAE,CAAC,CACR,MAAM,GAAG,GAAG,EAAE,YAAY,SAAS,EACxC,EACF"}