@studious-lms/server 1.1.24 → 1.2.6

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 (485) hide show
  1. package/.coderabbit.yaml +9 -0
  2. package/.env.example +53 -0
  3. package/.env.test.example +37 -0
  4. package/README.md +34 -7
  5. package/dist/exportType.d.ts.map +1 -1
  6. package/dist/exportType.js +4 -0
  7. package/dist/exportType.js.map +1 -0
  8. package/dist/index.d.ts +1 -1
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +212 -51
  11. package/dist/index.js.map +1 -0
  12. package/dist/instrument.d.ts +2 -0
  13. package/dist/instrument.d.ts.map +1 -0
  14. package/dist/instrument.js +18 -0
  15. package/dist/instrument.js.map +1 -0
  16. package/dist/lib/config/env.d.ts +190 -0
  17. package/dist/lib/config/env.d.ts.map +1 -0
  18. package/dist/lib/config/env.js +121 -0
  19. package/dist/lib/config/env.js.map +1 -0
  20. package/dist/lib/fileUpload.d.ts +2 -2
  21. package/dist/lib/fileUpload.d.ts.map +1 -1
  22. package/dist/lib/fileUpload.js +82 -15
  23. package/dist/lib/fileUpload.js.map +1 -0
  24. package/dist/lib/googleCloudStorage.d.ts +13 -0
  25. package/dist/lib/googleCloudStorage.d.ts.map +1 -1
  26. package/dist/lib/googleCloudStorage.js +45 -6
  27. package/dist/lib/googleCloudStorage.js.map +1 -0
  28. package/dist/lib/jsonConversion.d.ts.map +1 -1
  29. package/dist/lib/jsonConversion.js +16 -14
  30. package/dist/lib/jsonConversion.js.map +1 -0
  31. package/dist/lib/jsonStyles.d.ts.map +1 -1
  32. package/dist/lib/jsonStyles.js +4 -0
  33. package/dist/lib/jsonStyles.js.map +1 -0
  34. package/dist/lib/notificationHandler.d.ts +25 -0
  35. package/dist/lib/notificationHandler.d.ts.map +1 -0
  36. package/dist/lib/notificationHandler.js +32 -0
  37. package/dist/lib/notificationHandler.js.map +1 -0
  38. package/dist/lib/prisma.d.ts +2 -2
  39. package/dist/lib/prisma.d.ts.map +1 -1
  40. package/dist/lib/prisma.js +24 -1
  41. package/dist/lib/prisma.js.map +1 -0
  42. package/dist/lib/pusher.d.ts +4 -1
  43. package/dist/lib/pusher.d.ts.map +1 -1
  44. package/dist/lib/pusher.js +14 -6
  45. package/dist/lib/pusher.js.map +1 -0
  46. package/dist/lib/redis.d.ts +5 -0
  47. package/dist/lib/redis.d.ts.map +1 -0
  48. package/dist/lib/redis.js +53 -0
  49. package/dist/lib/redis.js.map +1 -0
  50. package/dist/lib/thumbnailGenerator.d.ts +0 -21
  51. package/dist/lib/thumbnailGenerator.d.ts.map +1 -1
  52. package/dist/lib/thumbnailGenerator.js +159 -158
  53. package/dist/lib/thumbnailGenerator.js.map +1 -0
  54. package/dist/middleware/auth.d.ts.map +1 -1
  55. package/dist/middleware/auth.js +41 -93
  56. package/dist/middleware/auth.js.map +1 -0
  57. package/dist/middleware/logging.d.ts.map +1 -1
  58. package/dist/middleware/logging.js +4 -0
  59. package/dist/middleware/logging.js.map +1 -0
  60. package/dist/middleware/security.d.ts +5 -0
  61. package/dist/middleware/security.d.ts.map +1 -0
  62. package/dist/middleware/security.js +77 -0
  63. package/dist/middleware/security.js.map +1 -0
  64. package/dist/models/agenda.d.ts +97 -0
  65. package/dist/models/agenda.d.ts.map +1 -0
  66. package/dist/models/agenda.js +40 -0
  67. package/dist/models/agenda.js.map +1 -0
  68. package/dist/models/announcement.d.ts +223 -0
  69. package/dist/models/announcement.d.ts.map +1 -0
  70. package/dist/models/announcement.js +120 -0
  71. package/dist/models/announcement.js.map +1 -0
  72. package/dist/models/assignment.d.ts +1292 -0
  73. package/dist/models/assignment.d.ts.map +1 -0
  74. package/dist/models/assignment.js +309 -0
  75. package/dist/models/assignment.js.map +1 -0
  76. package/dist/models/attendance.d.ts +180 -0
  77. package/dist/models/attendance.d.ts.map +1 -0
  78. package/dist/models/attendance.js +188 -0
  79. package/dist/models/attendance.js.map +1 -0
  80. package/dist/models/auth.d.ts +153 -0
  81. package/dist/models/auth.d.ts.map +1 -0
  82. package/dist/models/auth.js +217 -0
  83. package/dist/models/auth.js.map +1 -0
  84. package/dist/models/class.d.ts +439 -0
  85. package/dist/models/class.d.ts.map +1 -0
  86. package/dist/models/class.js +546 -0
  87. package/dist/models/class.js.map +1 -0
  88. package/dist/models/comment.d.ts +171 -0
  89. package/dist/models/comment.d.ts.map +1 -0
  90. package/dist/models/comment.js +138 -0
  91. package/dist/models/comment.js.map +1 -0
  92. package/dist/models/conversation.d.ts +164 -0
  93. package/dist/models/conversation.d.ts.map +1 -0
  94. package/dist/models/conversation.js +175 -0
  95. package/dist/models/conversation.js.map +1 -0
  96. package/dist/models/event.d.ts +295 -0
  97. package/dist/models/event.d.ts.map +1 -0
  98. package/dist/models/event.js +145 -0
  99. package/dist/models/event.js.map +1 -0
  100. package/dist/models/file.d.ts +536 -0
  101. package/dist/models/file.d.ts.map +1 -0
  102. package/dist/models/file.js +126 -0
  103. package/dist/models/file.js.map +1 -0
  104. package/dist/models/folder.d.ts +295 -0
  105. package/dist/models/folder.d.ts.map +1 -0
  106. package/dist/models/folder.js +202 -0
  107. package/dist/models/folder.js.map +1 -0
  108. package/dist/models/labChat.d.ts +243 -0
  109. package/dist/models/labChat.d.ts.map +1 -0
  110. package/dist/models/labChat.js +204 -0
  111. package/dist/models/labChat.js.map +1 -0
  112. package/dist/models/marketing.d.ts +72 -0
  113. package/dist/models/marketing.d.ts.map +1 -0
  114. package/dist/models/marketing.js +26 -0
  115. package/dist/models/marketing.js.map +1 -0
  116. package/dist/models/message.d.ts +100 -0
  117. package/dist/models/message.d.ts.map +1 -0
  118. package/dist/models/message.js +131 -0
  119. package/dist/models/message.js.map +1 -0
  120. package/dist/models/newtonChat.d.ts +72 -0
  121. package/dist/models/newtonChat.d.ts.map +1 -0
  122. package/dist/models/newtonChat.js +61 -0
  123. package/dist/models/newtonChat.js.map +1 -0
  124. package/dist/models/notification.d.ts +65 -0
  125. package/dist/models/notification.d.ts.map +1 -0
  126. package/dist/models/notification.js +46 -0
  127. package/dist/models/notification.js.map +1 -0
  128. package/dist/models/section.d.ts +102 -0
  129. package/dist/models/section.d.ts.map +1 -0
  130. package/dist/models/section.js +83 -0
  131. package/dist/models/section.js.map +1 -0
  132. package/dist/models/user.d.ts +39 -0
  133. package/dist/models/user.d.ts.map +1 -0
  134. package/dist/models/user.js +38 -0
  135. package/dist/models/user.js.map +1 -0
  136. package/dist/models/worksheet.d.ts +460 -0
  137. package/dist/models/worksheet.d.ts.map +1 -0
  138. package/dist/models/worksheet.js +200 -0
  139. package/dist/models/worksheet.js.map +1 -0
  140. package/dist/pipelines/aiLabChat.d.ts +21 -0
  141. package/dist/pipelines/aiLabChat.d.ts.map +1 -0
  142. package/dist/pipelines/aiLabChat.js +460 -0
  143. package/dist/pipelines/aiLabChat.js.map +1 -0
  144. package/dist/pipelines/aiNewtonChat.d.ts +30 -0
  145. package/dist/pipelines/aiNewtonChat.d.ts.map +1 -0
  146. package/dist/pipelines/aiNewtonChat.js +289 -0
  147. package/dist/pipelines/aiNewtonChat.js.map +1 -0
  148. package/dist/pipelines/gradeWorksheet.d.ts +30 -0
  149. package/dist/pipelines/gradeWorksheet.d.ts.map +1 -0
  150. package/dist/pipelines/gradeWorksheet.js +252 -0
  151. package/dist/pipelines/gradeWorksheet.js.map +1 -0
  152. package/dist/routers/_app.d.ts +6403 -3741
  153. package/dist/routers/_app.d.ts.map +1 -1
  154. package/dist/routers/_app.js +10 -0
  155. package/dist/routers/_app.js.map +1 -0
  156. package/dist/routers/agenda.d.ts +58 -6
  157. package/dist/routers/agenda.d.ts.map +1 -1
  158. package/dist/routers/agenda.js +6 -58
  159. package/dist/routers/agenda.js.map +1 -0
  160. package/dist/routers/announcement.d.ts +325 -6
  161. package/dist/routers/announcement.d.ts.map +1 -1
  162. package/dist/routers/announcement.js +547 -57
  163. package/dist/routers/announcement.js.map +1 -0
  164. package/dist/routers/assignment.d.ts +431 -318
  165. package/dist/routers/assignment.d.ts.map +1 -1
  166. package/dist/routers/assignment.js +104 -1559
  167. package/dist/routers/assignment.js.map +1 -0
  168. package/dist/routers/attendance.d.ts +20 -9
  169. package/dist/routers/attendance.d.ts.map +1 -1
  170. package/dist/routers/attendance.js +10 -263
  171. package/dist/routers/attendance.js.map +1 -0
  172. package/dist/routers/auth.d.ts +21 -1
  173. package/dist/routers/auth.d.ts.map +1 -1
  174. package/dist/routers/auth.js +37 -241
  175. package/dist/routers/auth.js.map +1 -0
  176. package/dist/routers/class.d.ts +198 -68
  177. package/dist/routers/class.d.ts.map +1 -1
  178. package/dist/routers/class.js +88 -909
  179. package/dist/routers/class.js.map +1 -0
  180. package/dist/routers/comment.d.ts +153 -0
  181. package/dist/routers/comment.d.ts.map +1 -0
  182. package/dist/routers/comment.js +58 -0
  183. package/dist/routers/comment.js.map +1 -0
  184. package/dist/routers/conversation.d.ts +73 -3
  185. package/dist/routers/conversation.d.ts.map +1 -1
  186. package/dist/routers/conversation.js +23 -265
  187. package/dist/routers/conversation.js.map +1 -0
  188. package/dist/routers/event.d.ts +46 -37
  189. package/dist/routers/event.d.ts.map +1 -1
  190. package/dist/routers/event.js +15 -431
  191. package/dist/routers/event.js.map +1 -0
  192. package/dist/routers/file.d.ts +4 -2
  193. package/dist/routers/file.d.ts.map +1 -1
  194. package/dist/routers/file.js +11 -295
  195. package/dist/routers/file.js.map +1 -0
  196. package/dist/routers/folder.d.ts +21 -14
  197. package/dist/routers/folder.d.ts.map +1 -1
  198. package/dist/routers/folder.js +36 -743
  199. package/dist/routers/folder.js.map +1 -0
  200. package/dist/routers/labChat.d.ts +12 -9
  201. package/dist/routers/labChat.d.ts.map +1 -1
  202. package/dist/routers/labChat.js +21 -877
  203. package/dist/routers/labChat.js.map +1 -0
  204. package/dist/routers/marketing.d.ts +2 -2
  205. package/dist/routers/marketing.d.ts.map +1 -1
  206. package/dist/routers/marketing.js +9 -54
  207. package/dist/routers/marketing.js.map +1 -0
  208. package/dist/routers/message.d.ts +2 -1
  209. package/dist/routers/message.d.ts.map +1 -1
  210. package/dist/routers/message.js +29 -519
  211. package/dist/routers/message.js.map +1 -0
  212. package/dist/routers/newtonChat.d.ts +55 -0
  213. package/dist/routers/newtonChat.d.ts.map +1 -0
  214. package/dist/routers/newtonChat.js +22 -0
  215. package/dist/routers/newtonChat.js.map +1 -0
  216. package/dist/routers/notifications.d.ts +8 -8
  217. package/dist/routers/notifications.d.ts.map +1 -1
  218. package/dist/routers/notifications.js +20 -81
  219. package/dist/routers/notifications.js.map +1 -0
  220. package/dist/routers/section.d.ts +37 -6
  221. package/dist/routers/section.d.ts.map +1 -1
  222. package/dist/routers/section.js +26 -167
  223. package/dist/routers/section.js.map +1 -0
  224. package/dist/routers/user.d.ts +1 -1
  225. package/dist/routers/user.d.ts.map +1 -1
  226. package/dist/routers/user.js +34 -204
  227. package/dist/routers/user.js.map +1 -0
  228. package/dist/routers/worksheet.d.ts +362 -0
  229. package/dist/routers/worksheet.d.ts.map +1 -0
  230. package/dist/routers/worksheet.js +153 -0
  231. package/dist/routers/worksheet.js.map +1 -0
  232. package/dist/seedDatabase.d.ts +2 -3
  233. package/dist/seedDatabase.d.ts.map +1 -1
  234. package/dist/seedDatabase.js +311 -289
  235. package/dist/seedDatabase.js.map +1 -0
  236. package/dist/server/pipelines/aiLabChat.d.ts +21 -0
  237. package/dist/server/pipelines/aiLabChat.d.ts.map +1 -0
  238. package/dist/server/pipelines/aiLabChat.js +456 -0
  239. package/dist/server/pipelines/aiLabChat.js.map +1 -0
  240. package/dist/server/pipelines/aiNewtonChat.d.ts +30 -0
  241. package/dist/server/pipelines/aiNewtonChat.d.ts.map +1 -0
  242. package/dist/server/pipelines/aiNewtonChat.js +285 -0
  243. package/dist/server/pipelines/aiNewtonChat.js.map +1 -0
  244. package/dist/server/pipelines/gradeWorksheet.d.ts +30 -0
  245. package/dist/server/pipelines/gradeWorksheet.d.ts.map +1 -0
  246. package/dist/server/pipelines/gradeWorksheet.js +248 -0
  247. package/dist/server/pipelines/gradeWorksheet.js.map +1 -0
  248. package/dist/services/agenda.d.ts +100 -0
  249. package/dist/services/agenda.d.ts.map +1 -0
  250. package/dist/services/agenda.js +21 -0
  251. package/dist/services/agenda.js.map +1 -0
  252. package/dist/services/announcement.d.ts +135 -0
  253. package/dist/services/announcement.d.ts.map +1 -0
  254. package/dist/services/announcement.js +223 -0
  255. package/dist/services/announcement.js.map +1 -0
  256. package/dist/services/assignment.d.ts +1462 -0
  257. package/dist/services/assignment.d.ts.map +1 -0
  258. package/dist/services/assignment.js +898 -0
  259. package/dist/services/assignment.js.map +1 -0
  260. package/dist/services/attendance.d.ts +93 -0
  261. package/dist/services/attendance.d.ts.map +1 -0
  262. package/dist/services/attendance.js +61 -0
  263. package/dist/services/attendance.js.map +1 -0
  264. package/dist/services/auth.d.ts +68 -0
  265. package/dist/services/auth.d.ts.map +1 -0
  266. package/dist/services/auth.js +218 -0
  267. package/dist/services/auth.js.map +1 -0
  268. package/dist/services/class.d.ts +621 -0
  269. package/dist/services/class.d.ts.map +1 -0
  270. package/dist/services/class.js +474 -0
  271. package/dist/services/class.js.map +1 -0
  272. package/dist/services/comment.d.ts +100 -0
  273. package/dist/services/comment.d.ts.map +1 -0
  274. package/dist/services/comment.js +83 -0
  275. package/dist/services/comment.js.map +1 -0
  276. package/dist/services/conversation.d.ts +159 -0
  277. package/dist/services/conversation.d.ts.map +1 -0
  278. package/dist/services/conversation.js +138 -0
  279. package/dist/services/conversation.js.map +1 -0
  280. package/dist/services/event.d.ts +216 -0
  281. package/dist/services/event.d.ts.map +1 -0
  282. package/dist/services/event.js +168 -0
  283. package/dist/services/event.js.map +1 -0
  284. package/dist/services/file.d.ts +74 -0
  285. package/dist/services/file.d.ts.map +1 -0
  286. package/dist/services/file.js +133 -0
  287. package/dist/services/file.js.map +1 -0
  288. package/dist/services/folder.d.ts +239 -0
  289. package/dist/services/folder.d.ts.map +1 -0
  290. package/dist/services/folder.js +248 -0
  291. package/dist/services/folder.js.map +1 -0
  292. package/dist/services/labChat.d.ts +165 -0
  293. package/dist/services/labChat.d.ts.map +1 -0
  294. package/dist/services/labChat.js +289 -0
  295. package/dist/services/labChat.js.map +1 -0
  296. package/dist/services/marketing.d.ts +50 -0
  297. package/dist/services/marketing.d.ts.map +1 -0
  298. package/dist/services/marketing.js +32 -0
  299. package/dist/services/marketing.js.map +1 -0
  300. package/dist/services/message.d.ts +95 -0
  301. package/dist/services/message.d.ts.map +1 -0
  302. package/dist/services/message.js +350 -0
  303. package/dist/services/message.js.map +1 -0
  304. package/dist/services/newtonChat.d.ts +22 -0
  305. package/dist/services/newtonChat.d.ts.map +1 -0
  306. package/dist/services/newtonChat.js +174 -0
  307. package/dist/services/newtonChat.js.map +1 -0
  308. package/dist/services/notification.d.ts +65 -0
  309. package/dist/services/notification.d.ts.map +1 -0
  310. package/dist/services/notification.js +33 -0
  311. package/dist/services/notification.js.map +1 -0
  312. package/dist/services/section.d.ts +53 -0
  313. package/dist/services/section.d.ts.map +1 -0
  314. package/dist/services/section.js +199 -0
  315. package/dist/services/section.js.map +1 -0
  316. package/dist/services/user.d.ts +48 -0
  317. package/dist/services/user.d.ts.map +1 -0
  318. package/dist/services/user.js +141 -0
  319. package/dist/services/user.js.map +1 -0
  320. package/dist/services/worksheet.d.ts +239 -0
  321. package/dist/services/worksheet.d.ts.map +1 -0
  322. package/dist/services/worksheet.js +235 -0
  323. package/dist/services/worksheet.js.map +1 -0
  324. package/dist/socket/handlers.d.ts.map +1 -1
  325. package/dist/socket/handlers.js +4 -0
  326. package/dist/socket/handlers.js.map +1 -0
  327. package/dist/trpc.d.ts.map +1 -1
  328. package/dist/trpc.js +4 -0
  329. package/dist/trpc.js.map +1 -0
  330. package/dist/types/trpc.d.ts.map +1 -1
  331. package/dist/types/trpc.js +4 -0
  332. package/dist/types/trpc.js.map +1 -0
  333. package/dist/utils/aiUser.d.ts +1 -3
  334. package/dist/utils/aiUser.d.ts.map +1 -1
  335. package/dist/utils/aiUser.js +8 -3
  336. package/dist/utils/aiUser.js.map +1 -0
  337. package/dist/utils/email.d.ts +12 -1
  338. package/dist/utils/email.d.ts.map +1 -1
  339. package/dist/utils/email.js +26 -4
  340. package/dist/utils/email.js.map +1 -0
  341. package/dist/utils/generateInviteCode.d.ts +1 -2
  342. package/dist/utils/generateInviteCode.d.ts.map +1 -1
  343. package/dist/utils/generateInviteCode.js +5 -2
  344. package/dist/utils/generateInviteCode.js.map +1 -0
  345. package/dist/utils/inference.d.ts +8 -0
  346. package/dist/utils/inference.d.ts.map +1 -1
  347. package/dist/utils/inference.js +78 -10
  348. package/dist/utils/inference.js.map +1 -0
  349. package/dist/utils/logger.d.ts +4 -0
  350. package/dist/utils/logger.d.ts.map +1 -1
  351. package/dist/utils/logger.js +35 -3
  352. package/dist/utils/logger.js.map +1 -0
  353. package/dist/utils/prismaErrorHandler.d.ts.map +1 -1
  354. package/dist/utils/prismaErrorHandler.js +7 -0
  355. package/dist/utils/prismaErrorHandler.js.map +1 -0
  356. package/dist/utils/prismaWrapper.d.ts +1 -0
  357. package/dist/utils/prismaWrapper.d.ts.map +1 -1
  358. package/dist/utils/prismaWrapper.js +8 -0
  359. package/dist/utils/prismaWrapper.js.map +1 -0
  360. package/docker-compose.yml +19 -0
  361. package/package.json +21 -4
  362. package/prisma/migrations/20251109122857_annuoncements_comments/migration.sql +30 -0
  363. package/prisma/migrations/20251109135555_reactions_announcements_comments/migration.sql +35 -0
  364. package/prisma/schema.prisma +180 -12
  365. package/scripts/test-pre-push.ts +14 -0
  366. package/src/index.ts +247 -52
  367. package/src/instrument.ts +15 -0
  368. package/src/lib/config/env.ts +132 -0
  369. package/src/lib/fileUpload.ts +81 -16
  370. package/src/lib/googleCloudStorage.ts +42 -6
  371. package/src/lib/jsonConversion.ts +12 -14
  372. package/src/lib/prisma.ts +23 -2
  373. package/src/lib/pusher.ts +11 -6
  374. package/src/lib/redis.ts +56 -0
  375. package/src/lib/thumbnailGenerator.ts +170 -168
  376. package/src/middleware/auth.ts +86 -137
  377. package/src/middleware/security.ts +80 -0
  378. package/src/models/agenda.ts +46 -0
  379. package/src/models/announcement.ts +134 -0
  380. package/src/models/assignment.ts +322 -0
  381. package/src/models/attendance.ts +208 -0
  382. package/src/models/auth.ts +247 -0
  383. package/src/models/class.ts +598 -0
  384. package/src/models/comment.ts +152 -0
  385. package/src/models/conversation.ts +200 -0
  386. package/src/models/event.ts +177 -0
  387. package/src/models/file.ts +129 -0
  388. package/src/models/folder.ts +225 -0
  389. package/src/models/labChat.ts +213 -0
  390. package/src/models/marketing.ts +45 -0
  391. package/src/models/message.ts +153 -0
  392. package/src/models/newtonChat.ts +70 -0
  393. package/src/models/notification.ts +54 -0
  394. package/src/models/section.ts +98 -0
  395. package/src/models/user.ts +47 -0
  396. package/src/models/worksheet.ts +294 -0
  397. package/src/pipelines/aiLabChat.ts +511 -0
  398. package/src/pipelines/aiNewtonChat.ts +347 -0
  399. package/src/pipelines/gradeWorksheet.ts +286 -0
  400. package/src/routers/_app.ts +6 -0
  401. package/src/routers/agenda.ts +3 -61
  402. package/src/routers/announcement.ts +622 -57
  403. package/src/routers/assignment.ts +157 -1688
  404. package/src/routers/attendance.ts +16 -277
  405. package/src/routers/auth.ts +79 -313
  406. package/src/routers/class.ts +265 -1038
  407. package/src/routers/comment.ts +76 -0
  408. package/src/routers/conversation.ts +53 -284
  409. package/src/routers/event.ts +50 -481
  410. package/src/routers/file.ts +45 -341
  411. package/src/routers/folder.ts +107 -836
  412. package/src/routers/labChat.ts +29 -960
  413. package/src/routers/marketing.ts +35 -77
  414. package/src/routers/message.ts +45 -571
  415. package/src/routers/newtonChat.ts +36 -0
  416. package/src/routers/notifications.ts +32 -82
  417. package/src/routers/section.ts +58 -200
  418. package/src/routers/user.ts +49 -226
  419. package/src/routers/worksheet.ts +252 -0
  420. package/src/seedDatabase.ts +330 -290
  421. package/src/services/agenda.ts +21 -0
  422. package/src/services/announcement.ts +290 -0
  423. package/src/services/assignment.ts +1198 -0
  424. package/src/services/attendance.ts +85 -0
  425. package/src/services/auth.ts +277 -0
  426. package/src/services/class.ts +622 -0
  427. package/src/services/comment.ts +106 -0
  428. package/src/services/conversation.ts +213 -0
  429. package/src/services/event.ts +231 -0
  430. package/src/services/file.ts +167 -0
  431. package/src/services/folder.ts +316 -0
  432. package/src/services/labChat.ts +352 -0
  433. package/src/services/marketing.ts +57 -0
  434. package/src/services/message.ts +461 -0
  435. package/src/services/newtonChat.ts +222 -0
  436. package/src/services/notification.ts +50 -0
  437. package/src/services/section.ts +283 -0
  438. package/src/services/user.ts +172 -0
  439. package/src/services/worksheet.ts +358 -0
  440. package/src/trpc.ts +4 -0
  441. package/src/utils/aiUser.ts +4 -3
  442. package/src/utils/email.ts +33 -4
  443. package/src/utils/generateInviteCode.ts +1 -3
  444. package/src/utils/inference.ts +89 -10
  445. package/src/utils/logger.ts +33 -3
  446. package/src/utils/prismaErrorHandler.ts +3 -0
  447. package/src/utils/prismaWrapper.ts +4 -0
  448. package/tests/globalSetup.ts +62 -0
  449. package/tests/helpers.ts +22 -0
  450. package/tests/middleware/security.test.ts +42 -0
  451. package/tests/routers/agenda.test.ts +138 -0
  452. package/tests/routers/announcement.test.ts +490 -0
  453. package/tests/routers/assignment.test.ts +837 -0
  454. package/tests/routers/attendance.test.ts +160 -0
  455. package/tests/routers/auth.test.ts +171 -0
  456. package/tests/{class.test.ts → routers/class.test.ts} +163 -92
  457. package/tests/routers/comment.test.ts +126 -0
  458. package/tests/routers/conversation.test.ts +145 -0
  459. package/tests/routers/event.test.ts +289 -0
  460. package/tests/routers/folder.test.ts +178 -0
  461. package/tests/routers/labChat.test.ts +115 -0
  462. package/tests/routers/marketing.test.ts +59 -0
  463. package/tests/routers/message.test.ts +123 -0
  464. package/tests/routers/notification.test.ts +69 -0
  465. package/tests/routers/section.test.ts +208 -0
  466. package/tests/server/rateLimit.test.ts +73 -0
  467. package/tests/setup.ts +39 -65
  468. package/tests/user.test.ts +136 -0
  469. package/tests/utils/aiUser.test.ts +22 -0
  470. package/tests/utils/generateInviteCode.test.ts +24 -0
  471. package/tests/utils/logger.test.ts +74 -0
  472. package/tests/utils/prismaErrorHandler.test.ts +101 -0
  473. package/tests/utils/prismaWrapper.test.ts +82 -0
  474. package/tests/worksheet.test.ts +181 -0
  475. package/tsconfig.json +9 -2
  476. package/vitest.config.ts +30 -1
  477. package/vitest.unit.config.ts +21 -0
  478. package/API_SPECIFICATION.md +0 -1597
  479. package/BASE64_REMOVAL_SUMMARY.md +0 -164
  480. package/CHAT_API_SPEC.md +0 -579
  481. package/LAB_CHAT_API_SPEC.md +0 -518
  482. package/dist/routers/school.d.ts +0 -208
  483. package/dist/routers/school.d.ts.map +0 -1
  484. package/dist/routers/school.js +0 -481
  485. package/tests/auth.test.ts +0 -25
