@studious-lms/server 1.2.53 → 1.3.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 (477) hide show
  1. package/.coderabbit.yaml +9 -0
  2. package/.env.example +9 -1
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +102 -8
  5. package/dist/index.js.map +1 -1
  6. package/dist/lib/config/env.d.ts +21 -0
  7. package/dist/lib/config/env.d.ts.map +1 -1
  8. package/dist/lib/config/env.js +8 -2
  9. package/dist/lib/config/env.js.map +1 -1
  10. package/dist/lib/fileUpload.d.ts.map +1 -1
  11. package/dist/lib/fileUpload.js +2 -2
  12. package/dist/lib/fileUpload.js.map +1 -1
  13. package/dist/lib/googleCloudStorage.d.ts +6 -0
  14. package/dist/lib/googleCloudStorage.d.ts.map +1 -1
  15. package/dist/lib/googleCloudStorage.js +19 -2
  16. package/dist/lib/googleCloudStorage.js.map +1 -1
  17. package/dist/lib/pusher.d.ts +4 -1
  18. package/dist/lib/pusher.d.ts.map +1 -1
  19. package/dist/lib/pusher.js +6 -3
  20. package/dist/lib/pusher.js.map +1 -1
  21. package/dist/lib/redis.d.ts +5 -0
  22. package/dist/lib/redis.d.ts.map +1 -0
  23. package/dist/lib/redis.js +53 -0
  24. package/dist/lib/redis.js.map +1 -0
  25. package/dist/lib/thumbnailGenerator.d.ts +0 -21
  26. package/dist/lib/thumbnailGenerator.d.ts.map +1 -1
  27. package/dist/lib/thumbnailGenerator.js +157 -160
  28. package/dist/lib/thumbnailGenerator.js.map +1 -1
  29. package/dist/middleware/auth.d.ts.map +1 -1
  30. package/dist/middleware/auth.js +33 -95
  31. package/dist/middleware/auth.js.map +1 -1
  32. package/dist/models/agenda.d.ts +97 -0
  33. package/dist/models/agenda.d.ts.map +1 -0
  34. package/dist/models/agenda.js +40 -0
  35. package/dist/models/agenda.js.map +1 -0
  36. package/dist/models/announcement.d.ts +223 -0
  37. package/dist/models/announcement.d.ts.map +1 -0
  38. package/dist/models/announcement.js +120 -0
  39. package/dist/models/announcement.js.map +1 -0
  40. package/dist/models/assignment.d.ts +1292 -0
  41. package/dist/models/assignment.d.ts.map +1 -0
  42. package/dist/models/assignment.js +309 -0
  43. package/dist/models/assignment.js.map +1 -0
  44. package/dist/models/attendance.d.ts +180 -0
  45. package/dist/models/attendance.d.ts.map +1 -0
  46. package/dist/models/attendance.js +188 -0
  47. package/dist/models/attendance.js.map +1 -0
  48. package/dist/models/auth.d.ts +153 -0
  49. package/dist/models/auth.d.ts.map +1 -0
  50. package/dist/models/auth.js +217 -0
  51. package/dist/models/auth.js.map +1 -0
  52. package/dist/models/class.d.ts +439 -0
  53. package/dist/models/class.d.ts.map +1 -0
  54. package/dist/models/class.js +546 -0
  55. package/dist/models/class.js.map +1 -0
  56. package/dist/models/comment.d.ts +171 -0
  57. package/dist/models/comment.d.ts.map +1 -0
  58. package/dist/models/comment.js +138 -0
  59. package/dist/models/comment.js.map +1 -0
  60. package/dist/models/conversation.d.ts +164 -0
  61. package/dist/models/conversation.d.ts.map +1 -0
  62. package/dist/models/conversation.js +175 -0
  63. package/dist/models/conversation.js.map +1 -0
  64. package/dist/models/event.d.ts +295 -0
  65. package/dist/models/event.d.ts.map +1 -0
  66. package/dist/models/event.js +145 -0
  67. package/dist/models/event.js.map +1 -0
  68. package/dist/models/file.d.ts +536 -0
  69. package/dist/models/file.d.ts.map +1 -0
  70. package/dist/models/file.js +126 -0
  71. package/dist/models/file.js.map +1 -0
  72. package/dist/models/folder.d.ts +295 -0
  73. package/dist/models/folder.d.ts.map +1 -0
  74. package/dist/models/folder.js +202 -0
  75. package/dist/models/folder.js.map +1 -0
  76. package/dist/models/labChat.d.ts +243 -0
  77. package/dist/models/labChat.d.ts.map +1 -0
  78. package/dist/models/labChat.js +204 -0
  79. package/dist/models/labChat.js.map +1 -0
  80. package/dist/models/marketing.d.ts +72 -0
  81. package/dist/models/marketing.d.ts.map +1 -0
  82. package/dist/models/marketing.js +26 -0
  83. package/dist/models/marketing.js.map +1 -0
  84. package/dist/models/message.d.ts +100 -0
  85. package/dist/models/message.d.ts.map +1 -0
  86. package/dist/models/message.js +131 -0
  87. package/dist/models/message.js.map +1 -0
  88. package/dist/models/newtonChat.d.ts +72 -0
  89. package/dist/models/newtonChat.d.ts.map +1 -0
  90. package/dist/models/newtonChat.js +61 -0
  91. package/dist/models/newtonChat.js.map +1 -0
  92. package/dist/models/notification.d.ts +65 -0
  93. package/dist/models/notification.d.ts.map +1 -0
  94. package/dist/models/notification.js +46 -0
  95. package/dist/models/notification.js.map +1 -0
  96. package/dist/models/section.d.ts +102 -0
  97. package/dist/models/section.d.ts.map +1 -0
  98. package/dist/models/section.js +83 -0
  99. package/dist/models/section.js.map +1 -0
  100. package/dist/models/user.d.ts +39 -0
  101. package/dist/models/user.d.ts.map +1 -0
  102. package/dist/models/user.js +38 -0
  103. package/dist/models/user.js.map +1 -0
  104. package/dist/models/worksheet.d.ts +460 -0
  105. package/dist/models/worksheet.d.ts.map +1 -0
  106. package/dist/models/worksheet.js +200 -0
  107. package/dist/models/worksheet.js.map +1 -0
  108. package/dist/pipelines/aiLabChat.d.ts +21 -0
  109. package/dist/pipelines/aiLabChat.d.ts.map +1 -0
  110. package/dist/pipelines/aiLabChat.js +460 -0
  111. package/dist/pipelines/aiLabChat.js.map +1 -0
  112. package/dist/pipelines/aiNewtonChat.d.ts +30 -0
  113. package/dist/pipelines/aiNewtonChat.d.ts.map +1 -0
  114. package/dist/pipelines/aiNewtonChat.js +289 -0
  115. package/dist/pipelines/aiNewtonChat.js.map +1 -0
  116. package/dist/pipelines/gradeWorksheet.d.ts +30 -0
  117. package/dist/pipelines/gradeWorksheet.d.ts.map +1 -0
  118. package/dist/pipelines/gradeWorksheet.js +252 -0
  119. package/dist/pipelines/gradeWorksheet.js.map +1 -0
  120. package/dist/routers/_app.d.ts +1393 -1267
  121. package/dist/routers/_app.d.ts.map +1 -1
  122. package/dist/routers/agenda.d.ts +22 -22
  123. package/dist/routers/agenda.d.ts.map +1 -1
  124. package/dist/routers/agenda.js +4 -65
  125. package/dist/routers/agenda.js.map +1 -1
  126. package/dist/routers/announcement.d.ts +16 -16
  127. package/dist/routers/announcement.d.ts.map +1 -1
  128. package/dist/routers/announcement.js +37 -446
  129. package/dist/routers/announcement.js.map +1 -1
  130. package/dist/routers/assignment.d.ts +300 -378
  131. package/dist/routers/assignment.d.ts.map +1 -1
  132. package/dist/routers/assignment.js +78 -1868
  133. package/dist/routers/assignment.js.map +1 -1
  134. package/dist/routers/attendance.d.ts +19 -9
  135. package/dist/routers/attendance.d.ts.map +1 -1
  136. package/dist/routers/attendance.js +7 -264
  137. package/dist/routers/attendance.js.map +1 -1
  138. package/dist/routers/auth.d.ts +2 -2
  139. package/dist/routers/auth.d.ts.map +1 -1
  140. package/dist/routers/auth.js +29 -354
  141. package/dist/routers/auth.js.map +1 -1
  142. package/dist/routers/class.d.ts +139 -68
  143. package/dist/routers/class.d.ts.map +1 -1
  144. package/dist/routers/class.js +82 -1052
  145. package/dist/routers/class.js.map +1 -1
  146. package/dist/routers/comment.d.ts +6 -42
  147. package/dist/routers/comment.d.ts.map +1 -1
  148. package/dist/routers/comment.js +24 -244
  149. package/dist/routers/comment.js.map +1 -1
  150. package/dist/routers/conversation.d.ts +45 -7
  151. package/dist/routers/conversation.d.ts.map +1 -1
  152. package/dist/routers/conversation.js +19 -327
  153. package/dist/routers/conversation.js.map +1 -1
  154. package/dist/routers/event.d.ts +36 -36
  155. package/dist/routers/event.d.ts.map +1 -1
  156. package/dist/routers/event.js +13 -433
  157. package/dist/routers/event.js.map +1 -1
  158. package/dist/routers/file.d.ts +2 -2
  159. package/dist/routers/file.d.ts.map +1 -1
  160. package/dist/routers/file.js +9 -323
  161. package/dist/routers/file.js.map +1 -1
  162. package/dist/routers/folder.d.ts +21 -14
  163. package/dist/routers/folder.d.ts.map +1 -1
  164. package/dist/routers/folder.js +34 -745
  165. package/dist/routers/folder.js.map +1 -1
  166. package/dist/routers/labChat.d.ts +11 -10
  167. package/dist/routers/labChat.d.ts.map +1 -1
  168. package/dist/routers/labChat.js +19 -570
  169. package/dist/routers/labChat.js.map +1 -1
  170. package/dist/routers/marketing.d.ts +1 -1
  171. package/dist/routers/marketing.d.ts.map +1 -1
  172. package/dist/routers/marketing.js +7 -56
  173. package/dist/routers/marketing.js.map +1 -1
  174. package/dist/routers/message.d.ts +2 -2
  175. package/dist/routers/message.d.ts.map +1 -1
  176. package/dist/routers/message.js +27 -522
  177. package/dist/routers/message.js.map +1 -1
  178. package/dist/routers/newtonChat.d.ts +1 -1
  179. package/dist/routers/newtonChat.d.ts.map +1 -1
  180. package/dist/routers/newtonChat.js +7 -246
  181. package/dist/routers/newtonChat.js.map +1 -1
  182. package/dist/routers/notifications.d.ts +4 -4
  183. package/dist/routers/notifications.d.ts.map +1 -1
  184. package/dist/routers/notifications.js +18 -83
  185. package/dist/routers/notifications.js.map +1 -1
  186. package/dist/routers/section.d.ts +4 -4
  187. package/dist/routers/section.d.ts.map +1 -1
  188. package/dist/routers/section.js +14 -286
  189. package/dist/routers/section.js.map +1 -1
  190. package/dist/routers/user.d.ts +1 -1
  191. package/dist/routers/user.d.ts.map +1 -1
  192. package/dist/routers/user.js +32 -207
  193. package/dist/routers/user.js.map +1 -1
  194. package/dist/routers/worksheet.d.ts +51 -38
  195. package/dist/routers/worksheet.d.ts.map +1 -1
  196. package/dist/routers/worksheet.js +79 -394
  197. package/dist/routers/worksheet.js.map +1 -1
  198. package/dist/seedDatabase.d.ts +1 -1
  199. package/dist/server/pipelines/gradeWorksheet.d.ts +6 -6
  200. package/dist/server/pipelines/gradeWorksheet.d.ts.map +1 -1
  201. package/dist/server/pipelines/gradeWorksheet.js +12 -5
  202. package/dist/server/pipelines/gradeWorksheet.js.map +1 -1
  203. package/dist/services/agenda.d.ts +100 -0
  204. package/dist/services/agenda.d.ts.map +1 -0
  205. package/dist/services/agenda.js +21 -0
  206. package/dist/services/agenda.js.map +1 -0
  207. package/dist/services/announcement.d.ts +135 -0
  208. package/dist/services/announcement.d.ts.map +1 -0
  209. package/dist/services/announcement.js +223 -0
  210. package/dist/services/announcement.js.map +1 -0
  211. package/dist/services/assignment.d.ts +1462 -0
  212. package/dist/services/assignment.d.ts.map +1 -0
  213. package/dist/services/assignment.js +898 -0
  214. package/dist/services/assignment.js.map +1 -0
  215. package/dist/services/attendance.d.ts +93 -0
  216. package/dist/services/attendance.d.ts.map +1 -0
  217. package/dist/services/attendance.js +61 -0
  218. package/dist/services/attendance.js.map +1 -0
  219. package/dist/services/auth.d.ts +68 -0
  220. package/dist/services/auth.d.ts.map +1 -0
  221. package/dist/services/auth.js +218 -0
  222. package/dist/services/auth.js.map +1 -0
  223. package/dist/services/class.d.ts +621 -0
  224. package/dist/services/class.d.ts.map +1 -0
  225. package/dist/services/class.js +474 -0
  226. package/dist/services/class.js.map +1 -0
  227. package/dist/services/comment.d.ts +100 -0
  228. package/dist/services/comment.d.ts.map +1 -0
  229. package/dist/services/comment.js +83 -0
  230. package/dist/services/comment.js.map +1 -0
  231. package/dist/services/conversation.d.ts +159 -0
  232. package/dist/services/conversation.d.ts.map +1 -0
  233. package/dist/services/conversation.js +138 -0
  234. package/dist/services/conversation.js.map +1 -0
  235. package/dist/services/event.d.ts +216 -0
  236. package/dist/services/event.d.ts.map +1 -0
  237. package/dist/services/event.js +168 -0
  238. package/dist/services/event.js.map +1 -0
  239. package/dist/services/file.d.ts +74 -0
  240. package/dist/services/file.d.ts.map +1 -0
  241. package/dist/services/file.js +133 -0
  242. package/dist/services/file.js.map +1 -0
  243. package/dist/services/folder.d.ts +239 -0
  244. package/dist/services/folder.d.ts.map +1 -0
  245. package/dist/services/folder.js +248 -0
  246. package/dist/services/folder.js.map +1 -0
  247. package/dist/services/labChat.d.ts +165 -0
  248. package/dist/services/labChat.d.ts.map +1 -0
  249. package/dist/services/labChat.js +289 -0
  250. package/dist/services/labChat.js.map +1 -0
  251. package/dist/services/marketing.d.ts +50 -0
  252. package/dist/services/marketing.d.ts.map +1 -0
  253. package/dist/services/marketing.js +32 -0
  254. package/dist/services/marketing.js.map +1 -0
  255. package/dist/services/message.d.ts +95 -0
  256. package/dist/services/message.d.ts.map +1 -0
  257. package/dist/services/message.js +350 -0
  258. package/dist/services/message.js.map +1 -0
  259. package/dist/services/newtonChat.d.ts +22 -0
  260. package/dist/services/newtonChat.d.ts.map +1 -0
  261. package/dist/services/newtonChat.js +174 -0
  262. package/dist/services/newtonChat.js.map +1 -0
  263. package/dist/services/notification.d.ts +65 -0
  264. package/dist/services/notification.d.ts.map +1 -0
  265. package/dist/services/notification.js +33 -0
  266. package/dist/services/notification.js.map +1 -0
  267. package/dist/services/section.d.ts +53 -0
  268. package/dist/services/section.d.ts.map +1 -0
  269. package/dist/services/section.js +199 -0
  270. package/dist/services/section.js.map +1 -0
  271. package/dist/services/user.d.ts +48 -0
  272. package/dist/services/user.d.ts.map +1 -0
  273. package/dist/services/user.js +141 -0
  274. package/dist/services/user.js.map +1 -0
  275. package/dist/services/worksheet.d.ts +239 -0
  276. package/dist/services/worksheet.d.ts.map +1 -0
  277. package/dist/services/worksheet.js +235 -0
  278. package/dist/services/worksheet.js.map +1 -0
  279. package/dist/utils/aiUser.d.ts +1 -3
  280. package/dist/utils/aiUser.d.ts.map +1 -1
  281. package/dist/utils/aiUser.js +6 -5
  282. package/dist/utils/aiUser.js.map +1 -1
  283. package/dist/utils/email.d.ts +3 -0
  284. package/dist/utils/email.d.ts.map +1 -1
  285. package/dist/utils/email.js +7 -4
  286. package/dist/utils/email.js.map +1 -1
  287. package/dist/utils/generateInviteCode.d.ts +1 -2
  288. package/dist/utils/generateInviteCode.d.ts.map +1 -1
  289. package/dist/utils/generateInviteCode.js +3 -4
  290. package/dist/utils/generateInviteCode.js.map +1 -1
  291. package/dist/utils/inference.d.ts +3 -0
  292. package/dist/utils/inference.d.ts.map +1 -1
  293. package/dist/utils/inference.js +7 -4
  294. package/dist/utils/inference.js.map +1 -1
  295. package/dist/utils/logger.d.ts +3 -0
  296. package/dist/utils/logger.d.ts.map +1 -1
  297. package/dist/utils/logger.js +5 -2
  298. package/dist/utils/logger.js.map +1 -1
  299. package/dist/utils/prismaErrorHandler.d.ts.map +1 -1
  300. package/dist/utils/prismaErrorHandler.js +5 -2
  301. package/dist/utils/prismaErrorHandler.js.map +1 -1
  302. package/dist/utils/prismaWrapper.d.ts +1 -0
  303. package/dist/utils/prismaWrapper.d.ts.map +1 -1
  304. package/dist/utils/prismaWrapper.js +6 -2
  305. package/dist/utils/prismaWrapper.js.map +1 -1
  306. package/docker-compose.yml +5 -0
  307. package/package.json +4 -3
  308. package/src/index.ts +119 -12
  309. package/src/lib/config/env.ts +6 -0
  310. package/src/lib/fileUpload.ts +0 -1
  311. package/src/lib/googleCloudStorage.ts +17 -0
  312. package/src/lib/pusher.ts +5 -1
  313. package/src/lib/redis.ts +56 -0
  314. package/src/lib/thumbnailGenerator.ts +170 -168
  315. package/src/middleware/auth.ts +80 -137
  316. package/src/models/agenda.ts +46 -0
  317. package/src/models/announcement.ts +134 -0
  318. package/src/models/assignment.ts +322 -0
  319. package/src/models/attendance.ts +208 -0
  320. package/src/models/auth.ts +247 -0
  321. package/src/models/class.ts +598 -0
  322. package/src/models/comment.ts +152 -0
  323. package/src/models/conversation.ts +200 -0
  324. package/src/models/event.ts +177 -0
  325. package/src/models/file.ts +129 -0
  326. package/src/models/folder.ts +225 -0
  327. package/src/models/labChat.ts +213 -0
  328. package/src/models/marketing.ts +45 -0
  329. package/src/models/message.ts +153 -0
  330. package/src/models/newtonChat.ts +70 -0
  331. package/src/models/notification.ts +54 -0
  332. package/src/models/section.ts +98 -0
  333. package/src/models/user.ts +47 -0
  334. package/src/models/worksheet.ts +294 -0
  335. package/src/{server/pipelines → pipelines}/aiLabChat.ts +11 -7
  336. package/src/{server/pipelines → pipelines}/aiNewtonChat.ts +9 -5
  337. package/src/{server/pipelines → pipelines}/gradeWorksheet.ts +25 -14
  338. package/src/routers/agenda.ts +3 -66
  339. package/src/routers/announcement.ts +54 -495
  340. package/src/routers/assignment.ts +126 -2018
  341. package/src/routers/attendance.ts +15 -276
  342. package/src/routers/auth.ts +79 -442
  343. package/src/routers/class.ts +263 -1187
  344. package/src/routers/comment.ts +61 -288
  345. package/src/routers/conversation.ts +51 -360
  346. package/src/routers/event.ts +50 -481
  347. package/src/routers/file.ts +45 -368
  348. package/src/routers/folder.ts +107 -836
  349. package/src/routers/labChat.ts +29 -605
  350. package/src/routers/marketing.ts +35 -77
  351. package/src/routers/message.ts +45 -571
  352. package/src/routers/newtonChat.ts +17 -278
  353. package/src/routers/notifications.ts +32 -82
  354. package/src/routers/section.ts +46 -330
  355. package/src/routers/user.ts +49 -227
  356. package/src/routers/worksheet.ts +215 -503
  357. package/src/services/agenda.ts +21 -0
  358. package/src/services/announcement.ts +290 -0
  359. package/src/services/assignment.ts +1198 -0
  360. package/src/services/attendance.ts +85 -0
  361. package/src/services/auth.ts +277 -0
  362. package/src/services/class.ts +622 -0
  363. package/src/services/comment.ts +106 -0
  364. package/src/services/conversation.ts +213 -0
  365. package/src/services/event.ts +231 -0
  366. package/src/services/file.ts +167 -0
  367. package/src/services/folder.ts +316 -0
  368. package/src/services/labChat.ts +352 -0
  369. package/src/services/marketing.ts +57 -0
  370. package/src/services/message.ts +461 -0
  371. package/src/services/newtonChat.ts +222 -0
  372. package/src/services/notification.ts +50 -0
  373. package/src/services/section.ts +283 -0
  374. package/src/services/user.ts +172 -0
  375. package/src/services/worksheet.ts +358 -0
  376. package/src/utils/aiUser.ts +4 -3
  377. package/src/utils/email.ts +5 -3
  378. package/src/utils/generateInviteCode.ts +1 -3
  379. package/src/utils/inference.ts +5 -2
  380. package/src/utils/logger.ts +3 -1
  381. package/src/utils/prismaErrorHandler.ts +3 -0
  382. package/src/utils/prismaWrapper.ts +4 -0
  383. package/tests/globalSetup.ts +62 -0
  384. package/tests/helpers.ts +22 -0
  385. package/tests/middleware/security.test.ts +42 -0
  386. package/tests/routers/agenda.test.ts +138 -0
  387. package/tests/routers/announcement.test.ts +490 -0
  388. package/tests/routers/assignment.test.ts +837 -0
  389. package/tests/{attendance.test.ts → routers/attendance.test.ts} +6 -14
  390. package/tests/routers/auth.test.ts +171 -0
  391. package/tests/{class.test.ts → routers/class.test.ts} +131 -85
  392. package/tests/routers/comment.test.ts +126 -0
  393. package/tests/routers/conversation.test.ts +145 -0
  394. package/tests/{event.test.ts → routers/event.test.ts} +93 -32
  395. package/tests/routers/folder.test.ts +178 -0
  396. package/tests/routers/labChat.test.ts +115 -0
  397. package/tests/routers/marketing.test.ts +59 -0
  398. package/tests/routers/message.test.ts +123 -0
  399. package/tests/routers/notification.test.ts +69 -0
  400. package/tests/{section.test.ts → routers/section.test.ts} +5 -13
  401. package/tests/server/rateLimit.test.ts +73 -0
  402. package/tests/setup.ts +18 -92
  403. package/tests/user.test.ts +9 -31
  404. package/tests/utils/aiUser.test.ts +22 -0
  405. package/tests/utils/generateInviteCode.test.ts +24 -0
  406. package/tests/utils/logger.test.ts +74 -0
  407. package/tests/utils/prismaErrorHandler.test.ts +101 -0
  408. package/tests/utils/prismaWrapper.test.ts +82 -0
  409. package/tests/worksheet.test.ts +181 -0
  410. package/vitest.config.ts +6 -3
  411. package/vitest.unit.config.ts +21 -0
  412. package/TODO.md +0 -2
  413. package/coverage/base.css +0 -224
  414. package/coverage/block-navigation.js +0 -87
  415. package/coverage/clover.xml +0 -12110
  416. package/coverage/coverage-final.json +0 -44
  417. package/coverage/favicon.png +0 -0
  418. package/coverage/index.html +0 -221
  419. package/coverage/prettify.css +0 -1
  420. package/coverage/prettify.js +0 -2
  421. package/coverage/server/index.html +0 -116
  422. package/coverage/server/src/exportType.ts.html +0 -109
  423. package/coverage/server/src/index.html +0 -161
  424. package/coverage/server/src/index.ts.html +0 -1702
  425. package/coverage/server/src/instrument.ts.html +0 -130
  426. package/coverage/server/src/lib/config/env.ts.html +0 -448
  427. package/coverage/server/src/lib/config/index.html +0 -116
  428. package/coverage/server/src/lib/fileUpload.ts.html +0 -1138
  429. package/coverage/server/src/lib/googleCloudStorage.ts.html +0 -334
  430. package/coverage/server/src/lib/index.html +0 -206
  431. package/coverage/server/src/lib/jsonConversion.ts.html +0 -2323
  432. package/coverage/server/src/lib/jsonStyles.ts.html +0 -193
  433. package/coverage/server/src/lib/notificationHandler.ts.html +0 -193
  434. package/coverage/server/src/lib/pusher.ts.html +0 -121
  435. package/coverage/server/src/lib/thumbnailGenerator.ts.html +0 -592
  436. package/coverage/server/src/middleware/auth.ts.html +0 -646
  437. package/coverage/server/src/middleware/index.html +0 -146
  438. package/coverage/server/src/middleware/logging.ts.html +0 -244
  439. package/coverage/server/src/middleware/security.ts.html +0 -271
  440. package/coverage/server/src/routers/_app.ts.html +0 -232
  441. package/coverage/server/src/routers/agenda.ts.html +0 -319
  442. package/coverage/server/src/routers/announcement.ts.html +0 -3481
  443. package/coverage/server/src/routers/assignment.ts.html +0 -7633
  444. package/coverage/server/src/routers/attendance.ts.html +0 -1030
  445. package/coverage/server/src/routers/auth.ts.html +0 -1081
  446. package/coverage/server/src/routers/class.ts.html +0 -3535
  447. package/coverage/server/src/routers/comment.ts.html +0 -991
  448. package/coverage/server/src/routers/conversation.ts.html +0 -982
  449. package/coverage/server/src/routers/event.ts.html +0 -1609
  450. package/coverage/server/src/routers/file.ts.html +0 -1144
  451. package/coverage/server/src/routers/folder.ts.html +0 -2797
  452. package/coverage/server/src/routers/index.html +0 -386
  453. package/coverage/server/src/routers/labChat.ts.html +0 -3073
  454. package/coverage/server/src/routers/marketing.ts.html +0 -340
  455. package/coverage/server/src/routers/message.ts.html +0 -1912
  456. package/coverage/server/src/routers/notifications.ts.html +0 -364
  457. package/coverage/server/src/routers/section.ts.html +0 -1120
  458. package/coverage/server/src/routers/user.ts.html +0 -862
  459. package/coverage/server/src/routers/worksheet.ts.html +0 -1729
  460. package/coverage/server/src/trpc.ts.html +0 -397
  461. package/coverage/server/src/types/index.html +0 -116
  462. package/coverage/server/src/types/trpc.ts.html +0 -127
  463. package/coverage/server/src/utils/aiUser.ts.html +0 -280
  464. package/coverage/server/src/utils/email.ts.html +0 -121
  465. package/coverage/server/src/utils/generateInviteCode.ts.html +0 -106
  466. package/coverage/server/src/utils/index.html +0 -206
  467. package/coverage/server/src/utils/inference.ts.html +0 -709
  468. package/coverage/server/src/utils/logger.ts.html +0 -664
  469. package/coverage/server/src/utils/prismaErrorHandler.ts.html +0 -907
  470. package/coverage/server/src/utils/prismaWrapper.ts.html +0 -355
  471. package/coverage/server/vitest.config.ts.html +0 -196
  472. package/coverage/sort-arrow-sprite.png +0 -0
  473. package/coverage/sorter.js +0 -210
  474. package/src/lib/notificationHandler.ts +0 -36
  475. package/tests/announcement.test.ts +0 -164
  476. package/tests/assignment.test.ts +0 -296
  477. package/tests/auth.test.ts +0 -48
