@studious-lms/server 1.13.0 → 1.15.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 (375) 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/instrument.js +3 -3
  8. package/dist/instrument.js.map +1 -1
  9. package/dist/lib/config/cors.d.ts.map +1 -1
  10. package/dist/lib/config/cors.js +31 -11
  11. package/dist/lib/config/cors.js.map +1 -1
  12. package/dist/lib/config/env.d.ts +17 -0
  13. package/dist/lib/config/env.d.ts.map +1 -1
  14. package/dist/lib/config/env.js +8 -2
  15. package/dist/lib/config/env.js.map +1 -1
  16. package/dist/lib/googleCloudStorage.d.ts +10 -0
  17. package/dist/lib/googleCloudStorage.d.ts.map +1 -1
  18. package/dist/lib/googleCloudStorage.js +22 -2
  19. package/dist/lib/googleCloudStorage.js.map +1 -1
  20. package/dist/lib/inferDocumentFormat.d.ts +10 -0
  21. package/dist/lib/inferDocumentFormat.d.ts.map +1 -0
  22. package/dist/lib/inferDocumentFormat.js +48 -0
  23. package/dist/lib/inferDocumentFormat.js.map +1 -0
  24. package/dist/lib/legal.d.ts +3 -0
  25. package/dist/lib/legal.d.ts.map +1 -0
  26. package/dist/lib/legal.js +6 -0
  27. package/dist/lib/legal.js.map +1 -0
  28. package/dist/lib/prisma.d.ts +104 -5
  29. package/dist/lib/prisma.d.ts.map +1 -1
  30. package/dist/lib/prisma.js +33 -2
  31. package/dist/lib/prisma.js.map +1 -1
  32. package/dist/models/agenda.d.ts +20 -20
  33. package/dist/models/announcement.d.ts +211 -101
  34. package/dist/models/announcement.d.ts.map +1 -1
  35. package/dist/models/assignment.d.ts +560 -362
  36. package/dist/models/assignment.d.ts.map +1 -1
  37. package/dist/models/attendance.d.ts +197 -71
  38. package/dist/models/attendance.d.ts.map +1 -1
  39. package/dist/models/auth.d.ts +356 -114
  40. package/dist/models/auth.d.ts.map +1 -1
  41. package/dist/models/auth.js +4 -2
  42. package/dist/models/auth.js.map +1 -1
  43. package/dist/models/class.d.ts +327 -201
  44. package/dist/models/class.d.ts.map +1 -1
  45. package/dist/models/class.js +2 -2
  46. package/dist/models/class.js.map +1 -1
  47. package/dist/models/cloudStorage.d.ts +146 -56
  48. package/dist/models/cloudStorage.d.ts.map +1 -1
  49. package/dist/models/comment.d.ts +262 -110
  50. package/dist/models/comment.d.ts.map +1 -1
  51. package/dist/models/conversation.d.ts +206 -80
  52. package/dist/models/conversation.d.ts.map +1 -1
  53. package/dist/models/department.d.ts +196 -70
  54. package/dist/models/department.d.ts.map +1 -1
  55. package/dist/models/event.d.ts +305 -141
  56. package/dist/models/event.d.ts.map +1 -1
  57. package/dist/models/file.d.ts +422 -272
  58. package/dist/models/file.d.ts.map +1 -1
  59. package/dist/models/folder.d.ts +433 -181
  60. package/dist/models/folder.d.ts.map +1 -1
  61. package/dist/models/labChat.d.ts +205 -79
  62. package/dist/models/labChat.d.ts.map +1 -1
  63. package/dist/models/marketing.d.ts +79 -38
  64. package/dist/models/marketing.d.ts.map +1 -1
  65. package/dist/models/marketing.js +12 -4
  66. package/dist/models/marketing.js.map +1 -1
  67. package/dist/models/message.d.ts +97 -43
  68. package/dist/models/message.d.ts.map +1 -1
  69. package/dist/models/newtonChat.d.ts +84 -30
  70. package/dist/models/newtonChat.d.ts.map +1 -1
  71. package/dist/models/notification.d.ts +57 -21
  72. package/dist/models/notification.d.ts.map +1 -1
  73. package/dist/models/school.d.ts +349 -133
  74. package/dist/models/school.d.ts.map +1 -1
  75. package/dist/models/section.d.ts +216 -72
  76. package/dist/models/section.d.ts.map +1 -1
  77. package/dist/models/tag.d.ts +156 -48
  78. package/dist/models/tag.d.ts.map +1 -1
  79. package/dist/models/user.d.ts +82 -28
  80. package/dist/models/user.d.ts.map +1 -1
  81. package/dist/models/worksheet.d.ts +1032 -423
  82. package/dist/models/worksheet.d.ts.map +1 -1
  83. package/dist/models/worksheet.js +8 -2
  84. package/dist/models/worksheet.js.map +1 -1
  85. package/dist/pipelines/aiLabChat.d.ts +7 -9
  86. package/dist/pipelines/aiLabChat.d.ts.map +1 -1
  87. package/dist/pipelines/aiLabChat.js +194 -125
  88. package/dist/pipelines/aiLabChat.js.map +1 -1
  89. package/dist/pipelines/aiLabChatContract.d.ts +233 -389
  90. package/dist/pipelines/aiLabChatContract.d.ts.map +1 -1
  91. package/dist/pipelines/aiLabChatContract.js +54 -70
  92. package/dist/pipelines/aiLabChatContract.js.map +1 -1
  93. package/dist/pipelines/aiNewtonChat.d.ts.map +1 -1
  94. package/dist/pipelines/aiNewtonChat.js +41 -41
  95. package/dist/pipelines/aiNewtonChat.js.map +1 -1
  96. package/dist/pipelines/gradeWorksheet.d.ts +8 -8
  97. package/dist/pipelines/labChatPrompt.d.ts +18 -11
  98. package/dist/pipelines/labChatPrompt.d.ts.map +1 -1
  99. package/dist/pipelines/labChatPrompt.js +93 -75
  100. package/dist/pipelines/labChatPrompt.js.map +1 -1
  101. package/dist/pipelines/pdfToWorksheet.d.ts +1 -1
  102. package/dist/routers/_app.d.ts +2601 -2151
  103. package/dist/routers/_app.d.ts.map +1 -1
  104. package/dist/routers/_app.js +4 -2
  105. package/dist/routers/_app.js.map +1 -1
  106. package/dist/routers/admin.d.ts +13 -13
  107. package/dist/routers/agenda.d.ts +18 -18
  108. package/dist/routers/announcement.d.ts +60 -60
  109. package/dist/routers/assignment.d.ts +393 -383
  110. package/dist/routers/assignment.d.ts.map +1 -1
  111. package/dist/routers/attendance.d.ts +10 -10
  112. package/dist/routers/auth.d.ts +4 -2
  113. package/dist/routers/auth.d.ts.map +1 -1
  114. package/dist/routers/auth.js +15 -2
  115. package/dist/routers/auth.js.map +1 -1
  116. package/dist/routers/class.d.ts +157 -153
  117. package/dist/routers/class.d.ts.map +1 -1
  118. package/dist/routers/comment.d.ts +18 -18
  119. package/dist/routers/conversation.d.ts +11 -11
  120. package/dist/routers/department.d.ts +34 -34
  121. package/dist/routers/discussion.d.ts +68 -56
  122. package/dist/routers/discussion.d.ts.map +1 -1
  123. package/dist/routers/discussion.js +6 -2
  124. package/dist/routers/discussion.js.map +1 -1
  125. package/dist/routers/embedding.d.ts +73 -0
  126. package/dist/routers/embedding.d.ts.map +1 -0
  127. package/dist/routers/embedding.js +151 -0
  128. package/dist/routers/embedding.js.map +1 -0
  129. package/dist/routers/event.d.ts +57 -55
  130. package/dist/routers/event.d.ts.map +1 -1
  131. package/dist/routers/file.d.ts +14 -14
  132. package/dist/routers/folder.d.ts +38 -38
  133. package/dist/routers/labChat.d.ts +16 -16
  134. package/dist/routers/marketing.d.ts +1 -14
  135. package/dist/routers/marketing.d.ts.map +1 -1
  136. package/dist/routers/message.d.ts +13 -13
  137. package/dist/routers/newtonChat.d.ts +4 -4
  138. package/dist/routers/notifications.d.ts +5 -5
  139. package/dist/routers/permissions.d.ts +14 -14
  140. package/dist/routers/school.d.ts +59 -55
  141. package/dist/routers/school.d.ts.map +1 -1
  142. package/dist/routers/search.d.ts +22 -1
  143. package/dist/routers/search.d.ts.map +1 -1
  144. package/dist/routers/search.js +9 -3
  145. package/dist/routers/search.js.map +1 -1
  146. package/dist/routers/section.d.ts +4 -4
  147. package/dist/routers/studentProgress.d.ts +1 -1
  148. package/dist/routers/tag.d.ts +7 -7
  149. package/dist/routers/user.d.ts +99 -10
  150. package/dist/routers/user.d.ts.map +1 -1
  151. package/dist/routers/user.js +19 -2
  152. package/dist/routers/user.js.map +1 -1
  153. package/dist/routers/worksheet.d.ts +93 -55
  154. package/dist/routers/worksheet.d.ts.map +1 -1
  155. package/dist/routers/worksheet.js +26 -2
  156. package/dist/routers/worksheet.js.map +1 -1
  157. package/dist/routes/aiStream.d.ts +2 -0
  158. package/dist/routes/aiStream.d.ts.map +1 -0
  159. package/dist/routes/aiStream.js +726 -0
  160. package/dist/routes/aiStream.js.map +1 -0
  161. package/dist/seedDatabase.d.ts +3 -1
  162. package/dist/seedDatabase.d.ts.map +1 -1
  163. package/dist/seedDatabase.js +6 -6
  164. package/dist/seedDatabase.js.map +1 -1
  165. package/dist/services/adminInstitution.d.ts +8 -8
  166. package/dist/services/adminRunJob.d.ts +4 -4
  167. package/dist/services/agenda.d.ts +18 -18
  168. package/dist/services/aiChatStream.d.ts +88 -0
  169. package/dist/services/aiChatStream.d.ts.map +1 -0
  170. package/dist/services/aiChatStream.js +254 -0
  171. package/dist/services/aiChatStream.js.map +1 -0
  172. package/dist/services/aiModifierTools.d.ts +16 -0
  173. package/dist/services/aiModifierTools.d.ts.map +1 -0
  174. package/dist/services/aiModifierTools.js +274 -0
  175. package/dist/services/aiModifierTools.js.map +1 -0
  176. package/dist/services/aiProposalTools.d.ts +32 -0
  177. package/dist/services/aiProposalTools.d.ts.map +1 -0
  178. package/dist/services/aiProposalTools.js +207 -0
  179. package/dist/services/aiProposalTools.js.map +1 -0
  180. package/dist/services/aiStream.d.ts +22 -0
  181. package/dist/services/aiStream.d.ts.map +1 -0
  182. package/dist/services/aiStream.js +142 -0
  183. package/dist/services/aiStream.js.map +1 -0
  184. package/dist/services/aiTools.d.ts +16 -0
  185. package/dist/services/aiTools.d.ts.map +1 -0
  186. package/dist/services/aiTools.js +271 -0
  187. package/dist/services/aiTools.js.map +1 -0
  188. package/dist/services/announcement.d.ts +42 -42
  189. package/dist/services/announcement.d.ts.map +1 -1
  190. package/dist/services/announcement.js +7 -2
  191. package/dist/services/announcement.js.map +1 -1
  192. package/dist/services/assignment.d.ts +355 -345
  193. package/dist/services/assignment.d.ts.map +1 -1
  194. package/dist/services/assignment.js +30 -9
  195. package/dist/services/assignment.js.map +1 -1
  196. package/dist/services/attendance.d.ts +10 -10
  197. package/dist/services/auth.d.ts +4 -2
  198. package/dist/services/auth.d.ts.map +1 -1
  199. package/dist/services/auth.js +13 -4
  200. package/dist/services/auth.js.map +1 -1
  201. package/dist/services/class.d.ts +146 -142
  202. package/dist/services/class.d.ts.map +1 -1
  203. package/dist/services/class.js +24 -4
  204. package/dist/services/class.js.map +1 -1
  205. package/dist/services/comment.d.ts +18 -18
  206. package/dist/services/conversation.d.ts +11 -11
  207. package/dist/services/department.d.ts +33 -33
  208. package/dist/services/discussion.d.ts +58 -58
  209. package/dist/services/discussion.d.ts.map +1 -1
  210. package/dist/services/discussion.js +15 -8
  211. package/dist/services/discussion.js.map +1 -1
  212. package/dist/services/discussionSummary.d.ts +21 -0
  213. package/dist/services/discussionSummary.d.ts.map +1 -0
  214. package/dist/services/discussionSummary.js +179 -0
  215. package/dist/services/discussionSummary.js.map +1 -0
  216. package/dist/services/embedding.d.ts +85 -0
  217. package/dist/services/embedding.d.ts.map +1 -0
  218. package/dist/services/embedding.js +372 -0
  219. package/dist/services/embedding.js.map +1 -0
  220. package/dist/services/event.d.ts +55 -53
  221. package/dist/services/event.d.ts.map +1 -1
  222. package/dist/services/file.d.ts +28 -28
  223. package/dist/services/folder.d.ts +36 -36
  224. package/dist/services/folder.d.ts.map +1 -1
  225. package/dist/services/folder.js +32 -2
  226. package/dist/services/folder.js.map +1 -1
  227. package/dist/services/labChat.d.ts +16 -16
  228. package/dist/services/marketing.d.ts +2 -15
  229. package/dist/services/marketing.d.ts.map +1 -1
  230. package/dist/services/marketing.js +5 -5
  231. package/dist/services/marketing.js.map +1 -1
  232. package/dist/services/message.d.ts +11 -11
  233. package/dist/services/message.d.ts.map +1 -1
  234. package/dist/services/message.js +2 -2
  235. package/dist/services/message.js.map +1 -1
  236. package/dist/services/newtonChat.d.ts +4 -4
  237. package/dist/services/notification.d.ts +5 -5
  238. package/dist/services/notification.d.ts.map +1 -1
  239. package/dist/services/openaiDocumentGen.d.ts +37 -0
  240. package/dist/services/openaiDocumentGen.d.ts.map +1 -0
  241. package/dist/services/openaiDocumentGen.js +262 -0
  242. package/dist/services/openaiDocumentGen.js.map +1 -0
  243. package/dist/services/permissions.d.ts +14 -14
  244. package/dist/services/school.d.ts +54 -50
  245. package/dist/services/school.d.ts.map +1 -1
  246. package/dist/services/search.d.ts +13 -1
  247. package/dist/services/search.d.ts.map +1 -1
  248. package/dist/services/search.js +145 -2
  249. package/dist/services/search.js.map +1 -1
  250. package/dist/services/section.d.ts +3 -3
  251. package/dist/services/tag.d.ts +4 -4
  252. package/dist/services/user.d.ts +4 -4
  253. package/dist/services/user.d.ts.map +1 -1
  254. package/dist/services/user.js +10 -15
  255. package/dist/services/user.js.map +1 -1
  256. package/dist/services/userPrivacy.d.ts +86 -0
  257. package/dist/services/userPrivacy.d.ts.map +1 -0
  258. package/dist/services/userPrivacy.js +184 -0
  259. package/dist/services/userPrivacy.js.map +1 -0
  260. package/dist/services/worksheet.d.ts +86 -57
  261. package/dist/services/worksheet.d.ts.map +1 -1
  262. package/dist/services/worksheet.js +57 -5
  263. package/dist/services/worksheet.js.map +1 -1
  264. package/dist/utils/email.d.ts.map +1 -1
  265. package/dist/utils/email.js +7 -3
  266. package/dist/utils/email.js.map +1 -1
  267. package/dist/utils/streamBroadcast.d.ts +11 -0
  268. package/dist/utils/streamBroadcast.d.ts.map +1 -0
  269. package/dist/utils/streamBroadcast.js +32 -0
  270. package/dist/utils/streamBroadcast.js.map +1 -0
  271. package/dist/workers/connection.d.ts +15 -0
  272. package/dist/workers/connection.d.ts.map +1 -1
  273. package/dist/workers/connection.js +20 -2
  274. package/dist/workers/connection.js.map +1 -1
  275. package/dist/workers/index.js +4 -2
  276. package/dist/workers/index.js.map +1 -1
  277. package/dist/workers/processors/createRunJobWorker.d.ts.map +1 -1
  278. package/dist/workers/processors/createRunJobWorker.js +31 -8
  279. package/dist/workers/processors/createRunJobWorker.js.map +1 -1
  280. package/dist/workers/processors/embedContent.d.ts +8 -0
  281. package/dist/workers/processors/embedContent.d.ts.map +1 -0
  282. package/dist/workers/processors/embedContent.js +67 -0
  283. package/dist/workers/processors/embedContent.js.map +1 -0
  284. package/dist/workers/queues.d.ts +6 -0
  285. package/dist/workers/queues.d.ts.map +1 -1
  286. package/dist/workers/queues.js +5 -3
  287. package/dist/workers/queues.js.map +1 -1
  288. package/package.json +5 -1
  289. package/prisma/migrations/20260609215135_init/migration.sql +1412 -0
  290. package/prisma/migrations/20260610130000_add_worksheet_tags/migration.sql +13 -0
  291. package/prisma/migrations/20260610140000_expand_embedding_source_types/migration.sql +4 -0
  292. package/prisma/migrations/20260611120000_add_user_terms_acceptance/migration.sql +3 -0
  293. package/prisma/schema.prisma +44 -7
  294. package/src/index.ts +4 -0
  295. package/src/instrument.ts +1 -1
  296. package/src/lib/config/cors.ts +32 -9
  297. package/src/lib/config/env.ts +6 -0
  298. package/src/lib/googleCloudStorage.ts +21 -0
  299. package/src/lib/inferDocumentFormat.ts +58 -0
  300. package/src/lib/legal.ts +2 -0
  301. package/src/lib/prisma.ts +40 -1
  302. package/src/models/auth.ts +4 -0
  303. package/src/models/class.ts +3 -2
  304. package/src/models/marketing.ts +10 -2
  305. package/src/models/worksheet.ts +5 -2
  306. package/src/pipelines/aiLabChat.ts +245 -146
  307. package/src/pipelines/aiLabChatContract.ts +59 -69
  308. package/src/pipelines/aiNewtonChat.ts +46 -43
  309. package/src/pipelines/labChatPrompt.ts +115 -90
  310. package/src/routers/_app.ts +2 -0
  311. package/src/routers/auth.ts +13 -0
  312. package/src/routers/discussion.ts +7 -0
  313. package/src/routers/embedding.ts +164 -0
  314. package/src/routers/search.ts +10 -1
  315. package/src/routers/user.ts +26 -0
  316. package/src/routers/worksheet.ts +27 -0
  317. package/src/routes/aiStream.ts +827 -0
  318. package/src/seedDatabase.ts +4 -4
  319. package/src/services/aiChatStream.ts +341 -0
  320. package/src/services/aiModifierTools.ts +341 -0
  321. package/src/services/aiProposalTools.ts +274 -0
  322. package/src/services/aiStream.ts +175 -0
  323. package/src/services/aiTools.ts +290 -0
  324. package/src/services/announcement.ts +7 -0
  325. package/src/services/assignment.ts +31 -7
  326. package/src/services/auth.ts +14 -2
  327. package/src/services/class.ts +27 -2
  328. package/src/services/discussion.ts +22 -8
  329. package/src/services/discussionSummary.ts +226 -0
  330. package/src/services/embedding.ts +446 -0
  331. package/src/services/folder.ts +31 -0
  332. package/src/services/marketing.ts +3 -3
  333. package/src/services/message.ts +2 -2
  334. package/src/services/openaiDocumentGen.ts +319 -0
  335. package/src/services/search.ts +163 -1
  336. package/src/services/user.ts +9 -17
  337. package/src/services/userPrivacy.ts +196 -0
  338. package/src/services/worksheet.ts +77 -3
  339. package/src/utils/email.ts +5 -1
  340. package/src/utils/streamBroadcast.ts +48 -0
  341. package/src/workers/connection.ts +19 -0
  342. package/src/workers/index.ts +2 -0
  343. package/src/workers/processors/createRunJobWorker.ts +32 -6
  344. package/src/workers/processors/embedContent.ts +86 -0
  345. package/src/workers/queues.ts +5 -1
  346. package/tests/helpers/registerInput.ts +20 -0
  347. package/tests/integration/globalSetup.ts +10 -18
  348. package/tests/integration/routers/auth.test.ts +13 -18
  349. package/tests/unit/lib/inferDocumentFormat.test.ts +33 -0
  350. package/tests/unit/pipelines/aiLabChatContract.test.ts +38 -21
  351. package/tests/unit/pipelines/labChatPrompt.test.ts +23 -36
  352. package/tests/unit/services/aiChatStream.test.ts +92 -0
  353. package/tests/unit/services/openaiDocumentGen.test.ts +65 -0
  354. package/prisma/migrations/20250807062924_init/migration.sql +0 -436
  355. package/prisma/migrations/20250919063704_init2/migration.sql +0 -24
  356. package/prisma/migrations/20250920143543_add_profile_fields/migration.sql +0 -15
  357. package/prisma/migrations/20250922165147_add_chat_models/migration.sql +0 -68
  358. package/prisma/migrations/20250922165314_add_chat_roles/migration.sql +0 -5
  359. package/prisma/migrations/20250922171242_refactor_notification_system/migration.sql +0 -20
  360. package/prisma/migrations/20250922172208_add_mentions_system/migration.sql +0 -21
  361. package/prisma/migrations/20250925072732_add_lab_chat_system/migration.sql +0 -25
  362. package/prisma/migrations/20251020151505_add_upload_tracking_fields/migration.sql +0 -57
  363. package/prisma/migrations/20251109122857_annuoncements_comments/migration.sql +0 -30
  364. package/prisma/migrations/20251109135555_reactions_announcements_comments/migration.sql +0 -35
  365. package/prisma/migrations/20260410124000_add_submission_recommendation_state/migration.sql +0 -14
  366. package/prisma/migrations/20260415103500_add_session_type/migration.sql +0 -33
  367. package/prisma/migrations/20260415133000_add_ai_usage_logs/migration.sql +0 -19
  368. package/prisma/migrations/20260417083000_add_conversation_member_hidden_at/migration.sql +0 -2
  369. package/prisma/migrations/20260502230500_assignment_submission_comments/migration.sql +0 -60
  370. package/prisma/migrations/20260504071500_school_memberships/migration.sql +0 -81
  371. package/prisma/migrations/20260506162500_consolidate_run_job_and_unify_job_status/migration.sql +0 -166
  372. package/prisma/migrations/20260509220000_institution_overhaul/migration.sql +0 -184
  373. package/prisma/migrations/20260510170000_add_folder_permissions/migration.sql +0 -93
  374. package/prisma/migrations/20260510183000_add_discussions/migration.sql +0 -151
  375. /package/.github/workflows/{npm.yml → npm-publish.yml} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"userPrivacy.js","sources":["services/userPrivacy.ts"],"sourceRoot":"/","sourcesContent":["/**\n * User privacy service — data export and account erasure (anonymization).\n */\nimport { TRPCError } from \"@trpc/server\";\nimport { randomBytes } from \"node:crypto\";\nimport { hash } from \"bcryptjs\";\nimport { prisma } from \"../lib/prisma.js\";\nimport { deleteSessionsByUserId } from \"../models/auth.js\";\n\nasync function assertAccountCanBeErased(userId: string) {\n const user = await prisma.user.findUnique({\n where: { id: userId },\n select: {\n id: true,\n teacherIn: {\n select: {\n id: true,\n name: true,\n _count: { select: { students: true } },\n },\n },\n _count: {\n select: {\n assignments: true,\n createdLabChats: true,\n },\n },\n },\n });\n\n if (!user) {\n throw new TRPCError({ code: \"NOT_FOUND\", message: \"User not found\" });\n }\n\n const classesWithStudents = user.teacherIn.filter(\n (cls) => cls._count.students > 0,\n );\n if (classesWithStudents.length > 0) {\n throw new TRPCError({\n code: \"PRECONDITION_FAILED\",\n message:\n \"Delete or transfer your classes before deleting your account.\",\n });\n }\n\n if (user._count.assignments > 0) {\n throw new TRPCError({\n code: \"PRECONDITION_FAILED\",\n message:\n \"Remove or reassign your assignments before deleting your account.\",\n });\n }\n\n if (user._count.createdLabChats > 0) {\n throw new TRPCError({\n code: \"PRECONDITION_FAILED\",\n message: \"Remove your AI lab chats before deleting your account.\",\n });\n }\n}\n\n/** Export a portable snapshot of the authenticated user's personal data. */\nexport async function exportUserData(userId: string) {\n const user = await prisma.user.findUnique({\n where: { id: userId },\n select: {\n id: true,\n username: true,\n email: true,\n verified: true,\n termsAcceptedAt: true,\n termsVersion: true,\n profile: true,\n teacherIn: {\n select: { id: true, name: true, subject: true, section: true },\n },\n studentIn: {\n select: { id: true, name: true, subject: true, section: true },\n },\n schoolMemberships: {\n select: {\n role: true,\n status: true,\n school: { select: { id: true, name: true } },\n },\n },\n submissions: {\n select: {\n id: true,\n createdAt: true,\n submittedAt: true,\n gradeReceived: true,\n extendedResponse: true,\n assignment: { select: { id: true, title: true, classId: true } },\n },\n },\n events: {\n select: {\n id: true,\n name: true,\n startTime: true,\n endTime: true,\n location: true,\n remarks: true,\n },\n },\n sentMessages: {\n select: {\n id: true,\n content: true,\n createdAt: true,\n conversationId: true,\n },\n take: 500,\n orderBy: { createdAt: \"desc\" },\n },\n notificationsReceived: {\n select: {\n id: true,\n title: true,\n content: true,\n read: true,\n createdAt: true,\n },\n take: 200,\n orderBy: { createdAt: \"desc\" },\n },\n },\n });\n\n if (!user) {\n throw new TRPCError({ code: \"NOT_FOUND\", message: \"User not found\" });\n }\n\n return {\n exportedAt: new Date().toISOString(),\n user,\n };\n}\n\n/**\n * Erase personal account data by anonymizing the user record and removing\n * sessions and memberships. Educational records tied to classes (e.g.\n * submissions) remain with an anonymized identity where required.\n */\nexport async function deleteUserAccount(userId: string) {\n await assertAccountCanBeErased(userId);\n await deleteSessionsByUserId(userId);\n\n const anonUsername = `deleted_${userId.slice(0, 8)}`;\n const anonEmail = `deleted+${userId}@studious.invalid`;\n const randomPassword = await hash(randomBytes(32).toString(\"hex\"), 10);\n\n await prisma.$transaction([\n prisma.conversationMember.deleteMany({ where: { userId } }),\n prisma.notification.deleteMany({\n where: { OR: [{ senderId: userId }, { receiverId: userId }] },\n }),\n prisma.schoolMembership.deleteMany({ where: { userId } }),\n prisma.permission.deleteMany({\n where: { OR: [{ userId }, { grantedById: userId }] },\n }),\n prisma.user.update({\n where: { id: userId },\n data: {\n teacherIn: { set: [] },\n studentIn: { set: [] },\n departments: { set: [] },\n tags: { set: [] },\n specificAssignments: { set: [] },\n presentAttendance: { set: [] },\n lateAttendance: { set: [] },\n absentAttendance: { set: [] },\n schoolId: null,\n username: anonUsername,\n email: anonEmail,\n password: randomPassword,\n verified: false,\n termsAcceptedAt: null,\n termsVersion: null,\n profile: {\n update: {\n displayName: null,\n bio: null,\n location: null,\n website: null,\n profilePicture: null,\n profilePictureThumbnail: null,\n },\n },\n },\n }),\n ]);\n\n return { success: true };\n}\n"],"names":[],"mappings":"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","debug_id":"7184e3ea-1921-5a91-936e-6fa9a92f8a03"}