@@ -1,232 +1,62 @@
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]="7b0b6e3d-022d-5fe3-a54e-a8f4a40964f3")}catch(e){}}();
1
3
  import { z } from "zod";
2
4
  import { createTRPCRouter, protectedProcedure } from "../trpc.js";
3
- import { TRPCError } from "@trpc/server";
4
- import { prisma } from "../lib/prisma.js";
5
- import { logger } from "../utils/logger.js";
6
- // Helper function to convert file path to backend proxy URL
7
- function getFileUrl(filePath) {
8
- if (!filePath)
9
- return null;
10
- // If it's already a full URL (DiceBear or external), return as is
11
- if (filePath.startsWith('http')) {
12
- return filePath;
13
- }
14
- // Convert GCS path to full backend proxy URL
15
- const backendUrl = process.env.BACKEND_URL || 'http://localhost:3001';
16
- return `${backendUrl}/api/files/${encodeURIComponent(filePath)}`;
17
- }
18
- // For direct file uploads (file already uploaded to GCS)
5
+ import { getProfile, updateProfile, getUploadUrl, } from "../services/user.js";
19
6
  const fileUploadSchema = z.object({
20
7
  filePath: z.string().min(1, "File path is required"),
21
8
  fileName: z.string().min(1, "File name is required"),
22
- fileType: z.string().regex(/^image\/(jpeg|jpg|png|gif|webp)$/i, "Only image files (JPEG, PNG, GIF, WebP) are allowed"),
9
+ fileType: z
10
+ .string()
11
+ .regex(/^image\/(jpeg|jpg|png|gif|webp)$/i, "Only image files (JPEG, PNG, GIF, WebP) are allowed"),
23
12
  fileSize: z.number().max(5 * 1024 * 1024, "File size must be less than 5MB"),
24
13
  });
