@studious-lms/server 1.2.53 → 1.4.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 (479) 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 +461 -0
  53. package/dist/models/class.d.ts.map +1 -0
  54. package/dist/models/class.js +645 -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 +76 -0
  109. package/dist/pipelines/aiLabChat.d.ts.map +1 -0
  110. package/dist/pipelines/aiLabChat.js +599 -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 +1523 -1315
  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 +160 -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 +21 -11
  167. package/dist/routers/labChat.d.ts.map +1 -1
  168. package/dist/routers/labChat.js +22 -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 +13 -2
  175. package/dist/routers/message.d.ts.map +1 -1
  176. package/dist/routers/message.js +32 -520
  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 +68 -55
  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 +643 -0
  224. package/dist/services/class.d.ts.map +1 -0
  225. package/dist/services/class.js +486 -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 +169 -0
  248. package/dist/services/labChat.d.ts.map +1 -0
  249. package/dist/services/labChat.js +381 -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 +103 -0
  256. package/dist/services/message.d.ts.map +1 -0
  257. package/dist/services/message.js +422 -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/prisma/schema.prisma +1 -1
  309. package/src/index.ts +119 -12
  310. package/src/lib/config/env.ts +6 -0
  311. package/src/lib/fileUpload.ts +0 -1
  312. package/src/lib/googleCloudStorage.ts +17 -0
  313. package/src/lib/pusher.ts +5 -1
  314. package/src/lib/redis.ts +56 -0
  315. package/src/lib/thumbnailGenerator.ts +170 -168
  316. package/src/middleware/auth.ts +80 -137
  317. package/src/models/agenda.ts +46 -0
  318. package/src/models/announcement.ts +134 -0
  319. package/src/models/assignment.ts +322 -0
  320. package/src/models/attendance.ts +208 -0
  321. package/src/models/auth.ts +247 -0
  322. package/src/models/class.ts +703 -0
  323. package/src/models/comment.ts +152 -0
  324. package/src/models/conversation.ts +200 -0
  325. package/src/models/event.ts +177 -0
  326. package/src/models/file.ts +129 -0
  327. package/src/models/folder.ts +225 -0
  328. package/src/models/labChat.ts +213 -0
  329. package/src/models/marketing.ts +45 -0
  330. package/src/models/message.ts +153 -0
  331. package/src/models/newtonChat.ts +70 -0
  332. package/src/models/notification.ts +54 -0
  333. package/src/models/section.ts +98 -0
  334. package/src/models/user.ts +47 -0
  335. package/src/models/worksheet.ts +294 -0
  336. package/src/pipelines/aiLabChat.ts +684 -0
  337. package/src/{server/pipelines → pipelines}/aiNewtonChat.ts +9 -5
  338. package/src/{server/pipelines → pipelines}/gradeWorksheet.ts +25 -14
  339. package/src/routers/agenda.ts +3 -66
  340. package/src/routers/announcement.ts +54 -495
  341. package/src/routers/assignment.ts +126 -2018
  342. package/src/routers/attendance.ts +15 -276
  343. package/src/routers/auth.ts +79 -442
  344. package/src/routers/class.ts +263 -1187
  345. package/src/routers/comment.ts +61 -288
  346. package/src/routers/conversation.ts +51 -360
  347. package/src/routers/event.ts +50 -481
  348. package/src/routers/file.ts +45 -368
  349. package/src/routers/folder.ts +107 -836
  350. package/src/routers/labChat.ts +35 -604
  351. package/src/routers/marketing.ts +35 -77
  352. package/src/routers/message.ts +54 -567
  353. package/src/routers/newtonChat.ts +17 -278
  354. package/src/routers/notifications.ts +32 -82
  355. package/src/routers/section.ts +46 -330
  356. package/src/routers/user.ts +49 -227
  357. package/src/routers/worksheet.ts +215 -503
  358. package/src/services/agenda.ts +21 -0
  359. package/src/services/announcement.ts +290 -0
  360. package/src/services/assignment.ts +1198 -0
  361. package/src/services/attendance.ts +85 -0
  362. package/src/services/auth.ts +277 -0
  363. package/src/services/class.ts +629 -0
  364. package/src/services/comment.ts +106 -0
  365. package/src/services/conversation.ts +213 -0
  366. package/src/services/event.ts +231 -0
  367. package/src/services/file.ts +167 -0
  368. package/src/services/folder.ts +316 -0
  369. package/src/services/labChat.ts +458 -0
  370. package/src/services/marketing.ts +57 -0
  371. package/src/services/message.ts +554 -0
  372. package/src/services/newtonChat.ts +222 -0
  373. package/src/services/notification.ts +50 -0
  374. package/src/services/section.ts +283 -0
  375. package/src/services/user.ts +172 -0
  376. package/src/services/worksheet.ts +358 -0
  377. package/src/utils/aiUser.ts +4 -3
  378. package/src/utils/email.ts +5 -3
  379. package/src/utils/generateInviteCode.ts +1 -3
  380. package/src/utils/inference.ts +5 -2
  381. package/src/utils/logger.ts +3 -1
  382. package/src/utils/prismaErrorHandler.ts +3 -0
  383. package/src/utils/prismaWrapper.ts +4 -0
  384. package/tests/globalSetup.ts +62 -0
  385. package/tests/helpers.ts +22 -0
  386. package/tests/middleware/security.test.ts +42 -0
  387. package/tests/routers/agenda.test.ts +138 -0
  388. package/tests/routers/announcement.test.ts +490 -0
  389. package/tests/routers/assignment.test.ts +837 -0
  390. package/tests/{attendance.test.ts → routers/attendance.test.ts} +6 -14
  391. package/tests/routers/auth.test.ts +171 -0
  392. package/tests/{class.test.ts → routers/class.test.ts} +131 -85
  393. package/tests/routers/comment.test.ts +126 -0
  394. package/tests/routers/conversation.test.ts +145 -0
  395. package/tests/{event.test.ts → routers/event.test.ts} +93 -32
  396. package/tests/routers/folder.test.ts +178 -0
  397. package/tests/routers/labChat.test.ts +115 -0
  398. package/tests/routers/marketing.test.ts +59 -0
  399. package/tests/routers/message.test.ts +123 -0
  400. package/tests/routers/notification.test.ts +69 -0
  401. package/tests/{section.test.ts → routers/section.test.ts} +5 -13
  402. package/tests/server/rateLimit.test.ts +73 -0
  403. package/tests/setup.ts +18 -92
  404. package/tests/user.test.ts +9 -31
  405. package/tests/utils/aiUser.test.ts +22 -0
  406. package/tests/utils/generateInviteCode.test.ts +24 -0
  407. package/tests/utils/logger.test.ts +74 -0
  408. package/tests/utils/prismaErrorHandler.test.ts +101 -0
  409. package/tests/utils/prismaWrapper.test.ts +82 -0
  410. package/tests/worksheet.test.ts +181 -0
  411. package/vitest.config.ts +6 -3
  412. package/vitest.unit.config.ts +21 -0
  413. package/TODO.md +0 -2
  414. package/coverage/base.css +0 -224
  415. package/coverage/block-navigation.js +0 -87
  416. package/coverage/clover.xml +0 -12110
  417. package/coverage/coverage-final.json +0 -44
  418. package/coverage/favicon.png +0 -0
  419. package/coverage/index.html +0 -221
  420. package/coverage/prettify.css +0 -1
  421. package/coverage/prettify.js +0 -2
  422. package/coverage/server/index.html +0 -116
  423. package/coverage/server/src/exportType.ts.html +0 -109
  424. package/coverage/server/src/index.html +0 -161
  425. package/coverage/server/src/index.ts.html +0 -1702
  426. package/coverage/server/src/instrument.ts.html +0 -130
  427. package/coverage/server/src/lib/config/env.ts.html +0 -448
  428. package/coverage/server/src/lib/config/index.html +0 -116
  429. package/coverage/server/src/lib/fileUpload.ts.html +0 -1138
  430. package/coverage/server/src/lib/googleCloudStorage.ts.html +0 -334
  431. package/coverage/server/src/lib/index.html +0 -206
  432. package/coverage/server/src/lib/jsonConversion.ts.html +0 -2323
  433. package/coverage/server/src/lib/jsonStyles.ts.html +0 -193
  434. package/coverage/server/src/lib/notificationHandler.ts.html +0 -193
  435. package/coverage/server/src/lib/pusher.ts.html +0 -121
  436. package/coverage/server/src/lib/thumbnailGenerator.ts.html +0 -592
  437. package/coverage/server/src/middleware/auth.ts.html +0 -646
  438. package/coverage/server/src/middleware/index.html +0 -146
  439. package/coverage/server/src/middleware/logging.ts.html +0 -244
  440. package/coverage/server/src/middleware/security.ts.html +0 -271
  441. package/coverage/server/src/routers/_app.ts.html +0 -232
  442. package/coverage/server/src/routers/agenda.ts.html +0 -319
  443. package/coverage/server/src/routers/announcement.ts.html +0 -3481
  444. package/coverage/server/src/routers/assignment.ts.html +0 -7633
  445. package/coverage/server/src/routers/attendance.ts.html +0 -1030
  446. package/coverage/server/src/routers/auth.ts.html +0 -1081
  447. package/coverage/server/src/routers/class.ts.html +0 -3535
  448. package/coverage/server/src/routers/comment.ts.html +0 -991
  449. package/coverage/server/src/routers/conversation.ts.html +0 -982
  450. package/coverage/server/src/routers/event.ts.html +0 -1609
  451. package/coverage/server/src/routers/file.ts.html +0 -1144
  452. package/coverage/server/src/routers/folder.ts.html +0 -2797
  453. package/coverage/server/src/routers/index.html +0 -386
  454. package/coverage/server/src/routers/labChat.ts.html +0 -3073
  455. package/coverage/server/src/routers/marketing.ts.html +0 -340
  456. package/coverage/server/src/routers/message.ts.html +0 -1912
  457. package/coverage/server/src/routers/notifications.ts.html +0 -364
  458. package/coverage/server/src/routers/section.ts.html +0 -1120
  459. package/coverage/server/src/routers/user.ts.html +0 -862
  460. package/coverage/server/src/routers/worksheet.ts.html +0 -1729
  461. package/coverage/server/src/trpc.ts.html +0 -397
  462. package/coverage/server/src/types/index.html +0 -116
  463. package/coverage/server/src/types/trpc.ts.html +0 -127
  464. package/coverage/server/src/utils/aiUser.ts.html +0 -280
  465. package/coverage/server/src/utils/email.ts.html +0 -121
  466. package/coverage/server/src/utils/generateInviteCode.ts.html +0 -106
  467. package/coverage/server/src/utils/index.html +0 -206
  468. package/coverage/server/src/utils/inference.ts.html +0 -709
  469. package/coverage/server/src/utils/logger.ts.html +0 -664
  470. package/coverage/server/src/utils/prismaErrorHandler.ts.html +0 -907
  471. package/coverage/server/src/utils/prismaWrapper.ts.html +0 -355
  472. package/coverage/server/vitest.config.ts.html +0 -196
  473. package/coverage/sort-arrow-sprite.png +0 -0
  474. package/coverage/sorter.js +0 -210
  475. package/src/lib/notificationHandler.ts +0 -36
  476. package/src/server/pipelines/aiLabChat.ts +0 -507
  477. package/tests/announcement.test.ts +0 -164
  478. package/tests/assignment.test.ts +0 -296
  479. 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
+ }