@@ -1,38 +1,44 @@
1
- import { type WorksheetQuestionType } from "@prisma/client";
1
+ import { Prisma, type WorksheetQuestionType } from "@prisma/client";
2
2
  /** Get worksheet with questions and mark schemes. */
3
3
  export declare function getWorksheet(worksheetId: string, userId: string): Promise<{
4
4
  class: {
5
- name: string;
5
+ section: string;
6
6
  id: string;
7
+ name: string;
7
8
  schoolId: string | null;
8
- subject: string;
9
9
  color: string | null;
10
- section: string;
10
+ subject: string;
11
11
  syllabus: string | null;
12
12
  departmentId: string | null;
13
13
  discussionsEnabled: boolean;
14
14
  studentsCanCreateDiscussions: boolean;
15
15
  studentsCanReply: boolean;
16
16
  } | null;
17
+ tags: {
18
+ id: string;
19
+ name: string;
20
+ color: string;
21
+ classId: string;
22
+ }[];
17
23
  questions: {
18
24
  type: import(".prisma/client").$Enums.WorksheetQuestionType;
19
- options: import("@prisma/client/runtime/library.js").JsonValue | null;
25
+ options: Prisma.JsonValue | null;
26
+ markScheme: Prisma.JsonValue | null;
20
27
  id: string;
21
28
  createdAt: Date;
22
29
  updatedAt: Date;
23
- order: number | null;
24
30
  points: number;
25
- worksheetId: string;
26
- markScheme: import("@prisma/client/runtime/library.js").JsonValue | null;
27
31
  question: string;
32
+ worksheetId: string;
33
+ order: number | null;
28
34
  answer: string;
29
35
  }[];
30
36
  } & {
31
37
  status: import(".prisma/client").$Enums.JobStatus | null;
32
- name: string;
33
38
  id: string;
34
39
  createdAt: Date;
35
40
  updatedAt: Date;
41
+ name: string;
36
42
  classId: string;
37
43
  runJobId: string | null;
38
44
  sourceUrl: string | null;
@@ -41,14 +47,20 @@ export declare function getWorksheet(worksheetId: string, userId: string): Promi
41
47
  export declare function worksheetExists(id: string): Promise<boolean>;
42
48
  export declare function listWorksheets(classId: string): Promise<{
43
49
  questionCount: number;
50
+ tags: {
51
+ id: string;
52
+ name: string;
53
+ color: string;
54
+ classId: string;
55
+ }[];
44
56
  questions: {
45
57
  id: string;
46
58
  }[];
47
59
  status: import(".prisma/client").$Enums.JobStatus | null;
48
- name: string;
49
60
  id: string;
50
61
  createdAt: Date;
51
62
  updatedAt: Date;
63
+ name: string;
52
64
  classId: string;
53
65
  runJobId: string | null;
54
66
  sourceUrl: string | null;
@@ -57,30 +69,30 @@ export declare function updateWorksheetRecord(worksheetId: string, userId: strin
57
69
  name?: string;
58
70
  }): Promise<{
59
71
  status: import(".prisma/client").$Enums.JobStatus | null;
60
- name: string;
61
72
  id: string;
62
73
  createdAt: Date;
63
74
  updatedAt: Date;
75
+ name: string;
64
76
  classId: string;
65
77
  runJobId: string | null;
66
78
  sourceUrl: string | null;
67
79
  }>;
68
80
  export declare function deleteWorksheetRecord(worksheetId: string, userId: string): Promise<{
69
81
  status: import(".prisma/client").$Enums.JobStatus | null;
70
- name: string;
71
82
  id: string;
72
83
  createdAt: Date;
73
84
  updatedAt: Date;
85
+ name: string;
74
86
  classId: string;
75
87
  runJobId: string | null;
76
88
  sourceUrl: string | null;
77
89
  }>;
78
90
  export declare function createWorksheetRecord(classId: string, name: string): Promise<{
79
91
  status: import(".prisma/client").$Enums.JobStatus | null;
80
- name: string;
81
92
  id: string;
82
93
  createdAt: Date;
83
94
  updatedAt: Date;
95
+ name: string;
84
96
  classId: string;
85
97
  runJobId: string | null;
86
98
  sourceUrl: string | null;
@@ -91,10 +103,10 @@ export declare function createWorksheetRecord(classId: string, name: string): Pr
91
103
  */
92
104
  export declare function duplicateWorksheetRecord(worksheetId: string, classId: string, name: string, userId: string): Promise<{
93
105
  status: import(".prisma/client").$Enums.JobStatus | null;
94
- name: string;
95
106
  id: string;
96
107
  createdAt: Date;
97
108
  updatedAt: Date;
109
+ name: string;
98
110
  classId: string;
99
111
  runJobId: string | null;
100
112
  sourceUrl: string | null;
@@ -113,10 +125,10 @@ export declare function createWorksheetFromPdf(classId: string, url: string, use
113
125
  }): Promise<{
114
126
  runJobId: string;
115
127
  status: import(".prisma/client").$Enums.JobStatus | null;
116
- name: string;
117
128
  id: string;
118
129
  createdAt: Date;
119
130
  updatedAt: Date;
131
+ name: string;
120
132
  classId: string;
121
133
  sourceUrl: string | null;
122
134
  }>;
@@ -128,10 +140,10 @@ export declare function createWorksheetFromUploadedPdf(classId: string, fileId:
128
140
  }): Promise<{
129
141
  runJobId: string;
130
142
  status: import(".prisma/client").$Enums.JobStatus | null;
131
- name: string;
132
143
  id: string;
133
144
  createdAt: Date;
134
145
  updatedAt: Date;
146
+ name: string;
135
147
  classId: string;
136
148
  sourceUrl: string | null;
137
149
  }>;
@@ -145,17 +157,34 @@ export declare function addQuestionToWorksheet(worksheetId: string, userId: stri
145
157
  order?: number;
146
158
  }): Promise<{
147
159
  type: import(".prisma/client").$Enums.WorksheetQuestionType;
148
- options: import("@prisma/client/runtime/library.js").JsonValue | null;
160
+ options: Prisma.JsonValue | null;
161
+ markScheme: Prisma.JsonValue | null;
149
162
  id: string;
150
163
  createdAt: Date;
151
164
  updatedAt: Date;
152
- order: number | null;
153
165
  points: number;
154
- worksheetId: string;
155
- markScheme: import("@prisma/client/runtime/library.js").JsonValue | null;
156
166
  question: string;
167
+ worksheetId: string;
168
+ order: number | null;
157
169
  answer: string;
158
170
  }>;
