@studious-lms/server 1.12.0 → 1.14.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 (338) hide show
  1. package/.dockerignore +28 -0
  2. package/.env.example +5 -0
  3. package/.github/workflows/deploy.yml +123 -0
  4. package/Dockerfile +54 -0
  5. package/dist/index.js +5 -2
  6. package/dist/index.js.map +1 -1
  7. package/dist/lib/config/cors.d.ts.map +1 -1
  8. package/dist/lib/config/cors.js +31 -11
  9. package/dist/lib/config/cors.js.map +1 -1
  10. package/dist/lib/config/env.d.ts +17 -0
  11. package/dist/lib/config/env.d.ts.map +1 -1
  12. package/dist/lib/config/env.js +8 -2
  13. package/dist/lib/config/env.js.map +1 -1
  14. package/dist/lib/googleCloudStorage.d.ts +10 -0
  15. package/dist/lib/googleCloudStorage.d.ts.map +1 -1
  16. package/dist/lib/googleCloudStorage.js +22 -2
  17. package/dist/lib/googleCloudStorage.js.map +1 -1
  18. package/dist/lib/prisma.d.ts +104 -5
  19. package/dist/lib/prisma.d.ts.map +1 -1
  20. package/dist/lib/prisma.js +33 -2
  21. package/dist/lib/prisma.js.map +1 -1
  22. package/dist/models/agenda.d.ts +20 -20
  23. package/dist/models/announcement.d.ts +177 -69
  24. package/dist/models/announcement.d.ts.map +1 -1
  25. package/dist/models/assignment.d.ts +551 -353
  26. package/dist/models/assignment.d.ts.map +1 -1
  27. package/dist/models/attendance.d.ts +197 -71
  28. package/dist/models/attendance.d.ts.map +1 -1
  29. package/dist/models/auth.d.ts +348 -114
  30. package/dist/models/auth.d.ts.map +1 -1
  31. package/dist/models/class.d.ts +324 -188
  32. package/dist/models/class.d.ts.map +1 -1
  33. package/dist/models/class.js +9 -3
  34. package/dist/models/class.js.map +1 -1
  35. package/dist/models/cloudStorage.d.ts +146 -56
  36. package/dist/models/cloudStorage.d.ts.map +1 -1
  37. package/dist/models/comment.d.ts +269 -110
  38. package/dist/models/comment.d.ts.map +1 -1
  39. package/dist/models/comment.js +3 -2
  40. package/dist/models/comment.js.map +1 -1
  41. package/dist/models/conversation.d.ts +206 -63
  42. package/dist/models/conversation.d.ts.map +1 -1
  43. package/dist/models/conversation.js +13 -2
  44. package/dist/models/conversation.js.map +1 -1
  45. package/dist/models/department.d.ts +196 -70
  46. package/dist/models/department.d.ts.map +1 -1
  47. package/dist/models/event.d.ts +287 -125
  48. package/dist/models/event.d.ts.map +1 -1
  49. package/dist/models/file.d.ts +389 -263
  50. package/dist/models/file.d.ts.map +1 -1
  51. package/dist/models/folder.d.ts +433 -181
  52. package/dist/models/folder.d.ts.map +1 -1
  53. package/dist/models/labChat.d.ts +209 -83
  54. package/dist/models/labChat.d.ts.map +1 -1
  55. package/dist/models/marketing.d.ts +80 -26
  56. package/dist/models/marketing.d.ts.map +1 -1
  57. package/dist/models/message.d.ts +95 -41
  58. package/dist/models/message.d.ts.map +1 -1
  59. package/dist/models/newtonChat.d.ts +83 -29
  60. package/dist/models/newtonChat.d.ts.map +1 -1
  61. package/dist/models/notification.d.ts +61 -25
  62. package/dist/models/notification.d.ts.map +1 -1
  63. package/dist/models/school.d.ts +349 -133
  64. package/dist/models/school.d.ts.map +1 -1
  65. package/dist/models/section.d.ts +216 -72
  66. package/dist/models/section.d.ts.map +1 -1
  67. package/dist/models/tag.d.ts +156 -48
  68. package/dist/models/tag.d.ts.map +1 -1
  69. package/dist/models/user.d.ts +82 -28
  70. package/dist/models/user.d.ts.map +1 -1
  71. package/dist/models/worksheet.d.ts +1023 -410
  72. package/dist/models/worksheet.d.ts.map +1 -1
  73. package/dist/models/worksheet.js +19 -7
  74. package/dist/models/worksheet.js.map +1 -1
  75. package/dist/pipelines/aiLabChat.d.ts +0 -8
  76. package/dist/pipelines/aiLabChat.d.ts.map +1 -1
  77. package/dist/pipelines/aiLabChat.js +50 -67
  78. package/dist/pipelines/aiLabChat.js.map +1 -1
  79. package/dist/pipelines/aiLabChatContract.d.ts +393 -388
  80. package/dist/pipelines/aiLabChatContract.d.ts.map +1 -1
  81. package/dist/pipelines/aiLabChatContract.js +63 -69
  82. package/dist/pipelines/aiLabChatContract.js.map +1 -1
  83. package/dist/pipelines/aiNewtonChat.d.ts.map +1 -1
  84. package/dist/pipelines/aiNewtonChat.js +41 -41
  85. package/dist/pipelines/aiNewtonChat.js.map +1 -1
  86. package/dist/pipelines/gradeWorksheet.d.ts +8 -8
  87. package/dist/pipelines/gradeWorksheet.d.ts.map +1 -1
  88. package/dist/pipelines/gradeWorksheet.js +59 -14
  89. package/dist/pipelines/gradeWorksheet.js.map +1 -1
  90. package/dist/pipelines/labChatPrompt.d.ts +10 -8
  91. package/dist/pipelines/labChatPrompt.d.ts.map +1 -1
  92. package/dist/pipelines/labChatPrompt.js +47 -67
  93. package/dist/pipelines/labChatPrompt.js.map +1 -1
  94. package/dist/pipelines/pdfToWorksheet.d.ts +2 -2
  95. package/dist/routers/_app.d.ts +2268 -1898
  96. package/dist/routers/_app.d.ts.map +1 -1
  97. package/dist/routers/_app.js +4 -2
  98. package/dist/routers/_app.js.map +1 -1
  99. package/dist/routers/admin.d.ts +13 -13
  100. package/dist/routers/agenda.d.ts +18 -18
  101. package/dist/routers/announcement.d.ts +32 -28
  102. package/dist/routers/announcement.d.ts.map +1 -1
  103. package/dist/routers/announcement.js +6 -5
  104. package/dist/routers/announcement.js.map +1 -1
  105. package/dist/routers/assignment.d.ts +335 -327
  106. package/dist/routers/assignment.d.ts.map +1 -1
  107. package/dist/routers/assignment.js +4 -4
  108. package/dist/routers/assignment.js.map +1 -1
  109. package/dist/routers/attendance.d.ts +10 -10
  110. package/dist/routers/auth.d.ts +2 -2
  111. package/dist/routers/class.d.ts +170 -147
  112. package/dist/routers/class.d.ts.map +1 -1
  113. package/dist/routers/comment.d.ts +40 -16
  114. package/dist/routers/comment.d.ts.map +1 -1
  115. package/dist/routers/comment.js +6 -3
  116. package/dist/routers/comment.js.map +1 -1
  117. package/dist/routers/conversation.d.ts +17 -17
  118. package/dist/routers/department.d.ts +34 -34
  119. package/dist/routers/discussion.d.ts +65 -53
  120. package/dist/routers/discussion.d.ts.map +1 -1
  121. package/dist/routers/discussion.js +6 -2
  122. package/dist/routers/discussion.js.map +1 -1
  123. package/dist/routers/embedding.d.ts +69 -0
  124. package/dist/routers/embedding.d.ts.map +1 -0
  125. package/dist/routers/embedding.js +143 -0
  126. package/dist/routers/embedding.js.map +1 -0
  127. package/dist/routers/event.d.ts +39 -39
  128. package/dist/routers/file.d.ts +12 -12
  129. package/dist/routers/folder.d.ts +38 -38
  130. package/dist/routers/labChat.d.ts +19 -19
  131. package/dist/routers/marketing.d.ts +2 -2
  132. package/dist/routers/message.d.ts +13 -13
  133. package/dist/routers/newtonChat.d.ts +4 -4
  134. package/dist/routers/notifications.d.ts +9 -9
  135. package/dist/routers/permissions.d.ts +14 -14
  136. package/dist/routers/school.d.ts +55 -55
  137. package/dist/routers/search.d.ts +22 -1
  138. package/dist/routers/search.d.ts.map +1 -1
  139. package/dist/routers/search.js +9 -3
  140. package/dist/routers/search.js.map +1 -1
  141. package/dist/routers/section.d.ts +4 -4
  142. package/dist/routers/studentProgress.d.ts +1 -1
  143. package/dist/routers/tag.d.ts +7 -7
  144. package/dist/routers/user.d.ts +10 -10
  145. package/dist/routers/worksheet.d.ts +97 -56
  146. package/dist/routers/worksheet.d.ts.map +1 -1
  147. package/dist/routers/worksheet.js +28 -2
  148. package/dist/routers/worksheet.js.map +1 -1
  149. package/dist/routes/aiStream.d.ts +2 -0
  150. package/dist/routes/aiStream.d.ts.map +1 -0
  151. package/dist/routes/aiStream.js +696 -0
  152. package/dist/routes/aiStream.js.map +1 -0
  153. package/dist/seedDatabase.d.ts +2 -2
  154. package/dist/seedDatabase.js +6 -6
  155. package/dist/seedDatabase.js.map +1 -1
  156. package/dist/services/adminInstitution.d.ts +8 -8
  157. package/dist/services/adminRunJob.d.ts +4 -4
  158. package/dist/services/agenda.d.ts +18 -18
  159. package/dist/services/aiChatStream.d.ts +68 -0
  160. package/dist/services/aiChatStream.d.ts.map +1 -0
  161. package/dist/services/aiChatStream.js +157 -0
  162. package/dist/services/aiChatStream.js.map +1 -0
  163. package/dist/services/aiModifierTools.d.ts +32 -0
  164. package/dist/services/aiModifierTools.d.ts.map +1 -0
  165. package/dist/services/aiModifierTools.js +165 -0
  166. package/dist/services/aiModifierTools.js.map +1 -0
  167. package/dist/services/aiProposalTools.d.ts +32 -0
  168. package/dist/services/aiProposalTools.d.ts.map +1 -0
  169. package/dist/services/aiProposalTools.js +207 -0
  170. package/dist/services/aiProposalTools.js.map +1 -0
  171. package/dist/services/aiStream.d.ts +22 -0
  172. package/dist/services/aiStream.d.ts.map +1 -0
  173. package/dist/services/aiStream.js +142 -0
  174. package/dist/services/aiStream.js.map +1 -0
  175. package/dist/services/aiTools.d.ts +16 -0
  176. package/dist/services/aiTools.d.ts.map +1 -0
  177. package/dist/services/aiTools.js +271 -0
  178. package/dist/services/aiTools.js.map +1 -0
  179. package/dist/services/announcement.d.ts +12 -12
  180. package/dist/services/announcement.d.ts.map +1 -1
  181. package/dist/services/announcement.js +7 -2
  182. package/dist/services/announcement.js.map +1 -1
  183. package/dist/services/assignment.d.ts +293 -293
  184. package/dist/services/assignment.d.ts.map +1 -1
  185. package/dist/services/assignment.js +36 -15
  186. package/dist/services/assignment.js.map +1 -1
  187. package/dist/services/attendance.d.ts +10 -10
  188. package/dist/services/auth.d.ts +2 -2
  189. package/dist/services/class.d.ts +161 -138
  190. package/dist/services/class.d.ts.map +1 -1
  191. package/dist/services/class.js +25 -4
  192. package/dist/services/class.js.map +1 -1
  193. package/dist/services/comment.d.ts +34 -16
  194. package/dist/services/comment.d.ts.map +1 -1
  195. package/dist/services/comment.js +23 -2
  196. package/dist/services/comment.js.map +1 -1
  197. package/dist/services/conversation.d.ts +17 -17
  198. package/dist/services/conversation.d.ts.map +1 -1
  199. package/dist/services/conversation.js +9 -7
  200. package/dist/services/conversation.js.map +1 -1
  201. package/dist/services/department.d.ts +33 -33
  202. package/dist/services/discussion.d.ts +58 -58
  203. package/dist/services/discussion.d.ts.map +1 -1
  204. package/dist/services/discussion.js +8 -8
  205. package/dist/services/discussion.js.map +1 -1
  206. package/dist/services/discussionSummary.d.ts +21 -0
  207. package/dist/services/discussionSummary.d.ts.map +1 -0
  208. package/dist/services/discussionSummary.js +179 -0
  209. package/dist/services/discussionSummary.js.map +1 -0
  210. package/dist/services/embedding.d.ts +67 -0
  211. package/dist/services/embedding.d.ts.map +1 -0
  212. package/dist/services/embedding.js +226 -0
  213. package/dist/services/embedding.js.map +1 -0
  214. package/dist/services/event.d.ts +37 -37
  215. package/dist/services/file.d.ts +24 -24
  216. package/dist/services/folder.d.ts +36 -36
  217. package/dist/services/labChat.d.ts +19 -19
  218. package/dist/services/marketing.d.ts +2 -2
  219. package/dist/services/message.d.ts +11 -11
  220. package/dist/services/message.d.ts.map +1 -1
  221. package/dist/services/message.js +2 -2
  222. package/dist/services/message.js.map +1 -1
  223. package/dist/services/newtonChat.d.ts +4 -4
  224. package/dist/services/notification.d.ts +9 -9
  225. package/dist/services/notification.d.ts.map +1 -1
  226. package/dist/services/permissions.d.ts +14 -14
  227. package/dist/services/school.d.ts +50 -50
  228. package/dist/services/search.d.ts +12 -0
  229. package/dist/services/search.d.ts.map +1 -1
  230. package/dist/services/search.js +120 -2
  231. package/dist/services/search.js.map +1 -1
  232. package/dist/services/section.d.ts +3 -3
  233. package/dist/services/tag.d.ts +4 -4
  234. package/dist/services/user.d.ts +4 -4
  235. package/dist/services/user.d.ts.map +1 -1
  236. package/dist/services/user.js +10 -15
  237. package/dist/services/user.js.map +1 -1
  238. package/dist/services/worksheet.d.ts +62 -47
  239. package/dist/services/worksheet.d.ts.map +1 -1
  240. package/dist/services/worksheet.js +11 -4
  241. package/dist/services/worksheet.js.map +1 -1
  242. package/dist/utils/streamBroadcast.d.ts +11 -0
  243. package/dist/utils/streamBroadcast.d.ts.map +1 -0
  244. package/dist/utils/streamBroadcast.js +32 -0
  245. package/dist/utils/streamBroadcast.js.map +1 -0
  246. package/dist/workers/connection.d.ts +15 -0
  247. package/dist/workers/connection.d.ts.map +1 -1
  248. package/dist/workers/connection.js +20 -2
  249. package/dist/workers/connection.js.map +1 -1
  250. package/dist/workers/index.js +4 -2
  251. package/dist/workers/index.js.map +1 -1
  252. package/dist/workers/processors/createRunJobWorker.d.ts.map +1 -1
  253. package/dist/workers/processors/createRunJobWorker.js +31 -8
  254. package/dist/workers/processors/createRunJobWorker.js.map +1 -1
  255. package/dist/workers/processors/embedContent.d.ts +8 -0
  256. package/dist/workers/processors/embedContent.d.ts.map +1 -0
  257. package/dist/workers/processors/embedContent.js +76 -0
  258. package/dist/workers/processors/embedContent.js.map +1 -0
  259. package/dist/workers/queues.d.ts +6 -0
  260. package/dist/workers/queues.d.ts.map +1 -1
  261. package/dist/workers/queues.js +5 -3
  262. package/dist/workers/queues.js.map +1 -1
  263. package/package.json +5 -1
  264. package/prisma/migrations/20260609215135_init/migration.sql +1412 -0
  265. package/prisma/migrations/20260610130000_add_worksheet_tags/migration.sql +13 -0
  266. package/prisma/schema.prisma +39 -7
  267. package/src/index.ts +4 -0
  268. package/src/lib/config/cors.ts +32 -9
  269. package/src/lib/config/env.ts +6 -0
  270. package/src/lib/googleCloudStorage.ts +21 -0
  271. package/src/lib/prisma.ts +40 -1
  272. package/src/models/class.ts +10 -3
  273. package/src/models/comment.ts +1 -0
  274. package/src/models/conversation.ts +12 -0
  275. package/src/models/worksheet.ts +16 -7
  276. package/src/pipelines/aiLabChat.ts +54 -79
  277. package/src/pipelines/aiLabChatContract.ts +69 -69
  278. package/src/pipelines/aiNewtonChat.ts +46 -43
  279. package/src/pipelines/gradeWorksheet.ts +66 -15
  280. package/src/pipelines/labChatPrompt.ts +63 -88
  281. package/src/routers/_app.ts +2 -0
  282. package/src/routers/announcement.ts +4 -3
  283. package/src/routers/assignment.ts +2 -2
  284. package/src/routers/comment.ts +5 -0
  285. package/src/routers/discussion.ts +7 -0
  286. package/src/routers/embedding.ts +159 -0
  287. package/src/routers/search.ts +10 -1
  288. package/src/routers/worksheet.ts +29 -0
  289. package/src/routes/aiStream.ts +789 -0
  290. package/src/seedDatabase.ts +4 -4
  291. package/src/services/aiChatStream.ts +219 -0
  292. package/src/services/aiModifierTools.ts +188 -0
  293. package/src/services/aiProposalTools.ts +272 -0
  294. package/src/services/aiStream.ts +175 -0
  295. package/src/services/aiTools.ts +290 -0
  296. package/src/services/announcement.ts +7 -0
  297. package/src/services/assignment.ts +36 -14
  298. package/src/services/class.ts +30 -2
  299. package/src/services/comment.ts +22 -0
  300. package/src/services/conversation.ts +9 -4
  301. package/src/services/discussion.ts +9 -8
  302. package/src/services/discussionSummary.ts +226 -0
  303. package/src/services/embedding.ts +285 -0
  304. package/src/services/message.ts +2 -2
  305. package/src/services/search.ts +138 -0
  306. package/src/services/user.ts +9 -17
  307. package/src/services/worksheet.ts +10 -2
  308. package/src/utils/streamBroadcast.ts +48 -0
  309. package/src/workers/connection.ts +19 -0
  310. package/src/workers/index.ts +2 -0
  311. package/src/workers/processors/createRunJobWorker.ts +32 -6
  312. package/src/workers/processors/embedContent.ts +90 -0
  313. package/src/workers/queues.ts +5 -1
  314. package/tests/integration/routers/conversation.test.ts +9 -7
  315. package/tests/unit/pipelines/aiLabChatContract.test.ts +38 -21
  316. package/tests/unit/pipelines/labChatPrompt.test.ts +23 -36
  317. package/prisma/migrations/20250807062924_init/migration.sql +0 -436
  318. package/prisma/migrations/20250919063704_init2/migration.sql +0 -24
  319. package/prisma/migrations/20250920143543_add_profile_fields/migration.sql +0 -15
  320. package/prisma/migrations/20250922165147_add_chat_models/migration.sql +0 -68
  321. package/prisma/migrations/20250922165314_add_chat_roles/migration.sql +0 -5
  322. package/prisma/migrations/20250922171242_refactor_notification_system/migration.sql +0 -20
  323. package/prisma/migrations/20250922172208_add_mentions_system/migration.sql +0 -21
  324. package/prisma/migrations/20250925072732_add_lab_chat_system/migration.sql +0 -25
  325. package/prisma/migrations/20251020151505_add_upload_tracking_fields/migration.sql +0 -57
  326. package/prisma/migrations/20251109122857_annuoncements_comments/migration.sql +0 -30
  327. package/prisma/migrations/20251109135555_reactions_announcements_comments/migration.sql +0 -35
  328. package/prisma/migrations/20260410124000_add_submission_recommendation_state/migration.sql +0 -14
  329. package/prisma/migrations/20260415103500_add_session_type/migration.sql +0 -33
  330. package/prisma/migrations/20260415133000_add_ai_usage_logs/migration.sql +0 -19
  331. package/prisma/migrations/20260417083000_add_conversation_member_hidden_at/migration.sql +0 -2
  332. package/prisma/migrations/20260502230500_assignment_submission_comments/migration.sql +0 -60
  333. package/prisma/migrations/20260504071500_school_memberships/migration.sql +0 -81
  334. package/prisma/migrations/20260506162500_consolidate_run_job_and_unify_job_status/migration.sql +0 -166
  335. package/prisma/migrations/20260509220000_institution_overhaul/migration.sql +0 -184
  336. package/prisma/migrations/20260510170000_add_folder_permissions/migration.sql +0 -93
  337. package/prisma/migrations/20260510183000_add_discussions/migration.sql +0 -151
  338. /package/.github/workflows/{npm.yml → npm-publish.yml} +0 -0
