@studious-lms/server 1.1.26 → 1.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (486) hide show
  1. package/.coderabbit.yaml +9 -0
  2. package/.env.example +53 -0
  3. package/.env.test.example +37 -0
  4. package/README.md +34 -7
  5. package/dist/exportType.d.ts.map +1 -1
  6. package/dist/exportType.js +4 -0
  7. package/dist/exportType.js.map +1 -0
  8. package/dist/index.d.ts +1 -1
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +212 -51
  11. package/dist/index.js.map +1 -0
  12. package/dist/instrument.d.ts +2 -0
  13. package/dist/instrument.d.ts.map +1 -0
  14. package/dist/instrument.js +18 -0
  15. package/dist/instrument.js.map +1 -0
  16. package/dist/lib/config/env.d.ts +190 -0
  17. package/dist/lib/config/env.d.ts.map +1 -0
  18. package/dist/lib/config/env.js +121 -0
  19. package/dist/lib/config/env.js.map +1 -0
  20. package/dist/lib/fileUpload.d.ts +2 -2
  21. package/dist/lib/fileUpload.d.ts.map +1 -1
  22. package/dist/lib/fileUpload.js +15 -5
  23. package/dist/lib/fileUpload.js.map +1 -0
  24. package/dist/lib/googleCloudStorage.d.ts +6 -0
  25. package/dist/lib/googleCloudStorage.d.ts.map +1 -1
  26. package/dist/lib/googleCloudStorage.js +26 -6
  27. package/dist/lib/googleCloudStorage.js.map +1 -0
  28. package/dist/lib/jsonConversion.d.ts.map +1 -1
  29. package/dist/lib/jsonConversion.js +16 -14
  30. package/dist/lib/jsonConversion.js.map +1 -0
  31. package/dist/lib/jsonStyles.d.ts.map +1 -1
  32. package/dist/lib/jsonStyles.js +4 -0
  33. package/dist/lib/jsonStyles.js.map +1 -0
  34. package/dist/lib/notificationHandler.d.ts +2 -2
  35. package/dist/lib/notificationHandler.d.ts.map +1 -1
  36. package/dist/lib/notificationHandler.js +4 -0
  37. package/dist/lib/notificationHandler.js.map +1 -0
  38. package/dist/lib/prisma.d.ts +2 -2
  39. package/dist/lib/prisma.d.ts.map +1 -1
  40. package/dist/lib/prisma.js +24 -1
  41. package/dist/lib/prisma.js.map +1 -0
  42. package/dist/lib/pusher.d.ts +4 -1
  43. package/dist/lib/pusher.d.ts.map +1 -1
  44. package/dist/lib/pusher.js +14 -6
  45. package/dist/lib/pusher.js.map +1 -0
  46. package/dist/lib/redis.d.ts +5 -0
  47. package/dist/lib/redis.d.ts.map +1 -0
  48. package/dist/lib/redis.js +53 -0
  49. package/dist/lib/redis.js.map +1 -0
  50. package/dist/lib/thumbnailGenerator.d.ts +0 -21
  51. package/dist/lib/thumbnailGenerator.d.ts.map +1 -1
  52. package/dist/lib/thumbnailGenerator.js +159 -158
  53. package/dist/lib/thumbnailGenerator.js.map +1 -0
  54. package/dist/middleware/auth.d.ts.map +1 -1
  55. package/dist/middleware/auth.js +41 -93
  56. package/dist/middleware/auth.js.map +1 -0
  57. package/dist/middleware/logging.d.ts.map +1 -1
  58. package/dist/middleware/logging.js +4 -0
  59. package/dist/middleware/logging.js.map +1 -0
  60. package/dist/middleware/security.d.ts +5 -0
  61. package/dist/middleware/security.d.ts.map +1 -0
  62. package/dist/middleware/security.js +77 -0
  63. package/dist/middleware/security.js.map +1 -0
  64. package/dist/models/agenda.d.ts +97 -0
  65. package/dist/models/agenda.d.ts.map +1 -0
  66. package/dist/models/agenda.js +40 -0
  67. package/dist/models/agenda.js.map +1 -0
  68. package/dist/models/announcement.d.ts +223 -0
  69. package/dist/models/announcement.d.ts.map +1 -0
  70. package/dist/models/announcement.js +120 -0
  71. package/dist/models/announcement.js.map +1 -0
  72. package/dist/models/assignment.d.ts +1292 -0
  73. package/dist/models/assignment.d.ts.map +1 -0
  74. package/dist/models/assignment.js +309 -0
  75. package/dist/models/assignment.js.map +1 -0
  76. package/dist/models/attendance.d.ts +180 -0
  77. package/dist/models/attendance.d.ts.map +1 -0
  78. package/dist/models/attendance.js +188 -0
  79. package/dist/models/attendance.js.map +1 -0
  80. package/dist/models/auth.d.ts +153 -0
  81. package/dist/models/auth.d.ts.map +1 -0
  82. package/dist/models/auth.js +217 -0
  83. package/dist/models/auth.js.map +1 -0
  84. package/dist/models/class.d.ts +439 -0
  85. package/dist/models/class.d.ts.map +1 -0
  86. package/dist/models/class.js +546 -0
  87. package/dist/models/class.js.map +1 -0
  88. package/dist/models/comment.d.ts +171 -0
  89. package/dist/models/comment.d.ts.map +1 -0
  90. package/dist/models/comment.js +138 -0
  91. package/dist/models/comment.js.map +1 -0
  92. package/dist/models/conversation.d.ts +164 -0
  93. package/dist/models/conversation.d.ts.map +1 -0
  94. package/dist/models/conversation.js +175 -0
  95. package/dist/models/conversation.js.map +1 -0
  96. package/dist/models/event.d.ts +295 -0
  97. package/dist/models/event.d.ts.map +1 -0
  98. package/dist/models/event.js +145 -0
  99. package/dist/models/event.js.map +1 -0
  100. package/dist/models/file.d.ts +536 -0
  101. package/dist/models/file.d.ts.map +1 -0
  102. package/dist/models/file.js +126 -0
  103. package/dist/models/file.js.map +1 -0
  104. package/dist/models/folder.d.ts +295 -0
  105. package/dist/models/folder.d.ts.map +1 -0
  106. package/dist/models/folder.js +202 -0
  107. package/dist/models/folder.js.map +1 -0
  108. package/dist/models/labChat.d.ts +243 -0
  109. package/dist/models/labChat.d.ts.map +1 -0
  110. package/dist/models/labChat.js +204 -0
  111. package/dist/models/labChat.js.map +1 -0
  112. package/dist/models/marketing.d.ts +72 -0
  113. package/dist/models/marketing.d.ts.map +1 -0
  114. package/dist/models/marketing.js +26 -0
  115. package/dist/models/marketing.js.map +1 -0
  116. package/dist/models/message.d.ts +100 -0
  117. package/dist/models/message.d.ts.map +1 -0
  118. package/dist/models/message.js +131 -0
  119. package/dist/models/message.js.map +1 -0
  120. package/dist/models/newtonChat.d.ts +72 -0
  121. package/dist/models/newtonChat.d.ts.map +1 -0
  122. package/dist/models/newtonChat.js +61 -0
  123. package/dist/models/newtonChat.js.map +1 -0
  124. package/dist/models/notification.d.ts +65 -0
  125. package/dist/models/notification.d.ts.map +1 -0
  126. package/dist/models/notification.js +46 -0
  127. package/dist/models/notification.js.map +1 -0
  128. package/dist/models/section.d.ts +102 -0
  129. package/dist/models/section.d.ts.map +1 -0
  130. package/dist/models/section.js +83 -0
  131. package/dist/models/section.js.map +1 -0
  132. package/dist/models/user.d.ts +39 -0
  133. package/dist/models/user.d.ts.map +1 -0
  134. package/dist/models/user.js +38 -0
  135. package/dist/models/user.js.map +1 -0
  136. package/dist/models/worksheet.d.ts +460 -0
  137. package/dist/models/worksheet.d.ts.map +1 -0
  138. package/dist/models/worksheet.js +200 -0
  139. package/dist/models/worksheet.js.map +1 -0
  140. package/dist/pipelines/aiLabChat.d.ts +21 -0
  141. package/dist/pipelines/aiLabChat.d.ts.map +1 -0
  142. package/dist/pipelines/aiLabChat.js +460 -0
  143. package/dist/pipelines/aiLabChat.js.map +1 -0
  144. package/dist/pipelines/aiNewtonChat.d.ts +30 -0
  145. package/dist/pipelines/aiNewtonChat.d.ts.map +1 -0
  146. package/dist/pipelines/aiNewtonChat.js +289 -0
  147. package/dist/pipelines/aiNewtonChat.js.map +1 -0
  148. package/dist/pipelines/gradeWorksheet.d.ts +30 -0
  149. package/dist/pipelines/gradeWorksheet.d.ts.map +1 -0
  150. package/dist/pipelines/gradeWorksheet.js +252 -0
  151. package/dist/pipelines/gradeWorksheet.js.map +1 -0
  152. package/dist/routers/_app.d.ts +6438 -3910
  153. package/dist/routers/_app.d.ts.map +1 -1
  154. package/dist/routers/_app.js +10 -0
  155. package/dist/routers/_app.js.map +1 -0
  156. package/dist/routers/agenda.d.ts +58 -6
  157. package/dist/routers/agenda.d.ts.map +1 -1
  158. package/dist/routers/agenda.js +6 -58
  159. package/dist/routers/agenda.js.map +1 -0
  160. package/dist/routers/announcement.d.ts +325 -6
  161. package/dist/routers/announcement.d.ts.map +1 -1
  162. package/dist/routers/announcement.js +543 -77
  163. package/dist/routers/announcement.js.map +1 -0
  164. package/dist/routers/assignment.d.ts +419 -357
  165. package/dist/routers/assignment.d.ts.map +1 -1
  166. package/dist/routers/assignment.js +100 -1689
  167. package/dist/routers/assignment.js.map +1 -0
  168. package/dist/routers/attendance.d.ts +20 -9
  169. package/dist/routers/attendance.d.ts.map +1 -1
  170. package/dist/routers/attendance.js +10 -263
  171. package/dist/routers/attendance.js.map +1 -0
  172. package/dist/routers/auth.d.ts +21 -1
  173. package/dist/routers/auth.d.ts.map +1 -1
  174. package/dist/routers/auth.js +37 -241
  175. package/dist/routers/auth.js.map +1 -0
  176. package/dist/routers/class.d.ts +198 -68
  177. package/dist/routers/class.d.ts.map +1 -1
  178. package/dist/routers/class.js +88 -909
  179. package/dist/routers/class.js.map +1 -0
  180. package/dist/routers/comment.d.ts +153 -0
  181. package/dist/routers/comment.d.ts.map +1 -0
  182. package/dist/routers/comment.js +58 -0
  183. package/dist/routers/comment.js.map +1 -0
  184. package/dist/routers/conversation.d.ts +73 -3
  185. package/dist/routers/conversation.d.ts.map +1 -1
  186. package/dist/routers/conversation.js +23 -265
  187. package/dist/routers/conversation.js.map +1 -0
  188. package/dist/routers/event.d.ts +46 -37
  189. package/dist/routers/event.d.ts.map +1 -1
  190. package/dist/routers/event.js +15 -431
  191. package/dist/routers/event.js.map +1 -0
  192. package/dist/routers/file.d.ts +4 -2
  193. package/dist/routers/file.d.ts.map +1 -1
  194. package/dist/routers/file.js +11 -298
  195. package/dist/routers/file.js.map +1 -0
  196. package/dist/routers/folder.d.ts +21 -14
  197. package/dist/routers/folder.d.ts.map +1 -1
  198. package/dist/routers/folder.js +36 -743
  199. package/dist/routers/folder.js.map +1 -0
  200. package/dist/routers/labChat.d.ts +12 -9
  201. package/dist/routers/labChat.d.ts.map +1 -1
  202. package/dist/routers/labChat.js +21 -885
  203. package/dist/routers/labChat.js.map +1 -0
  204. package/dist/routers/marketing.d.ts +2 -2
  205. package/dist/routers/marketing.d.ts.map +1 -1
  206. package/dist/routers/marketing.js +9 -54
  207. package/dist/routers/marketing.js.map +1 -0
  208. package/dist/routers/message.d.ts +2 -1
  209. package/dist/routers/message.d.ts.map +1 -1
  210. package/dist/routers/message.js +29 -519
  211. package/dist/routers/message.js.map +1 -0
  212. package/dist/routers/newtonChat.d.ts +55 -0
  213. package/dist/routers/newtonChat.d.ts.map +1 -0
  214. package/dist/routers/newtonChat.js +22 -0
  215. package/dist/routers/newtonChat.js.map +1 -0
  216. package/dist/routers/notifications.d.ts +8 -8
  217. package/dist/routers/notifications.d.ts.map +1 -1
  218. package/dist/routers/notifications.js +20 -81
  219. package/dist/routers/notifications.js.map +1 -0
  220. package/dist/routers/section.d.ts +23 -8
  221. package/dist/routers/section.d.ts.map +1 -1
  222. package/dist/routers/section.js +23 -273
  223. package/dist/routers/section.js.map +1 -0
  224. package/dist/routers/user.d.ts +1 -1
  225. package/dist/routers/user.d.ts.map +1 -1
  226. package/dist/routers/user.js +34 -204
  227. package/dist/routers/user.js.map +1 -0
  228. package/dist/routers/worksheet.d.ts +362 -0
  229. package/dist/routers/worksheet.d.ts.map +1 -0
  230. package/dist/routers/worksheet.js +153 -0
  231. package/dist/routers/worksheet.js.map +1 -0
  232. package/dist/seedDatabase.d.ts +2 -3
  233. package/dist/seedDatabase.d.ts.map +1 -1
  234. package/dist/seedDatabase.js +309 -288
  235. package/dist/seedDatabase.js.map +1 -0
  236. package/dist/server/pipelines/aiLabChat.d.ts +21 -0
  237. package/dist/server/pipelines/aiLabChat.d.ts.map +1 -0
  238. package/dist/server/pipelines/aiLabChat.js +456 -0
  239. package/dist/server/pipelines/aiLabChat.js.map +1 -0
  240. package/dist/server/pipelines/aiNewtonChat.d.ts +30 -0
  241. package/dist/server/pipelines/aiNewtonChat.d.ts.map +1 -0
  242. package/dist/server/pipelines/aiNewtonChat.js +285 -0
  243. package/dist/server/pipelines/aiNewtonChat.js.map +1 -0
  244. package/dist/server/pipelines/gradeWorksheet.d.ts +30 -0
  245. package/dist/server/pipelines/gradeWorksheet.d.ts.map +1 -0
  246. package/dist/server/pipelines/gradeWorksheet.js +248 -0
  247. package/dist/server/pipelines/gradeWorksheet.js.map +1 -0
  248. package/dist/services/agenda.d.ts +100 -0
  249. package/dist/services/agenda.d.ts.map +1 -0
  250. package/dist/services/agenda.js +21 -0
  251. package/dist/services/agenda.js.map +1 -0
  252. package/dist/services/announcement.d.ts +135 -0
  253. package/dist/services/announcement.d.ts.map +1 -0
  254. package/dist/services/announcement.js +223 -0
  255. package/dist/services/announcement.js.map +1 -0
  256. package/dist/services/assignment.d.ts +1462 -0
  257. package/dist/services/assignment.d.ts.map +1 -0
  258. package/dist/services/assignment.js +898 -0
  259. package/dist/services/assignment.js.map +1 -0
  260. package/dist/services/attendance.d.ts +93 -0
  261. package/dist/services/attendance.d.ts.map +1 -0
  262. package/dist/services/attendance.js +61 -0
  263. package/dist/services/attendance.js.map +1 -0
  264. package/dist/services/auth.d.ts +68 -0
  265. package/dist/services/auth.d.ts.map +1 -0
  266. package/dist/services/auth.js +218 -0
  267. package/dist/services/auth.js.map +1 -0
  268. package/dist/services/class.d.ts +621 -0
  269. package/dist/services/class.d.ts.map +1 -0
  270. package/dist/services/class.js +474 -0
  271. package/dist/services/class.js.map +1 -0
  272. package/dist/services/comment.d.ts +100 -0
  273. package/dist/services/comment.d.ts.map +1 -0
  274. package/dist/services/comment.js +83 -0
  275. package/dist/services/comment.js.map +1 -0
  276. package/dist/services/conversation.d.ts +159 -0
  277. package/dist/services/conversation.d.ts.map +1 -0
  278. package/dist/services/conversation.js +138 -0
  279. package/dist/services/conversation.js.map +1 -0
  280. package/dist/services/event.d.ts +216 -0
  281. package/dist/services/event.d.ts.map +1 -0
  282. package/dist/services/event.js +168 -0
  283. package/dist/services/event.js.map +1 -0
  284. package/dist/services/file.d.ts +74 -0
  285. package/dist/services/file.d.ts.map +1 -0
  286. package/dist/services/file.js +133 -0
  287. package/dist/services/file.js.map +1 -0
  288. package/dist/services/folder.d.ts +239 -0
  289. package/dist/services/folder.d.ts.map +1 -0
  290. package/dist/services/folder.js +248 -0
  291. package/dist/services/folder.js.map +1 -0
  292. package/dist/services/labChat.d.ts +165 -0
  293. package/dist/services/labChat.d.ts.map +1 -0
  294. package/dist/services/labChat.js +289 -0
  295. package/dist/services/labChat.js.map +1 -0
  296. package/dist/services/marketing.d.ts +50 -0
  297. package/dist/services/marketing.d.ts.map +1 -0
  298. package/dist/services/marketing.js +32 -0
  299. package/dist/services/marketing.js.map +1 -0
  300. package/dist/services/message.d.ts +95 -0
  301. package/dist/services/message.d.ts.map +1 -0
  302. package/dist/services/message.js +350 -0
  303. package/dist/services/message.js.map +1 -0
  304. package/dist/services/newtonChat.d.ts +22 -0
  305. package/dist/services/newtonChat.d.ts.map +1 -0
  306. package/dist/services/newtonChat.js +174 -0
  307. package/dist/services/newtonChat.js.map +1 -0
  308. package/dist/services/notification.d.ts +65 -0
  309. package/dist/services/notification.d.ts.map +1 -0
  310. package/dist/services/notification.js +33 -0
  311. package/dist/services/notification.js.map +1 -0
  312. package/dist/services/section.d.ts +53 -0
  313. package/dist/services/section.d.ts.map +1 -0
  314. package/dist/services/section.js +199 -0
  315. package/dist/services/section.js.map +1 -0
  316. package/dist/services/user.d.ts +48 -0
  317. package/dist/services/user.d.ts.map +1 -0
  318. package/dist/services/user.js +141 -0
  319. package/dist/services/user.js.map +1 -0
  320. package/dist/services/worksheet.d.ts +239 -0
  321. package/dist/services/worksheet.d.ts.map +1 -0
  322. package/dist/services/worksheet.js +235 -0
  323. package/dist/services/worksheet.js.map +1 -0
  324. package/dist/socket/handlers.d.ts.map +1 -1
  325. package/dist/socket/handlers.js +4 -0
  326. package/dist/socket/handlers.js.map +1 -0
  327. package/dist/trpc.d.ts.map +1 -1
  328. package/dist/trpc.js +4 -0
  329. package/dist/trpc.js.map +1 -0
  330. package/dist/types/trpc.d.ts.map +1 -1
  331. package/dist/types/trpc.js +4 -0
  332. package/dist/types/trpc.js.map +1 -0
  333. package/dist/utils/aiUser.d.ts +1 -3
  334. package/dist/utils/aiUser.d.ts.map +1 -1
  335. package/dist/utils/aiUser.js +8 -3
  336. package/dist/utils/aiUser.js.map +1 -0
  337. package/dist/utils/email.d.ts +12 -1
  338. package/dist/utils/email.d.ts.map +1 -1
  339. package/dist/utils/email.js +26 -4
  340. package/dist/utils/email.js.map +1 -0
  341. package/dist/utils/generateInviteCode.d.ts +1 -2
  342. package/dist/utils/generateInviteCode.d.ts.map +1 -1
  343. package/dist/utils/generateInviteCode.js +5 -2
  344. package/dist/utils/generateInviteCode.js.map +1 -0
  345. package/dist/utils/inference.d.ts +8 -0
  346. package/dist/utils/inference.d.ts.map +1 -1
  347. package/dist/utils/inference.js +78 -10
  348. package/dist/utils/inference.js.map +1 -0
  349. package/dist/utils/logger.d.ts +3 -0
  350. package/dist/utils/logger.d.ts.map +1 -1
  351. package/dist/utils/logger.js +8 -1
  352. package/dist/utils/logger.js.map +1 -0
  353. package/dist/utils/prismaErrorHandler.d.ts.map +1 -1
  354. package/dist/utils/prismaErrorHandler.js +7 -0
  355. package/dist/utils/prismaErrorHandler.js.map +1 -0
  356. package/dist/utils/prismaWrapper.d.ts +1 -0
  357. package/dist/utils/prismaWrapper.d.ts.map +1 -1
  358. package/dist/utils/prismaWrapper.js +8 -0
  359. package/dist/utils/prismaWrapper.js.map +1 -0
  360. package/docker-compose.yml +19 -0
  361. package/package.json +21 -4
  362. package/prisma/migrations/20251109122857_annuoncements_comments/migration.sql +30 -0
  363. package/prisma/migrations/20251109135555_reactions_announcements_comments/migration.sql +35 -0
  364. package/prisma/schema.prisma +180 -12
  365. package/scripts/test-pre-push.ts +14 -0
  366. package/src/index.ts +247 -52
  367. package/src/instrument.ts +15 -0
  368. package/src/lib/config/env.ts +132 -0
  369. package/src/lib/fileUpload.ts +13 -6
  370. package/src/lib/googleCloudStorage.ts +23 -6
  371. package/src/lib/jsonConversion.ts +12 -14
  372. package/src/lib/prisma.ts +23 -2
  373. package/src/lib/pusher.ts +11 -6
  374. package/src/lib/redis.ts +56 -0
  375. package/src/lib/thumbnailGenerator.ts +170 -168
  376. package/src/middleware/auth.ts +86 -137
  377. package/src/middleware/security.ts +80 -0
  378. package/src/models/agenda.ts +46 -0
  379. package/src/models/announcement.ts +134 -0
  380. package/src/models/assignment.ts +322 -0
  381. package/src/models/attendance.ts +208 -0
  382. package/src/models/auth.ts +247 -0
  383. package/src/models/class.ts +598 -0
  384. package/src/models/comment.ts +152 -0
  385. package/src/models/conversation.ts +200 -0
  386. package/src/models/event.ts +177 -0
  387. package/src/models/file.ts +129 -0
  388. package/src/models/folder.ts +225 -0
  389. package/src/models/labChat.ts +213 -0
  390. package/src/models/marketing.ts +45 -0
  391. package/src/models/message.ts +153 -0
  392. package/src/models/newtonChat.ts +70 -0
  393. package/src/models/notification.ts +54 -0
  394. package/src/models/section.ts +98 -0
  395. package/src/models/user.ts +47 -0
  396. package/src/models/worksheet.ts +294 -0
  397. package/src/pipelines/aiLabChat.ts +511 -0
  398. package/src/pipelines/aiNewtonChat.ts +347 -0
  399. package/src/pipelines/gradeWorksheet.ts +286 -0
  400. package/src/routers/_app.ts +6 -0
  401. package/src/routers/agenda.ts +3 -61
  402. package/src/routers/announcement.ts +616 -79
  403. package/src/routers/assignment.ts +148 -1827
  404. package/src/routers/attendance.ts +16 -277
  405. package/src/routers/auth.ts +79 -313
  406. package/src/routers/class.ts +265 -1038
  407. package/src/routers/comment.ts +76 -0
  408. package/src/routers/conversation.ts +53 -284
  409. package/src/routers/event.ts +50 -481
  410. package/src/routers/file.ts +45 -344
  411. package/src/routers/folder.ts +107 -836
  412. package/src/routers/labChat.ts +29 -969
  413. package/src/routers/marketing.ts +35 -77
  414. package/src/routers/message.ts +45 -571
  415. package/src/routers/newtonChat.ts +36 -0
  416. package/src/routers/notifications.ts +32 -82
  417. package/src/routers/section.ts +58 -322
  418. package/src/routers/user.ts +49 -226
  419. package/src/routers/worksheet.ts +252 -0
  420. package/src/seedDatabase.ts +328 -289
  421. package/src/services/agenda.ts +21 -0
  422. package/src/services/announcement.ts +290 -0
  423. package/src/services/assignment.ts +1198 -0
  424. package/src/services/attendance.ts +85 -0
  425. package/src/services/auth.ts +277 -0
  426. package/src/services/class.ts +622 -0
  427. package/src/services/comment.ts +106 -0
  428. package/src/services/conversation.ts +213 -0
  429. package/src/services/event.ts +231 -0
  430. package/src/services/file.ts +167 -0
  431. package/src/services/folder.ts +316 -0
  432. package/src/services/labChat.ts +352 -0
  433. package/src/services/marketing.ts +57 -0
  434. package/src/services/message.ts +461 -0
  435. package/src/services/newtonChat.ts +222 -0
  436. package/src/services/notification.ts +50 -0
  437. package/src/services/section.ts +283 -0
  438. package/src/services/user.ts +172 -0
  439. package/src/services/worksheet.ts +358 -0
  440. package/src/trpc.ts +4 -0
  441. package/src/utils/aiUser.ts +4 -3
  442. package/src/utils/email.ts +33 -4
  443. package/src/utils/generateInviteCode.ts +1 -3
  444. package/src/utils/inference.ts +89 -10
  445. package/src/utils/logger.ts +4 -1
  446. package/src/utils/prismaErrorHandler.ts +3 -0
  447. package/src/utils/prismaWrapper.ts +4 -0
  448. package/tests/globalSetup.ts +62 -0
  449. package/tests/helpers.ts +22 -0
  450. package/tests/middleware/security.test.ts +42 -0
  451. package/tests/routers/agenda.test.ts +138 -0
  452. package/tests/routers/announcement.test.ts +490 -0
  453. package/tests/routers/assignment.test.ts +837 -0
  454. package/tests/routers/attendance.test.ts +160 -0
  455. package/tests/routers/auth.test.ts +171 -0
  456. package/tests/{class.test.ts → routers/class.test.ts} +163 -92
  457. package/tests/routers/comment.test.ts +126 -0
  458. package/tests/routers/conversation.test.ts +145 -0
  459. package/tests/routers/event.test.ts +289 -0
  460. package/tests/routers/folder.test.ts +178 -0
  461. package/tests/routers/labChat.test.ts +115 -0
  462. package/tests/routers/marketing.test.ts +59 -0
  463. package/tests/routers/message.test.ts +123 -0
  464. package/tests/routers/notification.test.ts +69 -0
  465. package/tests/routers/section.test.ts +208 -0
  466. package/tests/server/rateLimit.test.ts +73 -0
  467. package/tests/setup.ts +39 -59
  468. package/tests/user.test.ts +136 -0
  469. package/tests/utils/aiUser.test.ts +22 -0
  470. package/tests/utils/generateInviteCode.test.ts +24 -0
  471. package/tests/utils/logger.test.ts +74 -0
  472. package/tests/utils/prismaErrorHandler.test.ts +101 -0
  473. package/tests/utils/prismaWrapper.test.ts +82 -0
  474. package/tests/worksheet.test.ts +181 -0
  475. package/tsconfig.json +9 -2
  476. package/vitest.config.ts +30 -1
  477. package/vitest.unit.config.ts +21 -0
  478. package/API_SPECIFICATION.md +0 -1597
  479. package/BASE64_REMOVAL_SUMMARY.md +0 -164
  480. package/CHAT_API_SPEC.md +0 -579
  481. package/LAB_CHAT_API_SPEC.md +0 -518
  482. package/dist/routers/school.d.ts +0 -208
  483. package/dist/routers/school.d.ts.map +0 -1
  484. package/dist/routers/school.js +0 -481
  485. package/src/lib/notificationHandler.ts +0 -36
  486. package/tests/auth.test.ts +0 -25