171
+ /** A question's full editable state as captured before an AI modifier run. */
172
+ export interface WorksheetQuestionSnapshot {
173
+ id: string;
174
+ type: WorksheetQuestionType;
175
+ question: string;
176
+ answer: string;
177
+ options: unknown;
178
+ markScheme: unknown;
179
+ points: number;
180
+ order: number | null;
181
+ }
182
+ /**
183
+ * Restore a worksheet's questions to a snapshot: deletes questions not in the
184
+ * snapshot, re-creates deleted ones (with their original ids), and reverts
185
+ * edited ones. Used by AI modifier undo.
186
+ */
187
+ export declare function restoreWorksheetQuestions(worksheetId: string, userId: string, questions: WorksheetQuestionSnapshot[]): Promise<void>;
159
188
  export declare function reorderWorksheetQuestions(worksheetId: string, userId: string, movedId: string, position: "before" | "after", targetId: string): Promise<{
160
189
  id: string;
161
190
  }[]>;
@@ -168,28 +197,28 @@ export declare function updateWorksheetQuestionRecord(worksheetId: string, quest
168
197
  type?: WorksheetQuestionType;
169
198
  }): Promise<{
170
199
  type: import(".prisma/client").$Enums.WorksheetQuestionType;
171
- options: import("@prisma/client/runtime/library.js").JsonValue | null;
200
+ options: Prisma.JsonValue | null;
201
+ markScheme: Prisma.JsonValue | null;
172
202
  id: string;
173
203
  createdAt: Date;
174
204
  updatedAt: Date;
175
- order: number | null;
176
205
  points: number;
177
- worksheetId: string;
178
- markScheme: import("@prisma/client/runtime/library.js").JsonValue | null;
179
206
  question: string;
207
+ worksheetId: string;
208
+ order: number | null;
180
209
  answer: string;
181
210
  }>;
