@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
@@ -19,12 +19,12 @@ export declare const discussionRouter: import("@trpc/server").TRPCBuiltRouter<{
19
19
  list: import("@trpc/server").TRPCQueryProcedure<{
20
20
  input: {
21
21
  classId: string;
22
- type?: "DISCUSSION" | "QUESTION" | "ANNOUNCEMENT" | undefined;
22
+ type?: "ANNOUNCEMENT" | "DISCUSSION" | "QUESTION" | undefined;
23
23
  sort?: "recent" | "activity" | "top" | undefined;
24
- search?: string | undefined;
25
24
  cursor?: string | undefined;
26
- tagId?: string | undefined;
25
+ search?: string | undefined;
27
26
  limit?: number | undefined;
27
+ tagId?: string | undefined;
28
28
  };
29
29
  output: {
30
30
  items: {
@@ -45,28 +45,28 @@ export declare const discussionRouter: import("@trpc/server").TRPCBuiltRouter<{
45
45
  id: string;
46
46
  username: string;
47
47
  profile: {
48
- displayName: string | null;
49
48
  profilePicture: string | null;
49
+ displayName: string | null;
50
50
  profilePictureThumbnail: string | null;
51
51
  } | null;
52
52
  };
53
53
  attachments: {
54
54
  path: string;
55
55
  type: string;
56
- name: string;
57
56
  id: string;
57
+ name: string;
58
58
  size: number | null;
59
59
  uploadedAt: Date | null;
60
- uploadStatus: import(".prisma/client").$Enums.UploadStatus;
61
- thumbnailId: string | null;
62
60
  thumbnail: {
63
61
  path: string;
64
62
  id: string;
65
63
  } | null;
64
+ thumbnailId: string | null;
65
+ uploadStatus: import(".prisma/client").$Enums.UploadStatus;
66
66
  }[];
67
67
  tags: {
68
- name: string;
69
68
  id: string;
69
+ name: string;
70
70
  color: string;
71
71
  }[];
72
72
  replyCount: number;
@@ -110,28 +110,28 @@ export declare const discussionRouter: import("@trpc/server").TRPCBuiltRouter<{
110
110
  id: string;
111
111
  username: string;
112
112
  profile: {
113
- displayName: string | null;
114
113
  profilePicture: string | null;
114
+ displayName: string | null;
115
115
  profilePictureThumbnail: string | null;
116
116
  } | null;
117
117
  };
118
118
  attachments: {
119
119
  path: string;
120
120
  type: string;
121
- name: string;
122
121
  id: string;
122
+ name: string;
123
123
  size: number | null;
124
124
  uploadedAt: Date | null;
125
- uploadStatus: import(".prisma/client").$Enums.UploadStatus;
126
- thumbnailId: string | null;
127
125
  thumbnail: {
128
126
  path: string;
129
127
  id: string;
130
128
  } | null;
129
+ thumbnailId: string | null;
130
+ uploadStatus: import(".prisma/client").$Enums.UploadStatus;
131
131
  }[];
132
132
  tags: {
133
- name: string;
134
133
  id: string;
134
+ name: string;
135
135
  color: string;
136
136
  }[];
137
137
  replyCount: number;
@@ -165,7 +165,7 @@ export declare const discussionRouter: import("@trpc/server").TRPCBuiltRouter<{
165
165
  classId: string;
166
166
  title: string;
167
167
  body: string;
168
- type?: "DISCUSSION" | "QUESTION" | "ANNOUNCEMENT" | undefined;
168
+ type?: "ANNOUNCEMENT" | "DISCUSSION" | "QUESTION" | undefined;
169
169
  tagIds?: string[] | undefined;
170
170
  attachmentIds?: string[] | undefined;
171
171
  };
@@ -187,28 +187,28 @@ export declare const discussionRouter: import("@trpc/server").TRPCBuiltRouter<{
187
187
  id: string;
188
188
  username: string;
189
189
  profile: {
190
- displayName: string | null;
191
190
  profilePicture: string | null;
191
+ displayName: string | null;
192
192
  profilePictureThumbnail: string | null;
193
193
  } | null;
194
194
  };
195
195
  attachments: {
196
196
  path: string;
197
197
  type: string;
198
- name: string;
199
198
  id: string;
199
+ name: string;
200
200
  size: number | null;
201
201
  uploadedAt: Date | null;
202
- uploadStatus: import(".prisma/client").$Enums.UploadStatus;
203
- thumbnailId: string | null;
204
202
  thumbnail: {
205
203
  path: string;
206
204
  id: string;
207
205
  } | null;
206
+ thumbnailId: string | null;
207
+ uploadStatus: import(".prisma/client").$Enums.UploadStatus;
208
208
  }[];
209
209
  tags: {
210
- name: string;
211
210
  id: string;
211
+ name: string;
212
212
  color: string;
213
213
  }[];
214
214
  replyCount: number;
@@ -232,12 +232,12 @@ export declare const discussionRouter: import("@trpc/server").TRPCBuiltRouter<{
232
232
  }>;
233
233
  getUploadUrls: import("@trpc/server").TRPCMutationProcedure<{
234
234
  input: {
235
- classId: string;
236
235
  files: {
237
236
  type: string;
238
237
  name: string;
239
238
  size: number;
240
239
  }[];
240
+ classId: string;
241
241
  };
242
242
  output: {
243
243
  uploadFiles: import("../lib/fileUpload.js").DirectUploadFile[];
@@ -258,7 +258,7 @@ export declare const discussionRouter: import("@trpc/server").TRPCBuiltRouter<{
258
258
  update: import("@trpc/server").TRPCMutationProcedure<{
259
259
  input: {
260
260
  discussionId: string;
261
- type?: "DISCUSSION" | "QUESTION" | "ANNOUNCEMENT" | undefined;
261
+ type?: "ANNOUNCEMENT" | "DISCUSSION" | "QUESTION" | undefined;
262
262
  title?: string | undefined;
263
263
  body?: string | undefined;
264
264
  allowReplies?: boolean | undefined;
@@ -282,28 +282,28 @@ export declare const discussionRouter: import("@trpc/server").TRPCBuiltRouter<{
282
282
  id: string;
283
283
  username: string;
284
284
  profile: {
285
- displayName: string | null;
286
285
  profilePicture: string | null;
286
+ displayName: string | null;
287
287
  profilePictureThumbnail: string | null;
288
288
  } | null;
289
289
  };
290
290
  attachments: {
291
291
  path: string;
292
292
  type: string;
293
- name: string;
294
293
  id: string;
294
+ name: string;
295
295
  size: number | null;
296
296
  uploadedAt: Date | null;
297
- uploadStatus: import(".prisma/client").$Enums.UploadStatus;
298
- thumbnailId: string | null;
299
297
  thumbnail: {
300
298
  path: string;
301
299
  id: string;
302
300
  } | null;
301
+ thumbnailId: string | null;
302
+ uploadStatus: import(".prisma/client").$Enums.UploadStatus;
303
303
  }[];
304
304
  tags: {
305
- name: string;
306
305
  id: string;
306
+ name: string;
307
307
  color: string;
308
308
  }[];
309
309
  replyCount: number;
@@ -356,24 +356,24 @@ export declare const discussionRouter: import("@trpc/server").TRPCBuiltRouter<{
356
356
  id: string;
357
357
  username: string;
358
358
  profile: {
359
- displayName: string | null;
360
359
  profilePicture: string | null;
360
+ displayName: string | null;
361
361
  profilePictureThumbnail: string | null;
362
362
  } | null;
363
363
  };
364
364
  attachments: {
365
365
  path: string;
366
366
  type: string;
367
- name: string;
368
367
  id: string;
368
+ name: string;
369
369
  size: number | null;
370
370
  uploadedAt: Date | null;
371
- uploadStatus: import(".prisma/client").$Enums.UploadStatus;
372
- thumbnailId: string | null;
373
371
  thumbnail: {
374
372
  path: string;
375
373
  id: string;
376
374
  } | null;
375
+ thumbnailId: string | null;
376
+ uploadStatus: import(".prisma/client").$Enums.UploadStatus;
377
377
  }[];
378
378
  reactions: {
379
379
  counts: {
@@ -412,24 +412,24 @@ export declare const discussionRouter: import("@trpc/server").TRPCBuiltRouter<{
412
412
  id: string;
413
413
  username: string;
414
414
  profile: {
415
- displayName: string | null;
416
415
  profilePicture: string | null;
416
+ displayName: string | null;
417
417
  profilePictureThumbnail: string | null;
418
418
  } | null;
419
419
  };
420
420
  attachments: {
421
421
  path: string;
422
422
  type: string;
423
- name: string;
424
423
  id: string;
424
+ name: string;
425
425
  size: number | null;
426
426
  uploadedAt: Date | null;
427
- uploadStatus: import(".prisma/client").$Enums.UploadStatus;
428
- thumbnailId: string | null;
429
427
  thumbnail: {
430
428
  path: string;
431
429
  id: string;
432
430
  } | null;
431
+ thumbnailId: string | null;
432
+ uploadStatus: import(".prisma/client").$Enums.UploadStatus;
433
433
  }[];
434
434
  reactions: {
435
435
  counts: {
@@ -466,24 +466,24 @@ export declare const discussionRouter: import("@trpc/server").TRPCBuiltRouter<{
466
466
  id: string;
467
467
  username: string;
468
468
  profile: {
469
- displayName: string | null;
470
469
  profilePicture: string | null;
470
+ displayName: string | null;
471
471
  profilePictureThumbnail: string | null;
472
472
  } | null;
473
473
  };
474
474
  attachments: {
475
475
  path: string;
476
476
  type: string;
477
- name: string;
478
477
  id: string;
478
+ name: string;
479
479
  size: number | null;
480
480
  uploadedAt: Date | null;
481
- uploadStatus: import(".prisma/client").$Enums.UploadStatus;
482
- thumbnailId: string | null;
483
481
  thumbnail: {
484
482
  path: string;
485
483
  id: string;
486
484
  } | null;
485
+ thumbnailId: string | null;
486
+ uploadStatus: import(".prisma/client").$Enums.UploadStatus;
487
487
  }[];
488
488
  reactions: {
489
489
  counts: {
@@ -524,28 +524,28 @@ export declare const discussionRouter: import("@trpc/server").TRPCBuiltRouter<{
524
524
  id: string;
525
525
  username: string;
526
526
  profile: {
527
- displayName: string | null;
528
527
  profilePicture: string | null;
528
+ displayName: string | null;
529
529
  profilePictureThumbnail: string | null;
530
530
  } | null;
531
531
  };
532
532
  attachments: {
533
533
  path: string;
534
534
  type: string;
535
- name: string;
536
535
  id: string;
536
+ name: string;
537
537
  size: number | null;
538
538
  uploadedAt: Date | null;
539
- uploadStatus: import(".prisma/client").$Enums.UploadStatus;
540
- thumbnailId: string | null;
541
539
  thumbnail: {
542
540
  path: string;
543
541
  id: string;
544
542
  } | null;
543
+ thumbnailId: string | null;
544
+ uploadStatus: import(".prisma/client").$Enums.UploadStatus;
545
545
  }[];
546
546
  tags: {
547
- name: string;
548
547
  id: string;
548
+ name: string;
549
549
  color: string;
550
550
  }[];
551
551
  replyCount: number;
@@ -590,28 +590,28 @@ export declare const discussionRouter: import("@trpc/server").TRPCBuiltRouter<{
590
590
  id: string;
591
591
  username: string;
592
592
  profile: {
593
- displayName: string | null;
594
593
  profilePicture: string | null;
594
+ displayName: string | null;
595
595
  profilePictureThumbnail: string | null;
596
596
  } | null;
597
597
  };
598
598
  attachments: {
599
599
  path: string;
600
600
  type: string;
601
- name: string;
602
601
  id: string;
602
+ name: string;
603
603
  size: number | null;
604
604
  uploadedAt: Date | null;
605
- uploadStatus: import(".prisma/client").$Enums.UploadStatus;
606
- thumbnailId: string | null;
607
605
  thumbnail: {
608
606
  path: string;
609
607
  id: string;
610
608
  } | null;
609
+ thumbnailId: string | null;
610
+ uploadStatus: import(".prisma/client").$Enums.UploadStatus;
611
611
  }[];
612
612
  tags: {
613
- name: string;
614
613
  id: string;
614
+ name: string;
615
615
  color: string;
616
616
  }[];
617
617
  replyCount: number;
@@ -653,24 +653,24 @@ export declare const discussionRouter: import("@trpc/server").TRPCBuiltRouter<{
653
653
  id: string;
654
654
  username: string;
655
655
  profile: {
656
- displayName: string | null;
657
656
  profilePicture: string | null;
657
+ displayName: string | null;
658
658
  profilePictureThumbnail: string | null;
659
659
  } | null;
660
660
  };
661
661
  attachments: {
662
662
  path: string;
663
663
  type: string;
664
- name: string;
665
664
  id: string;
665
+ name: string;
666
666
  size: number | null;
667
667
  uploadedAt: Date | null;
668
- uploadStatus: import(".prisma/client").$Enums.UploadStatus;
669
- thumbnailId: string | null;
670
668
  thumbnail: {
671
669
  path: string;
672
670
  id: string;
673
671
  } | null;
672
+ thumbnailId: string | null;
673
+ uploadStatus: import(".prisma/client").$Enums.UploadStatus;
674
674
  }[];
675
675
  reactions: {
676
676
  counts: {
@@ -741,8 +741,8 @@ export declare const discussionRouter: import("@trpc/server").TRPCBuiltRouter<{
741
741
  reaction: {
742
742
  type: import(".prisma/client").$Enums.ReactionType;
743
743
  id: string;
744
- createdAt: Date;
745
744
  userId: string;
745
+ createdAt: Date;
746
746
  announcementId: string | null;
747
747
  discussionId: string | null;
748
748
  discussionReplyId: string | null;
@@ -752,6 +752,18 @@ export declare const discussionRouter: import("@trpc/server").TRPCBuiltRouter<{
752
752
  meta: object;
753
753
  }>;
754
754
  }>>;
755
+ summarize: import("@trpc/server").TRPCQueryProcedure<{
756
+ input: {
757
+ discussionId: string;
758
+ };
759
+ output: {
760
+ summary: string;
761
+ keyQuestions: string[];
762
+ unresolvedIssues: string[];
763
+ participantCount: number;
764
+ };
765
+ meta: object;
766
+ }>;
755
767
  tags: import("@trpc/server").TRPCBuiltRouter<{
756
768
  ctx: import("../trpc.js").Context;
757
769
  meta: object;
@@ -774,8 +786,8 @@ export declare const discussionRouter: import("@trpc/server").TRPCBuiltRouter<{
774
786
  classId: string;
775
787
  };
776
788
  output: {
777
- name: string;
778
789
  id: string;
790
+ name: string;
779
791
  color: string;
780
792
  classId: string;
781
793
  }[];
@@ -788,8 +800,8 @@ export declare const discussionRouter: import("@trpc/server").TRPCBuiltRouter<{
788
800
  classId: string;
789
801
  };
790
802
  output: {
791
- name: string;
792
803
  id: string;
804
+ name: string;
793
805
  color: string;
794
806
  classId: string;
795
807
  };
@@ -802,8 +814,8 @@ export declare const discussionRouter: import("@trpc/server").TRPCBuiltRouter<{
802
814
  color?: string | undefined;
803
815
  };
804
816
  output: {
805
- name: string;
806
817
  id: string;
818
+ name: string;
807
819
  color: string;
808
820
  classId: string;
809
821
  };
@@ -1 +1 @@
1
- {"version":3,"file":"discussion.d.ts","sourceRoot":"/","sources":["routers/discussion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAgDxB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4J3B,CAAC"}
1
+ {"version":3,"file":"discussion.d.ts","sourceRoot":"/","sources":["routers/discussion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAiDxB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkK3B,CAAC"}
@@ -1,8 +1,9 @@
1
1
 
2
- !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]="6fe7687d-41cf-5836-8b08-7544529aadaf")}catch(e){}}();
2
+ !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]="309e0893-4ce8-5692-afb2-91d2b8c27105")}catch(e){}}();
3
3
  import { z } from "zod";
4
4
  import { createTRPCRouter, protectedProcedure } from "../trpc.js";
5
5
  import { createDiscussion, createDiscussionTag, deleteDiscussion, deleteDiscussionReply, deleteDiscussionTag, getDiscussionClassAccess, getDiscussion, getUnreadCounts, listDiscussionTags, listDiscussions, lockDiscussion, markAcceptedAnswer, markDiscussionRead, pinDiscussion, replyToDiscussion, toggleDiscussionReaction, updateDiscussion, updateDiscussionReply, updateDiscussionTag, } from "../services/discussion.js";
6
+ import { getDiscussionSummary } from "../services/discussionSummary.js";
6
7
  import { confirmDirectUpload, createDirectUploadFiles } from "../lib/fileUpload.js";
7
8
  import { prisma } from "../lib/prisma.js";
8
9
  import { TRPCError } from "@trpc/server";
@@ -132,6 +133,9 @@ export const discussionRouter = createTRPCRouter({
132
133
  .input(reactionToggleInputSchema)
133
134
  .mutation(({ ctx, input }) => toggleDiscussionReaction(ctx.user.id, input)),
134
135
  }),
136
+ summarize: protectedProcedure
137
+ .input(z.object({ discussionId: z.string() }))
138
+ .query(({ ctx, input }) => getDiscussionSummary(ctx.user.id, input.discussionId)),
135
139
  tags: createTRPCRouter({
136
140
  list: protectedProcedure
137
141
  .input(z.object({ classId: z.string() }))
@@ -148,4 +152,4 @@ export const discussionRouter = createTRPCRouter({
148
152
  }),
149
153
  });
150
154
  //# sourceMappingURL=discussion.js.map
151
- //# debugId=6fe7687d-41cf-5836-8b08-7544529aadaf
155
+ //# debugId=309e0893-4ce8-5692-afb2-91d2b8c27105
@@ -1 +1 @@
1
- {"version":3,"file":"discussion.js","sources":["routers/discussion.ts"],"sourceRoot":"/","sourcesContent":["import { z } from \"zod\";\nimport { createTRPCRouter, protectedProcedure } from \"../trpc.js\";\nimport {\n createDiscussion,\n createDiscussionTag,\n deleteDiscussion,\n deleteDiscussionReply,\n deleteDiscussionTag,\n getDiscussionClassAccess,\n getDiscussion,\n getUnreadCounts,\n listDiscussionTags,\n listDiscussions,\n lockDiscussion,\n markAcceptedAnswer,\n markDiscussionRead,\n pinDiscussion,\n replyToDiscussion,\n toggleDiscussionReaction,\n updateDiscussion,\n updateDiscussionReply,\n updateDiscussionTag,\n} from \"../services/discussion.js\";\nimport { confirmDirectUpload, createDirectUploadFiles } from \"../lib/fileUpload.js\";\nimport { prisma } from \"../lib/prisma.js\";\nimport { TRPCError } from \"@trpc/server\";\n\nconst discussionTypeSchema = z.enum([\"DISCUSSION\", \"QUESTION\", \"ANNOUNCEMENT\"]);\nconst reactionTypeSchema = z.enum([\"THUMBSUP\", \"CELEBRATE\", \"CARE\", \"HEART\", \"IDEA\", \"HAPPY\"]);\nconst hexColorSchema = z.string().regex(/^#[0-9A-Fa-f]{6}$/);\nconst MAX_DISCUSSION_UPLOAD_FILES = 20;\nconst MAX_DISCUSSION_FILE_BYTES = 25 * 1024 * 1024;\nconst reactionToggleInputSchema = z\n .object({\n discussionId: z.string().optional(),\n discussionReplyId: z.string().optional(),\n type: reactionTypeSchema,\n })\n .refine(\n ({ discussionId, discussionReplyId }) => Boolean(discussionId) !== Boolean(discussionReplyId),\n { message: \"must provide exactly one of discussionId or discussionReplyId\" }\n );\nconst directFileSchema = z.object({\n name: z.string().trim().min(1).max(255),\n type: z.string().trim().min(1).max(127),\n size: z.number().int().nonnegative().max(MAX_DISCUSSION_FILE_BYTES),\n});\n\nexport const discussionRouter = createTRPCRouter({\n list: protectedProcedure\n .input(\n z.object({\n classId: z.string(),\n tagId: z.string().optional(),\n type: discussionTypeSchema.optional(),\n search: z.string().optional(),\n sort: z.enum([\"recent\", \"activity\", \"top\"]).default(\"activity\"),\n cursor: z.string().optional(),\n limit: z.number().min(1).max(50).default(20),\n })\n )\n .query(({ ctx, input }) => listDiscussions(ctx.user!.id, input)),\n\n get: protectedProcedure\n .input(z.object({ discussionId: z.string() }))\n .query(({ ctx, input }) => getDiscussion(ctx.user!.id, input.discussionId)),\n\n create: protectedProcedure\n .input(\n z.object({\n classId: z.string(),\n title: z.string().trim().min(1).max(160),\n body: z.string().trim().min(1),\n type: discussionTypeSchema.default(\"DISCUSSION\"),\n tagIds: z.array(z.string()).optional(),\n attachmentIds: z.array(z.string()).optional(),\n })\n )\n .mutation(({ ctx, input }) => createDiscussion(ctx.user!.id, input)),\n\n getUploadUrls: protectedProcedure\n .input(\n z.object({\n classId: z.string(),\n files: z.array(directFileSchema).min(1).max(MAX_DISCUSSION_UPLOAD_FILES),\n })\n )\n .mutation(async ({ ctx, input }) => {\n await getDiscussionClassAccess(input.classId, ctx.user!.id);\n return {\n uploadFiles: await createDirectUploadFiles(input.files, ctx.user!.id),\n };\n }),\n\n confirmUpload: protectedProcedure\n .input(\n z.object({\n fileId: z.string(),\n uploadSuccess: z.boolean(),\n errorMessage: z.string().optional(),\n })\n )\n .mutation(async ({ ctx, input }) => {\n const file = await prisma.file.findFirst({\n where: {\n id: input.fileId,\n userId: ctx.user!.id,\n discussionId: null,\n discussionReplyId: null,\n },\n select: { id: true },\n });\n if (!file) {\n throw new TRPCError({ code: \"NOT_FOUND\", message: \"File not found or you do not have permission\" });\n }\n await confirmDirectUpload(input.fileId, input.uploadSuccess, input.errorMessage);\n return { success: true };\n }),\n\n update: protectedProcedure\n .input(\n z.object({\n discussionId: z.string(),\n title: z.string().trim().min(1).max(160).optional(),\n body: z.string().trim().min(1).optional(),\n type: discussionTypeSchema.optional(),\n tagIds: z.array(z.string()).optional(),\n allowReplies: z.boolean().optional(),\n })\n )\n .mutation(({ ctx, input }) => updateDiscussion(ctx.user!.id, input)),\n\n delete: protectedProcedure\n .input(z.object({ discussionId: z.string() }))\n .mutation(({ ctx, input }) => deleteDiscussion(ctx.user!.id, input.discussionId)),\n\n reply: protectedProcedure\n .input(\n z.object({\n discussionId: z.string(),\n parentReplyId: z.string().optional(),\n body: z.string().trim().min(1),\n attachmentIds: z.array(z.string()).optional(),\n })\n )\n .mutation(({ ctx, input }) => replyToDiscussion(ctx.user!.id, input)),\n\n updateReply: protectedProcedure\n .input(\n z.object({\n replyId: z.string(),\n body: z.string().trim().min(1),\n attachmentIds: z.array(z.string()).optional(),\n })\n )\n .mutation(({ ctx, input }) => updateDiscussionReply(ctx.user!.id, input)),\n\n deleteReply: protectedProcedure\n .input(z.object({ replyId: z.string() }))\n .mutation(({ ctx, input }) => deleteDiscussionReply(ctx.user!.id, input.replyId)),\n\n pin: protectedProcedure\n .input(z.object({ discussionId: z.string(), isPinned: z.boolean() }))\n .mutation(({ ctx, input }) => pinDiscussion(ctx.user!.id, input.discussionId, input.isPinned)),\n\n lock: protectedProcedure\n .input(z.object({ discussionId: z.string(), isLocked: z.boolean() }))\n .mutation(({ ctx, input }) => lockDiscussion(ctx.user!.id, input.discussionId, input.isLocked)),\n\n markAcceptedAnswer: protectedProcedure\n .input(z.object({ replyId: z.string(), accepted: z.boolean() }))\n .mutation(({ ctx, input }) => markAcceptedAnswer(ctx.user!.id, input.replyId, input.accepted)),\n\n markRead: protectedProcedure\n .input(z.object({ discussionId: z.string() }))\n .mutation(({ ctx, input }) => markDiscussionRead(ctx.user!.id, input.discussionId)),\n\n getUnreadCounts: protectedProcedure\n .input(z.object({ classIds: z.array(z.string()).max(100) }))\n .query(({ ctx, input }) => getUnreadCounts(ctx.user!.id, input.classIds)),\n\n reactions: createTRPCRouter({\n toggle: protectedProcedure\n .input(reactionToggleInputSchema)\n .mutation(({ ctx, input }) => toggleDiscussionReaction(ctx.user!.id, input)),\n }),\n\n tags: createTRPCRouter({\n list: protectedProcedure\n .input(z.object({ classId: z.string() }))\n .query(({ ctx, input }) => listDiscussionTags(ctx.user!.id, input.classId)),\n\n create: protectedProcedure\n .input(z.object({ classId: z.string(), name: z.string().trim().min(1).max(32), color: hexColorSchema }))\n .mutation(({ ctx, input }) => createDiscussionTag(ctx.user!.id, input)),\n\n update: protectedProcedure\n .input(z.object({ tagId: z.string(), name: z.string().trim().min(1).max(32).optional(), color: hexColorSchema.optional() }))\n .mutation(({ ctx, input }) => updateDiscussionTag(ctx.user!.id, input)),\n\n delete: protectedProcedure\n .input(z.object({ tagId: z.string() }))\n .mutation(({ ctx, input }) => deleteDiscussionTag(ctx.user!.id, input.tagId)),\n }),\n});\n"],"names":[],"mappings":"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","debug_id":"6fe7687d-41cf-5836-8b08-7544529aadaf"}
1
+ {"version":3,"file":"discussion.js","sources":["routers/discussion.ts"],"sourceRoot":"/","sourcesContent":["import { z } from \"zod\";\nimport { createTRPCRouter, protectedProcedure } from \"../trpc.js\";\nimport {\n createDiscussion,\n createDiscussionTag,\n deleteDiscussion,\n deleteDiscussionReply,\n deleteDiscussionTag,\n getDiscussionClassAccess,\n getDiscussion,\n getUnreadCounts,\n listDiscussionTags,\n listDiscussions,\n lockDiscussion,\n markAcceptedAnswer,\n markDiscussionRead,\n pinDiscussion,\n replyToDiscussion,\n toggleDiscussionReaction,\n updateDiscussion,\n updateDiscussionReply,\n updateDiscussionTag,\n} from \"../services/discussion.js\";\nimport { getDiscussionSummary } from \"../services/discussionSummary.js\";\nimport { confirmDirectUpload, createDirectUploadFiles } from \"../lib/fileUpload.js\";\nimport { prisma } from \"../lib/prisma.js\";\nimport { TRPCError } from \"@trpc/server\";\n\nconst discussionTypeSchema = z.enum([\"DISCUSSION\", \"QUESTION\", \"ANNOUNCEMENT\"]);\nconst reactionTypeSchema = z.enum([\"THUMBSUP\", \"CELEBRATE\", \"CARE\", \"HEART\", \"IDEA\", \"HAPPY\"]);\nconst hexColorSchema = z.string().regex(/^#[0-9A-Fa-f]{6}$/);\nconst MAX_DISCUSSION_UPLOAD_FILES = 20;\nconst MAX_DISCUSSION_FILE_BYTES = 25 * 1024 * 1024;\nconst reactionToggleInputSchema = z\n .object({\n discussionId: z.string().optional(),\n discussionReplyId: z.string().optional(),\n type: reactionTypeSchema,\n })\n .refine(\n ({ discussionId, discussionReplyId }) => Boolean(discussionId) !== Boolean(discussionReplyId),\n { message: \"must provide exactly one of discussionId or discussionReplyId\" }\n );\nconst directFileSchema = z.object({\n name: z.string().trim().min(1).max(255),\n type: z.string().trim().min(1).max(127),\n size: z.number().int().nonnegative().max(MAX_DISCUSSION_FILE_BYTES),\n});\n\nexport const discussionRouter = createTRPCRouter({\n list: protectedProcedure\n .input(\n z.object({\n classId: z.string(),\n tagId: z.string().optional(),\n type: discussionTypeSchema.optional(),\n search: z.string().optional(),\n sort: z.enum([\"recent\", \"activity\", \"top\"]).default(\"activity\"),\n cursor: z.string().optional(),\n limit: z.number().min(1).max(50).default(20),\n })\n )\n .query(({ ctx, input }) => listDiscussions(ctx.user!.id, input)),\n\n get: protectedProcedure\n .input(z.object({ discussionId: z.string() }))\n .query(({ ctx, input }) => getDiscussion(ctx.user!.id, input.discussionId)),\n\n create: protectedProcedure\n .input(\n z.object({\n classId: z.string(),\n title: z.string().trim().min(1).max(160),\n body: z.string().trim().min(1),\n type: discussionTypeSchema.default(\"DISCUSSION\"),\n tagIds: z.array(z.string()).optional(),\n attachmentIds: z.array(z.string()).optional(),\n })\n )\n .mutation(({ ctx, input }) => createDiscussion(ctx.user!.id, input)),\n\n getUploadUrls: protectedProcedure\n .input(\n z.object({\n classId: z.string(),\n files: z.array(directFileSchema).min(1).max(MAX_DISCUSSION_UPLOAD_FILES),\n })\n )\n .mutation(async ({ ctx, input }) => {\n await getDiscussionClassAccess(input.classId, ctx.user!.id);\n return {\n uploadFiles: await createDirectUploadFiles(input.files, ctx.user!.id),\n };\n }),\n\n confirmUpload: protectedProcedure\n .input(\n z.object({\n fileId: z.string(),\n uploadSuccess: z.boolean(),\n errorMessage: z.string().optional(),\n })\n )\n .mutation(async ({ ctx, input }) => {\n const file = await prisma.file.findFirst({\n where: {\n id: input.fileId,\n userId: ctx.user!.id,\n discussionId: null,\n discussionReplyId: null,\n },\n select: { id: true },\n });\n if (!file) {\n throw new TRPCError({ code: \"NOT_FOUND\", message: \"File not found or you do not have permission\" });\n }\n await confirmDirectUpload(input.fileId, input.uploadSuccess, input.errorMessage);\n return { success: true };\n }),\n\n update: protectedProcedure\n .input(\n z.object({\n discussionId: z.string(),\n title: z.string().trim().min(1).max(160).optional(),\n body: z.string().trim().min(1).optional(),\n type: discussionTypeSchema.optional(),\n tagIds: z.array(z.string()).optional(),\n allowReplies: z.boolean().optional(),\n })\n )\n .mutation(({ ctx, input }) => updateDiscussion(ctx.user!.id, input)),\n\n delete: protectedProcedure\n .input(z.object({ discussionId: z.string() }))\n .mutation(({ ctx, input }) => deleteDiscussion(ctx.user!.id, input.discussionId)),\n\n reply: protectedProcedure\n .input(\n z.object({\n discussionId: z.string(),\n parentReplyId: z.string().optional(),\n body: z.string().trim().min(1),\n attachmentIds: z.array(z.string()).optional(),\n })\n )\n .mutation(({ ctx, input }) => replyToDiscussion(ctx.user!.id, input)),\n\n updateReply: protectedProcedure\n .input(\n z.object({\n replyId: z.string(),\n body: z.string().trim().min(1),\n attachmentIds: z.array(z.string()).optional(),\n })\n )\n .mutation(({ ctx, input }) => updateDiscussionReply(ctx.user!.id, input)),\n\n deleteReply: protectedProcedure\n .input(z.object({ replyId: z.string() }))\n .mutation(({ ctx, input }) => deleteDiscussionReply(ctx.user!.id, input.replyId)),\n\n pin: protectedProcedure\n .input(z.object({ discussionId: z.string(), isPinned: z.boolean() }))\n .mutation(({ ctx, input }) => pinDiscussion(ctx.user!.id, input.discussionId, input.isPinned)),\n\n lock: protectedProcedure\n .input(z.object({ discussionId: z.string(), isLocked: z.boolean() }))\n .mutation(({ ctx, input }) => lockDiscussion(ctx.user!.id, input.discussionId, input.isLocked)),\n\n markAcceptedAnswer: protectedProcedure\n .input(z.object({ replyId: z.string(), accepted: z.boolean() }))\n .mutation(({ ctx, input }) => markAcceptedAnswer(ctx.user!.id, input.replyId, input.accepted)),\n\n markRead: protectedProcedure\n .input(z.object({ discussionId: z.string() }))\n .mutation(({ ctx, input }) => markDiscussionRead(ctx.user!.id, input.discussionId)),\n\n getUnreadCounts: protectedProcedure\n .input(z.object({ classIds: z.array(z.string()).max(100) }))\n .query(({ ctx, input }) => getUnreadCounts(ctx.user!.id, input.classIds)),\n\n reactions: createTRPCRouter({\n toggle: protectedProcedure\n .input(reactionToggleInputSchema)\n .mutation(({ ctx, input }) => toggleDiscussionReaction(ctx.user!.id, input)),\n }),\n\n summarize: protectedProcedure\n .input(z.object({ discussionId: z.string() }))\n .query(({ ctx, input }) =>\n getDiscussionSummary(ctx.user!.id, input.discussionId),\n ),\n\n tags: createTRPCRouter({\n list: protectedProcedure\n .input(z.object({ classId: z.string() }))\n .query(({ ctx, input }) => listDiscussionTags(ctx.user!.id, input.classId)),\n\n create: protectedProcedure\n .input(z.object({ classId: z.string(), name: z.string().trim().min(1).max(32), color: hexColorSchema }))\n .mutation(({ ctx, input }) => createDiscussionTag(ctx.user!.id, input)),\n\n update: protectedProcedure\n .input(z.object({ tagId: z.string(), name: z.string().trim().min(1).max(32).optional(), color: hexColorSchema.optional() }))\n .mutation(({ ctx, input }) => updateDiscussionTag(ctx.user!.id, input)),\n\n delete: protectedProcedure\n .input(z.object({ tagId: z.string() }))\n .mutation(({ ctx, input }) => deleteDiscussionTag(ctx.user!.id, input.tagId)),\n }),\n});\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,qBAAqB,EACrB,mBAAmB,EACnB,wBAAwB,EACxB,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,wBAAwB,EACxB,gBAAgB,EAChB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,oBAAoB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC;AAChF,MAAM,kBAAkB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAC/F,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;AAC7D,MAAM,2BAA2B,GAAG,EAAE,CAAC;AACvC,MAAM,yBAAyB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AACnD,MAAM,yBAAyB,GAAG,CAAC;KAChC,MAAM,CAAC;IACN,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACxC,IAAI,EAAE,kBAAkB;CACzB,CAAC;KACD,MAAM,CACL,CAAC,EAAE,YAAY,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,OAAO,CAAC,iBAAiB,CAAC,EAC7F,EAAE,OAAO,EAAE,+DAA+D,EAAE,CAC7E,CAAC;AACJ,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IACvC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IACvC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,yBAAyB,CAAC;CACpE,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,gBAAgB,CAAC;IAC/C,IAAI,EAAE,kBAAkB;SACrB,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC5B,IAAI,EAAE,oBAAoB,CAAC,QAAQ,EAAE;QACrC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC7B,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;QAC/D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC7B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;KAC7C,CAAC,CACH;SACA,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAElE,GAAG,EAAE,kBAAkB;SACpB,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;SAC7C,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;IAE7E,MAAM,EAAE,kBAAkB;SACvB,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;QACxC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9B,IAAI,EAAE,oBAAoB,CAAC,OAAO,CAAC,YAAY,CAAC;QAChD,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;QACtC,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;KAC9C,CAAC,CACH;SACA,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAEtE,aAAa,EAAE,kBAAkB;SAC9B,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,2BAA2B,CAAC;KACzE,CAAC,CACH;SACA,QAAQ,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE;QACjC,MAAM,wBAAwB,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,IAAK,CAAC,EAAE,CAAC,CAAC;QAC5D,OAAO;YACL,WAAW,EAAE,MAAM,uBAAuB,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,IAAK,CAAC,EAAE,CAAC;SACtE,CAAC;IACJ,CAAC,CAAC;IAEJ,aAAa,EAAE,kBAAkB;SAC9B,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;QAClB,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE;QAC1B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KACpC,CAAC,CACH;SACA,QAAQ,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE;QACjC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;YACvC,KAAK,EAAE;gBACL,EAAE,EAAE,KAAK,CAAC,MAAM;gBAChB,MAAM,EAAE,GAAG,CAAC,IAAK,CAAC,EAAE;gBACpB,YAAY,EAAE,IAAI;gBAClB,iBAAiB,EAAE,IAAI;aACxB;YACD,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE;SACrB,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,8CAA8C,EAAE,CAAC,CAAC;QACtG,CAAC;QACD,MAAM,mBAAmB,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;QACjF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC,CAAC;IAEJ,MAAM,EAAE,kBAAkB;SACvB,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;QACxB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;QACnD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;QACzC,IAAI,EAAE,oBAAoB,CAAC,QAAQ,EAAE;QACrC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;QACtC,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;KACrC,CAAC,CACH;SACA,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAEtE,MAAM,EAAE,kBAAkB;SACvB,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;SAC7C,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;IAEnF,KAAK,EAAE,kBAAkB;SACtB,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;QACxB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACpC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9B,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;KAC9C,CAAC,CACH;SACA,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAEvE,WAAW,EAAE,kBAAkB;SAC5B,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9B,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;KAC9C,CAAC,CACH;SACA,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAE3E,WAAW,EAAE,kBAAkB;SAC5B,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;SACxC,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAEnF,GAAG,EAAE,kBAAkB;SACpB,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;SACpE,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAEhG,IAAI,EAAE,kBAAkB;SACrB,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;SACpE,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAEjG,kBAAkB,EAAE,kBAAkB;SACnC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;SAC/D,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAEhG,QAAQ,EAAE,kBAAkB;SACzB,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;SAC7C,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;IAErF,eAAe,EAAE,kBAAkB;SAChC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;SAC3D,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAE3E,SAAS,EAAE,gBAAgB,CAAC;QAC1B,MAAM,EAAE,kBAAkB;aACvB,KAAK,CAAC,yBAAyB,CAAC;aAChC,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,wBAAwB,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;KAC/E,CAAC;IAEF,SAAS,EAAE,kBAAkB;SAC1B,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;SAC7C,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CACxB,oBAAoB,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,KAAK,CAAC,YAAY,CAAC,CACvD;IAEH,IAAI,EAAE,gBAAgB,CAAC;QACrB,IAAI,EAAE,kBAAkB;aACrB,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;aACxC,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAE7E,MAAM,EAAE,kBAAkB;aACvB,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;aACvG,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAEzE,MAAM,EAAE,kBAAkB;aACvB,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,cAAc,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;aAC3H,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAEzE,MAAM,EAAE,kBAAkB;aACvB,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;aACtC,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;KAChF,CAAC;CACH,CAAC,CAAC","debug_id":"309e0893-4ce8-5692-afb2-91d2b8c27105"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * tRPC router for embedding/RAG operations.
3
+ * Provides search and indexing triggers for class content.
4
+ */
5
+ import { z } from 'zod';
6
+ export declare const embeddingRouter: import("@trpc/server").TRPCBuiltRouter<{
7
+ ctx: import("../trpc.js").Context;
8
+ meta: object;
9
+ errorShape: {
10
+ data: {
11
+ zodError: z.typeToFlattenedError<any, string> | null;
12
+ prismaError: import("../utils/prismaErrorHandler.js").PrismaErrorInfo | null;
13
+ code: import("@trpc/server").TRPC_ERROR_CODE_KEY;
14
+ httpStatus: number;
15
+ path?: string;
16
+ stack?: string;
17
+ };
18
+ message: string;
19
+ code: import("@trpc/server").TRPC_ERROR_CODE_NUMBER;
20
+ };
21
+ transformer: false;
22
+ }, import("@trpc/server").TRPCDecorateCreateRouterOptions<{
23
+ /**
24
+ * Semantic search over class materials.
25
+ */
26
+ search: import("@trpc/server").TRPCQueryProcedure<{
27
+ input: {
28
+ query: string;
29
+ classId: string;
30
+ limit?: number | undefined;
31
+ sourceTypes?: ("FILE" | "ASSIGNMENT" | "WORKSHEET" | "ANNOUNCEMENT" | "SECTION" | "DISCUSSION" | "SUBMISSION" | "SYLLABUS")[] | undefined;
32
+ };
33
+ output: import("../services/embedding.js").EmbeddingSearchResult[];
34
+ meta: object;
35
+ }>;
36
+ /**
37
+ * Trigger re-indexing of a specific resource.
38
+ * Teachers only.
39
+ */
40
+ reindex: import("@trpc/server").TRPCMutationProcedure<{
41
+ input: {
42
+ classId: string;
43
+ sourceType: "FILE" | "ASSIGNMENT" | "WORKSHEET" | "ANNOUNCEMENT" | "SECTION" | "DISCUSSION" | "SUBMISSION" | "SYLLABUS";
44
+ sourceId: string;
45
+ };
46
+ output: {
47
+ runJobId: string;
48
+ };
49
+ meta: object;
50
+ }>;
51
+ /**
52
+ * Bulk index all content for a class.
53
+ * Teachers only. Useful for initial setup.
54
+ */
55
+ indexAll: import("@trpc/server").TRPCMutationProcedure<{
56
+ input: {
57
+ classId: string;
58
+ };
59
+ output: {
60
+ queued: {
61
+ assignments: number;
62
+ worksheets: number;
63
+ announcements: number;
64
+ discussions: number;
65
+ submissions: number;
66
+ syllabus: number;
67
+ files: number;
68
+ };
69
+ };
70
+ meta: object;
71
+ }>;
72
+ }>>;
73
+ //# sourceMappingURL=embedding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding.d.ts","sourceRoot":"/","sources":["routers/embedding.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAaxB,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;IAC1B;;OAEG;;;;;;;;;;;IAiCH;;;OAGG;;;;;;;;;;;;IA+BH;;;OAGG;;;;;;;;;;;;;;;;;;GAyEH,CAAC"}