@@ -1,46 +1,33 @@
1
- import { TRPCError } from '@trpc/server';
2
- import { prisma } from '../lib/prisma.js';
3
- import type { MiddlewareContext } from '../types/trpc.js';
1
+ import { TRPCError } from "@trpc/server";
4
2
  import * as Sentry from "@sentry/node";
3
+ import type { MiddlewareContext } from "../types/trpc.js";
4
+ import {
5
+ findUserBySessionToken,
6
+ findTeacherClassesByUserId,
7
+ findClassWithMember,
8
+ findClassWithTeacher,
9
+ } from "../models/auth.js";
5
10
 
6
11
  export const createAuthMiddleware = (t: any) => {
7
-
8
- // Auth middleware
9
12
  const isAuthed = t.middleware(async ({ next, ctx }: MiddlewareContext) => {
10
- const startTime = Date.now();
11
- // Get user from request headers
12
- const userHeader = ctx.req.headers['x-user'];
13
+ const userHeader = ctx.req.headers["x-user"];
13
14
 
14
15
  if (!userHeader) {
15
16
  throw new TRPCError({
16
- code: 'UNAUTHORIZED',
17
- message: 'Not authenticated - no token found',
17
+ code: "UNAUTHORIZED",
18
+ message: "Not authenticated - no token found",
18
19
  });
19
20
  }
20
21
 
21
22
  try {
22
- const token = typeof userHeader === 'string' ? userHeader : userHeader[0];
23
-
24
- // Find user by session token
25
- const user = await prisma.user.findFirst({
26
- where: {
27
- sessions: {
28
- some: {
29
- id: token
30
- }
31
- }
32
- },
33
- select: {
34
- id: true,
35
- username: true,
36
- // institutionId: true,
37
- }
38
- });
23
+ const token =
24
+ typeof userHeader === "string" ? userHeader : userHeader[0];
25
+ const user = await findUserBySessionToken(token);
39
26
 
40
27
  if (!user) {
41
28
  throw new TRPCError({
42
- code: 'UNAUTHORIZED',
43
- message: 'Invalid or expired session',
29
+ code: "UNAUTHORIZED",
30
+ message: "Invalid or expired session",
44
31
  });
45
32
  }
46
33
 
@@ -51,140 +38,96 @@ export const createAuthMiddleware = (t: any) => {
51
38
  },
52
39
  });
53
40
  } catch (error) {
54
- // Re-throw TRPCErrors as-is (e.g., UNAUTHORIZED from invalid session)
55
41
  if (error instanceof TRPCError) {
56
42
  throw error;
57
43
  }
58
44
  Sentry.captureException(error);
59
45
  console.error(error);
60
46
  throw new TRPCError({
61
- code: 'INTERNAL_SERVER_ERROR',
62
- message: 'Internal server error',
47
+ code: "INTERNAL_SERVER_ERROR",
48
+ message: "Internal server error",
63
49
  });
64
50
  }
65
51
  });