182
211
  export declare function deleteWorksheetQuestionRecord(worksheetId: string, questionId: string, userId: string): Promise<{
183
212
  type: import(".prisma/client").$Enums.WorksheetQuestionType;
184
- options: import("@prisma/client/runtime/library.js").JsonValue | null;
213
+ options: Prisma.JsonValue | null;
214
+ markScheme: Prisma.JsonValue | null;
185
215
  id: string;
186
216
  createdAt: Date;
187
217
  updatedAt: Date;
188
- order: number | null;
189
218
  points: number;
190
- worksheetId: string;
191
- markScheme: import("@prisma/client/runtime/library.js").JsonValue | null;
192
219
  question: string;
220
+ worksheetId: string;
221
+ order: number | null;
193
222
  answer: string;
194
223
  }>;
195
224
  export declare function getWorksheetSubmission(worksheetId: string, submissionId: string, userId: string): Promise<{
@@ -203,15 +232,15 @@ export declare function getWorksheetSubmission(worksheetId: string, submissionId
203
232
  id: string;
204
233
  createdAt: Date;
205
234
  updatedAt: Date | null;
206
- studentId: string;
207
- questionId: string;
235
+ feedback: string | null;
236
+ runJobId: string | null;
208
237
  response: string;
209
238
  isCorrect: boolean;
210
- markschemeState: import("@prisma/client/runtime/library.js").JsonValue | null;
239
+ markschemeState: Prisma.JsonValue | null;
211
240
  points: number;
212
- feedback: string | null;
241
+ studentId: string;
242
+ questionId: string;
213
243
  studentWorksheetResponseId: string | null;
214
- runJobId: string | null;
215
244
  })[];