@@ -0,0 +1,30 @@
1
+ -- AlterTable
2
+ ALTER TABLE "public"."Announcement" ADD COLUMN "modifiedAt" TIMESTAMP(3);
3
+
4
+ -- AlterTable
5
+ ALTER TABLE "public"."File" ADD COLUMN "announcementId" TEXT;
6
+
7
+ -- CreateTable
8
+ CREATE TABLE "public"."AnnouncementComment" (
9
+ "id" TEXT NOT NULL,
10
+ "content" TEXT NOT NULL,
11
+ "authorId" TEXT NOT NULL,
12
+ "announcementId" TEXT NOT NULL,
13
+ "parentCommentId" TEXT,
14
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
15
+ "modifiedAt" TIMESTAMP(3),
16
+
17
+ CONSTRAINT "AnnouncementComment_pkey" PRIMARY KEY ("id")
18
+ );
19
+
20
+ -- AddForeignKey
21
+ ALTER TABLE "public"."File" ADD CONSTRAINT "File_announcementId_fkey" FOREIGN KEY ("announcementId") REFERENCES "public"."Announcement"("id") ON DELETE CASCADE ON UPDATE CASCADE;
22
+
23
+ -- AddForeignKey
24
+ ALTER TABLE "public"."AnnouncementComment" ADD CONSTRAINT "AnnouncementComment_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "public"."User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
25
+
26
+ -- AddForeignKey
27
+ ALTER TABLE "public"."AnnouncementComment" ADD CONSTRAINT "AnnouncementComment_announcementId_fkey" FOREIGN KEY ("announcementId") REFERENCES "public"."Announcement"("id") ON DELETE CASCADE ON UPDATE CASCADE;
28
+
29
+ -- AddForeignKey
30
+ ALTER TABLE "public"."AnnouncementComment" ADD CONSTRAINT "AnnouncementComment_parentCommentId_fkey" FOREIGN KEY ("parentCommentId") REFERENCES "public"."AnnouncementComment"("id") ON DELETE CASCADE ON UPDATE CASCADE;
@@ -0,0 +1,35 @@
1
+ -- CreateEnum
2
+ CREATE TYPE "public"."ReactionType" AS ENUM ('THUMBSUP', 'CELEBRATE', 'CARE', 'HEART', 'IDEA', 'HAPPY');
3
+
4
+ -- CreateTable
5
+ CREATE TABLE "public"."Reaction" (
6
+ "id" TEXT NOT NULL,
7
+ "type" "public"."ReactionType" NOT NULL,
8
+ "userId" TEXT NOT NULL,
9
+ "announcementId" TEXT,
10
+ "commentId" TEXT,
11
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
12
+
13
+ CONSTRAINT "Reaction_pkey" PRIMARY KEY ("id")
14
+ );
15
+
16
+ -- CreateIndex
17
+ CREATE INDEX "Reaction_announcementId_idx" ON "public"."Reaction"("announcementId");
18
+
19
+ -- CreateIndex
20
+ CREATE INDEX "Reaction_commentId_idx" ON "public"."Reaction"("commentId");
21
+
22
+ -- CreateIndex
23
+ CREATE UNIQUE INDEX "Reaction_userId_announcementId_key" ON "public"."Reaction"("userId", "announcementId");
24
+
25
+ -- CreateIndex
26
+ CREATE UNIQUE INDEX "Reaction_userId_commentId_key" ON "public"."Reaction"("userId", "commentId");
27
+
28
+ -- AddForeignKey
29
+ ALTER TABLE "public"."Reaction" ADD CONSTRAINT "Reaction_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
30
+
31
+ -- AddForeignKey
32
+ ALTER TABLE "public"."Reaction" ADD CONSTRAINT "Reaction_announcementId_fkey" FOREIGN KEY ("announcementId") REFERENCES "public"."Announcement"("id") ON DELETE CASCADE ON UPDATE CASCADE;
33
+
34
+ -- AddForeignKey
35
+ ALTER TABLE "public"."Reaction" ADD CONSTRAINT "Reaction_commentId_fkey" FOREIGN KEY ("commentId") REFERENCES "public"."AnnouncementComment"("id") ON DELETE CASCADE ON UPDATE CASCADE;
@@ -9,6 +9,11 @@ generator client {
9
9
  // output = "../generated/prisma"
10
10
  }