25
- // For DiceBear avatar URL
26
14
  const dicebearSchema = z.object({
27
15
  url: z.string().url("Invalid DiceBear avatar URL"),
28
16
  });
29
17
  const profileSchema = z.object({
30
- displayName: z.string().nullable().optional().transform(val => val === null ? undefined : val),
31
- bio: z.string().nullable().optional().transform(val => val === null ? undefined : val),
32
- location: z.string().nullable().optional().transform(val => val === null ? undefined : val),
33
- website: z.union([
18
+ displayName: z
19
+ .string()
20
+ .nullable()
21
+ .optional()
22
+ .transform((val) => (val === null ? undefined : val)),
23
+ bio: z
24
+ .string()
25
+ .nullable()
26
+ .optional()
27
+ .transform((val) => (val === null ? undefined : val)),
28
+ location: z
29
+ .string()
30
+ .nullable()
31
+ .optional()
32
+ .transform((val) => (val === null ? undefined : val)),
33
+ website: z
34
+ .union([
34
35
  z.string().url(),
35
36
  z.literal(""),
36
- z.null().transform(() => undefined)
37
- ]).optional(),
37
+ z.null().transform(() => undefined),
38
+ ])
39
+ .optional(),
38
40
  });
39
41
  const updateProfileSchema = z.object({
40
42
  profile: profileSchema.optional(),
41
- // Support both custom file upload and DiceBear avatar
42
43
  profilePicture: fileUploadSchema.optional(),
43
44
  dicebearAvatar: dicebearSchema.optional(),
44
45
  });