216
245
  } & {
217
246
  id: string;
@@ -219,9 +248,9 @@ export declare function getWorksheetSubmission(worksheetId: string, submissionId
219
248
  updatedAt: Date;
220
249
  submissionId: string | null;
221
250
  studentId: string;
251
+ worksheetId: string;
222
252
  submittedAt: Date | null;
223
253
  submitted: boolean;
224
- worksheetId: string;
225
254
  }>;
226
255
  export declare function answerWorksheetQuestion(worksheetResponseId: string, questionId: string, response: string, userId: string): Promise<{
227
256
  responses: {
@@ -229,15 +258,15 @@ export declare function answerWorksheetQuestion(worksheetResponseId: string, que
229
258
  id: string;
230
259
  createdAt: Date;
231
260
  updatedAt: Date | null;
232
- studentId: string;
233
- questionId: string;
261
+ feedback: string | null;
262
+ runJobId: string | null;
234
263
  response: string;
235
264
  isCorrect: boolean;
236
- markschemeState: import("@prisma/client/runtime/library.js").JsonValue | null;
265
+ markschemeState: Prisma.JsonValue | null;
237
266
  points: number;
238
- feedback: string | null;
267
+ studentId: string;
268
+ questionId: string;
239
269
  studentWorksheetResponseId: string | null;
240
- runJobId: string | null;
241
270
  }[];
242
271
  } & {
243
272
  id: string;
@@ -245,39 +274,39 @@ export declare function answerWorksheetQuestion(worksheetResponseId: string, que
245
274
  updatedAt: Date;
246
275
  submissionId: string | null;
247
276
  studentId: string;
277
+ worksheetId: string;
248
278
  submittedAt: Date | null;
249
279
  submitted: boolean;
250
- worksheetId: string;
251
280
  }>;
252
281
  export declare function cancelGrading(worksheetResponseId: string, progressId: string, userId: string): Promise<{
253
282
  status: import(".prisma/client").$Enums.JobStatus | null;
254
283
  id: string;
255
284
  createdAt: Date;
256
285
  updatedAt: Date | null;
257
- studentId: string;
258
- questionId: string;
286
+ feedback: string | null;
287
+ runJobId: string | null;
259
288
  response: string;
260
289
  isCorrect: boolean;
261
- markschemeState: import("@prisma/client/runtime/library.js").JsonValue | null;
290
+ markschemeState: Prisma.JsonValue | null;
262
291
  points: number;
263
- feedback: string | null;
292
+ studentId: string;
293
+ questionId: string;
264
294
  studentWorksheetResponseId: string | null;
265
- runJobId: string | null;
266
295
  }>;
267
296
  export declare function regradeQuestion(worksheetResponseId: string, progressId: string, userId: string): Promise<{
268
297
  status: import(".prisma/client").$Enums.JobStatus | null;
269
298
  id: string;
270
299
  createdAt: Date;
271
300
  updatedAt: Date | null;
272
- studentId: string;
273
- questionId: string;
301
+ feedback: string | null;
302
+ runJobId: string | null;
274
303
  response: string;
275
304
  isCorrect: boolean;
276
- markschemeState: import("@prisma/client/runtime/library.js").JsonValue | null;
305
+ markschemeState: Prisma.JsonValue | null;
277
306
  points: number;
278
- feedback: string | null;
307
+ studentId: string;
308
+ questionId: string;
279
309
  studentWorksheetResponseId: string | null;
280
- runJobId: string | null;
281
310
  } | null>;
282
311
  export declare function gradeAnswer(questionId: string, studentWorksheetResponseId: string, userId: string, data: {
283
312
  responseId?: string;
@@ -291,27 +320,27 @@ export declare function gradeAnswer(questionId: string, studentWorksheetResponse
291
320
  id: string;
292
321
  createdAt: Date;
293
322
  updatedAt: Date | null;
294
- studentId: string;
295
- questionId: string;
323
+ feedback: string | null;
324
+ runJobId: string | null;
296
325
  response: string;
297
326
  isCorrect: boolean;
298
- markschemeState: import("@prisma/client/runtime/library.js").JsonValue | null;
327
+ markschemeState: Prisma.JsonValue | null;
299
328
  points: number;
300
- feedback: string | null;
329
+ studentId: string;
330
+ questionId: string;
301
331
  studentWorksheetResponseId: string | null;
302
- runJobId: string | null;
303
332
  }>;
304
333
  export declare function addCommentToResponse(responseId: string, comment: string, authorId: string): Promise<{
305
334
  id: string;
306
335
  createdAt: Date;
336
+ content: string;
307
337
  assignmentId: string | null;
308
338
  submissionId: string | null;
309
339
  announcementId: string | null;
310
340
  modifiedAt: Date | null;
311
- content: string;
312
341
  authorId: string;
313
- parentCommentId: string | null;
314
342
  isPinned: boolean;
343
+ parentCommentId: string | null;
315
344
  studentQuestionProgressId: string | null;
316
345
  }>;
317
346
  //# sourceMappingURL=worksheet.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"worksheet.d.ts","sourceRoot":"/","sources":["services/worksheet.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"worksheet.d.ts","sourceRoot":"/","sources":["services/worksheet.ts"],"names":[],"mappings":"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"}
@@ -3,15 +3,16 @@
3
3
  * Integrates with gradeWorksheet pipeline for auto-grading.
4
4
  */
5
5
 
6
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="763e1691-86f4-53c9-8832-39f71889d16c")}catch(e){}}();
6
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="ecf79b03-756f-53ee-81b5-52a53a17b0e8")}catch(e){}}();
7
7
  import { TRPCError } from "@trpc/server";