11
11
 
12
+ // @todo: add type safety to json fields.
13
+ // generator json {
14
+ // provider = "prisma-json-types-generator"
15
+ // }
16
+
12
17
  datasource db {
13
18
  provider = "postgresql"
14
19
  url = env("DATABASE_URL")
@@ -42,6 +47,33 @@ enum UploadStatus {
42
47
  CANCELLED
43
48
  }
44
49
 
50
+ enum GenerationStatus {
51
+ NOT_STARTED
52
+ PENDING
53
+ GENERATING
54
+ COMPLETED
55
+ FAILED
56
+ CANCELLED
57
+ }
58
+
59
+ enum WorksheetQuestionType {
60
+ MULTIPLE_CHOICE
61
+ TRUE_FALSE
62
+ SHORT_ANSWER
63
+ LONG_ANSWER
64
+ MATH_EXPRESSION
65
+ ESSAY
66
+ }
67
+
68
+ enum ReactionType {
69
+ THUMBSUP
70
+ CELEBRATE
71
+ CARE
72
+ HEART
73
+ IDEA
74
+ HAPPY
75
+ }
76
+
45
77
  model School {
46
78
  id String @id @default(uuid())
47
79
  name String
@@ -63,8 +95,6 @@ model User {
63
95
  verified Boolean @default(false)
64
96
  role UserRole @default(NONE)
65
97
 
66
- profileId String? @unique
67
-
68
98
  teacherIn Class[] @relation("UserTeacherToClass")
69
99
  studentIn Class[] @relation("UserStudentToClass")
70
100
 
@@ -72,10 +102,13 @@ model User {
72
102
  sessions Session[]
73
103
  files File[]
74
104
  assignments Assignment[]
105
+ specificAssignments Assignment[] @relation("SpecificAssignmentAssignedTo")
75
106
  events Event[]
76
107
  announcements Announcement[]
77
108
  notificationsSent Notification[] @relation("SentNotifications")
78
109
  notificationsReceived Notification[] @relation("ReceivedNotifications")
110
+ studentQuestionProgress StudentQuestionProgress[]
111
+ studentWorksheetResponses StudentWorksheetResponse[]
79
112
 
80
113
  presentAttendance Attendance[] @relation("PresentAttendance")
81
114
  lateAttendance Attendance[] @relation("LateAttendance")
@@ -89,6 +122,8 @@ model User {
89
122
  sentMessages Message[] @relation("SentMessages")
90
123
  mentions Mention[] @relation("UserMentions")
91
124
  createdLabChats LabChat[] @relation("CreatedLabChats")
125
+ comments Comment[]
126
+ reactions Reaction[]
92
127
 
93
128
  }
94
129
 
@@ -121,14 +156,16 @@ model Class {
121
156
  events Event[]
122
157
  sections Section[]
123
158
  sessions Session[]
159
+ worksheets Worksheet[]
124
160
  students User[] @relation("UserStudentToClass")
125
161
  teachers User[] @relation("UserTeacherToClass")
126
- markSchemes MarkScheme[] @relation("ClassToMarkScheme")
127
- gradingBoundaries GradingBoundary[] @relation("ClassToGradingBoundary")
162
+ // markSchemes MarkScheme[] @relation("ClassToMarkScheme")
163
+ // gradingBoundaries GradingBoundary[] @relation("ClassToGradingBoundary")
128
164
  draftFiles File[] @relation("ClassDraftFiles")
129
165
  classFiles Folder? @relation("ClassFiles")
130
166
  labChats LabChat[] @relation("ClassLabChats")
131
-
167
+ markSchemes MarkScheme[]
168
+ gradingBoundaries GradingBoundary[]
132
169
  school School? @relation(fields: [schoolId], references: [id])
133
170
  schoolId String?
134
171
  }
@@ -136,7 +173,8 @@ model Class {
136
173
  model MarkScheme {
137
174
  id String @id @default(uuid())
138
175
  classId String
139
- class Class[] @relation("ClassToMarkScheme")
176
+ // class Class[] @relation("ClassToMarkScheme")
177
+ class Class? @relation(fields: [classId], references: [id], onDelete: Cascade)
140
178
  structured String
141
179
  assignments Assignment[]
142
180
  }
@@ -144,7 +182,8 @@ model MarkScheme {
144
182
  model GradingBoundary {
145
183
  id String @id @default(uuid())
146
184
  classId String
147
- class Class[] @relation("ClassToGradingBoundary")
185
+ // class Class[] @relation("ClassToGradingBoundary")
186
+ class Class? @relation(fields: [classId], references: [id], onDelete: Cascade)
148
187
  structured String
149
188
  assignments Assignment[]
150
189
  }
@@ -207,6 +246,9 @@ model File {
207
246
  messageId String?
208
247
  message Message? @relation("MessageAttachments", fields: [messageId], references: [id], onDelete: Cascade)
209
248
 
249
+ announcement Announcement? @relation("AnnouncementAttachments", fields: [announcementId], references: [id], onDelete: Cascade)
250
+ announcementId String?
251
+
210
252
  schools School[]
211
253
 
212
254
  schoolDevelopementProgram SchoolDevelopementProgram? @relation("SchoolDevelopementProgramSupportingDocumentation", fields: [schoolDevelopementProgramId], references: [id], onDelete: Cascade)
@@ -225,7 +267,15 @@ model Assignment {
225
267
  class Class @relation(fields: [classId], references: [id], onDelete: Cascade)
226
268
  classId String
227
269
  attachments File[]
270
+ acceptFiles Boolean @default(false)
271
+ acceptExtendedResponse Boolean @default(false)
272
+ acceptWorksheet Boolean @default(false)
273
+ gradeWithAI Boolean @default(false)
274
+
275
+ aiPolicyLevel Int @default(0)
276
+
228
277
  submissions Submission[]
278
+ assignedTo User[] @relation("SpecificAssignmentAssignedTo")
229
279
  section Section? @relation(fields: [sectionId], references: [id], onDelete: Cascade)
230
280
  sectionId String?
231
281
  graded Boolean @default(false)
@@ -241,6 +291,7 @@ model Assignment {
241
291
  order Int?
242
292
  gradingBoundary GradingBoundary? @relation(fields: [gradingBoundaryId], references: [id], onDelete: Cascade)
243
293
  gradingBoundaryId String?
294
+ worksheets Worksheet[] @relation("AssignmentWorksheets")
244
295
  }
245
296
 
246
297
 
@@ -251,8 +302,47 @@ model Announcement {
251
302
  teacher User @relation(fields: [teacherId], references: [id])
252
303
  teacherId String
253
304
  createdAt DateTime @default(now())
305
+ modifiedAt DateTime? @updatedAt
254
306
  class Class @relation(fields: [classId], references: [id], onDelete: Cascade)
255
307
  classId String
308
+ attachments File[] @relation("AnnouncementAttachments")
309
+ comments Comment[]
310
+ reactions Reaction[]
311
+ }
312
+
313
+ model Comment {
314
+ id String @id @default(uuid())
315
+ content String
316
+ author User @relation(fields: [authorId], references: [id], onDelete: Cascade)
317
+ authorId String
318
+ announcement Announcement? @relation(fields: [announcementId], references: [id], onDelete: Cascade)
319
+ announcementId String?
320
+ parentComment Comment? @relation("CommentReplies", fields: [parentCommentId], references: [id], onDelete: Cascade)
321
+ parentCommentId String?
322
+ status GenerationStatus?
323
+ replies Comment[] @relation("CommentReplies")
324
+ reactions Reaction[]
325
+ createdAt DateTime @default(now())
326
+ modifiedAt DateTime? @updatedAt
327
+ studentQuestionProgress StudentQuestionProgress? @relation("StudentQuestionProgressComments", fields: [studentQuestionProgressId], references: [id], onDelete: Cascade)
328
+ studentQuestionProgressId String?
329
+ }
330
+
331
+ model Reaction {
332
+ id String @id @default(uuid())
333
+ type ReactionType
334
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
335
+ userId String
336
+ announcement Announcement? @relation(fields: [announcementId], references: [id], onDelete: Cascade)
337
+ announcementId String?
338
+ comment Comment? @relation(fields: [commentId], references: [id], onDelete: Cascade)
339
+ commentId String?
340
+ createdAt DateTime @default(now())
341
+
342
+ @@unique([userId, announcementId])
343
+ @@unique([userId, commentId])
344
+ @@index([announcementId])
345
+ @@index([commentId])
256
346
  }
257
347
 
258
348
  model Submission {
@@ -268,7 +358,8 @@ model Submission {
268
358
 
269
359
  attachments File[] @relation("SubmissionFile")
270
360
  annotations File[] @relation("SubmissionAnnotations")
271
-
361
+ worksheetResponses StudentWorksheetResponse[]
362
+ extendedResponse String?
272
363
  gradeReceived Int?
273
364
 
274
365
  rubricState String?
@@ -277,6 +368,18 @@ model Submission {
277
368
  submittedAt DateTime?
278
369
  submitted Boolean? @default(false)
279
370
  returned Boolean? @default(false)
371
+ newtonTutors NewtonChat[]
372
+ }
373
+
374
+ model NewtonChat {
375
+ id String @id @default(uuid())
376
+ submissionId String
377
+ submission Submission @relation(fields: [submissionId], references: [id], onDelete: Cascade)
378
+ conversationId String @unique
379
+ conversation Conversation @relation(fields: [conversationId], references: [id], onDelete: Cascade)
380
+ createdAt DateTime @default(now())
381
+ updatedAt DateTime @updatedAt
382
+ title String @default("Session with Newton Tutor")
280
383
  }
281
384
 
282
385
  model Section {
@@ -364,6 +467,7 @@ model Conversation {
364
467
  members ConversationMember[]
365
468
  messages Message[]
366
469
  labChat LabChat?
470
+ newtonChat NewtonChat?
367
471
  }
368
472
 
369
473
  model LabChat {
@@ -374,8 +478,7 @@ model LabChat {
374
478
  conversationId String @unique
375
479
  createdById String // Teacher who created the lab
376
480
  createdAt DateTime @default(now())
377
- updatedAt DateTime @updatedAt
378
-
481
+ updatedAt DateTime @updatedAt
379
482
  class Class @relation("ClassLabChats", fields: [classId], references: [id], onDelete: Cascade)
380
483
  conversation Conversation @relation(fields: [conversationId], references: [id], onDelete: Cascade)
381
484
  createdBy User @relation("CreatedLabChats", fields: [createdById], references: [id], onDelete: NoAction)
@@ -402,11 +505,13 @@ model Message {
402
505
  senderId String
403
506
  conversationId String
404
507
  createdAt DateTime @default(now())
405
-
508
+ status GenerationStatus? @default(NOT_STARTED)
406
509
  sender User @relation("SentMessages", fields: [senderId], references: [id], onDelete: Cascade)
407
510
  conversation Conversation @relation(fields: [conversationId], references: [id], onDelete: Cascade)
408
511
  mentions Mention[]
409
512
  attachments File[] @relation("MessageAttachments")
513
+
514
+ meta Json? @default("{}")
410
515
  }
411
516
 
412
517
  model Mention {
@@ -421,6 +526,69 @@ model Mention {
421
526
  @@unique([messageId, userId])
422
527
  }
423
528
 
529
+ model Worksheet {
530
+ id String @id @default(uuid())
531
+ name String
532
+ createdAt DateTime @default(now())
533
+ updatedAt DateTime @updatedAt
534
+ classId String
535
+ class Class? @relation(fields: [classId], references: [id], onDelete: Cascade)
536
+ assignments Assignment[] @relation("AssignmentWorksheets")
537
+ questions WorksheetQuestion[]
538
+ studentWorksheetResponses StudentWorksheetResponse[]
539
+ }
540
+
541
+ model WorksheetQuestion {
542
+ id String @id @default(uuid())
543
+ worksheetId String
544
+ worksheet Worksheet @relation(fields: [worksheetId], references: [id], onDelete: Cascade)
545
+ type WorksheetQuestionType
546
+ question String
547
+ answer String
548
+ options Json? @default("{}")
549
+ markScheme Json? @default("{}")
550
+ points Int @default(0)
551
+ order Int? @default(0)
552
+ createdAt DateTime @default(now())
553
+ updatedAt DateTime @updatedAt
554
+ studentResponses StudentQuestionProgress[]
555
+ }
556
+
557
+ model StudentWorksheetResponse {
558
+ id String @id @default(uuid())
559
+ studentId String
560
+ student User @relation(fields: [studentId], references: [id], onDelete: Cascade)
561
+ worksheetId String
562
+ worksheet Worksheet @relation(fields: [worksheetId], references: [id], onDelete: Cascade)
563
+ responses StudentQuestionProgress[]
564
+ submission Submission? @relation(fields: [submissionId], references: [id], onDelete: Cascade)
565
+ submissionId String?
566
+ createdAt DateTime @default(now())
567
+ updatedAt DateTime @updatedAt
568
+ submittedAt DateTime?
569
+ submitted Boolean @default(false)
570
+ }
571
+
572
+ model StudentQuestionProgress {
573
+ id String @id @default(uuid())
574
+ studentId String
575
+ student User @relation(fields: [studentId], references: [id], onDelete: Cascade)
576
+ questionId String
577
+ question WorksheetQuestion @relation(fields: [questionId], references: [id], onDelete: Cascade)
578
+ response String
579
+ isCorrect Boolean @default(false)
580
+ markschemeState Json? @default("{}")
581
+ points Int @default(0)
582
+ comments Comment[] @relation("StudentQuestionProgressComments")
583
+ feedback String?
584
+ createdAt DateTime @default(now())
585
+ updatedAt DateTime? @updatedAt
586
+ studentWorksheetResponseId String?
587
+ studentWorksheetResponse StudentWorksheetResponse? @relation(fields: [studentWorksheetResponseId], references: [id], onDelete: Cascade)
588
+ status GenerationStatus? @default(NOT_STARTED)
589
+
590
+ @@index([studentId, questionId])
591
+ }
424
592
 
425
593
  model SchoolDevelopementProgram {
426
594
  id String @id
@@ -443,7 +611,7 @@ model SchoolDevelopementProgram {
443
611
  submittedAt DateTime? @default(now())
444
612
  reviewedAt DateTime?
445
613
 
446
- status String @default("PENDING") // PENDING, APPROVED, REJECTED, REFERRED
614
+ status String @default("NOT_STARTED") // NOT_STARTED, PENDING, APPROVED, REJECTED, REFERRED
447
615
 
448
616
  supportingDocumentation File[] @relation("SchoolDevelopementProgramSupportingDocumentation")
449
617
  }
@@ -0,0 +1,14 @@
1
+ import { execSync } from 'child_process';
2
+ import { logger } from '../src/utils/logger';
3
+ import dotenv from 'dotenv';
4
+ import { resolve } from 'path';
5
+
6
+ dotenv.config({ path: resolve(process.cwd(), '.env.test') });
7
+
8
+ logger.info("Syncing Prisma schema to test database...");
9
+
10
+ execSync("npx prisma db push --force-reset --skip-generate", {
11
+ stdio: 'inherit',
12
+ });
13
+
14
+ logger.info("Test database is ready!");