@goscribe/server 1.2.0 → 1.3.1

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 (126) hide show
  1. package/check-difficulty.cjs +14 -0
  2. package/check-questions.cjs +14 -0
  3. package/db-summary.cjs +22 -0
  4. package/dist/context.d.ts +5 -1
  5. package/dist/lib/activity_human_description.d.ts +13 -0
  6. package/dist/lib/activity_human_description.js +221 -0
  7. package/dist/lib/activity_human_description.test.d.ts +1 -0
  8. package/dist/lib/activity_human_description.test.js +16 -0
  9. package/dist/lib/activity_log_service.d.ts +87 -0
  10. package/dist/lib/activity_log_service.js +276 -0
  11. package/dist/lib/activity_log_service.test.d.ts +1 -0
  12. package/dist/lib/activity_log_service.test.js +27 -0
  13. package/dist/lib/ai-session.d.ts +15 -2
  14. package/dist/lib/ai-session.js +147 -85
  15. package/dist/lib/constants.d.ts +13 -0
  16. package/dist/lib/constants.js +12 -0
  17. package/dist/lib/email.d.ts +11 -0
  18. package/dist/lib/email.js +193 -0
  19. package/dist/lib/env.d.ts +13 -0
  20. package/dist/lib/env.js +16 -0
  21. package/dist/lib/inference.d.ts +4 -1
  22. package/dist/lib/inference.js +3 -3
  23. package/dist/lib/logger.d.ts +4 -4
  24. package/dist/lib/logger.js +30 -8
  25. package/dist/lib/notification-service.d.ts +152 -0
  26. package/dist/lib/notification-service.js +473 -0
  27. package/dist/lib/notification-service.test.d.ts +1 -0
  28. package/dist/lib/notification-service.test.js +87 -0
  29. package/dist/lib/prisma.d.ts +2 -1
  30. package/dist/lib/prisma.js +5 -1
  31. package/dist/lib/pusher.d.ts +23 -0
  32. package/dist/lib/pusher.js +69 -5
  33. package/dist/lib/retry.d.ts +15 -0
  34. package/dist/lib/retry.js +37 -0
  35. package/dist/lib/storage.js +2 -2
  36. package/dist/lib/stripe.d.ts +9 -0
  37. package/dist/lib/stripe.js +36 -0
  38. package/dist/lib/subscription_service.d.ts +37 -0
  39. package/dist/lib/subscription_service.js +654 -0
  40. package/dist/lib/usage_service.d.ts +26 -0
  41. package/dist/lib/usage_service.js +59 -0
  42. package/dist/lib/worksheet-generation.d.ts +91 -0
  43. package/dist/lib/worksheet-generation.js +95 -0
  44. package/dist/lib/worksheet-generation.test.d.ts +1 -0
  45. package/dist/lib/worksheet-generation.test.js +20 -0
  46. package/dist/lib/workspace-access.d.ts +18 -0
  47. package/dist/lib/workspace-access.js +13 -0
  48. package/dist/routers/_app.d.ts +1349 -253
  49. package/dist/routers/_app.js +10 -0
  50. package/dist/routers/admin.d.ts +361 -0
  51. package/dist/routers/admin.js +633 -0
  52. package/dist/routers/annotations.d.ts +219 -0
  53. package/dist/routers/annotations.js +187 -0
  54. package/dist/routers/auth.d.ts +88 -7
  55. package/dist/routers/auth.js +339 -19
  56. package/dist/routers/chat.d.ts +6 -12
  57. package/dist/routers/copilot.d.ts +199 -0
  58. package/dist/routers/copilot.js +571 -0
  59. package/dist/routers/flashcards.d.ts +47 -81
  60. package/dist/routers/flashcards.js +143 -27
  61. package/dist/routers/members.d.ts +36 -7
  62. package/dist/routers/members.js +200 -19
  63. package/dist/routers/notifications.d.ts +99 -0
  64. package/dist/routers/notifications.js +127 -0
  65. package/dist/routers/payment.d.ts +89 -0
  66. package/dist/routers/payment.js +403 -0
  67. package/dist/routers/podcast.d.ts +8 -13
  68. package/dist/routers/podcast.js +54 -31
  69. package/dist/routers/studyguide.d.ts +1 -29
  70. package/dist/routers/studyguide.js +80 -71
  71. package/dist/routers/worksheets.d.ts +105 -38
  72. package/dist/routers/worksheets.js +258 -68
  73. package/dist/routers/workspace.d.ts +139 -60
  74. package/dist/routers/workspace.js +455 -315
  75. package/dist/scripts/purge-deleted-users.d.ts +1 -0
  76. package/dist/scripts/purge-deleted-users.js +149 -0
  77. package/dist/server.js +130 -10
  78. package/dist/services/flashcard-progress.service.d.ts +18 -66
  79. package/dist/services/flashcard-progress.service.js +51 -42
  80. package/dist/trpc.d.ts +20 -21
  81. package/dist/trpc.js +150 -1
  82. package/mcq-test.cjs +36 -0
  83. package/package.json +9 -2
  84. package/prisma/migrations/20260413143206_init/migration.sql +873 -0
  85. package/prisma/schema.prisma +471 -324
  86. package/src/context.ts +4 -1
  87. package/src/lib/activity_human_description.test.ts +28 -0
  88. package/src/lib/activity_human_description.ts +239 -0
  89. package/src/lib/activity_log_service.test.ts +37 -0
  90. package/src/lib/activity_log_service.ts +353 -0
  91. package/src/lib/ai-session.ts +79 -51
  92. package/src/lib/email.ts +213 -29
  93. package/src/lib/env.ts +23 -6
  94. package/src/lib/inference.ts +2 -2
  95. package/src/lib/notification-service.test.ts +106 -0
  96. package/src/lib/notification-service.ts +677 -0
  97. package/src/lib/prisma.ts +6 -1
  98. package/src/lib/pusher.ts +86 -2
  99. package/src/lib/stripe.ts +39 -0
  100. package/src/lib/subscription_service.ts +722 -0
  101. package/src/lib/usage_service.ts +74 -0
  102. package/src/lib/worksheet-generation.test.ts +31 -0
  103. package/src/lib/worksheet-generation.ts +139 -0
  104. package/src/routers/_app.ts +9 -0
  105. package/src/routers/admin.ts +710 -0
  106. package/src/routers/annotations.ts +41 -0
  107. package/src/routers/auth.ts +338 -28
  108. package/src/routers/copilot.ts +719 -0
  109. package/src/routers/flashcards.ts +201 -68
  110. package/src/routers/members.ts +280 -80
  111. package/src/routers/notifications.ts +142 -0
  112. package/src/routers/payment.ts +448 -0
  113. package/src/routers/podcast.ts +112 -83
  114. package/src/routers/studyguide.ts +12 -0
  115. package/src/routers/worksheets.ts +289 -66
  116. package/src/routers/workspace.ts +329 -122
  117. package/src/scripts/purge-deleted-users.ts +167 -0
  118. package/src/server.ts +137 -11
  119. package/src/services/flashcard-progress.service.ts +49 -37
  120. package/src/trpc.ts +184 -5
  121. package/test-generate.js +30 -0
  122. package/test-ratio.cjs +9 -0
  123. package/zod-test.cjs +22 -0
  124. package/prisma/migrations/20250826124819_add_worksheet_difficulty_and_estimated_time/migration.sql +0 -213
  125. package/prisma/migrations/20250826133236_add_worksheet_question_progress/migration.sql +0 -31
  126. package/prisma/seed.mjs +0 -135