8
- import { JobStatus } from "@prisma/client";
8
+ import { JobStatus, Prisma } from "@prisma/client";
9
9
  import { prisma } from "../lib/prisma.js";
10
10
  import { getFileUrl } from "../lib/fileUpload.js";
11
11
  import { cancelGradePipeline, regradeWorksheetPipeline } from "../pipelines/gradeWorksheet.js";
12
12
  import { enqueueRunJob } from "../workers/queues.js";
13
13
  import { logger } from "../utils/logger.js";
14
14
  import { findWorksheetByIdMinimal, findWorksheetByIdForClassMember, findWorksheetByIdForTeacher, findWorksheetsByClassId, createWorksheet, duplicateWorksheet, updateWorksheet, deleteWorksheet, findQuestionsByWorksheetId, createWorksheetQuestion, updateWorksheetQuestion, deleteWorksheetQuestion, findSubmissionByIdForWorksheetAccess, findOrCreateWorksheetResponse, findWorksheetResponseByIdForTeacher, findWorksheetResponseWithResponsesForStudent, findWorksheetQuestionByIdForTeacher, findWorksheetQuestionByIdInWorksheet, updateStudentQuestionProgress, createStudentQuestionProgress, findStudentQuestionProgress, updateStudentQuestionProgressForGrading, createStudentQuestionProgressForGrading, createComment, findStudentQuestionProgressByIdForTeacher, findStudentQuestionProgressByIdForStudentOrTeacher, findStudentQuestionProgressByIdForTeacherAndResponse, } from "../models/worksheet.js";
