@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
@@ -8,6 +8,21 @@ export async function clearDatabase() {
8
8
  logger.info('Clearing database');
9
9
  await prisma.notification.deleteMany();
10
10
 
11
+ // Delete worksheet-related records
12
+ await prisma.studentQuestionProgress.deleteMany();
13
+ await prisma.studentWorksheetResponse.deleteMany();
14
+ await prisma.worksheetQuestion.deleteMany();
15
+ await prisma.worksheet.deleteMany();
16
+
17
+ // Delete reactions (they reference announcements and comments)
18
+ await prisma.reaction.deleteMany();
19
+
20
+ // Delete comments (they reference announcements and users)
21
+ await prisma.comment.deleteMany();
22
+
23
+ // Delete NewtonChat (they reference submissions and conversations)
24
+ await prisma.newtonChat.deleteMany();
25
+
11
26
  // Delete chat-related records
12
27
  await prisma.mention.deleteMany();
13
28
  await prisma.message.deleteMany();
@@ -39,10 +54,19 @@ export async function clearDatabase() {
39
54
  // Delete schools (which reference files for logos) - this will cascade delete the file references
40
55
  await prisma.school.deleteMany();
41
56
 
57
+ // Delete marketing-related records
58
+ await prisma.schoolDevelopementProgram.deleteMany();
59
+ await prisma.earlyAccessRequest.deleteMany();
60
+
42
61
  // Finally delete all files
43
62
  await prisma.file.deleteMany();
44
63
  }
45
64
 
65
+ // Helper function to generate DiceBear avatar URL
66
+ function getDiceBearAvatar(seed: string): string {
67
+ return `https://api.dicebear.com/7.x/avataaars/svg?seed=${encodeURIComponent(seed)}`;
68
+ }
69
+
46
70
  export async function createUser(email: string, password: string, username: string) {
47
71
  logger.debug("Creating user", { email, username, password });
48
72
 
@@ -109,7 +133,7 @@ export const seedDatabase = async () => {
109
133
  createUser('charlotte.walker@student.riverside.edu', 'student123', 'charlotte.walker'),
110
134
  ]);
111
135
 
112
- // 4. Create User Profiles
136
+ // 4. Create User Profiles with DiceBear avatars
113
137
  await Promise.all([
114
138
  prisma.userProfile.create({
115
139
  data: {
@@ -118,6 +142,7 @@ export const seedDatabase = async () => {
118
142
  bio: 'Biology teacher with 15 years of experience. Passionate about making science accessible to all students.',
119
143
  location: 'Riverside, CA',
120
144
  website: 'https://sarahjohnson-bio.com',
145
+ profilePicture: getDiceBearAvatar(teachers[0].username),
121
146
  }
122
147
  }),
123
148
  prisma.userProfile.create({
@@ -126,6 +151,7 @@ export const seedDatabase = async () => {
126
151
  displayName: 'Mr. Michael Chen',
127
152
  bio: 'Mathematics teacher and department head. Specializes in AP Calculus and Statistics.',
128
153
  location: 'Riverside, CA',
154
+ profilePicture: getDiceBearAvatar(teachers[1].username),
129
155
  }
130
156
  }),
131
157
  prisma.userProfile.create({
@@ -134,18 +160,24 @@ export const seedDatabase = async () => {
134
160
  displayName: 'Ms. Emma Davis',
135
161
  bio: 'English Literature teacher. Loves fostering creative writing and critical thinking.',
136
162
  location: 'Riverside, CA',
163
+ profilePicture: getDiceBearAvatar(teachers[2].username),
137
164
  }
138
165
  }),
139
166
  ]);
140
167
 
141
- // Add profiles for some students
142
- await Promise.all(students.slice(0, 6).map((student, index) => {
143
- const names = ['Alex Martinez', 'Sophia Williams', 'James Brown', 'Olivia Taylor', 'Ethan Anderson', 'Ava Thomas'];
168
+ // Add profiles for all students with DiceBear avatars
169
+ await Promise.all(students.map((student, index) => {
170
+ const names = [
171
+ 'Alex Martinez', 'Sophia Williams', 'James Brown', 'Olivia Taylor',
172
+ 'Ethan Anderson', 'Ava Thomas', 'Noah Jackson', 'Isabella White',
173
+ 'Liam Harris', 'Mia Clark', 'Lucas Lewis', 'Charlotte Walker'
174
+ ];
144
175
  return prisma.userProfile.create({
145
176
  data: {
146
177
  userId: student.id,
147
- displayName: names[index],
148
- bio: `Grade 11 student at Riverside High School.`,
178
+ displayName: names[index] || student.username,
179
+ bio: index < 6 ? `Grade 11 student at Riverside High School.` : undefined,
180
+ profilePicture: getDiceBearAvatar(student.username),
149
181
  }
150
182
  });
151
183
  }));
@@ -883,10 +915,29 @@ export const seedDatabase = async () => {
883
915
  }
884
916
  }
885
917
 
886
- // Create all submissions
887
- await Promise.all(submissionsToCreate.map(submission =>
888
- prisma.submission.create({ data: submission })
889
- ));
918
+ // Create all submissions in batches to avoid connection pool exhaustion
919
+ const BATCH_SIZE = 15; // Create 15 at a time to avoid overwhelming Supabase connection pool
920
+
921
+ logger.info(`Creating ${submissionsToCreate.length} submissions in batches of ${BATCH_SIZE}`);
922
+
923
+ for (let i = 0; i < submissionsToCreate.length; i += BATCH_SIZE) {
924
+ const batch = submissionsToCreate.slice(i, i + BATCH_SIZE);
925
+ await Promise.all(batch.map(submission =>
926
+ prisma.submission.create({ data: submission })
927
+ ));
928
+
929
+ // Small delay between batches to avoid overwhelming the connection pool
930
+ if (i + BATCH_SIZE < submissionsToCreate.length) {
931
+ await new Promise(resolve => setTimeout(resolve, 100)); // 100ms delay
932
+ }
933
+
934
+ // Log progress every 30 submissions or at the end
935
+ if ((i + BATCH_SIZE) % 30 === 0 || i + BATCH_SIZE >= submissionsToCreate.length) {
936
+ logger.info(`Created ${Math.min(i + BATCH_SIZE, submissionsToCreate.length)}/${submissionsToCreate.length} submissions`);
937
+ }
938
+ }
939
+
940
+ logger.info(`Successfully created all ${submissionsToCreate.length} submissions`);
890
941
 
891
942
  // 11. Create announcements
892
943
  await Promise.all([
@@ -923,290 +974,262 @@ export const seedDatabase = async () => {
923
974
  const oct10 = new Date('2025-10-10T08:00:00');
924
975
  const oct11 = new Date('2025-10-11T08:00:00');
925
976
 
926
- await Promise.all([
977
+ // Build events array first, then batch create them
978
+ const eventsToCreate = [
927
979
  // Monday Oct 7 - Michael Chen's busy day
928
- prisma.event.create({
929
- data: {
930
- name: 'AP Calculus BC - Period 2',
931
- startTime: new Date('2025-10-07T09:15:00'),
932
- endTime: new Date('2025-10-07T10:05:00'),
933
- location: 'Room 156',
934
- remarks: 'Derivatives unit test review',
935
- userId: teachers[1].id,
936
- classId: mathClass.id,
937
- color: '#3B82F6',
938
- }
939
- }),
940
- prisma.event.create({
941
- data: {
942
- name: 'Department Head Meeting',
943
- startTime: new Date('2025-10-07T10:30:00'),
944
- endTime: new Date('2025-10-07T11:30:00'),
945
- location: 'Conference Room A',
946
- remarks: 'Monthly math department meeting - curriculum planning',
947
- userId: teachers[1].id,
948
- color: '#8B5CF6',
949
- }
950
- }),
951
- prisma.event.create({
952
- data: {
953
- name: 'AP Statistics - Period 5',
954
- startTime: new Date('2025-10-07T13:45:00'),
955
- endTime: new Date('2025-10-07T14:35:00'),
956
- location: 'Room 156',
957
- remarks: 'Hypothesis testing introduction',
958
- userId: teachers[1].id,
959
- color: '#3B82F6',
960
- }
961
- }),
962
- prisma.event.create({
963
- data: {
964
- name: 'Parent Conference - Williams Family',
965
- startTime: new Date('2025-10-07T15:00:00'),
966
- endTime: new Date('2025-10-07T15:30:00'),
967
- location: 'Room 156',
968
- remarks: 'Discuss Sophia\'s progress in AP Calculus',
969
- userId: teachers[1].id,
970
- color: '#F59E0B',
971
- }
972
- }),
973
- prisma.event.create({
974
- data: {
975
- name: 'Math Tutoring Session',
976
- startTime: new Date('2025-10-07T15:45:00'),
977
- endTime: new Date('2025-10-07T16:45:00'),
978
- location: 'Room 156',
979
- remarks: 'Extra help for struggling students',
980
- userId: teachers[1].id,
981
- color: '#10B981',
982
- }
983
- }),
980
+ {
981
+ name: 'AP Calculus BC - Period 2',
982
+ startTime: new Date('2025-10-07T09:15:00'),
983
+ endTime: new Date('2025-10-07T10:05:00'),
984
+ location: 'Room 156',
985
+ remarks: 'Derivatives unit test review',
986
+ userId: teachers[1].id,
987
+ classId: mathClass.id,
988
+ color: '#3B82F6',
989
+ },
990
+ {
991
+ name: 'Department Head Meeting',
992
+ startTime: new Date('2025-10-07T10:30:00'),
993
+ endTime: new Date('2025-10-07T11:30:00'),
994
+ location: 'Conference Room A',
995
+ remarks: 'Monthly math department meeting - curriculum planning',
996
+ userId: teachers[1].id,
997
+ color: '#8B5CF6',
998
+ },
999
+ {
1000
+ name: 'AP Statistics - Period 5',
1001
+ startTime: new Date('2025-10-07T13:45:00'),
1002
+ endTime: new Date('2025-10-07T14:35:00'),
1003
+ location: 'Room 156',
1004
+ remarks: 'Hypothesis testing introduction',
1005
+ userId: teachers[1].id,
1006
+ color: '#3B82F6',
1007
+ },
1008
+ {
1009
+ name: 'Parent Conference - Williams Family',
1010
+ startTime: new Date('2025-10-07T15:00:00'),
1011
+ endTime: new Date('2025-10-07T15:30:00'),
1012
+ location: 'Room 156',
1013
+ remarks: 'Discuss Sophia\'s progress in AP Calculus',
1014
+ userId: teachers[1].id,
1015
+ color: '#F59E0B',
1016
+ },
1017
+ {
1018
+ name: 'Math Tutoring Session',
1019
+ startTime: new Date('2025-10-07T15:45:00'),
1020
+ endTime: new Date('2025-10-07T16:45:00'),
1021
+ location: 'Room 156',
1022
+ remarks: 'Extra help for struggling students',
1023
+ userId: teachers[1].id,
1024
+ color: '#10B981',
1025
+ },
984
1026
 
985
1027
  // Tuesday Oct 8
986
- prisma.event.create({
987
- data: {
988
- name: 'AP Calculus BC - Period 2',
989
- startTime: new Date('2025-10-08T09:15:00'),
990
- endTime: new Date('2025-10-08T10:05:00'),
991
- location: 'Room 156',
992
- remarks: 'Derivatives unit test',
993
- userId: teachers[1].id,
994
- classId: mathClass.id,
995
- color: '#3B82F6',
996
- }
997
- }),
998
- prisma.event.create({
999
- data: {
1000
- name: 'Faculty Meeting',
1001
- startTime: new Date('2025-10-08T12:00:00'),
1002
- endTime: new Date('2025-10-08T13:00:00'),
1003
- location: 'Main Auditorium',
1004
- remarks: 'All-school faculty meeting',
1005
- userId: teachers[1].id,
1006
- color: '#6B7280',
1007
- }
1008
- }),
1009
- prisma.event.create({
1010
- data: {
1011
- name: 'AP Statistics - Period 5',
1012
- startTime: new Date('2025-10-08T13:45:00'),
1013
- endTime: new Date('2025-10-08T14:35:00'),
1014
- location: 'Room 156',
1015
- remarks: 'Hypothesis testing practice problems',
1016
- userId: teachers[1].id,
1017
- color: '#3B82F6',
1018
- }
1019
- }),
1020
- prisma.event.create({
1021
- data: {
1022
- name: 'Grade Level Team Meeting',
1023
- startTime: new Date('2025-10-08T15:00:00'),
1024
- endTime: new Date('2025-10-08T16:00:00'),
1025
- location: 'Room 201',
1026
- remarks: '11th grade team coordination',
1027
- userId: teachers[1].id,
1028
- color: '#8B5CF6',
1029
- }
1030
- }),
1028
+ {
1029
+ name: 'AP Calculus BC - Period 2',
1030
+ startTime: new Date('2025-10-08T09:15:00'),
1031
+ endTime: new Date('2025-10-08T10:05:00'),
1032
+ location: 'Room 156',
1033
+ remarks: 'Derivatives unit test',
1034
+ userId: teachers[1].id,
1035
+ classId: mathClass.id,
1036
+ color: '#3B82F6',
1037
+ },
1038
+ {
1039
+ name: 'Faculty Meeting',
1040
+ startTime: new Date('2025-10-08T12:00:00'),
1041
+ endTime: new Date('2025-10-08T13:00:00'),
1042
+ location: 'Main Auditorium',
1043
+ remarks: 'All-school faculty meeting',
1044
+ userId: teachers[1].id,
1045
+ color: '#6B7280',
1046
+ },
1047
+ {
1048
+ name: 'AP Statistics - Period 5',
1049
+ startTime: new Date('2025-10-08T13:45:00'),
1050
+ endTime: new Date('2025-10-08T14:35:00'),
1051
+ location: 'Room 156',
1052
+ remarks: 'Hypothesis testing practice problems',
1053
+ userId: teachers[1].id,
1054
+ color: '#3B82F6',
1055
+ },
1056
+ {
1057
+ name: 'Grade Level Team Meeting',
1058
+ startTime: new Date('2025-10-08T15:00:00'),
1059
+ endTime: new Date('2025-10-08T16:00:00'),
1060
+ location: 'Room 201',
1061
+ remarks: '11th grade team coordination',
1062
+ userId: teachers[1].id,
1063
+ color: '#8B5CF6',
1064
+ },
1031
1065
 
1032
1066
  // Wednesday Oct 9
1033
- prisma.event.create({
1034
- data: {
1035
- name: 'AP Calculus BC - Period 2',
1036
- startTime: new Date('2025-10-09T09:15:00'),
1037
- endTime: new Date('2025-10-09T10:05:00'),
1038
- location: 'Room 156',
1039
- remarks: 'Integration introduction',
1040
- userId: teachers[1].id,
1041
- classId: mathClass.id,
1042
- color: '#3B82F6',
1043
- }
1044
- }),
1045
- prisma.event.create({
1046
- data: {
1047
- name: 'Professional Development',
1048
- startTime: new Date('2025-10-09T11:00:00'),
1049
- endTime: new Date('2025-10-09T12:30:00'),
1050
- location: 'Library Conference Room',
1051
- remarks: 'Technology in Mathematics Education workshop',
1052
- userId: teachers[1].id,
1053
- color: '#059669',
1054
- }
1055
- }),
1056
- prisma.event.create({
1057
- data: {
1058
- name: 'AP Statistics - Period 5',
1059
- startTime: new Date('2025-10-09T13:45:00'),
1060
- endTime: new Date('2025-10-09T14:35:00'),
1061
- location: 'Room 156',
1062
- remarks: 'Chi-square tests',
1063
- userId: teachers[1].id,
1064
- color: '#3B82F6',
1065
- }
1066
- }),
1067
- prisma.event.create({
1068
- data: {
1069
- name: 'Student Council Advisory',
1070
- startTime: new Date('2025-10-09T15:00:00'),
1071
- endTime: new Date('2025-10-09T16:00:00'),
1072
- location: 'Room 105',
1073
- remarks: 'Advisor meeting for student council',
1074
- userId: teachers[1].id,
1075
- color: '#DC2626',
1076
- }
1077
- }),
1067
+ {
1068
+ name: 'AP Calculus BC - Period 2',
1069
+ startTime: new Date('2025-10-09T09:15:00'),
1070
+ endTime: new Date('2025-10-09T10:05:00'),
1071
+ location: 'Room 156',
1072
+ remarks: 'Integration introduction',
1073
+ userId: teachers[1].id,
1074
+ classId: mathClass.id,
1075
+ color: '#3B82F6',
1076
+ },
1077
+ {
1078
+ name: 'Professional Development',
1079
+ startTime: new Date('2025-10-09T11:00:00'),
1080
+ endTime: new Date('2025-10-09T12:30:00'),
1081
+ location: 'Library Conference Room',
1082
+ remarks: 'Technology in Mathematics Education workshop',
1083
+ userId: teachers[1].id,
1084
+ color: '#059669',
1085
+ },
1086
+ {
1087
+ name: 'AP Statistics - Period 5',
1088
+ startTime: new Date('2025-10-09T13:45:00'),
1089
+ endTime: new Date('2025-10-09T14:35:00'),
1090
+ location: 'Room 156',
1091
+ remarks: 'Chi-square tests',
1092
+ userId: teachers[1].id,
1093
+ color: '#3B82F6',
1094
+ },
1095
+ {
1096
+ name: 'Student Council Advisory',
1097
+ startTime: new Date('2025-10-09T15:00:00'),
1098
+ endTime: new Date('2025-10-09T16:00:00'),
1099
+ location: 'Room 105',
1100
+ remarks: 'Advisor meeting for student council',
1101
+ userId: teachers[1].id,
1102
+ color: '#DC2626',
1103
+ },
1078
1104
 
1079
1105
  // Thursday Oct 10
1080
- prisma.event.create({
1081
- data: {
1082
- name: 'AP Calculus BC - Period 2',
1083
- startTime: new Date('2025-10-10T09:15:00'),
1084
- endTime: new Date('2025-10-10T10:05:00'),
1085
- location: 'Room 156',
1086
- remarks: 'Integration by substitution',
1087
- userId: teachers[1].id,
1088
- classId: mathClass.id,
1089
- color: '#3B82F6',
1090
- }
1091
- }),
1092
- prisma.event.create({
1093
- data: {
1094
- name: 'Curriculum Committee',
1095
- startTime: new Date('2025-10-10T11:00:00'),
1096
- endTime: new Date('2025-10-10T12:00:00'),
1097
- location: 'Principal\'s Office',
1098
- remarks: 'Review new AP curriculum standards',
1099
- userId: teachers[1].id,
1100
- color: '#8B5CF6',
1101
- }
1102
- }),
1103
- prisma.event.create({
1104
- data: {
1105
- name: 'AP Statistics - Period 5',
1106
- startTime: new Date('2025-10-10T13:45:00'),
1107
- endTime: new Date('2025-10-10T14:35:00'),
1108
- location: 'Room 156',
1109
- remarks: 'ANOVA introduction',
1110
- userId: teachers[1].id,
1111
- color: '#3B82F6',
1112
- }
1113
- }),
1114
- prisma.event.create({
1115
- data: {
1116
- name: 'Parent Conference - Anderson Family',
1117
- startTime: new Date('2025-10-10T15:00:00'),
1118
- endTime: new Date('2025-10-10T15:30:00'),
1119
- location: 'Room 156',
1120
- remarks: 'Discuss Ethan\'s improvement strategies',
1121
- userId: teachers[1].id,
1122
- color: '#F59E0B',
1123
- }
1124
- }),
1125
- prisma.event.create({
1126
- data: {
1127
- name: 'Math Club Meeting',
1128
- startTime: new Date('2025-10-10T15:45:00'),
1129
- endTime: new Date('2025-10-10T16:45:00'),
1130
- location: 'Room 156',
1131
- remarks: 'Preparing for state math competition',
1132
- userId: teachers[1].id,
1133
- color: '#10B981',
1134
- }
1135
- }),
1106
+ {
1107
+ name: 'AP Calculus BC - Period 2',
1108
+ startTime: new Date('2025-10-10T09:15:00'),
1109
+ endTime: new Date('2025-10-10T10:05:00'),
1110
+ location: 'Room 156',
1111
+ remarks: 'Integration by substitution',
1112
+ userId: teachers[1].id,
1113
+ classId: mathClass.id,
1114
+ color: '#3B82F6',
1115
+ },
1116
+ {
1117
+ name: 'Curriculum Committee',
1118
+ startTime: new Date('2025-10-10T11:00:00'),
1119
+ endTime: new Date('2025-10-10T12:00:00'),
1120
+ location: 'Principal\'s Office',
1121
+ remarks: 'Review new AP curriculum standards',
1122
+ userId: teachers[1].id,
1123
+ color: '#8B5CF6',
1124
+ },
1125
+ {
1126
+ name: 'AP Statistics - Period 5',
1127
+ startTime: new Date('2025-10-10T13:45:00'),
1128
+ endTime: new Date('2025-10-10T14:35:00'),
1129
+ location: 'Room 156',
1130
+ remarks: 'ANOVA introduction',
1131
+ userId: teachers[1].id,
1132
+ color: '#3B82F6',
1133
+ },
1134
+ {
1135
+ name: 'Parent Conference - Anderson Family',
1136
+ startTime: new Date('2025-10-10T15:00:00'),
1137
+ endTime: new Date('2025-10-10T15:30:00'),
1138
+ location: 'Room 156',
1139
+ remarks: 'Discuss Ethan\'s improvement strategies',
1140
+ userId: teachers[1].id,
1141
+ color: '#F59E0B',
1142
+ },
1143
+ {
1144
+ name: 'Math Club Meeting',
1145
+ startTime: new Date('2025-10-10T15:45:00'),
1146
+ endTime: new Date('2025-10-10T16:45:00'),
1147
+ location: 'Room 156',
1148
+ remarks: 'Preparing for state math competition',
1149
+ userId: teachers[1].id,
1150
+ color: '#10B981',
1151
+ },
1136
1152
 
1137
1153
  // Friday Oct 11
1138
- prisma.event.create({
1139
- data: {
1140
- name: 'AP Calculus BC - Period 2',
1141
- startTime: new Date('2025-10-11T09:15:00'),
1142
- endTime: new Date('2025-10-11T10:05:00'),
1143
- location: 'Room 156',
1144
- remarks: 'Integration by parts',
1145
- userId: teachers[1].id,
1146
- classId: mathClass.id,
1147
- color: '#3B82F6',
1148
- }
1149
- }),
1150
- prisma.event.create({
1151
- data: {
1152
- name: 'IEP Meeting - Student Support',
1153
- startTime: new Date('2025-10-11T10:30:00'),
1154
- endTime: new Date('2025-10-11T11:30:00'),
1155
- location: 'Special Services Office',
1156
- remarks: 'Individualized Education Plan review',
1157
- userId: teachers[1].id,
1158
- color: '#F59E0B',
1159
- }
1160
- }),
1161
- prisma.event.create({
1162
- data: {
1163
- name: 'AP Statistics - Period 5',
1164
- startTime: new Date('2025-10-11T13:45:00'),
1165
- endTime: new Date('2025-10-11T14:35:00'),
1166
- location: 'Room 156',
1167
- remarks: 'ANOVA practice and review',
1168
- userId: teachers[1].id,
1169
- color: '#3B82F6',
1170
- }
1171
- }),
1172
- prisma.event.create({
1173
- data: {
1174
- name: 'Weekend Prep Session',
1175
- startTime: new Date('2025-10-11T15:00:00'),
1176
- endTime: new Date('2025-10-11T17:00:00'),
1177
- location: 'Room 156',
1178
- remarks: 'Voluntary AP exam prep session',
1179
- userId: teachers[1].id,
1180
- color: '#059669',
1181
- }
1182
- }),
1154
+ {
1155
+ name: 'AP Calculus BC - Period 2',
1156
+ startTime: new Date('2025-10-11T09:15:00'),
1157
+ endTime: new Date('2025-10-11T10:05:00'),
1158
+ location: 'Room 156',
1159
+ remarks: 'Integration by parts',
1160
+ userId: teachers[1].id,
1161
+ classId: mathClass.id,
1162
+ color: '#3B82F6',
1163
+ },
1164
+ {
1165
+ name: 'IEP Meeting - Student Support',
1166
+ startTime: new Date('2025-10-11T10:30:00'),
1167
+ endTime: new Date('2025-10-11T11:30:00'),
1168
+ location: 'Special Services Office',
1169
+ remarks: 'Individualized Education Plan review',
1170
+ userId: teachers[1].id,
1171
+ color: '#F59E0B',
1172
+ },
1173
+ {
1174
+ name: 'AP Statistics - Period 5',
1175
+ startTime: new Date('2025-10-11T13:45:00'),
1176
+ endTime: new Date('2025-10-11T14:35:00'),
1177
+ location: 'Room 156',
1178
+ remarks: 'ANOVA practice and review',
1179
+ userId: teachers[1].id,
1180
+ color: '#3B82F6',
1181
+ },
1182
+ {
1183
+ name: 'Weekend Prep Session',
1184
+ startTime: new Date('2025-10-11T15:00:00'),
1185
+ endTime: new Date('2025-10-11T17:00:00'),
1186
+ location: 'Room 156',
1187
+ remarks: 'Voluntary AP exam prep session',
1188
+ userId: teachers[1].id,
1189
+ color: '#059669',
1190
+ },
1183
1191
 
1184
1192
  // Some events for other teachers too
1185
- prisma.event.create({
1186
- data: {
1187
- name: 'Cell Biology Lab',
1188
- startTime: new Date(now.getTime() + 2 * 24 * 60 * 60 * 1000),
1189
- endTime: new Date(now.getTime() + 2 * 24 * 60 * 60 * 1000 + 90 * 60 * 1000), // 90 minutes
1190
- location: 'Science Lab Room 204',
1191
- remarks: 'Bring lab notebooks and safety goggles',
1192
- userId: teachers[0].id,
1193
- classId: biologyClass.id,
1194
- color: '#10B981',
1195
- }
1196
- }),
1197
- prisma.event.create({
1198
- data: {
1199
- name: 'Poetry Reading',
1200
- startTime: new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000),
1201
- endTime: new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000 + 60 * 60 * 1000),
1202
- location: 'Library',
1203
- remarks: 'Students will present their original poetry',
1204
- userId: teachers[2].id,
1205
- classId: englishClass.id,
1206
- color: '#8B5CF6',
1207
- }
1208
- }),
1209
- ]);
1193
+ {
1194
+ name: 'Cell Biology Lab',
1195
+ startTime: new Date(now.getTime() + 2 * 24 * 60 * 60 * 1000),
1196
+ endTime: new Date(now.getTime() + 2 * 24 * 60 * 60 * 1000 + 90 * 60 * 1000), // 90 minutes
1197
+ location: 'Science Lab Room 204',
1198
+ remarks: 'Bring lab notebooks and safety goggles',
1199
+ userId: teachers[0].id,
1200
+ classId: biologyClass.id,
1201
+ color: '#10B981',
1202
+ },
1203
+ {
1204
+ name: 'Poetry Reading',
1205
+ startTime: new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000),
1206
+ endTime: new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000 + 60 * 60 * 1000),
1207
+ location: 'Library',
1208
+ remarks: 'Students will present their original poetry',
1209
+ userId: teachers[2].id,
1210
+ classId: englishClass.id,
1211
+ color: '#8B5CF6',
1212
+ },
1213
+ ];
1214
+
1215
+ // Create events in batches to avoid connection pool exhaustion
1216
+ const EVENT_BATCH_SIZE = 10;
1217
+
1218
+ logger.info(`Creating ${eventsToCreate.length} events in batches of ${EVENT_BATCH_SIZE}`);
1219
+
1220
+ for (let i = 0; i < eventsToCreate.length; i += EVENT_BATCH_SIZE) {
1221
+ const batch = eventsToCreate.slice(i, i + EVENT_BATCH_SIZE);
1222
+ await Promise.all(batch.map(event =>
1223
+ prisma.event.create({ data: event })
1224
+ ));
1225
+
1226
+ // Small delay between batches
1227
+ if (i + EVENT_BATCH_SIZE < eventsToCreate.length) {
1228
+ await new Promise(resolve => setTimeout(resolve, 100));
1229
+ }
1230
+ }
1231
+
1232
+ logger.info(`Successfully created all ${eventsToCreate.length} events`);
1210
1233
 
1211
1234
  // 13. Create attendance records
1212
1235
  const attendanceDate = new Date(now.getTime() - 24 * 60 * 60 * 1000);
@@ -1511,10 +1534,19 @@ export const seedDatabase = async () => {
1511
1534
  },
1512
1535
  ];
1513
1536
 
1514
- // Create all messages
1515
- await Promise.all(chatMessages.map(message =>
1516
- prisma.message.create({ data: message })
1517
- ));
1537
+ // Create all messages in batches to avoid connection pool exhaustion
1538
+ const MESSAGE_BATCH_SIZE = 10;
1539
+
1540
+ logger.info(`Creating ${chatMessages.length} chat messages in batches of ${MESSAGE_BATCH_SIZE}`);
1541
+
1542
+ for (let i = 0; i < chatMessages.length; i += MESSAGE_BATCH_SIZE) {
1543
+ const batch = chatMessages.slice(i, i + MESSAGE_BATCH_SIZE);
1544
+ await Promise.all(batch.map(message =>
1545
+ prisma.message.create({ data: message })
1546
+ ));
1547
+ }
1548
+
1549
+ logger.info(`Successfully created all ${chatMessages.length} chat messages`);
1518
1550
 
1519
1551
  // 16. Create file structure for classes
1520
1552
  await Promise.all([
@@ -1573,8 +1605,15 @@ export const seedDatabase = async () => {
1573
1605
  logger.info(' Student: alex.martinez@student.riverside.edu / student123');
1574
1606
  };
1575
1607
 
1576
- (async () => {
1608
+ // Only run seedDatabase when executed directly (npm run seed)
1609
+ // Not when imported by other modules
1610
+ const isSeedScript = process.argv[1]?.includes('seedDatabase') ||
1611
+ process.argv.includes('seed');
1612
+
1613
+ if (isSeedScript) {
1614
+ (async () => {
1577
1615
  logger.info('Seeding database');
1578
1616
  await seedDatabase();
1579
1617
  logger.info('Database seeded');
1580
- })();
1618
+ })();
1619
+ }