@@ -0,0 +1,1412 @@
1
+ -- CreateExtension
2
+ CREATE EXTENSION IF NOT EXISTS "vector";
3
+
4
+ -- CreateEnum
5
+ CREATE TYPE "AssignmentType" AS ENUM ('HOMEWORK', 'QUIZ', 'TEST', 'PROJECT', 'ESSAY', 'DISCUSSION', 'PRESENTATION', 'LAB', 'OTHER');
6
+
7
+ -- CreateEnum
8
+ CREATE TYPE "UserRole" AS ENUM ('STUDENT', 'TEACHER', 'ADMIN', 'NONE');
9
+
10
+ -- CreateEnum
11
+ CREATE TYPE "UploadStatus" AS ENUM ('PENDING', 'UPLOADING', 'COMPLETED', 'FAILED', 'CANCELLED');
12
+
13
+ -- CreateEnum
14
+ CREATE TYPE "JobStatus" AS ENUM ('NOT_STARTED', 'PENDING', 'COMPLETED', 'FAILED', 'CANCELLED');
15
+
16
+ -- CreateEnum
17
+ CREATE TYPE "WorksheetQuestionType" AS ENUM ('MULTIPLE_CHOICE', 'TRUE_FALSE', 'SHORT_ANSWER', 'LONG_ANSWER', 'MATH_EXPRESSION', 'ESSAY');
18
+
19
+ -- CreateEnum
20
+ CREATE TYPE "ReactionType" AS ENUM ('THUMBSUP', 'CELEBRATE', 'CARE', 'HEART', 'IDEA', 'HAPPY');
21
+
22
+ -- CreateEnum
23
+ CREATE TYPE "DiscussionType" AS ENUM ('DISCUSSION', 'QUESTION', 'ANNOUNCEMENT');
24
+
25
+ -- CreateEnum
26
+ CREATE TYPE "SubmissionRecommendationState" AS ENUM ('NONE', 'OPEN', 'ASSIGNED', 'DISMISSED');
27
+
28
+ -- CreateEnum
29
+ CREATE TYPE "SchoolMembershipRole" AS ENUM ('ADMIN', 'TEACHER', 'STUDENT');
30
+
31
+ -- CreateEnum
32
+ CREATE TYPE "SchoolMembershipStatus" AS ENUM ('ACTIVE', 'INVITED', 'SUSPENDED');
33
+
34
+ -- CreateEnum
35
+ CREATE TYPE "SchoolInviteStatus" AS ENUM ('PENDING', 'ACCEPTED', 'REVOKED', 'EXPIRED');
36
+
37
+ -- CreateEnum
38
+ CREATE TYPE "TagTarget" AS ENUM ('USER', 'CLASS', 'RUBRIC', 'BOUNDARY');
39
+
40
+ -- CreateEnum
41
+ CREATE TYPE "FolderScope" AS ENUM ('CLASS', 'SCHOOL_STORAGE', 'PERSONAL', 'GENERIC');
42
+
43
+ -- CreateEnum
44
+ CREATE TYPE "SessionType" AS ENUM ('AUTH', 'EMAIL_VERIFICATION', 'PASSWORD_RESET', 'CLASS_INVITE');
45
+
46
+ -- CreateEnum
47
+ CREATE TYPE "ConversationType" AS ENUM ('DM', 'GROUP');
48
+
49
+ -- CreateEnum
50
+ CREATE TYPE "ConversationRole" AS ENUM ('ADMIN', 'MEMBER');
51
+
52
+ -- CreateEnum
53
+ CREATE TYPE "RunJobType" AS ENUM ('PDF_TO_WORKSHEET', 'GRADE_WORKSHEET', 'AI_LAB_CHAT', 'AI_NEWTON_CHAT', 'STUDENT_PROGRESS_CHAT', 'EMBED_CONTENT');
54
+
55
+ -- CreateEnum
56
+ CREATE TYPE "EmbeddingSourceType" AS ENUM ('FILE', 'ASSIGNMENT', 'WORKSHEET', 'ANNOUNCEMENT', 'SECTION');
57
+
58
+ -- CreateEnum
59
+ CREATE TYPE "RunJobStatus" AS ENUM ('PENDING', 'RUNNING', 'SUCCEEDED', 'FAILED', 'CANCELLED');
60
+
61
+ -- CreateEnum
62
+ CREATE TYPE "PermissionPrincipalType" AS ENUM ('USER', 'TAG', 'CLASS', 'CLASS_TEACHERS', 'CLASS_STUDENTS', 'DEPARTMENT', 'SCHOOL');
63
+
64
+ -- CreateEnum
65
+ CREATE TYPE "PermissionLevel" AS ENUM ('READ', 'WRITE');
66
+
67
+ -- CreateTable
68
+ CREATE TABLE "School" (
69
+ "id" TEXT NOT NULL,
70
+ "name" TEXT NOT NULL,
71
+ "description" TEXT,
72
+ "logoId" TEXT,
73
+ "subdomain" TEXT,
74
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
75
+ "updatedAt" TIMESTAMP(3) NOT NULL,
76
+
77
+ CONSTRAINT "School_pkey" PRIMARY KEY ("id")
78
+ );
79
+
80
+ -- CreateTable
81
+ CREATE TABLE "Department" (
82
+ "id" TEXT NOT NULL,
83
+ "schoolId" TEXT NOT NULL,
84
+ "name" TEXT NOT NULL,
85
+ "description" TEXT,
86
+ "color" TEXT DEFAULT '#3B82F6',
87
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
88
+ "updatedAt" TIMESTAMP(3) NOT NULL,
89
+
90
+ CONSTRAINT "Department_pkey" PRIMARY KEY ("id")
91
+ );
92
+
93
+ -- CreateTable
94
+ CREATE TABLE "Tag" (
95
+ "id" TEXT NOT NULL,
96
+ "schoolId" TEXT NOT NULL,
97
+ "departmentId" TEXT,
98
+ "name" TEXT NOT NULL,
99
+ "color" TEXT NOT NULL DEFAULT '#3B82F6',
100
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
101
+ "updatedAt" TIMESTAMP(3) NOT NULL,
102
+
103
+ CONSTRAINT "Tag_pkey" PRIMARY KEY ("id")
104
+ );
105
+
106
+ -- CreateTable
107
+ CREATE TABLE "User" (
108
+ "id" TEXT NOT NULL,
109
+ "username" TEXT NOT NULL,
110
+ "email" TEXT NOT NULL,
111
+ "password" TEXT NOT NULL,
112
+ "verified" BOOLEAN NOT NULL DEFAULT false,
113
+ "schoolId" TEXT,
114
+
115
+ CONSTRAINT "User_pkey" PRIMARY KEY ("id")
116
+ );
117
+
118
+ -- CreateTable
119
+ CREATE TABLE "SchoolMembership" (
120
+ "id" TEXT NOT NULL,
121
+ "schoolId" TEXT NOT NULL,
122
+ "userId" TEXT NOT NULL,
123
+ "role" "SchoolMembershipRole" NOT NULL,
124
+ "status" "SchoolMembershipStatus" NOT NULL DEFAULT 'ACTIVE',
125
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
126
+ "updatedAt" TIMESTAMP(3) NOT NULL,
127
+
128
+ CONSTRAINT "SchoolMembership_pkey" PRIMARY KEY ("id")
129
+ );
130
+
131
+ -- CreateTable
132
+ CREATE TABLE "SchoolInvite" (
133
+ "id" TEXT NOT NULL,
134
+ "token" TEXT NOT NULL,
135
+ "email" TEXT NOT NULL,
136
+ "role" "SchoolMembershipRole" NOT NULL,
137
+ "status" "SchoolInviteStatus" NOT NULL DEFAULT 'PENDING',
138
+ "expiresAt" TIMESTAMP(3) NOT NULL,
139
+ "acceptedAt" TIMESTAMP(3),
140
+ "revokedAt" TIMESTAMP(3),
141
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
142
+ "updatedAt" TIMESTAMP(3) NOT NULL,
143
+ "schoolId" TEXT NOT NULL,
144
+ "invitedById" TEXT NOT NULL,
145
+
146
+ CONSTRAINT "SchoolInvite_pkey" PRIMARY KEY ("id")
147
+ );
148
+
149
+ -- CreateTable
150
+ CREATE TABLE "UserProfile" (
151
+ "id" TEXT NOT NULL,
152
+ "userId" TEXT NOT NULL,
153
+ "displayName" TEXT,
154
+ "bio" TEXT,
155
+ "location" TEXT,
156
+ "website" TEXT,
157
+ "profilePicture" TEXT,
158
+ "profilePictureThumbnail" TEXT,
159
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
160
+ "updatedAt" TIMESTAMP(3) NOT NULL,
161
+
162
+ CONSTRAINT "UserProfile_pkey" PRIMARY KEY ("id")
163
+ );
164
+
165
+ -- CreateTable
166
+ CREATE TABLE "Class" (
167
+ "id" TEXT NOT NULL,
168
+ "name" TEXT NOT NULL,
169
+ "subject" TEXT NOT NULL,
170
+ "color" TEXT DEFAULT '#3B82F6',
171
+ "section" TEXT NOT NULL,
172
+ "syllabus" TEXT,
173
+ "schoolId" TEXT,
174
+ "departmentId" TEXT,
175
+ "discussionsEnabled" BOOLEAN NOT NULL DEFAULT true,
176
+ "studentsCanCreateDiscussions" BOOLEAN NOT NULL DEFAULT true,
177
+ "studentsCanReply" BOOLEAN NOT NULL DEFAULT true,
178
+
179
+ CONSTRAINT "Class_pkey" PRIMARY KEY ("id")
180
+ );
181
+
182
+ -- CreateTable
183
+ CREATE TABLE "MarkScheme" (
184
+ "id" TEXT NOT NULL,
185
+ "classId" TEXT,
186
+ "departmentId" TEXT,
187
+ "name" TEXT,
188
+ "structured" TEXT NOT NULL,
189
+
190
+ CONSTRAINT "MarkScheme_pkey" PRIMARY KEY ("id")
191
+ );
192
+
193
+ -- CreateTable
194
+ CREATE TABLE "GradingBoundary" (
195
+ "id" TEXT NOT NULL,
196
+ "classId" TEXT,
197
+ "departmentId" TEXT,
198
+ "name" TEXT,
199
+ "structured" TEXT NOT NULL,
200
+
201
+ CONSTRAINT "GradingBoundary_pkey" PRIMARY KEY ("id")
202
+ );
203
+
204
+ -- CreateTable
205
+ CREATE TABLE "Folder" (
206
+ "id" TEXT NOT NULL,
207
+ "name" TEXT NOT NULL,
208
+ "scope" "FolderScope" NOT NULL DEFAULT 'GENERIC',
209
+ "parentFolderId" TEXT,
210
+ "color" TEXT DEFAULT '#3B82F6',
211
+ "classId" TEXT,
212
+ "schoolStorageId" TEXT,
213
+ "personalOwnerId" TEXT,
214
+
215
+ CONSTRAINT "Folder_pkey" PRIMARY KEY ("id")
216
+ );
217
+
218
+ -- CreateTable
219
+ CREATE TABLE "File" (
220
+ "id" TEXT NOT NULL,
221
+ "name" TEXT NOT NULL,
222
+ "path" TEXT NOT NULL,
223
+ "size" INTEGER,
224
+ "type" TEXT NOT NULL,
225
+ "userId" TEXT,
226
+ "uploadedAt" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
227
+ "uploadStatus" "UploadStatus" NOT NULL DEFAULT 'PENDING',
228
+ "uploadUrl" TEXT,
229
+ "uploadExpiresAt" TIMESTAMP(3),
230
+ "uploadSessionId" TEXT,
231
+ "uploadProgress" INTEGER,
232
+ "uploadError" TEXT,
233
+ "uploadRetryCount" INTEGER NOT NULL DEFAULT 0,
234
+ "isOrphaned" BOOLEAN NOT NULL DEFAULT false,
235
+ "cleanupAt" TIMESTAMP(3),
236
+ "thumbnailId" TEXT,
237
+ "assignmentId" TEXT,
238
+ "submissionId" TEXT,
239
+ "annotationId" TEXT,
240
+ "classDraftId" TEXT,
241
+ "folderId" TEXT,
242
+ "conversationId" TEXT,
243
+ "messageId" TEXT,
244
+ "announcementId" TEXT,
245
+ "discussionId" TEXT,
246
+ "discussionReplyId" TEXT,
247
+ "schoolDevelopementProgramId" TEXT,
248
+
249
+ CONSTRAINT "File_pkey" PRIMARY KEY ("id")
250
+ );
251
+
252
+ -- CreateTable
253
+ CREATE TABLE "Assignment" (
254
+ "id" TEXT NOT NULL,
255
+ "title" TEXT NOT NULL,
256
+ "instructions" TEXT NOT NULL,
257
+ "dueDate" TIMESTAMP(3) NOT NULL,
258
+ "createdAt" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
259
+ "modifiedAt" TIMESTAMP(3),
260
+ "teacherId" TEXT NOT NULL,
261
+ "classId" TEXT NOT NULL,
262
+ "acceptFiles" BOOLEAN NOT NULL DEFAULT false,
263
+ "acceptExtendedResponse" BOOLEAN NOT NULL DEFAULT false,
264
+ "acceptWorksheet" BOOLEAN NOT NULL DEFAULT false,
265
+ "gradeWithAI" BOOLEAN NOT NULL DEFAULT false,
266
+ "aiPolicyLevel" INTEGER NOT NULL DEFAULT 0,
267
+ "sectionId" TEXT,
268
+ "graded" BOOLEAN NOT NULL DEFAULT false,
269
+ "maxGrade" INTEGER DEFAULT 0,
270
+ "weight" DOUBLE PRECISION NOT NULL DEFAULT 1,
271
+ "type" "AssignmentType" NOT NULL DEFAULT 'HOMEWORK',
272
+ "inProgress" BOOLEAN NOT NULL DEFAULT false,
273
+ "template" BOOLEAN NOT NULL DEFAULT false,
274
+ "eventId" TEXT,
275
+ "markSchemeId" TEXT,
276
+ "order" INTEGER,
277
+ "gradingBoundaryId" TEXT,
278
+
279
+ CONSTRAINT "Assignment_pkey" PRIMARY KEY ("id")
280
+ );
281
+
282
+ -- CreateTable
283
+ CREATE TABLE "Announcement" (
284
+ "id" TEXT NOT NULL,
285
+ "remarks" TEXT NOT NULL,
286
+ "teacherId" TEXT NOT NULL,
287
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
288
+ "modifiedAt" TIMESTAMP(3),
289
+ "classId" TEXT NOT NULL,
290
+
291
+ CONSTRAINT "Announcement_pkey" PRIMARY KEY ("id")
292
+ );
293
+
294
+ -- CreateTable
295
+ CREATE TABLE "Comment" (
296
+ "id" TEXT NOT NULL,
297
+ "content" TEXT NOT NULL,
298
+ "authorId" TEXT NOT NULL,
299
+ "announcementId" TEXT,
300
+ "assignmentId" TEXT,
301
+ "submissionId" TEXT,
302
+ "parentCommentId" TEXT,
303
+ "isPinned" BOOLEAN NOT NULL DEFAULT false,
304
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
305
+ "modifiedAt" TIMESTAMP(3),
306
+ "studentQuestionProgressId" TEXT,
307
+
308
+ CONSTRAINT "Comment_pkey" PRIMARY KEY ("id")
309
+ );
310
+
311
+ -- CreateTable
312
+ CREATE TABLE "Discussion" (
313
+ "id" TEXT NOT NULL,
314
+ "classId" TEXT NOT NULL,
315
+ "authorId" TEXT NOT NULL,
316
+ "title" TEXT NOT NULL,
317
+ "body" TEXT NOT NULL,
318
+ "type" "DiscussionType" NOT NULL DEFAULT 'DISCUSSION',
319
+ "isPinned" BOOLEAN NOT NULL DEFAULT false,
320
+ "isLocked" BOOLEAN NOT NULL DEFAULT false,
321
+ "allowReplies" BOOLEAN NOT NULL DEFAULT true,
322
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
323
+ "updatedAt" TIMESTAMP(3) NOT NULL,
324
+ "lastActivityAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
325
+
326
+ CONSTRAINT "Discussion_pkey" PRIMARY KEY ("id")
327
+ );
328
+
329
+ -- CreateTable
330
+ CREATE TABLE "DiscussionReply" (
331
+ "id" TEXT NOT NULL,
332
+ "discussionId" TEXT NOT NULL,
333
+ "authorId" TEXT NOT NULL,
334
+ "parentId" TEXT,
335
+ "body" TEXT NOT NULL,
336
+ "isAcceptedAnswer" BOOLEAN NOT NULL DEFAULT false,
337
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
338
+ "modifiedAt" TIMESTAMP(3),
339
+ "deletedAt" TIMESTAMP(3),
340
+
341
+ CONSTRAINT "DiscussionReply_pkey" PRIMARY KEY ("id")
342
+ );
343
+
344
+ -- CreateTable
345
+ CREATE TABLE "DiscussionTag" (
346
+ "id" TEXT NOT NULL,
347
+ "classId" TEXT NOT NULL,
348
+ "name" TEXT NOT NULL,
349
+ "color" TEXT NOT NULL DEFAULT '#3B82F6',
350
+
351
+ CONSTRAINT "DiscussionTag_pkey" PRIMARY KEY ("id")
352
+ );
353
+
354
+ -- CreateTable
355
+ CREATE TABLE "DiscussionRead" (
356
+ "userId" TEXT NOT NULL,
357
+ "discussionId" TEXT NOT NULL,
358
+ "lastReadAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
359
+
360
+ CONSTRAINT "DiscussionRead_pkey" PRIMARY KEY ("userId","discussionId")
361
+ );
362
+
363
+ -- CreateTable
364
+ CREATE TABLE "Reaction" (
365
+ "id" TEXT NOT NULL,
366
+ "type" "ReactionType" NOT NULL,
367
+ "userId" TEXT NOT NULL,
368
+ "announcementId" TEXT,
369
+ "commentId" TEXT,
370
+ "discussionId" TEXT,
371
+ "discussionReplyId" TEXT,
372
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
373
+
374
+ CONSTRAINT "Reaction_pkey" PRIMARY KEY ("id")
375
+ );
376
+
377
+ -- CreateTable
378
+ CREATE TABLE "Submission" (
379
+ "id" TEXT NOT NULL,
380
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
381
+ "modifiedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
382
+ "assignmentId" TEXT NOT NULL,
383
+ "studentId" TEXT NOT NULL,
384
+ "extendedResponse" TEXT,
385
+ "gradeReceived" INTEGER,
386
+ "recommendationState" "SubmissionRecommendationState" NOT NULL DEFAULT 'NONE',
387
+ "recommendationUpdatedAt" TIMESTAMP(3),
388
+ "targetedAssignmentId" TEXT,
389
+ "rubricState" TEXT,
390
+ "teacherComments" TEXT,
391
+ "submittedAt" TIMESTAMP(3),
392
+ "submitted" BOOLEAN DEFAULT false,
393
+ "returned" BOOLEAN DEFAULT false,
394
+
395
+ CONSTRAINT "Submission_pkey" PRIMARY KEY ("id")
396
+ );
397
+
398
+ -- CreateTable
399
+ CREATE TABLE "NewtonChat" (
400
+ "id" TEXT NOT NULL,
401
+ "submissionId" TEXT NOT NULL,
402
+ "conversationId" TEXT NOT NULL,
403
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
404
+ "updatedAt" TIMESTAMP(3) NOT NULL,
405
+ "title" TEXT NOT NULL DEFAULT 'Session with Newton Tutor',
406
+
407
+ CONSTRAINT "NewtonChat_pkey" PRIMARY KEY ("id")
408
+ );
409
+
410
+ -- CreateTable
411
+ CREATE TABLE "Section" (
412
+ "id" TEXT NOT NULL,
413
+ "name" TEXT NOT NULL,
414
+ "classId" TEXT NOT NULL,
415
+ "color" TEXT DEFAULT '#3B82F6',
416
+ "order" INTEGER,
417
+
418
+ CONSTRAINT "Section_pkey" PRIMARY KEY ("id")
419
+ );
420
+
421
+ -- CreateTable
422
+ CREATE TABLE "Session" (
423
+ "id" TEXT NOT NULL,
424
+ "createdAt" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
425
+ "expiresAt" TIMESTAMP(3),
426
+ "type" "SessionType" NOT NULL DEFAULT 'AUTH',
427
+ "userId" TEXT,
428
+ "classId" TEXT,
429
+
430
+ CONSTRAINT "Session_pkey" PRIMARY KEY ("id")
431
+ );
432
+
433
+ -- CreateTable
434
+ CREATE TABLE "Event" (
435
+ "id" TEXT NOT NULL,
436
+ "name" TEXT,
437
+ "startTime" TIMESTAMP(3) NOT NULL,
438
+ "endTime" TIMESTAMP(3) NOT NULL,
439
+ "location" TEXT,
440
+ "remarks" TEXT,
441
+ "userId" TEXT,
442
+ "classId" TEXT,
443
+ "color" TEXT DEFAULT '#3B82F6',
444
+
445
+ CONSTRAINT "Event_pkey" PRIMARY KEY ("id")
446
+ );
447
+
448
+ -- CreateTable
449
+ CREATE TABLE "Attendance" (
450
+ "id" TEXT NOT NULL,
451
+ "date" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
452
+ "classId" TEXT NOT NULL,
453
+ "eventId" TEXT,
454
+
455
+ CONSTRAINT "Attendance_pkey" PRIMARY KEY ("id")
456
+ );
457
+
458
+ -- CreateTable
459
+ CREATE TABLE "Notification" (
460
+ "id" TEXT NOT NULL,
461
+ "title" TEXT NOT NULL,
462
+ "content" TEXT NOT NULL,
463
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
464
+ "senderId" TEXT,
465
+ "receiverId" TEXT NOT NULL,
466
+ "read" BOOLEAN NOT NULL DEFAULT false,
467
+
468
+ CONSTRAINT "Notification_pkey" PRIMARY KEY ("id")
469
+ );
470
+
471
+ -- CreateTable
472
+ CREATE TABLE "Conversation" (
473
+ "id" TEXT NOT NULL,
474
+ "type" "ConversationType" NOT NULL,
475
+ "name" TEXT,
476
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
477
+ "updatedAt" TIMESTAMP(3) NOT NULL,
478
+ "displayInChat" BOOLEAN NOT NULL DEFAULT true,
479
+
480
+ CONSTRAINT "Conversation_pkey" PRIMARY KEY ("id")
481
+ );
482
+
483
+ -- CreateTable
484
+ CREATE TABLE "LabChat" (
485
+ "id" TEXT NOT NULL,
486
+ "title" TEXT NOT NULL,
487
+ "context" TEXT NOT NULL,
488
+ "classId" TEXT NOT NULL,
489
+ "conversationId" TEXT NOT NULL,
490
+ "createdById" TEXT NOT NULL,
491
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
492
+ "updatedAt" TIMESTAMP(3) NOT NULL,
493
+
494
+ CONSTRAINT "LabChat_pkey" PRIMARY KEY ("id")
495
+ );
496
+
497
+ -- CreateTable
498
+ CREATE TABLE "ConversationMember" (
499
+ "id" TEXT NOT NULL,
500
+ "userId" TEXT NOT NULL,
501
+ "conversationId" TEXT NOT NULL,
502
+ "role" "ConversationRole" NOT NULL DEFAULT 'MEMBER',
503
+ "joinedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
504
+ "hiddenAt" TIMESTAMP(3),
505
+ "lastViewedAt" TIMESTAMP(3),
506
+ "lastViewedMentionAt" TIMESTAMP(3),
507
+
508
+ CONSTRAINT "ConversationMember_pkey" PRIMARY KEY ("id")
509
+ );
510
+
511
+ -- CreateTable
512
+ CREATE TABLE "Message" (
513
+ "id" TEXT NOT NULL,
514
+ "content" TEXT NOT NULL,
515
+ "senderId" TEXT NOT NULL,
516
+ "conversationId" TEXT NOT NULL,
517
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
518
+ "status" "JobStatus",
519
+ "runJobId" TEXT,
520
+ "meta" JSONB DEFAULT '{}',
521
+
522
+ CONSTRAINT "Message_pkey" PRIMARY KEY ("id")
523
+ );
524
+
525
+ -- CreateTable
526
+ CREATE TABLE "AiUsageLog" (
527
+ "id" TEXT NOT NULL,
528
+ "reason" TEXT NOT NULL,
529
+ "provider" TEXT NOT NULL DEFAULT 'openai',
530
+ "model" TEXT NOT NULL,
531
+ "operation" TEXT NOT NULL,
532
+ "success" BOOLEAN NOT NULL DEFAULT true,
533
+ "promptTokens" INTEGER,
534
+ "completionTokens" INTEGER,
535
+ "totalTokens" INTEGER,
536
+ "estimatedInputTokens" INTEGER,
537
+ "metadata" JSONB DEFAULT '{}',
538
+ "error" TEXT,
539
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
540
+
541
+ CONSTRAINT "AiUsageLog_pkey" PRIMARY KEY ("id")
542
+ );
543
+
544
+ -- CreateTable
545
+ CREATE TABLE "Mention" (
546
+ "id" TEXT NOT NULL,
547
+ "messageId" TEXT NOT NULL,
548
+ "userId" TEXT NOT NULL,
549
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
550
+
551
+ CONSTRAINT "Mention_pkey" PRIMARY KEY ("id")
552
+ );
553
+
554
+ -- CreateTable
555
+ CREATE TABLE "Worksheet" (
556
+ "id" TEXT NOT NULL,
557
+ "name" TEXT NOT NULL,
558
+ "sourceUrl" TEXT,
559
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
560
+ "updatedAt" TIMESTAMP(3) NOT NULL,
561
+ "classId" TEXT NOT NULL,
562
+ "runJobId" TEXT,
563
+ "status" "JobStatus" DEFAULT 'NOT_STARTED',
564
+
565
+ CONSTRAINT "Worksheet_pkey" PRIMARY KEY ("id")
566
+ );
567
+
568
+ -- CreateTable
569
+ CREATE TABLE "WorksheetQuestion" (
570
+ "id" TEXT NOT NULL,
571
+ "worksheetId" TEXT NOT NULL,
572
+ "type" "WorksheetQuestionType" NOT NULL,
573
+ "question" TEXT NOT NULL,
574
+ "answer" TEXT NOT NULL,
575
+ "options" JSONB DEFAULT '{}',
576
+ "markScheme" JSONB DEFAULT '{}',
577
+ "points" INTEGER NOT NULL DEFAULT 0,
578
+ "order" INTEGER DEFAULT 0,
579
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
580
+ "updatedAt" TIMESTAMP(3) NOT NULL,
581
+
582
+ CONSTRAINT "WorksheetQuestion_pkey" PRIMARY KEY ("id")
583
+ );
584
+
585
+ -- CreateTable
586
+ CREATE TABLE "StudentWorksheetResponse" (
587
+ "id" TEXT NOT NULL,
588
+ "studentId" TEXT NOT NULL,
589
+ "worksheetId" TEXT NOT NULL,
590
+ "submissionId" TEXT,
591
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
592
+ "updatedAt" TIMESTAMP(3) NOT NULL,
593
+ "submittedAt" TIMESTAMP(3),
594
+ "submitted" BOOLEAN NOT NULL DEFAULT false,
595
+
596
+ CONSTRAINT "StudentWorksheetResponse_pkey" PRIMARY KEY ("id")
597
+ );
598
+
599
+ -- CreateTable
600
+ CREATE TABLE "StudentQuestionProgress" (
601
+ "id" TEXT NOT NULL,
602
+ "studentId" TEXT NOT NULL,
603
+ "questionId" TEXT NOT NULL,
604
+ "response" TEXT NOT NULL,
605
+ "isCorrect" BOOLEAN NOT NULL DEFAULT false,
606
+ "markschemeState" JSONB DEFAULT '{}',
607
+ "points" INTEGER NOT NULL DEFAULT 0,
608
+ "feedback" TEXT,
609
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
610
+ "updatedAt" TIMESTAMP(3),
611
+ "studentWorksheetResponseId" TEXT,
612
+ "status" "JobStatus" DEFAULT 'NOT_STARTED',
613
+ "runJobId" TEXT,
614
+
615
+ CONSTRAINT "StudentQuestionProgress_pkey" PRIMARY KEY ("id")
616
+ );
617
+
618
+ -- CreateTable
619
+ CREATE TABLE "SchoolDevelopementProgram" (
620
+ "id" TEXT NOT NULL,
621
+ "name" TEXT NOT NULL,
622
+ "type" TEXT NOT NULL,
623
+ "address" TEXT NOT NULL,
624
+ "city" TEXT NOT NULL,
625
+ "country" TEXT NOT NULL,
626
+ "numberOfStudents" INTEGER NOT NULL,
627
+ "numberOfTeachers" INTEGER NOT NULL,
628
+ "website" TEXT,
629
+ "contactName" TEXT,
630
+ "contactRole" TEXT,
631
+ "contactEmail" TEXT,
632
+ "contactPhone" TEXT DEFAULT '',
633
+ "eligibilityInformation" TEXT,
634
+ "whyHelp" TEXT,
635
+ "additionalInformation" TEXT,
636
+ "submittedAt" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
637
+ "reviewedAt" TIMESTAMP(3),
638
+ "status" TEXT NOT NULL DEFAULT 'NOT_STARTED',
639
+
640
+ CONSTRAINT "SchoolDevelopementProgram_pkey" PRIMARY KEY ("id")
641
+ );
642
+
643
+ -- CreateTable
644
+ CREATE TABLE "EarlyAccessRequest" (
645
+ "id" TEXT NOT NULL,
646
+ "email" TEXT NOT NULL,
647
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
648
+ "institutionSize" TEXT NOT NULL,
649
+
650
+ CONSTRAINT "EarlyAccessRequest_pkey" PRIMARY KEY ("id")
651
+ );
652
+
653
+ -- CreateTable
654
+ CREATE TABLE "Embedding" (
655
+ "id" TEXT NOT NULL,
656
+ "classId" TEXT NOT NULL,
657
+ "sourceType" "EmbeddingSourceType" NOT NULL,
658
+ "sourceId" TEXT NOT NULL,
659
+ "content" TEXT NOT NULL,
660
+ "vector" vector(1536) NOT NULL,
661
+ "metadata" JSONB DEFAULT '{}',
662
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
663
+
664
+ CONSTRAINT "Embedding_pkey" PRIMARY KEY ("id")
665
+ );
666
+
667
+ -- CreateTable
668
+ CREATE TABLE "RunJob" (
669
+ "id" TEXT NOT NULL,
670
+ "type" "RunJobType" NOT NULL,
671
+ "status" "RunJobStatus" NOT NULL DEFAULT 'PENDING',
672
+ "classId" TEXT,
673
+ "userId" TEXT,
674
+ "bullJobId" TEXT,
675
+ "input" JSONB NOT NULL,
676
+ "result" JSONB,
677
+ "error" TEXT,
678
+ "attempts" INTEGER NOT NULL DEFAULT 0,
679
+ "startedAt" TIMESTAMP(3),
680
+ "finishedAt" TIMESTAMP(3),
681
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
682
+ "updatedAt" TIMESTAMP(3) NOT NULL,
683
+
684
+ CONSTRAINT "RunJob_pkey" PRIMARY KEY ("id")
685
+ );
686
+
687
+ -- CreateTable
688
+ CREATE TABLE "Permission" (
689
+ "id" TEXT NOT NULL,
690
+ "folderId" TEXT NOT NULL,
691
+ "principalType" "PermissionPrincipalType" NOT NULL,
692
+ "userId" TEXT,
693
+ "tagId" TEXT,
694
+ "classId" TEXT,
695
+ "departmentId" TEXT,
696
+ "schoolId" TEXT,
697
+ "level" "PermissionLevel" NOT NULL,
698
+ "grantedById" TEXT NOT NULL,
699
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
700
+
701
+ CONSTRAINT "Permission_pkey" PRIMARY KEY ("id")
702
+ );
703
+
704
+ -- CreateTable
705
+ CREATE TABLE "_UserDepartments" (
706
+ "A" TEXT NOT NULL,
707
+ "B" TEXT NOT NULL,
708
+
709
+ CONSTRAINT "_UserDepartments_AB_pkey" PRIMARY KEY ("A","B")
710
+ );
711
+
712
+ -- CreateTable
713
+ CREATE TABLE "_UserTags" (
714
+ "A" TEXT NOT NULL,
715
+ "B" TEXT NOT NULL,
716
+
717
+ CONSTRAINT "_UserTags_AB_pkey" PRIMARY KEY ("A","B")
718
+ );
719
+
720
+ -- CreateTable
721
+ CREATE TABLE "_UserStudentToClass" (
722
+ "A" TEXT NOT NULL,
723
+ "B" TEXT NOT NULL,
724
+
725
+ CONSTRAINT "_UserStudentToClass_AB_pkey" PRIMARY KEY ("A","B")
726
+ );
727
+
728
+ -- CreateTable
729
+ CREATE TABLE "_UserTeacherToClass" (
730
+ "A" TEXT NOT NULL,
731
+ "B" TEXT NOT NULL,
732
+
733
+ CONSTRAINT "_UserTeacherToClass_AB_pkey" PRIMARY KEY ("A","B")
734
+ );
735
+
736
+ -- CreateTable
737
+ CREATE TABLE "_ClassTags" (
738
+ "A" TEXT NOT NULL,
739
+ "B" TEXT NOT NULL,
740
+
741
+ CONSTRAINT "_ClassTags_AB_pkey" PRIMARY KEY ("A","B")
742
+ );
743
+
744
+ -- CreateTable
745
+ CREATE TABLE "_MarkSchemeTags" (
746
+ "A" TEXT NOT NULL,
747
+ "B" TEXT NOT NULL,
748
+
749
+ CONSTRAINT "_MarkSchemeTags_AB_pkey" PRIMARY KEY ("A","B")
750
+ );
751
+
752
+ -- CreateTable
753
+ CREATE TABLE "_GradingBoundaryTags" (
754
+ "A" TEXT NOT NULL,
755
+ "B" TEXT NOT NULL,
756
+
757
+ CONSTRAINT "_GradingBoundaryTags_AB_pkey" PRIMARY KEY ("A","B")
758
+ );
759
+
760
+ -- CreateTable
761
+ CREATE TABLE "_SpecificAssignmentAssignedTo" (
762
+ "A" TEXT NOT NULL,
763
+ "B" TEXT NOT NULL,
764
+
765
+ CONSTRAINT "_SpecificAssignmentAssignedTo_AB_pkey" PRIMARY KEY ("A","B")
766
+ );
767
+
768
+ -- CreateTable
769
+ CREATE TABLE "_AssignmentWorksheets" (
770
+ "A" TEXT NOT NULL,
771
+ "B" TEXT NOT NULL,
772
+
773
+ CONSTRAINT "_AssignmentWorksheets_AB_pkey" PRIMARY KEY ("A","B")
774
+ );
775
+
776
+ -- CreateTable
777
+ CREATE TABLE "_DiscussionToTag" (
778
+ "A" TEXT NOT NULL,
779
+ "B" TEXT NOT NULL,
780
+
781
+ CONSTRAINT "_DiscussionToTag_AB_pkey" PRIMARY KEY ("A","B")
782
+ );
783
+
784
+ -- CreateTable
785
+ CREATE TABLE "_PresentAttendance" (
786
+ "A" TEXT NOT NULL,
787
+ "B" TEXT NOT NULL,
788
+
789
+ CONSTRAINT "_PresentAttendance_AB_pkey" PRIMARY KEY ("A","B")
790
+ );
791
+
792
+ -- CreateTable
793
+ CREATE TABLE "_LateAttendance" (
794
+ "A" TEXT NOT NULL,
795
+ "B" TEXT NOT NULL,
796
+
797
+ CONSTRAINT "_LateAttendance_AB_pkey" PRIMARY KEY ("A","B")
798
+ );
799
+
800
+ -- CreateTable
801
+ CREATE TABLE "_AbsentAttendance" (
802
+ "A" TEXT NOT NULL,
803
+ "B" TEXT NOT NULL,
804
+
805
+ CONSTRAINT "_AbsentAttendance_AB_pkey" PRIMARY KEY ("A","B")
806
+ );
807
+
808
+ -- CreateIndex
809
+ CREATE UNIQUE INDEX "School_subdomain_key" ON "School"("subdomain");
810
+
811
+ -- CreateIndex
812
+ CREATE INDEX "Department_schoolId_idx" ON "Department"("schoolId");
813
+
814
+ -- CreateIndex
815
+ CREATE UNIQUE INDEX "Department_schoolId_name_key" ON "Department"("schoolId", "name");
816
+
817
+ -- CreateIndex
818
+ CREATE INDEX "Tag_schoolId_idx" ON "Tag"("schoolId");
819
+
820
+ -- CreateIndex
821
+ CREATE INDEX "Tag_departmentId_idx" ON "Tag"("departmentId");
822
+
823
+ -- CreateIndex
824
+ CREATE UNIQUE INDEX "Tag_schoolId_name_key" ON "Tag"("schoolId", "name");
825
+
826
+ -- CreateIndex
827
+ CREATE INDEX "SchoolMembership_userId_idx" ON "SchoolMembership"("userId");
828
+
829
+ -- CreateIndex
830
+ CREATE INDEX "SchoolMembership_schoolId_role_idx" ON "SchoolMembership"("schoolId", "role");
831
+
832
+ -- CreateIndex
833
+ CREATE INDEX "SchoolMembership_schoolId_status_idx" ON "SchoolMembership"("schoolId", "status");
834
+
835
+ -- CreateIndex
836
+ CREATE UNIQUE INDEX "SchoolMembership_schoolId_userId_key" ON "SchoolMembership"("schoolId", "userId");
837
+
838
+ -- CreateIndex
839
+ CREATE UNIQUE INDEX "SchoolInvite_token_key" ON "SchoolInvite"("token");
840
+
841
+ -- CreateIndex
842
+ CREATE INDEX "SchoolInvite_schoolId_status_idx" ON "SchoolInvite"("schoolId", "status");
843
+
844
+ -- CreateIndex
845
+ CREATE INDEX "SchoolInvite_email_idx" ON "SchoolInvite"("email");
846
+
847
+ -- CreateIndex
848
+ CREATE UNIQUE INDEX "UserProfile_userId_key" ON "UserProfile"("userId");
849
+
850
+ -- CreateIndex
851
+ CREATE INDEX "Class_schoolId_idx" ON "Class"("schoolId");
852
+
853
+ -- CreateIndex
854
+ CREATE INDEX "Class_departmentId_idx" ON "Class"("departmentId");
855
+
856
+ -- CreateIndex
857
+ CREATE INDEX "MarkScheme_classId_idx" ON "MarkScheme"("classId");
858
+
859
+ -- CreateIndex
860
+ CREATE INDEX "MarkScheme_departmentId_idx" ON "MarkScheme"("departmentId");
861
+
862
+ -- CreateIndex
863
+ CREATE INDEX "GradingBoundary_classId_idx" ON "GradingBoundary"("classId");
864
+
865
+ -- CreateIndex
866
+ CREATE INDEX "GradingBoundary_departmentId_idx" ON "GradingBoundary"("departmentId");
867
+
868
+ -- CreateIndex
869
+ CREATE UNIQUE INDEX "Folder_classId_key" ON "Folder"("classId");
870
+
871
+ -- CreateIndex
872
+ CREATE UNIQUE INDEX "Folder_schoolStorageId_key" ON "Folder"("schoolStorageId");
873
+
874
+ -- CreateIndex
875
+ CREATE UNIQUE INDEX "Folder_personalOwnerId_key" ON "Folder"("personalOwnerId");
876
+
877
+ -- CreateIndex
878
+ CREATE UNIQUE INDEX "File_thumbnailId_key" ON "File"("thumbnailId");
879
+
880
+ -- CreateIndex
881
+ CREATE INDEX "Comment_assignmentId_idx" ON "Comment"("assignmentId");
882
+
883
+ -- CreateIndex
884
+ CREATE INDEX "Comment_submissionId_idx" ON "Comment"("submissionId");
885
+
886
+ -- CreateIndex
887
+ CREATE INDEX "Discussion_classId_isPinned_lastActivityAt_idx" ON "Discussion"("classId", "isPinned", "lastActivityAt");
888
+
889
+ -- CreateIndex
890
+ CREATE INDEX "Discussion_classId_createdAt_idx" ON "Discussion"("classId", "createdAt");
891
+
892
+ -- CreateIndex
893
+ CREATE INDEX "DiscussionReply_discussionId_createdAt_idx" ON "DiscussionReply"("discussionId", "createdAt");
894
+
895
+ -- CreateIndex
896
+ CREATE INDEX "DiscussionReply_parentId_idx" ON "DiscussionReply"("parentId");
897
+
898
+ -- CreateIndex
899
+ CREATE UNIQUE INDEX "DiscussionTag_classId_name_key" ON "DiscussionTag"("classId", "name");
900
+
901
+ -- CreateIndex
902
+ CREATE INDEX "DiscussionRead_userId_idx" ON "DiscussionRead"("userId");
903
+
904
+ -- CreateIndex
905
+ CREATE INDEX "Reaction_announcementId_idx" ON "Reaction"("announcementId");
906
+
907
+ -- CreateIndex
908
+ CREATE INDEX "Reaction_commentId_idx" ON "Reaction"("commentId");
909
+
910
+ -- CreateIndex
911
+ CREATE INDEX "Reaction_discussionId_idx" ON "Reaction"("discussionId");
912
+
913
+ -- CreateIndex
914
+ CREATE INDEX "Reaction_discussionReplyId_idx" ON "Reaction"("discussionReplyId");
915
+
916
+ -- CreateIndex
917
+ CREATE UNIQUE INDEX "Reaction_userId_announcementId_key" ON "Reaction"("userId", "announcementId");
918
+
919
+ -- CreateIndex
920
+ CREATE UNIQUE INDEX "Reaction_userId_commentId_key" ON "Reaction"("userId", "commentId");
921
+
922
+ -- CreateIndex
923
+ CREATE UNIQUE INDEX "Reaction_userId_discussionId_key" ON "Reaction"("userId", "discussionId");
924
+
925
+ -- CreateIndex
926
+ CREATE UNIQUE INDEX "Reaction_userId_discussionReplyId_key" ON "Reaction"("userId", "discussionReplyId");
927
+
928
+ -- CreateIndex
929
+ CREATE INDEX "Submission_studentId_recommendationState_idx" ON "Submission"("studentId", "recommendationState");
930
+
931
+ -- CreateIndex
932
+ CREATE UNIQUE INDEX "NewtonChat_conversationId_key" ON "NewtonChat"("conversationId");
933
+
934
+ -- CreateIndex
935
+ CREATE UNIQUE INDEX "LabChat_conversationId_key" ON "LabChat"("conversationId");
936
+
937
+ -- CreateIndex
938
+ CREATE UNIQUE INDEX "ConversationMember_userId_conversationId_key" ON "ConversationMember"("userId", "conversationId");
939
+
940
+ -- CreateIndex
941
+ CREATE INDEX "Message_runJobId_idx" ON "Message"("runJobId");
942
+
943
+ -- CreateIndex
944
+ CREATE INDEX "AiUsageLog_reason_createdAt_idx" ON "AiUsageLog"("reason", "createdAt");
945
+
946
+ -- CreateIndex
947
+ CREATE UNIQUE INDEX "Mention_messageId_userId_key" ON "Mention"("messageId", "userId");
948
+
949
+ -- CreateIndex
950
+ CREATE UNIQUE INDEX "Worksheet_classId_sourceUrl_key" ON "Worksheet"("classId", "sourceUrl");
951
+
952
+ -- CreateIndex
953
+ CREATE INDEX "StudentQuestionProgress_studentId_questionId_idx" ON "StudentQuestionProgress"("studentId", "questionId");
954
+
955
+ -- CreateIndex
956
+ CREATE INDEX "StudentQuestionProgress_runJobId_idx" ON "StudentQuestionProgress"("runJobId");
957
+
958
+ -- CreateIndex
959
+ CREATE INDEX "Embedding_classId_idx" ON "Embedding"("classId");
960
+
961
+ -- CreateIndex
962
+ CREATE INDEX "Embedding_sourceType_sourceId_idx" ON "Embedding"("sourceType", "sourceId");
963
+
964
+ -- CreateIndex
965
+ CREATE INDEX "RunJob_userId_type_status_idx" ON "RunJob"("userId", "type", "status");
966
+
967
+ -- CreateIndex
968
+ CREATE INDEX "RunJob_classId_status_idx" ON "RunJob"("classId", "status");
969
+
970
+ -- CreateIndex
971
+ CREATE INDEX "RunJob_status_createdAt_idx" ON "RunJob"("status", "createdAt");
972
+
973
+ -- CreateIndex
974
+ CREATE INDEX "Permission_folderId_idx" ON "Permission"("folderId");
975
+
976
+ -- CreateIndex
977
+ CREATE INDEX "Permission_userId_idx" ON "Permission"("userId");
978
+
979
+ -- CreateIndex
980
+ CREATE INDEX "Permission_tagId_idx" ON "Permission"("tagId");
981
+
982
+ -- CreateIndex
983
+ CREATE INDEX "Permission_classId_idx" ON "Permission"("classId");
984
+
985
+ -- CreateIndex
986
+ CREATE INDEX "Permission_departmentId_idx" ON "Permission"("departmentId");
987
+
988
+ -- CreateIndex
989
+ CREATE INDEX "Permission_schoolId_idx" ON "Permission"("schoolId");
990
+
991
+ -- CreateIndex
992
+ CREATE UNIQUE INDEX "Permission_folderId_principalType_userId_tagId_classId_depa_key" ON "Permission"("folderId", "principalType", "userId", "tagId", "classId", "departmentId", "schoolId");
993
+
994
+ -- CreateIndex
995
+ CREATE INDEX "_UserDepartments_B_index" ON "_UserDepartments"("B");
996
+
997
+ -- CreateIndex
998
+ CREATE INDEX "_UserTags_B_index" ON "_UserTags"("B");
999
+
1000
+ -- CreateIndex
1001
+ CREATE INDEX "_UserStudentToClass_B_index" ON "_UserStudentToClass"("B");
1002
+
1003
+ -- CreateIndex
1004
+ CREATE INDEX "_UserTeacherToClass_B_index" ON "_UserTeacherToClass"("B");
1005
+
1006
+ -- CreateIndex
1007
+ CREATE INDEX "_ClassTags_B_index" ON "_ClassTags"("B");
1008
+
1009
+ -- CreateIndex
1010
+ CREATE INDEX "_MarkSchemeTags_B_index" ON "_MarkSchemeTags"("B");
1011
+
1012
+ -- CreateIndex
1013
+ CREATE INDEX "_GradingBoundaryTags_B_index" ON "_GradingBoundaryTags"("B");
1014
+
1015
+ -- CreateIndex
1016
+ CREATE INDEX "_SpecificAssignmentAssignedTo_B_index" ON "_SpecificAssignmentAssignedTo"("B");
1017
+
1018
+ -- CreateIndex
1019
+ CREATE INDEX "_AssignmentWorksheets_B_index" ON "_AssignmentWorksheets"("B");
1020
+
1021
+ -- CreateIndex
1022
+ CREATE INDEX "_DiscussionToTag_B_index" ON "_DiscussionToTag"("B");
1023
+
1024
+ -- CreateIndex
1025
+ CREATE INDEX "_PresentAttendance_B_index" ON "_PresentAttendance"("B");
1026
+
1027
+ -- CreateIndex
1028
+ CREATE INDEX "_LateAttendance_B_index" ON "_LateAttendance"("B");
1029
+
1030
+ -- CreateIndex
1031
+ CREATE INDEX "_AbsentAttendance_B_index" ON "_AbsentAttendance"("B");
1032
+
1033
+ -- AddForeignKey
1034
+ ALTER TABLE "School" ADD CONSTRAINT "School_logoId_fkey" FOREIGN KEY ("logoId") REFERENCES "File"("id") ON DELETE SET NULL ON UPDATE CASCADE;
1035
+
1036
+ -- AddForeignKey
1037
+ ALTER TABLE "Department" ADD CONSTRAINT "Department_schoolId_fkey" FOREIGN KEY ("schoolId") REFERENCES "School"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1038
+
1039
+ -- AddForeignKey
1040
+ ALTER TABLE "Tag" ADD CONSTRAINT "Tag_schoolId_fkey" FOREIGN KEY ("schoolId") REFERENCES "School"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1041
+
1042
+ -- AddForeignKey
1043
+ ALTER TABLE "Tag" ADD CONSTRAINT "Tag_departmentId_fkey" FOREIGN KEY ("departmentId") REFERENCES "Department"("id") ON DELETE SET NULL ON UPDATE CASCADE;
1044
+
1045
+ -- AddForeignKey
1046
+ ALTER TABLE "User" ADD CONSTRAINT "User_schoolId_fkey" FOREIGN KEY ("schoolId") REFERENCES "School"("id") ON DELETE SET NULL ON UPDATE CASCADE;
1047
+
1048
+ -- AddForeignKey
1049
+ ALTER TABLE "SchoolMembership" ADD CONSTRAINT "SchoolMembership_schoolId_fkey" FOREIGN KEY ("schoolId") REFERENCES "School"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1050
+
1051
+ -- AddForeignKey
1052
+ ALTER TABLE "SchoolMembership" ADD CONSTRAINT "SchoolMembership_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1053
+
1054
+ -- AddForeignKey
1055
+ ALTER TABLE "SchoolInvite" ADD CONSTRAINT "SchoolInvite_schoolId_fkey" FOREIGN KEY ("schoolId") REFERENCES "School"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1056
+
1057
+ -- AddForeignKey
1058
+ ALTER TABLE "SchoolInvite" ADD CONSTRAINT "SchoolInvite_invitedById_fkey" FOREIGN KEY ("invitedById") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1059
+
1060
+ -- AddForeignKey
1061
+ ALTER TABLE "UserProfile" ADD CONSTRAINT "UserProfile_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1062
+
1063
+ -- AddForeignKey
1064
+ ALTER TABLE "Class" ADD CONSTRAINT "Class_schoolId_fkey" FOREIGN KEY ("schoolId") REFERENCES "School"("id") ON DELETE SET NULL ON UPDATE CASCADE;
1065
+
1066
+ -- AddForeignKey
1067
+ ALTER TABLE "Class" ADD CONSTRAINT "Class_departmentId_fkey" FOREIGN KEY ("departmentId") REFERENCES "Department"("id") ON DELETE SET NULL ON UPDATE CASCADE;
1068
+
1069
+ -- AddForeignKey
1070
+ ALTER TABLE "MarkScheme" ADD CONSTRAINT "MarkScheme_classId_fkey" FOREIGN KEY ("classId") REFERENCES "Class"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1071
+
1072
+ -- AddForeignKey
1073
+ ALTER TABLE "MarkScheme" ADD CONSTRAINT "MarkScheme_departmentId_fkey" FOREIGN KEY ("departmentId") REFERENCES "Department"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1074
+
1075
+ -- AddForeignKey
1076
+ ALTER TABLE "GradingBoundary" ADD CONSTRAINT "GradingBoundary_classId_fkey" FOREIGN KEY ("classId") REFERENCES "Class"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1077
+
1078
+ -- AddForeignKey
1079
+ ALTER TABLE "GradingBoundary" ADD CONSTRAINT "GradingBoundary_departmentId_fkey" FOREIGN KEY ("departmentId") REFERENCES "Department"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1080
+
1081
+ -- AddForeignKey
1082
+ ALTER TABLE "Folder" ADD CONSTRAINT "Folder_parentFolderId_fkey" FOREIGN KEY ("parentFolderId") REFERENCES "Folder"("id") ON DELETE SET NULL ON UPDATE CASCADE;
1083
+
1084
+ -- AddForeignKey
1085
+ ALTER TABLE "Folder" ADD CONSTRAINT "Folder_classId_fkey" FOREIGN KEY ("classId") REFERENCES "Class"("id") ON DELETE SET NULL ON UPDATE CASCADE;
1086
+
1087
+ -- AddForeignKey
1088
+ ALTER TABLE "Folder" ADD CONSTRAINT "Folder_schoolStorageId_fkey" FOREIGN KEY ("schoolStorageId") REFERENCES "School"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1089
+
1090
+ -- AddForeignKey
1091
+ ALTER TABLE "Folder" ADD CONSTRAINT "Folder_personalOwnerId_fkey" FOREIGN KEY ("personalOwnerId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1092
+
1093
+ -- AddForeignKey
1094
+ ALTER TABLE "File" ADD CONSTRAINT "File_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
1095
+
1096
+ -- AddForeignKey
1097
+ ALTER TABLE "File" ADD CONSTRAINT "File_thumbnailId_fkey" FOREIGN KEY ("thumbnailId") REFERENCES "File"("id") ON DELETE SET NULL ON UPDATE CASCADE;
1098
+
1099
+ -- AddForeignKey
1100
+ ALTER TABLE "File" ADD CONSTRAINT "File_assignmentId_fkey" FOREIGN KEY ("assignmentId") REFERENCES "Assignment"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1101
+
1102
+ -- AddForeignKey
1103
+ ALTER TABLE "File" ADD CONSTRAINT "File_submissionId_fkey" FOREIGN KEY ("submissionId") REFERENCES "Submission"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1104
+
1105
+ -- AddForeignKey
1106
+ ALTER TABLE "File" ADD CONSTRAINT "File_annotationId_fkey" FOREIGN KEY ("annotationId") REFERENCES "Submission"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1107
+
1108
+ -- AddForeignKey
1109
+ ALTER TABLE "File" ADD CONSTRAINT "File_classDraftId_fkey" FOREIGN KEY ("classDraftId") REFERENCES "Class"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1110
+
1111
+ -- AddForeignKey
1112
+ ALTER TABLE "File" ADD CONSTRAINT "File_folderId_fkey" FOREIGN KEY ("folderId") REFERENCES "Folder"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1113
+
1114
+ -- AddForeignKey
1115
+ ALTER TABLE "File" ADD CONSTRAINT "File_messageId_fkey" FOREIGN KEY ("messageId") REFERENCES "Message"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1116
+
1117
+ -- AddForeignKey
1118
+ ALTER TABLE "File" ADD CONSTRAINT "File_announcementId_fkey" FOREIGN KEY ("announcementId") REFERENCES "Announcement"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1119
+
1120
+ -- AddForeignKey
1121
+ ALTER TABLE "File" ADD CONSTRAINT "File_discussionId_fkey" FOREIGN KEY ("discussionId") REFERENCES "Discussion"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1122
+
1123
+ -- AddForeignKey
1124
+ ALTER TABLE "File" ADD CONSTRAINT "File_discussionReplyId_fkey" FOREIGN KEY ("discussionReplyId") REFERENCES "DiscussionReply"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1125
+
1126
+ -- AddForeignKey
1127
+ ALTER TABLE "File" ADD CONSTRAINT "File_schoolDevelopementProgramId_fkey" FOREIGN KEY ("schoolDevelopementProgramId") REFERENCES "SchoolDevelopementProgram"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1128
+
1129
+ -- AddForeignKey
1130
+ ALTER TABLE "Assignment" ADD CONSTRAINT "Assignment_teacherId_fkey" FOREIGN KEY ("teacherId") REFERENCES "User"("id") ON DELETE NO ACTION ON UPDATE CASCADE;
1131
+
1132
+ -- AddForeignKey
1133
+ ALTER TABLE "Assignment" ADD CONSTRAINT "Assignment_classId_fkey" FOREIGN KEY ("classId") REFERENCES "Class"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1134
+
1135
+ -- AddForeignKey
1136
+ ALTER TABLE "Assignment" ADD CONSTRAINT "Assignment_sectionId_fkey" FOREIGN KEY ("sectionId") REFERENCES "Section"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1137
+
1138
+ -- AddForeignKey
1139
+ ALTER TABLE "Assignment" ADD CONSTRAINT "Assignment_eventId_fkey" FOREIGN KEY ("eventId") REFERENCES "Event"("id") ON DELETE NO ACTION ON UPDATE CASCADE;
1140
+
1141
+ -- AddForeignKey
1142
+ ALTER TABLE "Assignment" ADD CONSTRAINT "Assignment_markSchemeId_fkey" FOREIGN KEY ("markSchemeId") REFERENCES "MarkScheme"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1143
+
1144
+ -- AddForeignKey
1145
+ ALTER TABLE "Assignment" ADD CONSTRAINT "Assignment_gradingBoundaryId_fkey" FOREIGN KEY ("gradingBoundaryId") REFERENCES "GradingBoundary"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1146
+
1147
+ -- AddForeignKey
1148
+ ALTER TABLE "Announcement" ADD CONSTRAINT "Announcement_teacherId_fkey" FOREIGN KEY ("teacherId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
1149
+
1150
+ -- AddForeignKey
1151
+ ALTER TABLE "Announcement" ADD CONSTRAINT "Announcement_classId_fkey" FOREIGN KEY ("classId") REFERENCES "Class"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1152
+
1153
+ -- AddForeignKey
1154
+ ALTER TABLE "Comment" ADD CONSTRAINT "Comment_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1155
+
1156
+ -- AddForeignKey
1157
+ ALTER TABLE "Comment" ADD CONSTRAINT "Comment_announcementId_fkey" FOREIGN KEY ("announcementId") REFERENCES "Announcement"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1158
+
1159
+ -- AddForeignKey
1160
+ ALTER TABLE "Comment" ADD CONSTRAINT "Comment_assignmentId_fkey" FOREIGN KEY ("assignmentId") REFERENCES "Assignment"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1161
+
1162
+ -- AddForeignKey
1163
+ ALTER TABLE "Comment" ADD CONSTRAINT "Comment_submissionId_fkey" FOREIGN KEY ("submissionId") REFERENCES "Submission"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1164
+
1165
+ -- AddForeignKey
1166
+ ALTER TABLE "Comment" ADD CONSTRAINT "Comment_parentCommentId_fkey" FOREIGN KEY ("parentCommentId") REFERENCES "Comment"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1167
+
1168
+ -- AddForeignKey
1169
+ ALTER TABLE "Comment" ADD CONSTRAINT "Comment_studentQuestionProgressId_fkey" FOREIGN KEY ("studentQuestionProgressId") REFERENCES "StudentQuestionProgress"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1170
+
1171
+ -- AddForeignKey
1172
+ ALTER TABLE "Discussion" ADD CONSTRAINT "Discussion_classId_fkey" FOREIGN KEY ("classId") REFERENCES "Class"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1173
+
1174
+ -- AddForeignKey
1175
+ ALTER TABLE "Discussion" ADD CONSTRAINT "Discussion_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1176
+
1177
+ -- AddForeignKey
1178
+ ALTER TABLE "DiscussionReply" ADD CONSTRAINT "DiscussionReply_discussionId_fkey" FOREIGN KEY ("discussionId") REFERENCES "Discussion"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1179
+
1180
+ -- AddForeignKey
1181
+ ALTER TABLE "DiscussionReply" ADD CONSTRAINT "DiscussionReply_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1182
+
1183
+ -- AddForeignKey
1184
+ ALTER TABLE "DiscussionReply" ADD CONSTRAINT "DiscussionReply_parentId_fkey" FOREIGN KEY ("parentId") REFERENCES "DiscussionReply"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1185
+
1186
+ -- AddForeignKey
1187
+ ALTER TABLE "DiscussionTag" ADD CONSTRAINT "DiscussionTag_classId_fkey" FOREIGN KEY ("classId") REFERENCES "Class"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1188
+
1189
+ -- AddForeignKey
1190
+ ALTER TABLE "DiscussionRead" ADD CONSTRAINT "DiscussionRead_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1191
+
1192
+ -- AddForeignKey
1193
+ ALTER TABLE "DiscussionRead" ADD CONSTRAINT "DiscussionRead_discussionId_fkey" FOREIGN KEY ("discussionId") REFERENCES "Discussion"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1194
+
1195
+ -- AddForeignKey
1196
+ ALTER TABLE "Reaction" ADD CONSTRAINT "Reaction_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1197
+
1198
+ -- AddForeignKey
1199
+ ALTER TABLE "Reaction" ADD CONSTRAINT "Reaction_announcementId_fkey" FOREIGN KEY ("announcementId") REFERENCES "Announcement"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1200
+
1201
+ -- AddForeignKey
1202
+ ALTER TABLE "Reaction" ADD CONSTRAINT "Reaction_commentId_fkey" FOREIGN KEY ("commentId") REFERENCES "Comment"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1203
+
1204
+ -- AddForeignKey
1205
+ ALTER TABLE "Reaction" ADD CONSTRAINT "Reaction_discussionId_fkey" FOREIGN KEY ("discussionId") REFERENCES "Discussion"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1206
+
1207
+ -- AddForeignKey
1208
+ ALTER TABLE "Reaction" ADD CONSTRAINT "Reaction_discussionReplyId_fkey" FOREIGN KEY ("discussionReplyId") REFERENCES "DiscussionReply"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1209
+
1210
+ -- AddForeignKey
1211
+ ALTER TABLE "Submission" ADD CONSTRAINT "Submission_assignmentId_fkey" FOREIGN KEY ("assignmentId") REFERENCES "Assignment"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1212
+
1213
+ -- AddForeignKey
1214
+ ALTER TABLE "Submission" ADD CONSTRAINT "Submission_studentId_fkey" FOREIGN KEY ("studentId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
1215
+
1216
+ -- AddForeignKey
1217
+ ALTER TABLE "Submission" ADD CONSTRAINT "Submission_targetedAssignmentId_fkey" FOREIGN KEY ("targetedAssignmentId") REFERENCES "Assignment"("id") ON DELETE SET NULL ON UPDATE CASCADE;
1218
+
1219
+ -- AddForeignKey
1220
+ ALTER TABLE "NewtonChat" ADD CONSTRAINT "NewtonChat_submissionId_fkey" FOREIGN KEY ("submissionId") REFERENCES "Submission"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1221
+
1222
+ -- AddForeignKey
1223
+ ALTER TABLE "NewtonChat" ADD CONSTRAINT "NewtonChat_conversationId_fkey" FOREIGN KEY ("conversationId") REFERENCES "Conversation"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1224
+
1225
+ -- AddForeignKey
1226
+ ALTER TABLE "Section" ADD CONSTRAINT "Section_classId_fkey" FOREIGN KEY ("classId") REFERENCES "Class"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1227
+
1228
+ -- AddForeignKey
1229
+ ALTER TABLE "Session" ADD CONSTRAINT "Session_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE NO ACTION ON UPDATE CASCADE;
1230
+
1231
+ -- AddForeignKey
1232
+ ALTER TABLE "Session" ADD CONSTRAINT "Session_classId_fkey" FOREIGN KEY ("classId") REFERENCES "Class"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1233
+
1234
+ -- AddForeignKey
1235
+ ALTER TABLE "Event" ADD CONSTRAINT "Event_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1236
+
1237
+ -- AddForeignKey
1238
+ ALTER TABLE "Event" ADD CONSTRAINT "Event_classId_fkey" FOREIGN KEY ("classId") REFERENCES "Class"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1239
+
1240
+ -- AddForeignKey
1241
+ ALTER TABLE "Attendance" ADD CONSTRAINT "Attendance_classId_fkey" FOREIGN KEY ("classId") REFERENCES "Class"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1242
+
1243
+ -- AddForeignKey
1244
+ ALTER TABLE "Attendance" ADD CONSTRAINT "Attendance_eventId_fkey" FOREIGN KEY ("eventId") REFERENCES "Event"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1245
+
1246
+ -- AddForeignKey
1247
+ ALTER TABLE "Notification" ADD CONSTRAINT "Notification_senderId_fkey" FOREIGN KEY ("senderId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
1248
+
1249
+ -- AddForeignKey
1250
+ ALTER TABLE "Notification" ADD CONSTRAINT "Notification_receiverId_fkey" FOREIGN KEY ("receiverId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1251
+
1252
+ -- AddForeignKey
1253
+ ALTER TABLE "LabChat" ADD CONSTRAINT "LabChat_classId_fkey" FOREIGN KEY ("classId") REFERENCES "Class"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1254
+
1255
+ -- AddForeignKey
1256
+ ALTER TABLE "LabChat" ADD CONSTRAINT "LabChat_conversationId_fkey" FOREIGN KEY ("conversationId") REFERENCES "Conversation"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1257
+
1258
+ -- AddForeignKey
1259
+ ALTER TABLE "LabChat" ADD CONSTRAINT "LabChat_createdById_fkey" FOREIGN KEY ("createdById") REFERENCES "User"("id") ON DELETE NO ACTION ON UPDATE CASCADE;
1260
+
1261
+ -- AddForeignKey
1262
+ ALTER TABLE "ConversationMember" ADD CONSTRAINT "ConversationMember_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1263
+
1264
+ -- AddForeignKey
1265
+ ALTER TABLE "ConversationMember" ADD CONSTRAINT "ConversationMember_conversationId_fkey" FOREIGN KEY ("conversationId") REFERENCES "Conversation"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1266
+
1267
+ -- AddForeignKey
1268
+ ALTER TABLE "Message" ADD CONSTRAINT "Message_runJobId_fkey" FOREIGN KEY ("runJobId") REFERENCES "RunJob"("id") ON DELETE SET NULL ON UPDATE CASCADE;
1269
+
1270
+ -- AddForeignKey
1271
+ ALTER TABLE "Message" ADD CONSTRAINT "Message_senderId_fkey" FOREIGN KEY ("senderId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1272
+
1273
+ -- AddForeignKey
1274
+ ALTER TABLE "Message" ADD CONSTRAINT "Message_conversationId_fkey" FOREIGN KEY ("conversationId") REFERENCES "Conversation"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1275
+
1276
+ -- AddForeignKey
1277
+ ALTER TABLE "Mention" ADD CONSTRAINT "Mention_messageId_fkey" FOREIGN KEY ("messageId") REFERENCES "Message"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1278
+
1279
+ -- AddForeignKey
1280
+ ALTER TABLE "Mention" ADD CONSTRAINT "Mention_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1281
+
1282
+ -- AddForeignKey
1283
+ ALTER TABLE "Worksheet" ADD CONSTRAINT "Worksheet_classId_fkey" FOREIGN KEY ("classId") REFERENCES "Class"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1284
+
1285
+ -- AddForeignKey
1286
+ ALTER TABLE "Worksheet" ADD CONSTRAINT "Worksheet_runJobId_fkey" FOREIGN KEY ("runJobId") REFERENCES "RunJob"("id") ON DELETE SET NULL ON UPDATE CASCADE;
1287
+
1288
+ -- AddForeignKey
1289
+ ALTER TABLE "WorksheetQuestion" ADD CONSTRAINT "WorksheetQuestion_worksheetId_fkey" FOREIGN KEY ("worksheetId") REFERENCES "Worksheet"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1290
+
1291
+ -- AddForeignKey
1292
+ ALTER TABLE "StudentWorksheetResponse" ADD CONSTRAINT "StudentWorksheetResponse_studentId_fkey" FOREIGN KEY ("studentId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1293
+
1294
+ -- AddForeignKey
1295
+ ALTER TABLE "StudentWorksheetResponse" ADD CONSTRAINT "StudentWorksheetResponse_worksheetId_fkey" FOREIGN KEY ("worksheetId") REFERENCES "Worksheet"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1296
+
1297
+ -- AddForeignKey
1298
+ ALTER TABLE "StudentWorksheetResponse" ADD CONSTRAINT "StudentWorksheetResponse_submissionId_fkey" FOREIGN KEY ("submissionId") REFERENCES "Submission"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1299
+
1300
+ -- AddForeignKey
1301
+ ALTER TABLE "StudentQuestionProgress" ADD CONSTRAINT "StudentQuestionProgress_studentId_fkey" FOREIGN KEY ("studentId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1302
+
1303
+ -- AddForeignKey
1304
+ ALTER TABLE "StudentQuestionProgress" ADD CONSTRAINT "StudentQuestionProgress_questionId_fkey" FOREIGN KEY ("questionId") REFERENCES "WorksheetQuestion"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1305
+
1306
+ -- AddForeignKey
1307
+ ALTER TABLE "StudentQuestionProgress" ADD CONSTRAINT "StudentQuestionProgress_studentWorksheetResponseId_fkey" FOREIGN KEY ("studentWorksheetResponseId") REFERENCES "StudentWorksheetResponse"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1308
+
1309
+ -- AddForeignKey
1310
+ ALTER TABLE "StudentQuestionProgress" ADD CONSTRAINT "StudentQuestionProgress_runJobId_fkey" FOREIGN KEY ("runJobId") REFERENCES "RunJob"("id") ON DELETE SET NULL ON UPDATE CASCADE;
1311
+
1312
+ -- AddForeignKey
1313
+ ALTER TABLE "Embedding" ADD CONSTRAINT "Embedding_classId_fkey" FOREIGN KEY ("classId") REFERENCES "Class"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1314
+
1315
+ -- AddForeignKey
1316
+ ALTER TABLE "Permission" ADD CONSTRAINT "Permission_folderId_fkey" FOREIGN KEY ("folderId") REFERENCES "Folder"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1317
+
1318
+ -- AddForeignKey
1319
+ ALTER TABLE "Permission" ADD CONSTRAINT "Permission_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1320
+
1321
+ -- AddForeignKey
1322
+ ALTER TABLE "Permission" ADD CONSTRAINT "Permission_tagId_fkey" FOREIGN KEY ("tagId") REFERENCES "Tag"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1323
+
1324
+ -- AddForeignKey
1325
+ ALTER TABLE "Permission" ADD CONSTRAINT "Permission_classId_fkey" FOREIGN KEY ("classId") REFERENCES "Class"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1326
+
1327
+ -- AddForeignKey
1328
+ ALTER TABLE "Permission" ADD CONSTRAINT "Permission_departmentId_fkey" FOREIGN KEY ("departmentId") REFERENCES "Department"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1329
+
1330
+ -- AddForeignKey
1331
+ ALTER TABLE "Permission" ADD CONSTRAINT "Permission_schoolId_fkey" FOREIGN KEY ("schoolId") REFERENCES "School"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1332
+
1333
+ -- AddForeignKey
1334
+ ALTER TABLE "Permission" ADD CONSTRAINT "Permission_grantedById_fkey" FOREIGN KEY ("grantedById") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
1335
+
1336
+ -- AddForeignKey
1337
+ ALTER TABLE "_UserDepartments" ADD CONSTRAINT "_UserDepartments_A_fkey" FOREIGN KEY ("A") REFERENCES "Department"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1338
+
1339
+ -- AddForeignKey
1340
+ ALTER TABLE "_UserDepartments" ADD CONSTRAINT "_UserDepartments_B_fkey" FOREIGN KEY ("B") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1341
+
1342
+ -- AddForeignKey
1343
+ ALTER TABLE "_UserTags" ADD CONSTRAINT "_UserTags_A_fkey" FOREIGN KEY ("A") REFERENCES "Tag"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1344
+
1345
+ -- AddForeignKey
1346
+ ALTER TABLE "_UserTags" ADD CONSTRAINT "_UserTags_B_fkey" FOREIGN KEY ("B") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1347
+
1348
+ -- AddForeignKey
1349
+ ALTER TABLE "_UserStudentToClass" ADD CONSTRAINT "_UserStudentToClass_A_fkey" FOREIGN KEY ("A") REFERENCES "Class"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1350
+
1351
+ -- AddForeignKey
1352
+ ALTER TABLE "_UserStudentToClass" ADD CONSTRAINT "_UserStudentToClass_B_fkey" FOREIGN KEY ("B") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1353
+
1354
+ -- AddForeignKey
1355
+ ALTER TABLE "_UserTeacherToClass" ADD CONSTRAINT "_UserTeacherToClass_A_fkey" FOREIGN KEY ("A") REFERENCES "Class"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1356
+
1357
+ -- AddForeignKey
1358
+ ALTER TABLE "_UserTeacherToClass" ADD CONSTRAINT "_UserTeacherToClass_B_fkey" FOREIGN KEY ("B") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1359
+
1360
+ -- AddForeignKey
1361
+ ALTER TABLE "_ClassTags" ADD CONSTRAINT "_ClassTags_A_fkey" FOREIGN KEY ("A") REFERENCES "Class"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1362
+
1363
+ -- AddForeignKey
1364
+ ALTER TABLE "_ClassTags" ADD CONSTRAINT "_ClassTags_B_fkey" FOREIGN KEY ("B") REFERENCES "Tag"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1365
+
1366
+ -- AddForeignKey
1367
+ ALTER TABLE "_MarkSchemeTags" ADD CONSTRAINT "_MarkSchemeTags_A_fkey" FOREIGN KEY ("A") REFERENCES "MarkScheme"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1368
+
1369
+ -- AddForeignKey
1370
+ ALTER TABLE "_MarkSchemeTags" ADD CONSTRAINT "_MarkSchemeTags_B_fkey" FOREIGN KEY ("B") REFERENCES "Tag"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1371
+
1372
+ -- AddForeignKey
1373
+ ALTER TABLE "_GradingBoundaryTags" ADD CONSTRAINT "_GradingBoundaryTags_A_fkey" FOREIGN KEY ("A") REFERENCES "GradingBoundary"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1374
+
1375
+ -- AddForeignKey
1376
+ ALTER TABLE "_GradingBoundaryTags" ADD CONSTRAINT "_GradingBoundaryTags_B_fkey" FOREIGN KEY ("B") REFERENCES "Tag"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1377
+
1378
+ -- AddForeignKey
1379
+ ALTER TABLE "_SpecificAssignmentAssignedTo" ADD CONSTRAINT "_SpecificAssignmentAssignedTo_A_fkey" FOREIGN KEY ("A") REFERENCES "Assignment"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1380
+
1381
+ -- AddForeignKey
1382
+ ALTER TABLE "_SpecificAssignmentAssignedTo" ADD CONSTRAINT "_SpecificAssignmentAssignedTo_B_fkey" FOREIGN KEY ("B") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1383
+
1384
+ -- AddForeignKey
1385
+ ALTER TABLE "_AssignmentWorksheets" ADD CONSTRAINT "_AssignmentWorksheets_A_fkey" FOREIGN KEY ("A") REFERENCES "Assignment"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1386
+
1387
+ -- AddForeignKey
1388
+ ALTER TABLE "_AssignmentWorksheets" ADD CONSTRAINT "_AssignmentWorksheets_B_fkey" FOREIGN KEY ("B") REFERENCES "Worksheet"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1389
+
1390
+ -- AddForeignKey
1391
+ ALTER TABLE "_DiscussionToTag" ADD CONSTRAINT "_DiscussionToTag_A_fkey" FOREIGN KEY ("A") REFERENCES "Discussion"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1392
+
1393
+ -- AddForeignKey
1394
+ ALTER TABLE "_DiscussionToTag" ADD CONSTRAINT "_DiscussionToTag_B_fkey" FOREIGN KEY ("B") REFERENCES "DiscussionTag"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1395
+
1396
+ -- AddForeignKey
1397
+ ALTER TABLE "_PresentAttendance" ADD CONSTRAINT "_PresentAttendance_A_fkey" FOREIGN KEY ("A") REFERENCES "Attendance"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1398
+
1399
+ -- AddForeignKey
1400
+ ALTER TABLE "_PresentAttendance" ADD CONSTRAINT "_PresentAttendance_B_fkey" FOREIGN KEY ("B") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1401
+
1402
+ -- AddForeignKey
1403
+ ALTER TABLE "_LateAttendance" ADD CONSTRAINT "_LateAttendance_A_fkey" FOREIGN KEY ("A") REFERENCES "Attendance"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1404
+
1405
+ -- AddForeignKey
1406
+ ALTER TABLE "_LateAttendance" ADD CONSTRAINT "_LateAttendance_B_fkey" FOREIGN KEY ("B") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1407
+
1408
+ -- AddForeignKey
1409
+ ALTER TABLE "_AbsentAttendance" ADD CONSTRAINT "_AbsentAttendance_A_fkey" FOREIGN KEY ("A") REFERENCES "Attendance"("id") ON DELETE CASCADE ON UPDATE CASCADE;
1410
+
1411
+ -- AddForeignKey
1412
+ ALTER TABLE "_AbsentAttendance" ADD CONSTRAINT "_AbsentAttendance_B_fkey" FOREIGN KEY ("B") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;