15
+ import { enqueueEmbedding } from "./embedding.js";
15
16
  const sanitizeQuestionOptionsForStudent = (options) => {
16
17
  if (!Array.isArray(options))
17
18
  return options;
@@ -66,7 +67,10 @@ export async function updateWorksheetRecord(worksheetId, userId, data) {
66
67
  message: "Only class teachers can update worksheets",
67
68
  });
68
69
  }
69
- return updateWorksheet(worksheetId, data);
70
+ const updated = await updateWorksheet(worksheetId, data);
71
+ // Re-index worksheet for RAG search
72
+ enqueueEmbedding(worksheet.classId, 'WORKSHEET', worksheetId);
73
+ return updated;
70
74
  }
71
75
  export async function deleteWorksheetRecord(worksheetId, userId) {
72
76
  const worksheet = await findWorksheetByIdForTeacher(worksheetId, userId);
@@ -79,7 +83,10 @@ export async function deleteWorksheetRecord(worksheetId, userId) {
79
83
  return deleteWorksheet(worksheetId);
80
84
  }
81
85
  export async function createWorksheetRecord(classId, name) {
82
- return createWorksheet({ classId, name });
86
+ const worksheet = await createWorksheet({ classId, name });
87
+ // Auto-index worksheet for RAG search
88
+ enqueueEmbedding(classId, 'WORKSHEET', worksheet.id);
89
+ return worksheet;
83
90
  }
84
91
  /**
85
92
  * Duplicate a worksheet into another class. Caller must teach both the source worksheet's class
@@ -219,6 +226,51 @@ export async function addQuestionToWorksheet(worksheetId, userId, data) {
219
226
  ...data,
220
227
  });
221
228
  }
229
+ const toJsonInput = (value) => value === null || value === undefined
230
+ ? Prisma.JsonNull
231
+ : value;
232
+ /**
233
+ * Restore a worksheet's questions to a snapshot: deletes questions not in the
234
+ * snapshot, re-creates deleted ones (with their original ids), and reverts
235
+ * edited ones. Used by AI modifier undo.
236
+ */
237
+ export async function restoreWorksheetQuestions(worksheetId, userId, questions) {
238
+ const worksheet = await findWorksheetByIdForTeacher(worksheetId, userId);
239
+ if (!worksheet) {
240
+ throw new TRPCError({
241
+ code: "FORBIDDEN",
242
+ message: "Only class teachers can modify worksheet questions",
243
+ });
244
+ }
245
+ await prisma.$transaction([
246
+ prisma.worksheetQuestion.deleteMany({
247
+ where: { worksheetId, id: { notIn: questions.map((q) => q.id) } },
248
+ }),
249
+ ...questions.map((q) => prisma.worksheetQuestion.upsert({
250
+ where: { id: q.id },
251
+ create: {
252
+ id: q.id,
253
+ worksheetId,
254
+ type: q.type,
255
+ question: q.question,
256
+ answer: q.answer,
257
+ options: toJsonInput(q.options),
258
+ markScheme: toJsonInput(q.markScheme),
259
+ points: q.points,
260
+ order: q.order,
261
+ },
262
+ update: {
263
+ type: q.type,
264
+ question: q.question,
265
+ answer: q.answer,
266
+ options: toJsonInput(q.options),
267
+ markScheme: toJsonInput(q.markScheme),
268
+ points: q.points,
269
+ order: q.order,
270
+ },
271
+ })),
272
+ ]);
273
+ }
222
274
  export async function reorderWorksheetQuestions(worksheetId, userId, movedId, position, targetId) {
223
275
  const worksheet = await findWorksheetByIdForTeacher(worksheetId, userId);
224
276
  if (!worksheet) {
@@ -442,4 +494,4 @@ export async function addCommentToResponse(responseId, comment, authorId) {
442
494
  });
443
495
  }
444
496
  //# sourceMappingURL=worksheet.js.map
445
- //# debugId=763e1691-86f4-53c9-8832-39f71889d16c
497
+ //# debugId=ecf79b03-756f-53ee-81b5-52a53a17b0e8