45
46
  const getUploadUrlSchema = z.object({
46
47
  fileName: z.string().min(1, "File name is required"),
47
- fileType: z.string().regex(/^image\/(jpeg|jpg|png|gif|webp)$/i, "Only image files are allowed"),
48
+ fileType: z
49
+ .string()
50
+ .regex(/^image\/(jpeg|jpg|png|gif|webp)$/i, "Only image files are allowed"),
48
51
  });
49
52
  export const userRouter = createTRPCRouter({
50
- getProfile: protectedProcedure
51
- .query(async ({ ctx }) => {
52
- if (!ctx.user) {
53
- throw new TRPCError({
54
- code: "UNAUTHORIZED",
55
- message: "User must be authenticated",
56
- });
57
- }
58
- const user = await prisma.user.findUnique({
59
- where: { id: ctx.user.id },
60
- select: {
61
- id: true,
62
- username: true,
63
- },
64
- });
65
- if (!user) {
66
- throw new TRPCError({
67
- code: "NOT_FOUND",
68
- message: "User not found",
69
- });
70
- }
71
- // Get user profile separately
72
- const userProfile = await prisma.userProfile.findUnique({
73
- where: { userId: ctx.user.id },
74
- });
75
- return {
76
- id: user.id,
77
- username: user.username,
78
- profile: userProfile ? {
79
- displayName: userProfile.displayName || null,
80
- bio: userProfile.bio || null,
81
- location: userProfile.location || null,
82
- website: userProfile.website || null,
83
- profilePicture: getFileUrl(userProfile.profilePicture),
84
- profilePictureThumbnail: getFileUrl(userProfile.profilePictureThumbnail),
85
- } : {
86
- displayName: null,
87
- bio: null,
88
- location: null,
89
- website: null,
90
- profilePicture: null,
91
- profilePictureThumbnail: null,
92
- },
93
- };
94
- }),
53
+ getProfile: protectedProcedure.query(({ ctx }) => getProfile(ctx.user.id)),
95
54
  updateProfile: protectedProcedure
96
55
  .input(updateProfileSchema)
97
- .mutation(async ({ ctx, input }) => {
98
- if (!ctx.user) {
99
- throw new TRPCError({
100
- code: "UNAUTHORIZED",
101
- message: "User must be authenticated",
102
- });
103
- }
104
- // Get current profile to clean up old profile picture
105
- const currentProfile = await prisma.userProfile.findUnique({
106
- where: { userId: ctx.user.id },
107
- });
108
- let profilePictureUrl = null;
109
- let profilePictureThumbnail = null;
110
- // Handle custom profile picture (already uploaded to GCS)
111
- if (input.profilePicture) {
112
- try {
113
- // File is already uploaded to GCS, just use the path
114
- profilePictureUrl = input.profilePicture.filePath;
115
- // Generate thumbnail for the uploaded file
116
- // TODO: Implement thumbnail generation for direct uploads
117
- profilePictureThumbnail = null;
118
- // Clean up old profile picture if it exists
119
- if (currentProfile?.profilePicture) {
120
- // TODO: Implement file deletion logic here
121
- // await deleteFile((currentProfile as any).profilePicture);
122
- }
123
- }
124
- catch (error) {
125
- logger.error('Profile picture processing failed', {
126
- userId: ctx.user.id,
127
- error: error instanceof Error ? error.message : 'Unknown error'
128
- });
129
- throw new TRPCError({
130
- code: "INTERNAL_SERVER_ERROR",
131
- message: "Failed to process profile picture. Please try again.",
132
- });
133
- }
134
- }
135
- // Handle DiceBear avatar URL
136
- if (input.dicebearAvatar) {
137
- profilePictureUrl = input.dicebearAvatar.url;
138
- // No thumbnail for DiceBear avatars since they're SVG URLs
139
- profilePictureThumbnail = null;
140
- }
141
- // Prepare update data
142
- const updateData = {};
143
- if (input.profile) {
144
- if (input.profile.displayName !== undefined && input.profile.displayName !== null) {
145
- updateData.displayName = input.profile.displayName;
146
- }
147
- if (input.profile.bio !== undefined && input.profile.bio !== null) {
148
- updateData.bio = input.profile.bio;
149
- }
150
- if (input.profile.location !== undefined && input.profile.location !== null) {
151
- updateData.location = input.profile.location;
152
- }
153
- if (input.profile.website !== undefined && input.profile.website !== null) {
154
- updateData.website = input.profile.website;
155
- }
156
- }
157
- if (profilePictureUrl !== null)
158
- updateData.profilePicture = profilePictureUrl;
159
- if (profilePictureThumbnail !== null)
160
- updateData.profilePictureThumbnail = profilePictureThumbnail;
161
- // Upsert user profile with structured data
162
- const updatedProfile = await prisma.userProfile.upsert({
163
- where: { userId: ctx.user.id },
164
- create: {
165
- userId: ctx.user.id,
166
- ...updateData,
167
- },
168
- update: {
169
- ...updateData,
170
- updatedAt: new Date(),
171
- },
172
- });
173
- // Get username for response
174
- const user = await prisma.user.findUnique({
175
- where: { id: ctx.user.id },
176
- select: { username: true },
177
- });
178
- return {
179
- id: ctx.user.id,
180
- username: user?.username || '',
181
- profile: {
182
- displayName: updatedProfile.displayName || null,
183
- bio: updatedProfile.bio || null,
184
- location: updatedProfile.location || null,
185
- website: updatedProfile.website || null,
186
- profilePicture: getFileUrl(updatedProfile.profilePicture),
187
- profilePictureThumbnail: getFileUrl(updatedProfile.profilePictureThumbnail),
188
- },
189
- };
190
- }),
56
+ .mutation(({ ctx, input }) => updateProfile(ctx.user.id, input)),
191
57
  getUploadUrl: protectedProcedure
192
58
  .input(getUploadUrlSchema)
193
- .mutation(async ({ ctx, input }) => {
194
- if (!ctx.user) {
195
- throw new TRPCError({
196
- code: "UNAUTHORIZED",
197
- message: "User must be authenticated",
198
- });
199
- }
200
- try {
201
- // Generate unique filename
202
- const fileExtension = input.fileName.split('.').pop();
203
- const uniqueFilename = `${ctx.user.id}-${Date.now()}.${fileExtension}`;
204
- const filePath = `users/${ctx.user.id}/profile/${uniqueFilename}`;
205
- // Generate backend proxy upload URL instead of direct GCS signed URL
206
- const backendUrl = process.env.BACKEND_URL || 'http://localhost:3001';
207
- const uploadUrl = `${backendUrl}/api/upload/${encodeURIComponent(filePath)}`;
208
- logger.info('Generated upload URL', {
209
- userId: ctx.user.id,
210
- filePath,
211
- fileName: uniqueFilename,
212
- fileType: input.fileType,
213
- uploadUrl
214
- });
215
- return {
216
- uploadUrl,
217
- filePath,
218
- fileName: uniqueFilename,
219
- };
220
- }
221
- catch (error) {
222
- logger.error('Failed to generate upload URL', {
223
- userId: ctx.user.id,
224
- error: error instanceof Error ? error.message : 'Unknown error'
225
- });
226
- throw new TRPCError({
227
- code: "INTERNAL_SERVER_ERROR",
228
- message: "Failed to generate upload URL",
229
- });
230
- }
231
- }),
59
+ .mutation(({ ctx, input }) => getUploadUrl(ctx.user.id, input.fileName, input.fileType)),
232
60
  });
