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