66
52
 
67
- // Add computed flags middleware
68
- const addComputedFlags = t.middleware(async ({ next, ctx }: MiddlewareContext) => {
69
- if (!ctx.user) {
70
- throw new TRPCError({
71
- code: 'UNAUTHORIZED',
72
- message: 'Not authenticated',
73
- });
74
- }
75
-
76
- // Get all classes where user is a teacher
77
- const teacherClasses = await prisma.class.findMany({
78
- where: {
79
- teachers: {
80
- some: {
81
- id: ctx.user.id
82
- }
83
- }
84
- },
85
- select: {
86
- id: true
87
- }
88
- });
89
-
90
- return next({
91
- ctx: {
92
- ...ctx,
93
- isTeacher: teacherClasses.length > 0,
94
- teacherClassIds: teacherClasses.map((c: { id: string }) => c.id)
53
+ const addComputedFlags = t.middleware(
54
+ async ({ next, ctx }: MiddlewareContext) => {
55
+ if (!ctx.user) {
56
+ throw new TRPCError({
57
+ code: "UNAUTHORIZED",
58
+ message: "Not authenticated",
59
+ });
95
60
  }
96
- });
97
- });
98
-
99
- // Student middleware
100
- const isMemberInClass = t.middleware(async ({ next, ctx, input }: MiddlewareContext) => {
101
- if (!ctx.user) {
102
- throw new TRPCError({
103
- code: 'UNAUTHORIZED',
104
- message: 'Not authenticated',
105
- });
106
- }
107
61
 
108
- const classId = (input as { classId: string })?.classId;
62
+ const teacherClasses = await findTeacherClassesByUserId(ctx.user.id);
109
63
 
110
- if (!classId) {
111
- throw new TRPCError({
112
- code: 'BAD_REQUEST',
113
- message: 'classId is required',
64
+ return next({
65
+ ctx: {
66
+ ...ctx,
67
+ isTeacher: teacherClasses.length > 0,
68
+ teacherClassIds: teacherClasses.map((c) => c.id),
69
+ },
114
70
  });
115
71
  }
72
+ );
116
73
 
117
- const isMember = await prisma.class.findFirst({
118
- where: {
119
- id: classId,
120
- OR: [
121
- {
122
- students: {
123
- some: {
124
- id: ctx.user.id
125
- }
126
- }
127
- },
128
- {
129
- teachers: {
130
- some: {
131
- id: ctx.user.id
132
- }
133
- }
134
- }
135
- ]
74
+ const isMemberInClass = t.middleware(
75
+ async ({ next, ctx, input }: MiddlewareContext) => {
76
+ if (!ctx.user) {
77
+ throw new TRPCError({
78
+ code: "UNAUTHORIZED",
79
+ message: "Not authenticated",
80
+ });
136
81
  }
137
- });
138
82
 
139
- if (!isMember) {
140
- throw new TRPCError({
141
- code: 'FORBIDDEN',
142
- message: 'Not a member in this class',
143
- });
144
- }
145
-
146
- return next();
147
- });
83
+ const classId = (input as { classId: string })?.classId;
84
+ if (!classId) {
85
+ throw new TRPCError({
86
+ code: "BAD_REQUEST",
87
+ message: "classId is required",
88
+ });
89
+ }
148
90
 
149
- // Teacher middleware
150
- const isTeacherInClass = t.middleware(async ({ next, ctx, input }: MiddlewareContext) => {
151
- if (!ctx.user) {
152
- throw new TRPCError({
153
- code: 'UNAUTHORIZED',
154
- message: 'Not authenticated',
155
- });
156
- }
91
+ const isMember = await findClassWithMember(classId, ctx.user.id);
92
+ if (!isMember) {
93
+ throw new TRPCError({
94
+ code: "FORBIDDEN",
95
+ message: "Not a member in this class",
96
+ });
97
+ }
157
98
 
158
- const classId = input.classId;
159
- if (!classId) {
160
- throw new TRPCError({
161
- code: 'BAD_REQUEST',
162
- message: 'classId is required',
163
- });
99
+ return next();
164
100
  }
101
+ );
165
102
 
166
- const isTeacher = await prisma.class.findFirst({
167
- where: {
168
- id: classId,
169
- teachers: {
170
- some: {
171
- id: ctx.user.id
172
- }
173
- }
103
+ const isTeacherInClass = t.middleware(
104
+ async ({ next, ctx, input }: MiddlewareContext) => {
105
+ if (!ctx.user) {
106
+ throw new TRPCError({
107
+ code: "UNAUTHORIZED",
108
+ message: "Not authenticated",
109
+ });
174
110
  }
175
- });
176
111
 
112
+ const classId = (input as { classId: string })?.classId;
113
+ if (!classId) {
114
+ throw new TRPCError({
115
+ code: "BAD_REQUEST",
116
+ message: "classId is required",
117
+ });
118
+ }
177
119
 
120
+ const isTeacher = await findClassWithTeacher(classId, ctx.user.id);
121
+ if (!isTeacher) {
122
+ throw new TRPCError({
123
+ code: "FORBIDDEN",
124
+ message: "Not a teacher in this class",
125
+ });
126
+ }
178
127
 
179
- if (!isTeacher) {
180
- throw new TRPCError({
181
- code: 'FORBIDDEN',
182
- message: 'Not a teacher in this class',
183
- });
128
+ return next();
184
129
  }
185
-
186
- return next();
187
- });
130
+ );
188
131
 
189
132
  return {
190
133
  isAuthed,
@@ -192,4 +135,4 @@ export const createAuthMiddleware = (t: any) => {
192
135
  isMemberInClass,
193
136
  isTeacherInClass,
194
137
  };
195
- };
138
+ };
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Agenda model – personal and class events for a date range.
3
+ */
4
+ import { prisma } from "../lib/prisma.js";
5
+
6
+ /** @returns Personal events (no class) for user in date range. */
7
+ export function findPersonalEvents(
8
+ userId: string,
9
+ rangeStart: Date,
10
+ rangeEnd: Date,
11
+ ) {
12
+ return prisma.event.findMany({
13
+ where: {
14
+ userId,
15
+ startTime: { gte: rangeStart, lte: rangeEnd },
16
+ class: { is: null },
17
+ },
18
+ include: {
19
+ assignmentsAttached: true,
20
+ class: true,
21
+ },
22
+ });
23
+ }
24
+
25
+ /** @returns Class events for user's classes in date range. */
26
+ export function findClassEvents(
27
+ userId: string,
28
+ rangeStart: Date,
29
+ rangeEnd: Date,
30
+ ) {
31
+ return prisma.event.findMany({
32
+ where: {
33
+ class: {
34
+ OR: [
35
+ { teachers: { some: { id: userId } } },
36
+ { students: { some: { id: userId } } },
37
+ ],
38
+ },
39
+ startTime: { gte: rangeStart, lte: rangeEnd },
40
+ },
41
+ include: {
42
+ assignmentsAttached: true,
43
+ class: true,
44
+ },
45
+ });
46
+ }
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Announcement model – announcements, attachments, comments.
3
+ */
4
+ import { prisma } from "../lib/prisma.js";
5
+
6
+ export const announcementSelect = {
7
+ id: true,
8
+ teacher: {
9
+ select: {
10
+ id: true,
11
+ username: true,
12
+ profile: {
13
+ select: {
14
+ displayName: true,
15
+ profilePicture: true,
16
+ profilePictureThumbnail: true,
17
+ },
18
+ },
19
+ },
20
+ },
21
+ remarks: true,
22
+ createdAt: true,
23
+ modifiedAt: true,
24
+ attachments: {
25
+ select: {
26
+ id: true,
27
+ name: true,
28
+ type: true,
29
+ size: true,
30
+ path: true,
31
+ uploadedAt: true,
32
+ thumbnailId: true,
33
+ },
34
+ },
35
+ };
36
+
37
+ /** @returns Announcements for a class. */
38
+ export function findAnnouncementsByClassId(classId: string) {
39
+ return prisma.announcement.findMany({
40
+ where: { classId },
41
+ select: {
42
+ ...announcementSelect,
43
+ _count: {
44
+ select: { comments: true },
45
+ },
46
+ },
47
+ orderBy: { createdAt: "desc" },
48
+ });
49
+ }
50
+
51
+ /** @returns Announcement by ID and class. */
52
+ export function findAnnouncementByIdAndClass(id: string, classId: string) {
53
+ return prisma.announcement.findFirst({
54
+ where: { id, classId },
55
+ select: announcementSelect,
56
+ });
57
+ }
58
+
59
+ /** @returns Announcement by ID with class and teachers. */
60
+ export function findAnnouncementWithClass(id: string) {
61
+ return prisma.announcement.findUnique({
62
+ where: { id },
63
+ include: {
64
+ class: {
65
+ include: { teachers: true },
66
+ },
67
+ attachments: {
68
+ select: {
69
+ id: true,
70
+ name: true,
71
+ type: true,
72
+ path: true,
73
+ size: true,
74
+ uploadStatus: true,
75
+ thumbnail: { select: { path: true } },
76
+ },
77
+ },
78
+ },
79
+ });
80
+ }
81
+
82
+ /** Create an announcement. */
83
+ export function createAnnouncement(data: {
84
+ remarks: string;
85
+ teacherId: string;
86
+ classId: string;
87
+ }) {
88
+ return prisma.announcement.create({
89
+ data: {
90
+ remarks: data.remarks,
91
+ teacher: { connect: { id: data.teacherId } },
92
+ class: { connect: { id: data.classId } },
93
+ },
94
+ select: announcementSelect,
95
+ });
96
+ }
97
+
98
+ /** Update announcement attachments. */
99
+ export function updateAnnouncementAttachments(
100
+ id: string,
101
+ data: {
102
+ connect?: { id: string }[];
103
+ deleteMany?: { id: { in: string[] } };
104
+ }
105
+ ) {
106
+ return prisma.announcement.update({
107
+ where: { id },
108
+ data: {
109
+ ...(data.connect?.length && {
110
+ attachments: { connect: data.connect },
111
+ }),
112
+ ...(data.deleteMany && {
113
+ attachments: { deleteMany: data.deleteMany },
114
+ }),
115
+ },
116
+ select: announcementSelect,
117
+ });
118
+ }
119
+
120
+ /** Update announcement remarks. */
121
+ export function updateAnnouncement(id: string, data: { remarks?: string }) {
122
+ return prisma.announcement.update({
123
+ where: { id },
124
+ data,
125
+ select: announcementSelect,
126
+ });
127
+ }
128
+
129
+ /** Delete an announcement. */
130
+ export function deleteAnnouncement(id: string) {
131
+ return prisma.announcement.delete({
132
+ where: { id },
133
+ });
134
+ }