61
+ //# sourceMappingURL=user.js.map
62
+ //# debugId=7b0b6e3d-022d-5fe3-a54e-a8f4a40964f3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.js","sources":["routers/user.ts"],"sourceRoot":"/","sourcesContent":["import { z } from \"zod\";\nimport { createTRPCRouter, protectedProcedure } from \"../trpc.js\";\nimport {\n getProfile,\n updateProfile,\n getUploadUrl,\n} from \"../services/user.js\";\n\nconst fileUploadSchema = z.object({\n filePath: z.string().min(1, \"File path is required\"),\n fileName: z.string().min(1, \"File name is required\"),\n fileType: z\n .string()\n .regex(\n /^image\\/(jpeg|jpg|png|gif|webp)$/i,\n \"Only image files (JPEG, PNG, GIF, WebP) are allowed\"\n ),\n fileSize: z.number().max(5 * 1024 * 1024, \"File size must be less than 5MB\"),\n});\n\nconst dicebearSchema = z.object({\n url: z.string().url(\"Invalid DiceBear avatar URL\"),\n});\n\nconst profileSchema = z.object({\n displayName: z\n .string()\n .nullable()\n .optional()\n .transform((val) => (val === null ? undefined : val)),\n bio: z\n .string()\n .nullable()\n .optional()\n .transform((val) => (val === null ? undefined : val)),\n location: z\n .string()\n .nullable()\n .optional()\n .transform((val) => (val === null ? undefined : val)),\n website: z\n .union([\n z.string().url(),\n z.literal(\"\"),\n z.null().transform(() => undefined),\n ])\n .optional(),\n});\n\nconst updateProfileSchema = z.object({\n profile: profileSchema.optional(),\n profilePicture: fileUploadSchema.optional(),\n dicebearAvatar: dicebearSchema.optional(),\n});\n\nconst getUploadUrlSchema = z.object({\n fileName: z.string().min(1, \"File name is required\"),\n fileType: z\n .string()\n .regex(\n /^image\\/(jpeg|jpg|png|gif|webp)$/i,\n \"Only image files are allowed\"\n ),\n});\n\nexport const userRouter = createTRPCRouter({\n getProfile: protectedProcedure.query(({ ctx }) =>\n getProfile(ctx.user!.id)\n ),\n\n updateProfile: protectedProcedure\n .input(updateProfileSchema)\n .mutation(({ ctx, input }) =>\n updateProfile(ctx.user!.id, input)\n ),\n\n getUploadUrl: protectedProcedure\n .input(getUploadUrlSchema)\n .mutation(({ ctx, input }) =>\n getUploadUrl(ctx.user!.id, input.fileName, input.fileType)\n ),\n});\n"],"names":[],"mappings":"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","debug_id":"7b0b6e3d-022d-5fe3-a54e-a8f4a40964f3"}
@@ -0,0 +1,362 @@
1
+ import { z } from "zod";
2
+ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
3
+ ctx: import("../trpc.js").Context;
4
+ meta: object;
5
+ errorShape: {
6
+ data: {
7
+ zodError: z.typeToFlattenedError<any, string> | null;
8
+ prismaError: import("../utils/prismaErrorHandler.js").PrismaErrorInfo | null;
9
+ code: import("@trpc/server").TRPC_ERROR_CODE_KEY;
10
+ httpStatus: number;
11
+ path?: string;
12
+ stack?: string;
13
+ };
14
+ message: string;
15
+ code: import("@trpc/server").TRPC_ERROR_CODE_NUMBER;
16
+ };
17
+ transformer: false;
18
+ }, import("@trpc/server").TRPCDecorateCreateRouterOptions<{
19
+ getWorksheet: import("@trpc/server").TRPCQueryProcedure<{
20
+ input: {
21
+ worksheetId: string;
22
+ };
23
+ output: {
24
+ class: {
25
+ id: string;
26
+ schoolId: string | null;
27
+ name: string;
28
+ subject: string;
29
+ color: string | null;
30
+ section: string;
31
+ syllabus: string | null;
32
+ } | null;
33
+ questions: {
34
+ options: import("@prisma/client/runtime/library.js").JsonValue | null;
35
+ type: import(".prisma/client").$Enums.WorksheetQuestionType;
36
+ id: string;
37
+ createdAt: Date;
38
+ updatedAt: Date;
39
+ order: number | null;
40
+ markScheme: import("@prisma/client/runtime/library.js").JsonValue | null;
41
+ question: string;
42
+ points: number;
43
+ worksheetId: string;
44
+ answer: string;
45
+ }[];
46
+ } & {
47
+ id: string;
48
+ createdAt: Date;
49
+ updatedAt: Date;
50
+ classId: string;
51
+ name: string;
52
+ };
53
+ meta: object;
54
+ }>;
55
+ exists: import("@trpc/server").TRPCQueryProcedure<{
56
+ input: {
57
+ [x: string]: unknown;
58
+ classId: string;
59
+ id: string;
60
+ };
61
+ output: boolean;
62
+ meta: object;
63
+ }>;
64
+ listWorksheets: import("@trpc/server").TRPCQueryProcedure<{
65
+ input: {
66
+ classId: string;
67
+ };
68
+ output: {
69
+ questionCount: number;
70
+ questions: {
71
+ id: string;
72
+ }[];
73
+ id: string;
74
+ createdAt: Date;
75
+ updatedAt: Date;
76
+ classId: string;
77
+ name: string;
78
+ }[];
79
+ meta: object;
80
+ }>;
81
+ updateWorksheet: import("@trpc/server").TRPCMutationProcedure<{
82
+ input: {
83
+ worksheetId: string;
84
+ name?: string | undefined;
85
+ };
86
+ output: {
87
+ id: string;
88
+ createdAt: Date;
89
+ updatedAt: Date;
90
+ classId: string;
91
+ name: string;
92
+ };
93
+ meta: object;
94
+ }>;
95
+ deleteWorksheet: import("@trpc/server").TRPCMutationProcedure<{
96
+ input: {
97
+ worksheetId: string;
98
+ };
99
+ output: {
100
+ id: string;
101
+ createdAt: Date;
102
+ updatedAt: Date;
103
+ classId: string;
104
+ name: string;
105
+ };
106
+ meta: object;
107
+ }>;
108
+ create: import("@trpc/server").TRPCMutationProcedure<{
109
+ input: {
110
+ classId: string;
111
+ name: string;
112
+ };
113
+ output: {
114
+ id: string;
115
+ createdAt: Date;
116
+ updatedAt: Date;
117
+ classId: string;
118
+ name: string;
119
+ };
120
+ meta: object;
121
+ }>;
122
+ addQuestion: import("@trpc/server").TRPCMutationProcedure<{
123
+ input: {
124
+ type: "ESSAY" | "MULTIPLE_CHOICE" | "TRUE_FALSE" | "SHORT_ANSWER" | "LONG_ANSWER" | "MATH_EXPRESSION";
125
+ question: string;
126
+ worksheetId: string;
127
+ answer: string;
128
+ options?: any;
129
+ markScheme?: any;
130
+ points?: number | undefined;
131
+ };
132
+ output: {
133
+ options: import("@prisma/client/runtime/library.js").JsonValue | null;
134
+ type: import(".prisma/client").$Enums.WorksheetQuestionType;
135
+ id: string;
136
+ createdAt: Date;
137
+ updatedAt: Date;
138
+ order: number | null;
139
+ markScheme: import("@prisma/client/runtime/library.js").JsonValue | null;
140
+ question: string;
141
+ points: number;
142
+ worksheetId: string;
143
+ answer: string;
144
+ };
145
+ meta: object;
146
+ }>;
147
+ reorderQuestions: import("@trpc/server").TRPCMutationProcedure<{
148
+ input: {
149
+ worksheetId: string;
150
+ movedId: string;
151
+ position: "before" | "after";
152
+ targetId: string;
153
+ };
154
+ output: {
155
+ id: string;
156
+ }[];
157
+ meta: object;
158
+ }>;
159
+ updateQuestion: import("@trpc/server").TRPCMutationProcedure<{
160
+ input: {
161
+ questionId: string;
162
+ worksheetId: string;
163
+ options?: any;
164
+ type?: "ESSAY" | "MULTIPLE_CHOICE" | "TRUE_FALSE" | "SHORT_ANSWER" | "LONG_ANSWER" | "MATH_EXPRESSION" | undefined;
165
+ markScheme?: any;
166
+ question?: string | undefined;
167
+ points?: number | undefined;
168
+ answer?: string | undefined;
169
+ };
170
+ output: {
171
+ options: import("@prisma/client/runtime/library.js").JsonValue | null;
172
+ type: import(".prisma/client").$Enums.WorksheetQuestionType;
173
+ id: string;
174
+ createdAt: Date;
175
+ updatedAt: Date;
176
+ order: number | null;
177
+ markScheme: import("@prisma/client/runtime/library.js").JsonValue | null;
178
+ question: string;
179
+ points: number;
180
+ worksheetId: string;
181
+ answer: string;
182
+ };
183
+ meta: object;
184
+ }>;
185
+ deleteQuestion: import("@trpc/server").TRPCMutationProcedure<{
186
+ input: {
187
+ questionId: string;
188
+ worksheetId: string;
189
+ };
190
+ output: {
191
+ options: import("@prisma/client/runtime/library.js").JsonValue | null;
192
+ type: import(".prisma/client").$Enums.WorksheetQuestionType;
193
+ id: string;
194
+ createdAt: Date;
195
+ updatedAt: Date;
196
+ order: number | null;
197
+ markScheme: import("@prisma/client/runtime/library.js").JsonValue | null;
198
+ question: string;
199
+ points: number;
200
+ worksheetId: string;
201
+ answer: string;
202
+ };
203
+ meta: object;
204
+ }>;
205
+ getWorksheetSubmission: import("@trpc/server").TRPCQueryProcedure<{
206
+ input: {
207
+ submissionId: string;
208
+ worksheetId: string;
209
+ };
210
+ output: {
211
+ responses: ({
212
+ comments: {
213
+ id: string;
214
+ }[];
215
+ } & {
216
+ status: import(".prisma/client").$Enums.GenerationStatus | null;
217
+ id: string;
218
+ createdAt: Date;
219
+ updatedAt: Date | null;
220
+ feedback: string | null;
221
+ studentId: string;
222
+ response: string;
223
+ isCorrect: boolean;
224
+ markschemeState: import("@prisma/client/runtime/library.js").JsonValue | null;
225
+ points: number;
226
+ questionId: string;
227
+ studentWorksheetResponseId: string | null;
228
+ })[];
229
+ } & {
230
+ id: string;
231
+ createdAt: Date;
232
+ updatedAt: Date;
233
+ submissionId: string | null;
234
+ studentId: string;
235
+ submittedAt: Date | null;
236
+ submitted: boolean;
237
+ worksheetId: string;
238
+ };
239
+ meta: object;
240
+ }>;
241
+ answerQuestion: import("@trpc/server").TRPCMutationProcedure<{
242
+ input: {
243
+ response: string;
244
+ questionId: string;
245
+ worksheetResponseId: string;
246
+ };
247
+ output: {
248
+ responses: {
249
+ status: import(".prisma/client").$Enums.GenerationStatus | null;
250
+ id: string;
251
+ createdAt: Date;
252
+ updatedAt: Date | null;
253
+ feedback: string | null;
254
+ studentId: string;
255
+ response: string;
256
+ isCorrect: boolean;
257
+ markschemeState: import("@prisma/client/runtime/library.js").JsonValue | null;
258
+ points: number;
259
+ questionId: string;
260
+ studentWorksheetResponseId: string | null;
261
+ }[];
262
+ } & {
263
+ id: string;
264
+ createdAt: Date;
265
+ updatedAt: Date;
266
+ submissionId: string | null;
267
+ studentId: string;
268
+ submittedAt: Date | null;
269
+ submitted: boolean;
270
+ worksheetId: string;
271
+ };
272
+ meta: object;
273
+ }>;
274
+ cancelGrading: import("@trpc/server").TRPCMutationProcedure<{
275
+ input: {
276
+ worksheetResponseId: string;
277
+ progressId: string;
278
+ };
279
+ output: {
280
+ status: import(".prisma/client").$Enums.GenerationStatus | null;
281
+ id: string;
282
+ createdAt: Date;
283
+ updatedAt: Date | null;
284
+ feedback: string | null;
285
+ studentId: string;
286
+ response: string;
287
+ isCorrect: boolean;
288
+ markschemeState: import("@prisma/client/runtime/library.js").JsonValue | null;
289
+ points: number;
290
+ questionId: string;
291
+ studentWorksheetResponseId: string | null;
292
+ };
293
+ meta: object;
294
+ }>;
295
+ regradeQuestion: import("@trpc/server").TRPCMutationProcedure<{
296
+ input: {
297
+ worksheetResponseId: string;
298
+ progressId: string;
299
+ };
300
+ output: {
301
+ status: import(".prisma/client").$Enums.GenerationStatus | null;
302
+ id: string;
303
+ createdAt: Date;
304
+ updatedAt: Date | null;
305
+ feedback: string | null;
306
+ studentId: string;
307
+ response: string;
308
+ isCorrect: boolean;
309
+ markschemeState: import("@prisma/client/runtime/library.js").JsonValue | null;
310
+ points: number;
311
+ questionId: string;
312
+ studentWorksheetResponseId: string | null;
313
+ };
314
+ meta: object;
315
+ }>;
316
+ gradeAnswer: import("@trpc/server").TRPCMutationProcedure<{
317
+ input: {
318
+ isCorrect: boolean;
319
+ questionId: string;
320
+ studentWorksheetResponseId: string;
321
+ feedback?: string | undefined;
322
+ response?: string | undefined;
323
+ markschemeState?: any;
324
+ points?: number | undefined;
325
+ responseId?: string | undefined;
326
+ };
327
+ output: {
328
+ status: import(".prisma/client").$Enums.GenerationStatus | null;
329
+ id: string;
330
+ createdAt: Date;
331
+ updatedAt: Date | null;
332
+ feedback: string | null;
333
+ studentId: string;
334
+ response: string;
335
+ isCorrect: boolean;
336
+ markschemeState: import("@prisma/client/runtime/library.js").JsonValue | null;
337
+ points: number;
338
+ questionId: string;
339
+ studentWorksheetResponseId: string | null;
340
+ };
341
+ meta: object;
342
+ }>;
343
+ addComment: import("@trpc/server").TRPCMutationProcedure<{
344
+ input: {
345
+ comment: string;
346
+ responseId: string;
347
+ };
348
+ output: {
349
+ status: import(".prisma/client").$Enums.GenerationStatus | null;
350
+ id: string;
351
+ createdAt: Date;
352
+ content: string;
353
+ modifiedAt: Date | null;
354
+ announcementId: string | null;
355
+ authorId: string;
356
+ parentCommentId: string | null;
357
+ studentQuestionProgressId: string | null;
358
+ };
359
+ meta: object;
360
+ }>;
361
+ }>>;
362
+ //# sourceMappingURL=worksheet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worksheet.d.ts","sourceRoot":"/","sources":["routers/worksheet.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAoBxB,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiO1B,CAAC"}