@@ -0,0 +1,873 @@
1
+ -- CreateEnum
2
+ CREATE TYPE "ArtifactType" AS ENUM ('STUDY_GUIDE', 'FLASHCARD_SET', 'WORKSHEET', 'MEETING_SUMMARY', 'PODCAST_EPISODE', 'STORAGE');
3
+
4
+ -- CreateEnum
5
+ CREATE TYPE "Difficulty" AS ENUM ('EASY', 'MEDIUM', 'HARD');
6
+
7
+ -- CreateEnum
8
+ CREATE TYPE "QuestionType" AS ENUM ('MULTIPLE_CHOICE', 'TEXT', 'NUMERIC', 'TRUE_FALSE', 'MATCHING', 'FILL_IN_THE_BLANK');
9
+
10
+ -- CreateEnum
11
+ CREATE TYPE "CopilotMessageRole" AS ENUM ('USER', 'ASSISTANT');
12
+
13
+ -- CreateEnum
14
+ CREATE TYPE "NotificationPriority" AS ENUM ('LOW', 'NORMAL', 'HIGH');
15
+
16
+ -- CreateEnum
17
+ CREATE TYPE "InvoiceType" AS ENUM ('SUBSCRIPTION', 'TOPUP');
18
+
19
+ -- CreateEnum
20
+ CREATE TYPE "ActivityLogCategory" AS ENUM ('AUTH', 'WORKSPACE', 'BILLING', 'ADMIN', 'CONTENT', 'SYSTEM');
21
+
22
+ -- CreateEnum
23
+ CREATE TYPE "ActivityLogStatus" AS ENUM ('SUCCESS', 'FAILURE');
24
+
25
+ -- CreateTable
26
+ CREATE TABLE "User" (
27
+ "id" TEXT NOT NULL,
28
+ "name" TEXT,
29
+ "email" TEXT,
30
+ "emailVerified" TIMESTAMP(3),
31
+ "passwordHash" TEXT,
32
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
33
+ "updatedAt" TIMESTAMP(3) NOT NULL,
34
+ "fileAssetId" TEXT,
35
+ "roleId" TEXT,
36
+ "deletedAt" TIMESTAMP(3),
37
+ "stripe_customer_id" TEXT,
38
+
39
+ CONSTRAINT "User_pkey" PRIMARY KEY ("id")
40
+ );
41
+
42
+ -- CreateTable
43
+ CREATE TABLE "PasswordResetToken" (
44
+ "id" TEXT NOT NULL,
45
+ "userId" TEXT NOT NULL,
46
+ "tokenHash" TEXT NOT NULL,
47
+ "expiresAt" TIMESTAMP(3) NOT NULL,
48
+ "usedAt" TIMESTAMP(3),
49
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
50
+
51
+ CONSTRAINT "PasswordResetToken_pkey" PRIMARY KEY ("id")
52
+ );
53
+
54
+ -- CreateTable
55
+ CREATE TABLE "Role" (
56
+ "id" TEXT NOT NULL,
57
+ "name" TEXT NOT NULL,
58
+
59
+ CONSTRAINT "Role_pkey" PRIMARY KEY ("id")
60
+ );
61
+
62
+ -- CreateTable
63
+ CREATE TABLE "Notification" (
64
+ "id" TEXT NOT NULL,
65
+ "userId" TEXT NOT NULL,
66
+ "actorUserId" TEXT,
67
+ "workspaceId" TEXT,
68
+ "type" TEXT NOT NULL,
69
+ "title" TEXT NOT NULL,
70
+ "body" TEXT NOT NULL,
71
+ "content" TEXT,
72
+ "actionUrl" TEXT,
73
+ "metadata" JSONB,
74
+ "priority" "NotificationPriority" NOT NULL DEFAULT 'NORMAL',
75
+ "sourceId" TEXT,
76
+ "read" BOOLEAN NOT NULL DEFAULT false,
77
+ "readAt" TIMESTAMP(3),
78
+ "deliveredAt" TIMESTAMP(3),
79
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
80
+ "updatedAt" TIMESTAMP(3) NOT NULL,
81
+
82
+ CONSTRAINT "Notification_pkey" PRIMARY KEY ("id")
83
+ );
84
+
85
+ -- CreateTable
86
+ CREATE TABLE "Session" (
87
+ "id" TEXT NOT NULL,
88
+ "userId" TEXT NOT NULL,
89
+ "expires" TIMESTAMP(3) NOT NULL,
90
+
91
+ CONSTRAINT "Session_pkey" PRIMARY KEY ("id")
92
+ );
93
+
94
+ -- CreateTable
95
+ CREATE TABLE "VerificationToken" (
96
+ "identifier" TEXT NOT NULL,
97
+ "token" TEXT NOT NULL,
98
+ "expires" TIMESTAMP(3) NOT NULL
99
+ );
100
+
101
+ -- CreateTable
102
+ CREATE TABLE "Folder" (
103
+ "id" TEXT NOT NULL,
104
+ "name" TEXT NOT NULL,
105
+ "ownerId" TEXT NOT NULL,
106
+ "parentId" TEXT,
107
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
108
+ "updatedAt" TIMESTAMP(3) NOT NULL,
109
+ "color" TEXT NOT NULL DEFAULT '#9D00FF',
110
+ "markerColor" TEXT,
111
+
112
+ CONSTRAINT "Folder_pkey" PRIMARY KEY ("id")
113
+ );
114
+
115
+ -- CreateTable
116
+ CREATE TABLE "Workspace" (
117
+ "id" TEXT NOT NULL,
118
+ "title" TEXT NOT NULL,
119
+ "description" TEXT,
120
+ "ownerId" TEXT NOT NULL,
121
+ "icon" TEXT NOT NULL DEFAULT '📄',
122
+ "color" TEXT NOT NULL DEFAULT '#9D00FF',
123
+ "markerColor" TEXT,
124
+ "folderId" TEXT,
125
+ "fileBeingAnalyzed" BOOLEAN NOT NULL DEFAULT false,
126
+ "analysisProgress" JSONB,
127
+ "needsAnalysis" BOOLEAN NOT NULL DEFAULT false,
128
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
129
+ "updatedAt" TIMESTAMP(3) NOT NULL,
130
+
131
+ CONSTRAINT "Workspace_pkey" PRIMARY KEY ("id")
132
+ );
133
+
134
+ -- CreateTable
135
+ CREATE TABLE "Channel" (
136
+ "id" TEXT NOT NULL,
137
+ "workspaceId" TEXT NOT NULL,
138
+ "name" TEXT NOT NULL,
139
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
140
+
141
+ CONSTRAINT "Channel_pkey" PRIMARY KEY ("id")
142
+ );
143
+
144
+ -- CreateTable
145
+ CREATE TABLE "Chat" (
146
+ "id" TEXT NOT NULL,
147
+ "channelId" TEXT NOT NULL,
148
+ "userId" TEXT,
149
+ "message" TEXT NOT NULL,
150
+ "updatedAt" TIMESTAMP(3) NOT NULL,
151
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
152
+
153
+ CONSTRAINT "Chat_pkey" PRIMARY KEY ("id")
154
+ );
155
+
156
+ -- CreateTable
157
+ CREATE TABLE "CopilotConversation" (
158
+ "id" TEXT NOT NULL,
159
+ "workspaceId" TEXT NOT NULL,
160
+ "userId" TEXT NOT NULL,
161
+ "title" TEXT NOT NULL DEFAULT 'New Chat',
162
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
163
+ "updatedAt" TIMESTAMP(3) NOT NULL,
164
+
165
+ CONSTRAINT "CopilotConversation_pkey" PRIMARY KEY ("id")
166
+ );
167
+
168
+ -- CreateTable
169
+ CREATE TABLE "CopilotMessage" (
170
+ "id" TEXT NOT NULL,
171
+ "conversationId" TEXT NOT NULL,
172
+ "role" "CopilotMessageRole" NOT NULL,
173
+ "content" TEXT NOT NULL,
174
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
175
+
176
+ CONSTRAINT "CopilotMessage_pkey" PRIMARY KEY ("id")
177
+ );
178
+
179
+ -- CreateTable
180
+ CREATE TABLE "FileAsset" (
181
+ "id" TEXT NOT NULL,
182
+ "workspaceId" TEXT,
183
+ "userId" TEXT,
184
+ "name" TEXT NOT NULL,
185
+ "mimeType" TEXT NOT NULL,
186
+ "size" INTEGER NOT NULL,
187
+ "bucket" TEXT,
188
+ "objectKey" TEXT,
189
+ "url" TEXT,
190
+ "checksum" TEXT,
191
+ "meta" JSONB,
192
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
193
+ "aiTranscription" JSONB DEFAULT '{}',
194
+
195
+ CONSTRAINT "FileAsset_pkey" PRIMARY KEY ("id")
196
+ );
197
+
198
+ -- CreateTable
199
+ CREATE TABLE "Artifact" (
200
+ "id" TEXT NOT NULL,
201
+ "workspaceId" TEXT NOT NULL,
202
+ "type" "ArtifactType" NOT NULL,
203
+ "title" TEXT NOT NULL,
204
+ "isArchived" BOOLEAN NOT NULL DEFAULT false,
205
+ "difficulty" "Difficulty",
206
+ "estimatedTime" TEXT,
207
+ "createdById" TEXT,
208
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
209
+ "updatedAt" TIMESTAMP(3) NOT NULL,
210
+ "description" TEXT,
211
+ "generating" BOOLEAN NOT NULL DEFAULT false,
212
+ "generatingMetadata" JSONB,
213
+ "worksheetConfig" JSONB,
214
+ "imageObjectKey" TEXT,
215
+
216
+ CONSTRAINT "Artifact_pkey" PRIMARY KEY ("id")
217
+ );
218
+
219
+ -- CreateTable
220
+ CREATE TABLE "ArtifactVersion" (
221
+ "id" TEXT NOT NULL,
222
+ "artifactId" TEXT NOT NULL,
223
+ "content" TEXT NOT NULL,
224
+ "data" JSONB,
225
+ "version" INTEGER NOT NULL,
226
+ "createdById" TEXT,
227
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
228
+
229
+ CONSTRAINT "ArtifactVersion_pkey" PRIMARY KEY ("id")
230
+ );
231
+
232
+ -- CreateTable
233
+ CREATE TABLE "StudyGuideHighlight" (
234
+ "id" TEXT NOT NULL,
235
+ "artifactVersionId" TEXT NOT NULL,
236
+ "userId" TEXT NOT NULL,
237
+ "startOffset" INTEGER NOT NULL,
238
+ "endOffset" INTEGER NOT NULL,
239
+ "selectedText" TEXT NOT NULL,
240
+ "color" TEXT NOT NULL DEFAULT '#FBBF24',
241
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
242
+ "updatedAt" TIMESTAMP(3) NOT NULL,
243
+
244
+ CONSTRAINT "StudyGuideHighlight_pkey" PRIMARY KEY ("id")
245
+ );
246
+
247
+ -- CreateTable
248
+ CREATE TABLE "StudyGuideComment" (
249
+ "id" TEXT NOT NULL,
250
+ "highlightId" TEXT NOT NULL,
251
+ "userId" TEXT NOT NULL,
252
+ "content" TEXT NOT NULL,
253
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
254
+ "updatedAt" TIMESTAMP(3) NOT NULL,
255
+
256
+ CONSTRAINT "StudyGuideComment_pkey" PRIMARY KEY ("id")
257
+ );
258
+
259
+ -- CreateTable
260
+ CREATE TABLE "Flashcard" (
261
+ "id" TEXT NOT NULL,
262
+ "artifactId" TEXT NOT NULL,
263
+ "front" TEXT NOT NULL,
264
+ "back" TEXT NOT NULL,
265
+ "tags" TEXT[],
266
+ "order" INTEGER NOT NULL DEFAULT 0,
267
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
268
+ "acceptedAnswers" TEXT[] DEFAULT ARRAY[]::TEXT[],
269
+
270
+ CONSTRAINT "Flashcard_pkey" PRIMARY KEY ("id")
271
+ );
272
+
273
+ -- CreateTable
274
+ CREATE TABLE "FlashcardProgress" (
275
+ "id" TEXT NOT NULL,
276
+ "userId" TEXT NOT NULL,
277
+ "flashcardId" TEXT NOT NULL,
278
+ "timesStudied" INTEGER NOT NULL DEFAULT 0,
279
+ "timesCorrect" INTEGER NOT NULL DEFAULT 0,
280
+ "timesIncorrect" INTEGER NOT NULL DEFAULT 0,
281
+ "timesIncorrectConsecutive" INTEGER NOT NULL DEFAULT 0,
282
+ "easeFactor" DOUBLE PRECISION NOT NULL DEFAULT 2.5,
283
+ "interval" INTEGER NOT NULL DEFAULT 0,
284
+ "repetitions" INTEGER NOT NULL DEFAULT 0,
285
+ "masteryLevel" INTEGER NOT NULL DEFAULT 0,
286
+ "lastStudiedAt" TIMESTAMP(3),
287
+ "nextReviewAt" TIMESTAMP(3),
288
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
289
+ "updatedAt" TIMESTAMP(3) NOT NULL,
290
+
291
+ CONSTRAINT "FlashcardProgress_pkey" PRIMARY KEY ("id")
292
+ );
293
+
294
+ -- CreateTable
295
+ CREATE TABLE "WorksheetQuestion" (
296
+ "id" TEXT NOT NULL,
297
+ "artifactId" TEXT NOT NULL,
298
+ "prompt" TEXT NOT NULL,
299
+ "answer" TEXT,
300
+ "type" "QuestionType" NOT NULL DEFAULT 'TEXT',
301
+ "difficulty" "Difficulty" NOT NULL DEFAULT 'MEDIUM',
302
+ "order" INTEGER NOT NULL DEFAULT 0,
303
+ "meta" JSONB,
304
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
305
+
306
+ CONSTRAINT "WorksheetQuestion_pkey" PRIMARY KEY ("id")
307
+ );
308
+
309
+ -- CreateTable
310
+ CREATE TABLE "WorksheetQuestionProgress" (
311
+ "id" TEXT NOT NULL,
312
+ "worksheetQuestionId" TEXT NOT NULL,
313
+ "userId" TEXT NOT NULL,
314
+ "userAnswer" TEXT,
315
+ "completedAt" TIMESTAMP(3),
316
+ "attempts" INTEGER NOT NULL DEFAULT 0,
317
+ "timeSpentSec" INTEGER,
318
+ "meta" JSONB,
319
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
320
+ "updatedAt" TIMESTAMP(3) NOT NULL,
321
+ "correct" BOOLEAN DEFAULT false,
322
+ "modified" BOOLEAN NOT NULL DEFAULT false,
323
+
324
+ CONSTRAINT "WorksheetQuestionProgress_pkey" PRIMARY KEY ("id")
325
+ );
326
+
327
+ -- CreateTable
328
+ CREATE TABLE "WorksheetPreset" (
329
+ "id" TEXT NOT NULL,
330
+ "userId" TEXT,
331
+ "workspaceId" TEXT,
332
+ "name" TEXT NOT NULL,
333
+ "isSystem" BOOLEAN NOT NULL DEFAULT false,
334
+ "config" JSONB NOT NULL,
335
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
336
+ "updatedAt" TIMESTAMP(3) NOT NULL,
337
+
338
+ CONSTRAINT "WorksheetPreset_pkey" PRIMARY KEY ("id")
339
+ );
340
+
341
+ -- CreateTable
342
+ CREATE TABLE "WorkspaceMember" (
343
+ "id" TEXT NOT NULL,
344
+ "workspaceId" TEXT NOT NULL,
345
+ "userId" TEXT NOT NULL,
346
+ "role" TEXT NOT NULL DEFAULT 'member',
347
+ "joinedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
348
+ "updatedAt" TIMESTAMP(3) NOT NULL,
349
+
350
+ CONSTRAINT "WorkspaceMember_pkey" PRIMARY KEY ("id")
351
+ );
352
+
353
+ -- CreateTable
354
+ CREATE TABLE "WorkspaceInvitation" (
355
+ "id" TEXT NOT NULL,
356
+ "workspaceId" TEXT NOT NULL,
357
+ "email" TEXT NOT NULL,
358
+ "role" TEXT NOT NULL DEFAULT 'member',
359
+ "token" TEXT NOT NULL,
360
+ "invitedById" TEXT NOT NULL,
361
+ "acceptedAt" TIMESTAMP(3),
362
+ "expiresAt" TIMESTAMP(3) NOT NULL DEFAULT (now() + '7 days'::interval),
363
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
364
+ "updatedAt" TIMESTAMP(3) NOT NULL,
365
+
366
+ CONSTRAINT "WorkspaceInvitation_pkey" PRIMARY KEY ("id")
367
+ );
368
+
369
+ -- CreateTable
370
+ CREATE TABLE "PodcastSegment" (
371
+ "id" TEXT NOT NULL,
372
+ "artifactId" TEXT NOT NULL,
373
+ "title" TEXT NOT NULL,
374
+ "content" TEXT NOT NULL,
375
+ "startTime" INTEGER NOT NULL,
376
+ "duration" INTEGER NOT NULL,
377
+ "order" INTEGER NOT NULL,
378
+ "objectKey" TEXT,
379
+ "audioUrl" TEXT,
380
+ "keyPoints" TEXT[],
381
+ "meta" JSONB,
382
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
383
+ "updatedAt" TIMESTAMP(3) NOT NULL,
384
+ "generating" BOOLEAN NOT NULL DEFAULT false,
385
+ "generatingMetadata" JSONB,
386
+
387
+ CONSTRAINT "PodcastSegment_pkey" PRIMARY KEY ("id")
388
+ );
389
+
390
+ -- CreateTable
391
+ CREATE TABLE "Invoice" (
392
+ "id" TEXT NOT NULL,
393
+ "userId" TEXT NOT NULL,
394
+ "subscriptionId" TEXT,
395
+ "stripeInvoiceId" TEXT NOT NULL,
396
+ "amountPaid" INTEGER NOT NULL,
397
+ "status" TEXT NOT NULL,
398
+ "invoicePdfUrl" TEXT,
399
+ "hostedInvoiceUrl" TEXT,
400
+ "paidAt" TIMESTAMP(3),
401
+ "type" "InvoiceType" NOT NULL DEFAULT 'SUBSCRIPTION',
402
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
403
+
404
+ CONSTRAINT "Invoice_pkey" PRIMARY KEY ("id")
405
+ );
406
+
407
+ -- CreateTable
408
+ CREATE TABLE "Plan" (
409
+ "id" TEXT NOT NULL,
410
+ "name" TEXT NOT NULL,
411
+ "description" TEXT,
412
+ "type" TEXT NOT NULL,
413
+ "price" INTEGER NOT NULL,
414
+ "stripePriceId" TEXT NOT NULL,
415
+ "interval" TEXT,
416
+ "active" BOOLEAN NOT NULL DEFAULT true,
417
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
418
+
419
+ CONSTRAINT "Plan_pkey" PRIMARY KEY ("id")
420
+ );
421
+
422
+ -- CreateTable
423
+ CREATE TABLE "PlanLimit" (
424
+ "id" TEXT NOT NULL,
425
+ "planId" TEXT NOT NULL,
426
+ "maxStorageBytes" BIGINT NOT NULL DEFAULT 0,
427
+ "maxWorksheets" INTEGER NOT NULL DEFAULT 0,
428
+ "maxFlashcards" INTEGER NOT NULL DEFAULT 0,
429
+ "maxPodcasts" INTEGER NOT NULL DEFAULT 0,
430
+ "maxStudyGuides" INTEGER NOT NULL DEFAULT 0,
431
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
432
+ "updatedAt" TIMESTAMP(3) NOT NULL,
433
+
434
+ CONSTRAINT "PlanLimit_pkey" PRIMARY KEY ("id")
435
+ );
436
+
437
+ -- CreateTable
438
+ CREATE TABLE "Subscription" (
439
+ "id" TEXT NOT NULL,
440
+ "userId" TEXT NOT NULL,
441
+ "planId" TEXT NOT NULL,
442
+ "stripeSubscriptionId" TEXT NOT NULL,
443
+ "stripeCustomerId" TEXT,
444
+ "status" TEXT NOT NULL,
445
+ "currentPeriodStart" TIMESTAMP(3) NOT NULL,
446
+ "currentPeriodEnd" TIMESTAMP(3) NOT NULL,
447
+ "cancelAt" TIMESTAMP(3),
448
+ "canceledAt" TIMESTAMP(3),
449
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
450
+
451
+ CONSTRAINT "Subscription_pkey" PRIMARY KEY ("id")
452
+ );
453
+
454
+ -- CreateTable
455
+ CREATE TABLE "ResourcePrice" (
456
+ "id" TEXT NOT NULL,
457
+ "resourceType" "ArtifactType" NOT NULL,
458
+ "priceCents" INTEGER NOT NULL,
459
+ "updatedAt" TIMESTAMP(3) NOT NULL,
460
+
461
+ CONSTRAINT "ResourcePrice_pkey" PRIMARY KEY ("id")
462
+ );
463
+
464
+ -- CreateTable
465
+ CREATE TABLE "UserCredit" (
466
+ "id" TEXT NOT NULL,
467
+ "userId" TEXT NOT NULL,
468
+ "resourceType" "ArtifactType" NOT NULL,
469
+ "amount" INTEGER NOT NULL DEFAULT 1,
470
+ "stripeSessionId" TEXT NOT NULL,
471
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
472
+
473
+ CONSTRAINT "UserCredit_pkey" PRIMARY KEY ("id")
474
+ );
475
+
476
+ -- CreateTable
477
+ CREATE TABLE "IdempotencyRecord" (
478
+ "id" TEXT NOT NULL,
479
+ "userId" TEXT NOT NULL,
480
+ "planId" TEXT,
481
+ "resourceType" "ArtifactType",
482
+ "stripeSessionId" TEXT,
483
+ "status" TEXT NOT NULL DEFAULT 'pending',
484
+ "activeLockKey" TEXT,
485
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
486
+ "updatedAt" TIMESTAMP(3) NOT NULL,
487
+
488
+ CONSTRAINT "IdempotencyRecord_pkey" PRIMARY KEY ("id")
489
+ );
490
+
491
+ -- CreateTable
492
+ CREATE TABLE "StripeEvent" (
493
+ "id" TEXT NOT NULL,
494
+ "stripeEventId" TEXT NOT NULL,
495
+ "type" TEXT NOT NULL,
496
+ "status" TEXT NOT NULL DEFAULT 'pending',
497
+ "error" TEXT,
498
+ "processedAt" TIMESTAMP(3),
499
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
500
+ "updatedAt" TIMESTAMP(3) NOT NULL,
501
+
502
+ CONSTRAINT "StripeEvent_pkey" PRIMARY KEY ("id")
503
+ );
504
+
505
+ -- CreateTable
506
+ CREATE TABLE "ActivityLog" (
507
+ "id" TEXT NOT NULL,
508
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
509
+ "actorUserId" TEXT,
510
+ "actorEmailSnapshot" TEXT,
511
+ "action" TEXT NOT NULL,
512
+ "category" "ActivityLogCategory" NOT NULL,
513
+ "resourceType" TEXT,
514
+ "resourceId" TEXT,
515
+ "workspaceId" TEXT,
516
+ "trpcPath" TEXT,
517
+ "httpMethod" TEXT,
518
+ "status" "ActivityLogStatus" NOT NULL,
519
+ "errorCode" TEXT,
520
+ "durationMs" INTEGER NOT NULL,
521
+ "ipAddress" TEXT,
522
+ "userAgent" TEXT,
523
+ "metadata" JSONB,
524
+
525
+ CONSTRAINT "ActivityLog_pkey" PRIMARY KEY ("id")
526
+ );
527
+
528
+ -- CreateTable
529
+ CREATE TABLE "_WorkspaceSharedWith" (
530
+ "A" TEXT NOT NULL,
531
+ "B" TEXT NOT NULL,
532
+
533
+ CONSTRAINT "_WorkspaceSharedWith_AB_pkey" PRIMARY KEY ("A","B")
534
+ );
535
+
536
+ -- CreateIndex
537
+ CREATE UNIQUE INDEX "User_email_key" ON "User"("email");
538
+
539
+ -- CreateIndex
540
+ CREATE UNIQUE INDEX "User_stripe_customer_id_key" ON "User"("stripe_customer_id");
541
+
542
+ -- CreateIndex
543
+ CREATE UNIQUE INDEX "PasswordResetToken_tokenHash_key" ON "PasswordResetToken"("tokenHash");
544
+
545
+ -- CreateIndex
546
+ CREATE INDEX "PasswordResetToken_userId_idx" ON "PasswordResetToken"("userId");
547
+
548
+ -- CreateIndex
549
+ CREATE UNIQUE INDEX "Role_name_key" ON "Role"("name");
550
+
551
+ -- CreateIndex
552
+ CREATE INDEX "Notification_userId_read_createdAt_idx" ON "Notification"("userId", "read", "createdAt" DESC);
553
+
554
+ -- CreateIndex
555
+ CREATE INDEX "Notification_userId_createdAt_idx" ON "Notification"("userId", "createdAt" DESC);
556
+
557
+ -- CreateIndex
558
+ CREATE INDEX "Notification_type_createdAt_idx" ON "Notification"("type", "createdAt" DESC);
559
+
560
+ -- CreateIndex
561
+ CREATE INDEX "Notification_workspaceId_idx" ON "Notification"("workspaceId");
562
+
563
+ -- CreateIndex
564
+ CREATE UNIQUE INDEX "Notification_userId_type_sourceId_key" ON "Notification"("userId", "type", "sourceId");
565
+
566
+ -- CreateIndex
567
+ CREATE UNIQUE INDEX "VerificationToken_token_key" ON "VerificationToken"("token");
568
+
569
+ -- CreateIndex
570
+ CREATE UNIQUE INDEX "VerificationToken_identifier_token_key" ON "VerificationToken"("identifier", "token");
571
+
572
+ -- CreateIndex
573
+ CREATE INDEX "Folder_ownerId_parentId_idx" ON "Folder"("ownerId", "parentId");
574
+
575
+ -- CreateIndex
576
+ CREATE INDEX "Workspace_ownerId_folderId_idx" ON "Workspace"("ownerId", "folderId");
577
+
578
+ -- CreateIndex
579
+ CREATE INDEX "Channel_workspaceId_idx" ON "Channel"("workspaceId");
580
+
581
+ -- CreateIndex
582
+ CREATE INDEX "Chat_channelId_createdAt_idx" ON "Chat"("channelId", "createdAt");
583
+
584
+ -- CreateIndex
585
+ CREATE INDEX "CopilotConversation_workspaceId_userId_updatedAt_idx" ON "CopilotConversation"("workspaceId", "userId", "updatedAt");
586
+
587
+ -- CreateIndex
588
+ CREATE INDEX "CopilotMessage_conversationId_createdAt_idx" ON "CopilotMessage"("conversationId", "createdAt");
589
+
590
+ -- CreateIndex
591
+ CREATE INDEX "FileAsset_workspaceId_idx" ON "FileAsset"("workspaceId");
592
+
593
+ -- CreateIndex
594
+ CREATE INDEX "FileAsset_userId_createdAt_idx" ON "FileAsset"("userId", "createdAt");
595
+
596
+ -- CreateIndex
597
+ CREATE INDEX "Artifact_workspaceId_type_idx" ON "Artifact"("workspaceId", "type");
598
+
599
+ -- CreateIndex
600
+ CREATE INDEX "ArtifactVersion_artifactId_idx" ON "ArtifactVersion"("artifactId");
601
+
602
+ -- CreateIndex
603
+ CREATE UNIQUE INDEX "ArtifactVersion_artifactId_version_key" ON "ArtifactVersion"("artifactId", "version");
604
+
605
+ -- CreateIndex
606
+ CREATE INDEX "StudyGuideHighlight_artifactVersionId_userId_idx" ON "StudyGuideHighlight"("artifactVersionId", "userId");
607
+
608
+ -- CreateIndex
609
+ CREATE INDEX "StudyGuideComment_highlightId_idx" ON "StudyGuideComment"("highlightId");
610
+
611
+ -- CreateIndex
612
+ CREATE INDEX "Flashcard_artifactId_idx" ON "Flashcard"("artifactId");
613
+
614
+ -- CreateIndex
615
+ CREATE INDEX "FlashcardProgress_userId_nextReviewAt_idx" ON "FlashcardProgress"("userId", "nextReviewAt");
616
+
617
+ -- CreateIndex
618
+ CREATE INDEX "FlashcardProgress_flashcardId_idx" ON "FlashcardProgress"("flashcardId");
619
+
620
+ -- CreateIndex
621
+ CREATE UNIQUE INDEX "FlashcardProgress_userId_flashcardId_key" ON "FlashcardProgress"("userId", "flashcardId");
622
+
623
+ -- CreateIndex
624
+ CREATE INDEX "WorksheetQuestion_artifactId_idx" ON "WorksheetQuestion"("artifactId");
625
+
626
+ -- CreateIndex
627
+ CREATE INDEX "WorksheetQuestionProgress_userId_idx" ON "WorksheetQuestionProgress"("userId");
628
+
629
+ -- CreateIndex
630
+ CREATE UNIQUE INDEX "WorksheetQuestionProgress_worksheetQuestionId_userId_key" ON "WorksheetQuestionProgress"("worksheetQuestionId", "userId");
631
+
632
+ -- CreateIndex
633
+ CREATE INDEX "WorksheetPreset_userId_workspaceId_idx" ON "WorksheetPreset"("userId", "workspaceId");
634
+
635
+ -- CreateIndex
636
+ CREATE INDEX "WorksheetPreset_isSystem_idx" ON "WorksheetPreset"("isSystem");
637
+
638
+ -- CreateIndex
639
+ CREATE INDEX "WorkspaceMember_workspaceId_idx" ON "WorkspaceMember"("workspaceId");
640
+
641
+ -- CreateIndex
642
+ CREATE INDEX "WorkspaceMember_userId_idx" ON "WorkspaceMember"("userId");
643
+
644
+ -- CreateIndex
645
+ CREATE UNIQUE INDEX "WorkspaceMember_workspaceId_userId_key" ON "WorkspaceMember"("workspaceId", "userId");
646
+
647
+ -- CreateIndex
648
+ CREATE UNIQUE INDEX "WorkspaceInvitation_token_key" ON "WorkspaceInvitation"("token");
649
+
650
+ -- CreateIndex
651
+ CREATE INDEX "WorkspaceInvitation_token_idx" ON "WorkspaceInvitation"("token");
652
+
653
+ -- CreateIndex
654
+ CREATE INDEX "WorkspaceInvitation_workspaceId_idx" ON "WorkspaceInvitation"("workspaceId");
655
+
656
+ -- CreateIndex
657
+ CREATE UNIQUE INDEX "WorkspaceInvitation_workspaceId_email_key" ON "WorkspaceInvitation"("workspaceId", "email");
658
+
659
+ -- CreateIndex
660
+ CREATE INDEX "PodcastSegment_artifactId_order_idx" ON "PodcastSegment"("artifactId", "order");
661
+
662
+ -- CreateIndex
663
+ CREATE INDEX "PodcastSegment_artifactId_startTime_idx" ON "PodcastSegment"("artifactId", "startTime");
664
+
665
+ -- CreateIndex
666
+ CREATE UNIQUE INDEX "Invoice_stripeInvoiceId_key" ON "Invoice"("stripeInvoiceId");
667
+
668
+ -- CreateIndex
669
+ CREATE INDEX "Invoice_userId_idx" ON "Invoice"("userId");
670
+
671
+ -- CreateIndex
672
+ CREATE UNIQUE INDEX "PlanLimit_planId_key" ON "PlanLimit"("planId");
673
+
674
+ -- CreateIndex
675
+ CREATE UNIQUE INDEX "Subscription_stripeSubscriptionId_key" ON "Subscription"("stripeSubscriptionId");
676
+
677
+ -- CreateIndex
678
+ CREATE INDEX "Subscription_userId_idx" ON "Subscription"("userId");
679
+
680
+ -- CreateIndex
681
+ CREATE INDEX "Subscription_planId_idx" ON "Subscription"("planId");
682
+
683
+ -- CreateIndex
684
+ CREATE UNIQUE INDEX "ResourcePrice_resourceType_key" ON "ResourcePrice"("resourceType");
685
+
686
+ -- CreateIndex
687
+ CREATE UNIQUE INDEX "UserCredit_stripeSessionId_key" ON "UserCredit"("stripeSessionId");
688
+
689
+ -- CreateIndex
690
+ CREATE INDEX "UserCredit_userId_idx" ON "UserCredit"("userId");
691
+
692
+ -- CreateIndex
693
+ CREATE UNIQUE INDEX "IdempotencyRecord_activeLockKey_key" ON "IdempotencyRecord"("activeLockKey");
694
+
695
+ -- CreateIndex
696
+ CREATE INDEX "IdempotencyRecord_userId_status_idx" ON "IdempotencyRecord"("userId", "status");
697
+
698
+ -- CreateIndex
699
+ CREATE INDEX "IdempotencyRecord_activeLockKey_idx" ON "IdempotencyRecord"("activeLockKey");
700
+
701
+ -- CreateIndex
702
+ CREATE UNIQUE INDEX "StripeEvent_stripeEventId_key" ON "StripeEvent"("stripeEventId");
703
+
704
+ -- CreateIndex
705
+ CREATE INDEX "StripeEvent_stripeEventId_idx" ON "StripeEvent"("stripeEventId");
706
+
707
+ -- CreateIndex
708
+ CREATE INDEX "ActivityLog_createdAt_idx" ON "ActivityLog"("createdAt" DESC);
709
+
710
+ -- CreateIndex
711
+ CREATE INDEX "ActivityLog_actorUserId_createdAt_idx" ON "ActivityLog"("actorUserId", "createdAt" DESC);
712
+
713
+ -- CreateIndex
714
+ CREATE INDEX "ActivityLog_workspaceId_createdAt_idx" ON "ActivityLog"("workspaceId", "createdAt" DESC);
715
+
716
+ -- CreateIndex
717
+ CREATE INDEX "ActivityLog_category_createdAt_idx" ON "ActivityLog"("category", "createdAt" DESC);
718
+
719
+ -- CreateIndex
720
+ CREATE INDEX "_WorkspaceSharedWith_B_index" ON "_WorkspaceSharedWith"("B");
721
+
722
+ -- AddForeignKey
723
+ ALTER TABLE "User" ADD CONSTRAINT "User_fileAssetId_fkey" FOREIGN KEY ("fileAssetId") REFERENCES "FileAsset"("id") ON DELETE SET NULL ON UPDATE CASCADE;
724
+
725
+ -- AddForeignKey
726
+ ALTER TABLE "User" ADD CONSTRAINT "User_roleId_fkey" FOREIGN KEY ("roleId") REFERENCES "Role"("id") ON DELETE SET NULL ON UPDATE CASCADE;
727
+
728
+ -- AddForeignKey
729
+ ALTER TABLE "PasswordResetToken" ADD CONSTRAINT "PasswordResetToken_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
730
+
731
+ -- AddForeignKey
732
+ ALTER TABLE "Notification" ADD CONSTRAINT "Notification_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
733
+
734
+ -- AddForeignKey
735
+ ALTER TABLE "Notification" ADD CONSTRAINT "Notification_actorUserId_fkey" FOREIGN KEY ("actorUserId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
736
+
737
+ -- AddForeignKey
738
+ ALTER TABLE "Notification" ADD CONSTRAINT "Notification_workspaceId_fkey" FOREIGN KEY ("workspaceId") REFERENCES "Workspace"("id") ON DELETE SET NULL ON UPDATE CASCADE;
739
+
740
+ -- AddForeignKey
741
+ ALTER TABLE "Session" ADD CONSTRAINT "Session_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
742
+
743
+ -- AddForeignKey
744
+ ALTER TABLE "Folder" ADD CONSTRAINT "Folder_ownerId_fkey" FOREIGN KEY ("ownerId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
745
+
746
+ -- AddForeignKey
747
+ ALTER TABLE "Folder" ADD CONSTRAINT "Folder_parentId_fkey" FOREIGN KEY ("parentId") REFERENCES "Folder"("id") ON DELETE CASCADE ON UPDATE CASCADE;
748
+
749
+ -- AddForeignKey
750
+ ALTER TABLE "Workspace" ADD CONSTRAINT "Workspace_ownerId_fkey" FOREIGN KEY ("ownerId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
751
+
752
+ -- AddForeignKey
753
+ ALTER TABLE "Workspace" ADD CONSTRAINT "Workspace_folderId_fkey" FOREIGN KEY ("folderId") REFERENCES "Folder"("id") ON DELETE SET NULL ON UPDATE CASCADE;
754
+
755
+ -- AddForeignKey
756
+ ALTER TABLE "Channel" ADD CONSTRAINT "Channel_workspaceId_fkey" FOREIGN KEY ("workspaceId") REFERENCES "Workspace"("id") ON DELETE CASCADE ON UPDATE CASCADE;
757
+
758
+ -- AddForeignKey
759
+ ALTER TABLE "Chat" ADD CONSTRAINT "Chat_channelId_fkey" FOREIGN KEY ("channelId") REFERENCES "Channel"("id") ON DELETE CASCADE ON UPDATE CASCADE;
760
+
761
+ -- AddForeignKey
762
+ ALTER TABLE "Chat" ADD CONSTRAINT "Chat_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
763
+
764
+ -- AddForeignKey
765
+ ALTER TABLE "CopilotConversation" ADD CONSTRAINT "CopilotConversation_workspaceId_fkey" FOREIGN KEY ("workspaceId") REFERENCES "Workspace"("id") ON DELETE CASCADE ON UPDATE CASCADE;
766
+
767
+ -- AddForeignKey
768
+ ALTER TABLE "CopilotConversation" ADD CONSTRAINT "CopilotConversation_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
769
+
770
+ -- AddForeignKey
771
+ ALTER TABLE "CopilotMessage" ADD CONSTRAINT "CopilotMessage_conversationId_fkey" FOREIGN KEY ("conversationId") REFERENCES "CopilotConversation"("id") ON DELETE CASCADE ON UPDATE CASCADE;
772
+
773
+ -- AddForeignKey
774
+ ALTER TABLE "FileAsset" ADD CONSTRAINT "FileAsset_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
775
+
776
+ -- AddForeignKey
777
+ ALTER TABLE "FileAsset" ADD CONSTRAINT "FileAsset_workspaceId_fkey" FOREIGN KEY ("workspaceId") REFERENCES "Workspace"("id") ON DELETE CASCADE ON UPDATE CASCADE;
778
+
779
+ -- AddForeignKey
780
+ ALTER TABLE "Artifact" ADD CONSTRAINT "Artifact_createdById_fkey" FOREIGN KEY ("createdById") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
781
+
782
+ -- AddForeignKey
783
+ ALTER TABLE "Artifact" ADD CONSTRAINT "Artifact_workspaceId_fkey" FOREIGN KEY ("workspaceId") REFERENCES "Workspace"("id") ON DELETE CASCADE ON UPDATE CASCADE;
784
+
785
+ -- AddForeignKey
786
+ ALTER TABLE "ArtifactVersion" ADD CONSTRAINT "ArtifactVersion_artifactId_fkey" FOREIGN KEY ("artifactId") REFERENCES "Artifact"("id") ON DELETE CASCADE ON UPDATE CASCADE;
787
+
788
+ -- AddForeignKey
789
+ ALTER TABLE "ArtifactVersion" ADD CONSTRAINT "ArtifactVersion_createdById_fkey" FOREIGN KEY ("createdById") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
790
+
791
+ -- AddForeignKey
792
+ ALTER TABLE "StudyGuideHighlight" ADD CONSTRAINT "StudyGuideHighlight_artifactVersionId_fkey" FOREIGN KEY ("artifactVersionId") REFERENCES "ArtifactVersion"("id") ON DELETE CASCADE ON UPDATE CASCADE;
793
+
794
+ -- AddForeignKey
795
+ ALTER TABLE "StudyGuideHighlight" ADD CONSTRAINT "StudyGuideHighlight_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
796
+
797
+ -- AddForeignKey
798
+ ALTER TABLE "StudyGuideComment" ADD CONSTRAINT "StudyGuideComment_highlightId_fkey" FOREIGN KEY ("highlightId") REFERENCES "StudyGuideHighlight"("id") ON DELETE CASCADE ON UPDATE CASCADE;
799
+
800
+ -- AddForeignKey
801
+ ALTER TABLE "StudyGuideComment" ADD CONSTRAINT "StudyGuideComment_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
802
+
803
+ -- AddForeignKey
804
+ ALTER TABLE "Flashcard" ADD CONSTRAINT "Flashcard_artifactId_fkey" FOREIGN KEY ("artifactId") REFERENCES "Artifact"("id") ON DELETE CASCADE ON UPDATE CASCADE;
805
+
806
+ -- AddForeignKey
807
+ ALTER TABLE "FlashcardProgress" ADD CONSTRAINT "FlashcardProgress_flashcardId_fkey" FOREIGN KEY ("flashcardId") REFERENCES "Flashcard"("id") ON DELETE CASCADE ON UPDATE CASCADE;
808
+
809
+ -- AddForeignKey
810
+ ALTER TABLE "FlashcardProgress" ADD CONSTRAINT "FlashcardProgress_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
811
+
812
+ -- AddForeignKey
813
+ ALTER TABLE "WorksheetQuestion" ADD CONSTRAINT "WorksheetQuestion_artifactId_fkey" FOREIGN KEY ("artifactId") REFERENCES "Artifact"("id") ON DELETE CASCADE ON UPDATE CASCADE;
814
+
815
+ -- AddForeignKey
816
+ ALTER TABLE "WorksheetQuestionProgress" ADD CONSTRAINT "WorksheetQuestionProgress_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
817
+
818
+ -- AddForeignKey
819
+ ALTER TABLE "WorksheetQuestionProgress" ADD CONSTRAINT "WorksheetQuestionProgress_worksheetQuestionId_fkey" FOREIGN KEY ("worksheetQuestionId") REFERENCES "WorksheetQuestion"("id") ON DELETE CASCADE ON UPDATE CASCADE;
820
+
821
+ -- AddForeignKey
822
+ ALTER TABLE "WorksheetPreset" ADD CONSTRAINT "WorksheetPreset_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
823
+
824
+ -- AddForeignKey
825
+ ALTER TABLE "WorksheetPreset" ADD CONSTRAINT "WorksheetPreset_workspaceId_fkey" FOREIGN KEY ("workspaceId") REFERENCES "Workspace"("id") ON DELETE CASCADE ON UPDATE CASCADE;
826
+
827
+ -- AddForeignKey
828
+ ALTER TABLE "WorkspaceMember" ADD CONSTRAINT "WorkspaceMember_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
829
+
830
+ -- AddForeignKey
831
+ ALTER TABLE "WorkspaceMember" ADD CONSTRAINT "WorkspaceMember_workspaceId_fkey" FOREIGN KEY ("workspaceId") REFERENCES "Workspace"("id") ON DELETE CASCADE ON UPDATE CASCADE;
832
+
833
+ -- AddForeignKey
834
+ ALTER TABLE "WorkspaceInvitation" ADD CONSTRAINT "WorkspaceInvitation_invitedById_fkey" FOREIGN KEY ("invitedById") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
835
+
836
+ -- AddForeignKey
837
+ ALTER TABLE "WorkspaceInvitation" ADD CONSTRAINT "WorkspaceInvitation_workspaceId_fkey" FOREIGN KEY ("workspaceId") REFERENCES "Workspace"("id") ON DELETE CASCADE ON UPDATE CASCADE;
838
+
839
+ -- AddForeignKey
840
+ ALTER TABLE "PodcastSegment" ADD CONSTRAINT "PodcastSegment_artifactId_fkey" FOREIGN KEY ("artifactId") REFERENCES "Artifact"("id") ON DELETE CASCADE ON UPDATE CASCADE;
841
+
842
+ -- AddForeignKey
843
+ ALTER TABLE "Invoice" ADD CONSTRAINT "Invoice_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
844
+
845
+ -- AddForeignKey
846
+ ALTER TABLE "Invoice" ADD CONSTRAINT "Invoice_subscriptionId_fkey" FOREIGN KEY ("subscriptionId") REFERENCES "Subscription"("id") ON DELETE SET NULL ON UPDATE CASCADE;
847
+
848
+ -- AddForeignKey
849
+ ALTER TABLE "PlanLimit" ADD CONSTRAINT "PlanLimit_planId_fkey" FOREIGN KEY ("planId") REFERENCES "Plan"("id") ON DELETE CASCADE ON UPDATE CASCADE;
850
+
851
+ -- AddForeignKey
852
+ ALTER TABLE "Subscription" ADD CONSTRAINT "Subscription_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
853
+
854
+ -- AddForeignKey
855
+ ALTER TABLE "Subscription" ADD CONSTRAINT "Subscription_planId_fkey" FOREIGN KEY ("planId") REFERENCES "Plan"("id") ON DELETE CASCADE ON UPDATE CASCADE;
856
+
857
+ -- AddForeignKey
858
+ ALTER TABLE "UserCredit" ADD CONSTRAINT "UserCredit_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
859
+
860
+ -- AddForeignKey
861
+ ALTER TABLE "IdempotencyRecord" ADD CONSTRAINT "IdempotencyRecord_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
862
+
863
+ -- AddForeignKey
864
+ ALTER TABLE "ActivityLog" ADD CONSTRAINT "ActivityLog_actorUserId_fkey" FOREIGN KEY ("actorUserId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
865
+
866
+ -- AddForeignKey
867
+ ALTER TABLE "ActivityLog" ADD CONSTRAINT "ActivityLog_workspaceId_fkey" FOREIGN KEY ("workspaceId") REFERENCES "Workspace"("id") ON DELETE SET NULL ON UPDATE CASCADE;
868
+
869
+ -- AddForeignKey
870
+ ALTER TABLE "_WorkspaceSharedWith" ADD CONSTRAINT "_WorkspaceSharedWith_A_fkey" FOREIGN KEY ("A") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
871
+
872
+ -- AddForeignKey
873
+ ALTER TABLE "_WorkspaceSharedWith" ADD CONSTRAINT "_WorkspaceSharedWith_B_fkey" FOREIGN KEY ("B") REFERENCES "Workspace"("id") ON DELETE CASCADE ON UPDATE CASCADE;