@studious-lms/server 1.1.24 → 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 (485) 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 +82 -15
  23. package/dist/lib/fileUpload.js.map +1 -0
  24. package/dist/lib/googleCloudStorage.d.ts +13 -0
  25. package/dist/lib/googleCloudStorage.d.ts.map +1 -1
  26. package/dist/lib/googleCloudStorage.js +45 -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 +25 -0
  35. package/dist/lib/notificationHandler.d.ts.map +1 -0
  36. package/dist/lib/notificationHandler.js +32 -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 +6403 -3741
  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 +547 -57
  163. package/dist/routers/announcement.js.map +1 -0
  164. package/dist/routers/assignment.d.ts +431 -318
  165. package/dist/routers/assignment.d.ts.map +1 -1
  166. package/dist/routers/assignment.js +104 -1559
  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 -295
  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 -877
  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 +37 -6
  221. package/dist/routers/section.d.ts.map +1 -1
  222. package/dist/routers/section.js +26 -167
  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 +311 -289
  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 +4 -0
  350. package/dist/utils/logger.d.ts.map +1 -1
  351. package/dist/utils/logger.js +35 -3
  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 +81 -16
  370. package/src/lib/googleCloudStorage.ts +42 -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 +622 -57
  403. package/src/routers/assignment.ts +157 -1688
  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 -341
  411. package/src/routers/folder.ts +107 -836
  412. package/src/routers/labChat.ts +29 -960
  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 -200
  418. package/src/routers/user.ts +49 -226
  419. package/src/routers/worksheet.ts +252 -0
  420. package/src/seedDatabase.ts +330 -290
  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 +33 -3
  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 -65
  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/tests/auth.test.ts +0 -25
@@ -1,10 +1,24 @@
1
+
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="4e5c4562-c500-5409-8250-b98dc8416587")}catch(e){}}();
1
3
  import { prisma } from "./lib/prisma.js";
2
4
  import { hash } from "bcryptjs";
3
5
  import { logger } from "./utils/logger.js";
4
6
  export async function clearDatabase() {
5
7
  // Delete in order to respect foreign key constraints
6
8
  // Delete notifications first (they reference users)
9
+ logger.info('Clearing database');
7
10
  await prisma.notification.deleteMany();
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
+ // Delete reactions (they reference announcements and comments)
17
+ await prisma.reaction.deleteMany();
18
+ // Delete comments (they reference announcements and users)
19
+ await prisma.comment.deleteMany();
20
+ // Delete NewtonChat (they reference submissions and conversations)
21
+ await prisma.newtonChat.deleteMany();
8
22
  // Delete chat-related records
9
23
  await prisma.mention.deleteMany();
10
24
  await prisma.message.deleteMany();
@@ -30,9 +44,16 @@ export async function clearDatabase() {
30
44
  await prisma.user.deleteMany();
31
45
  // Delete schools (which reference files for logos) - this will cascade delete the file references
32
46
  await prisma.school.deleteMany();
47
+ // Delete marketing-related records
48
+ await prisma.schoolDevelopementProgram.deleteMany();
49
+ await prisma.earlyAccessRequest.deleteMany();
33
50
  // Finally delete all files
34
51
  await prisma.file.deleteMany();
35
52
  }
53
+ // Helper function to generate DiceBear avatar URL
54
+ function getDiceBearAvatar(seed) {
55
+ return `https://api.dicebear.com/7.x/avataaars/svg?seed=${encodeURIComponent(seed)}`;
56
+ }
36
57
  export async function createUser(email, password, username) {
37
58
  logger.debug("Creating user", { email, username, password });
38
59
  const hashedPassword = await hash(password, 10);
@@ -77,7 +98,7 @@ export const seedDatabase = async () => {
77
98
  ]);
78
99
  // 3. Create Students (realistic names)
79
100
  const students = await Promise.all([
80
- createUser('alex.martinez@student.riverside.edu', 'student123', 'alex.martinez'),
101
+ createUser('alex.martinez@student.rverside.eidu', 'student123', 'alex.martinez'),
81
102
  createUser('sophia.williams@student.riverside.edu', 'student123', 'sophia.williams'),
82
103
  createUser('james.brown@student.riverside.edu', 'student123', 'james.brown'),
83
104
  createUser('olivia.taylor@student.riverside.edu', 'student123', 'olivia.taylor'),
@@ -90,7 +111,7 @@ export const seedDatabase = async () => {
90
111
  createUser('lucas.lewis@student.riverside.edu', 'student123', 'lucas.lewis'),
91
112
  createUser('charlotte.walker@student.riverside.edu', 'student123', 'charlotte.walker'),
92
113
  ]);
93
- // 4. Create User Profiles
114
+ // 4. Create User Profiles with DiceBear avatars
94
115
  await Promise.all([
95
116
  prisma.userProfile.create({
96
117
  data: {
@@ -99,6 +120,7 @@ export const seedDatabase = async () => {
99
120
  bio: 'Biology teacher with 15 years of experience. Passionate about making science accessible to all students.',
100
121
  location: 'Riverside, CA',
101
122
  website: 'https://sarahjohnson-bio.com',
123
+ profilePicture: getDiceBearAvatar(teachers[0].username),
102
124
  }
103
125
  }),
104
126
  prisma.userProfile.create({
@@ -107,6 +129,7 @@ export const seedDatabase = async () => {
107
129
  displayName: 'Mr. Michael Chen',
108
130
  bio: 'Mathematics teacher and department head. Specializes in AP Calculus and Statistics.',
109
131
  location: 'Riverside, CA',
132
+ profilePicture: getDiceBearAvatar(teachers[1].username),
110
133
  }
111
134
  }),
112
135
  prisma.userProfile.create({
@@ -115,17 +138,23 @@ export const seedDatabase = async () => {
115
138
  displayName: 'Ms. Emma Davis',
116
139
  bio: 'English Literature teacher. Loves fostering creative writing and critical thinking.',
117
140
  location: 'Riverside, CA',
141
+ profilePicture: getDiceBearAvatar(teachers[2].username),
118
142
  }
119
143
  }),
120
144
  ]);
121
- // Add profiles for some students
122
- await Promise.all(students.slice(0, 6).map((student, index) => {
123
- const names = ['Alex Martinez', 'Sophia Williams', 'James Brown', 'Olivia Taylor', 'Ethan Anderson', 'Ava Thomas'];
145
+ // Add profiles for all students with DiceBear avatars
146
+ await Promise.all(students.map((student, index) => {
147
+ const names = [
148
+ 'Alex Martinez', 'Sophia Williams', 'James Brown', 'Olivia Taylor',
149
+ 'Ethan Anderson', 'Ava Thomas', 'Noah Jackson', 'Isabella White',
150
+ 'Liam Harris', 'Mia Clark', 'Lucas Lewis', 'Charlotte Walker'
151
+ ];
124
152
  return prisma.userProfile.create({
125
153
  data: {
126
154
  userId: student.id,
127
- displayName: names[index],
128
- bio: `Grade 11 student at Riverside High School.`,
155
+ displayName: names[index] || student.username,
156
+ bio: index < 6 ? `Grade 11 student at Riverside High School.` : undefined,
157
+ profilePicture: getDiceBearAvatar(student.username),
129
158
  }
130
159
  });
131
160
  }));
@@ -845,8 +874,22 @@ export const seedDatabase = async () => {
845
874
  });
846
875
  }
847
876
  }
848
- // Create all submissions
849
- await Promise.all(submissionsToCreate.map(submission => prisma.submission.create({ data: submission })));
877
+ // Create all submissions in batches to avoid connection pool exhaustion
878
+ const BATCH_SIZE = 15; // Create 15 at a time to avoid overwhelming Supabase connection pool
879
+ logger.info(`Creating ${submissionsToCreate.length} submissions in batches of ${BATCH_SIZE}`);
880
+ for (let i = 0; i < submissionsToCreate.length; i += BATCH_SIZE) {
881
+ const batch = submissionsToCreate.slice(i, i + BATCH_SIZE);
882
+ await Promise.all(batch.map(submission => prisma.submission.create({ data: submission })));
883
+ // Small delay between batches to avoid overwhelming the connection pool
884
+ if (i + BATCH_SIZE < submissionsToCreate.length) {
885
+ await new Promise(resolve => setTimeout(resolve, 100)); // 100ms delay
886
+ }
887
+ // Log progress every 30 submissions or at the end
888
+ if ((i + BATCH_SIZE) % 30 === 0 || i + BATCH_SIZE >= submissionsToCreate.length) {
889
+ logger.info(`Created ${Math.min(i + BATCH_SIZE, submissionsToCreate.length)}/${submissionsToCreate.length} submissions`);
890
+ }
891
+ }
892
+ logger.info(`Successfully created all ${submissionsToCreate.length} submissions`);
850
893
  // 11. Create announcements
851
894
  await Promise.all([
852
895
  prisma.announcement.create({
@@ -880,285 +923,250 @@ export const seedDatabase = async () => {
880
923
  const oct9 = new Date('2025-10-09T08:00:00');
881
924
  const oct10 = new Date('2025-10-10T08:00:00');
882
925
  const oct11 = new Date('2025-10-11T08:00:00');
883
- await Promise.all([
926
+ // Build events array first, then batch create them
927
+ const eventsToCreate = [
884
928
  // Monday Oct 7 - Michael Chen's busy day
885
- prisma.event.create({
886
- data: {
887
- name: 'AP Calculus BC - Period 2',
888
- startTime: new Date('2025-10-07T09:15:00'),
889
- endTime: new Date('2025-10-07T10:05:00'),
890
- location: 'Room 156',
891
- remarks: 'Derivatives unit test review',
892
- userId: teachers[1].id,
893
- classId: mathClass.id,
894
- color: '#3B82F6',
895
- }
896
- }),
897
- prisma.event.create({
898
- data: {
899
- name: 'Department Head Meeting',
900
- startTime: new Date('2025-10-07T10:30:00'),
901
- endTime: new Date('2025-10-07T11:30:00'),
902
- location: 'Conference Room A',
903
- remarks: 'Monthly math department meeting - curriculum planning',
904
- userId: teachers[1].id,
905
- color: '#8B5CF6',
906
- }
907
- }),
908
- prisma.event.create({
909
- data: {
910
- name: 'AP Statistics - Period 5',
911
- startTime: new Date('2025-10-07T13:45:00'),
912
- endTime: new Date('2025-10-07T14:35:00'),
913
- location: 'Room 156',
914
- remarks: 'Hypothesis testing introduction',
915
- userId: teachers[1].id,
916
- color: '#3B82F6',
917
- }
918
- }),
919
- prisma.event.create({
920
- data: {
921
- name: 'Parent Conference - Williams Family',
922
- startTime: new Date('2025-10-07T15:00:00'),
923
- endTime: new Date('2025-10-07T15:30:00'),
924
- location: 'Room 156',
925
- remarks: 'Discuss Sophia\'s progress in AP Calculus',
926
- userId: teachers[1].id,
927
- color: '#F59E0B',
928
- }
929
- }),
930
- prisma.event.create({
931
- data: {
932
- name: 'Math Tutoring Session',
933
- startTime: new Date('2025-10-07T15:45:00'),
934
- endTime: new Date('2025-10-07T16:45:00'),
935
- location: 'Room 156',
936
- remarks: 'Extra help for struggling students',
937
- userId: teachers[1].id,
938
- color: '#10B981',
939
- }
940
- }),
929
+ {
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
+ name: 'Department Head Meeting',
941
+ startTime: new Date('2025-10-07T10:30:00'),
942
+ endTime: new Date('2025-10-07T11:30:00'),
943
+ location: 'Conference Room A',
944
+ remarks: 'Monthly math department meeting - curriculum planning',
945
+ userId: teachers[1].id,
946
+ color: '#8B5CF6',
947
+ },
948
+ {
949
+ name: 'AP Statistics - Period 5',
950
+ startTime: new Date('2025-10-07T13:45:00'),
951
+ endTime: new Date('2025-10-07T14:35:00'),
952
+ location: 'Room 156',
953
+ remarks: 'Hypothesis testing introduction',
954
+ userId: teachers[1].id,
955
+ color: '#3B82F6',
956
+ },
957
+ {
958
+ name: 'Parent Conference - Williams Family',
959
+ startTime: new Date('2025-10-07T15:00:00'),
960
+ endTime: new Date('2025-10-07T15:30:00'),
961
+ location: 'Room 156',
962
+ remarks: 'Discuss Sophia\'s progress in AP Calculus',
963
+ userId: teachers[1].id,
964
+ color: '#F59E0B',
965
+ },
966
+ {
967
+ name: 'Math Tutoring Session',
968
+ startTime: new Date('2025-10-07T15:45:00'),
969
+ endTime: new Date('2025-10-07T16:45:00'),
970
+ location: 'Room 156',
971
+ remarks: 'Extra help for struggling students',
972
+ userId: teachers[1].id,
973
+ color: '#10B981',
974
+ },
941
975
  // Tuesday Oct 8
942
- prisma.event.create({
943
- data: {
944
- name: 'AP Calculus BC - Period 2',
945
- startTime: new Date('2025-10-08T09:15:00'),
946
- endTime: new Date('2025-10-08T10:05:00'),
947
- location: 'Room 156',
948
- remarks: 'Derivatives unit test',
949
- userId: teachers[1].id,
950
- classId: mathClass.id,
951
- color: '#3B82F6',
952
- }
953
- }),
954
- prisma.event.create({
955
- data: {
956
- name: 'Faculty Meeting',
957
- startTime: new Date('2025-10-08T12:00:00'),
958
- endTime: new Date('2025-10-08T13:00:00'),
959
- location: 'Main Auditorium',
960
- remarks: 'All-school faculty meeting',
961
- userId: teachers[1].id,
962
- color: '#6B7280',
963
- }
964
- }),
965
- prisma.event.create({
966
- data: {
967
- name: 'AP Statistics - Period 5',
968
- startTime: new Date('2025-10-08T13:45:00'),
969
- endTime: new Date('2025-10-08T14:35:00'),
970
- location: 'Room 156',
971
- remarks: 'Hypothesis testing practice problems',
972
- userId: teachers[1].id,
973
- color: '#3B82F6',
974
- }
975
- }),
976
- prisma.event.create({
977
- data: {
978
- name: 'Grade Level Team Meeting',
979
- startTime: new Date('2025-10-08T15:00:00'),
980
- endTime: new Date('2025-10-08T16:00:00'),
981
- location: 'Room 201',
982
- remarks: '11th grade team coordination',
983
- userId: teachers[1].id,
984
- color: '#8B5CF6',
985
- }
986
- }),
976
+ {
977
+ name: 'AP Calculus BC - Period 2',
978
+ startTime: new Date('2025-10-08T09:15:00'),
979
+ endTime: new Date('2025-10-08T10:05:00'),
980
+ location: 'Room 156',
981
+ remarks: 'Derivatives unit test',
982
+ userId: teachers[1].id,
983
+ classId: mathClass.id,
984
+ color: '#3B82F6',
985
+ },
986
+ {
987
+ name: 'Faculty Meeting',
988
+ startTime: new Date('2025-10-08T12:00:00'),
989
+ endTime: new Date('2025-10-08T13:00:00'),
990
+ location: 'Main Auditorium',
991
+ remarks: 'All-school faculty meeting',
992
+ userId: teachers[1].id,
993
+ color: '#6B7280',
994
+ },
995
+ {
996
+ name: 'AP Statistics - Period 5',
997
+ startTime: new Date('2025-10-08T13:45:00'),
998
+ endTime: new Date('2025-10-08T14:35:00'),
999
+ location: 'Room 156',
1000
+ remarks: 'Hypothesis testing practice problems',
1001
+ userId: teachers[1].id,
1002
+ color: '#3B82F6',
1003
+ },
1004
+ {
1005
+ name: 'Grade Level Team Meeting',
1006
+ startTime: new Date('2025-10-08T15:00:00'),
1007
+ endTime: new Date('2025-10-08T16:00:00'),
1008
+ location: 'Room 201',
1009
+ remarks: '11th grade team coordination',
1010
+ userId: teachers[1].id,
1011
+ color: '#8B5CF6',
1012
+ },
987
1013
  // Wednesday Oct 9
988
- prisma.event.create({
989
- data: {
990
- name: 'AP Calculus BC - Period 2',
991
- startTime: new Date('2025-10-09T09:15:00'),
992
- endTime: new Date('2025-10-09T10:05:00'),
993
- location: 'Room 156',
994
- remarks: 'Integration introduction',
995
- userId: teachers[1].id,
996
- classId: mathClass.id,
997
- color: '#3B82F6',
998
- }
999
- }),
1000
- prisma.event.create({
1001
- data: {
1002
- name: 'Professional Development',
1003
- startTime: new Date('2025-10-09T11:00:00'),
1004
- endTime: new Date('2025-10-09T12:30:00'),
1005
- location: 'Library Conference Room',
1006
- remarks: 'Technology in Mathematics Education workshop',
1007
- userId: teachers[1].id,
1008
- color: '#059669',
1009
- }
1010
- }),
1011
- prisma.event.create({
1012
- data: {
1013
- name: 'AP Statistics - Period 5',
1014
- startTime: new Date('2025-10-09T13:45:00'),
1015
- endTime: new Date('2025-10-09T14:35:00'),
1016
- location: 'Room 156',
1017
- remarks: 'Chi-square tests',
1018
- userId: teachers[1].id,
1019
- color: '#3B82F6',
1020
- }
1021
- }),
1022
- prisma.event.create({
1023
- data: {
1024
- name: 'Student Council Advisory',
1025
- startTime: new Date('2025-10-09T15:00:00'),
1026
- endTime: new Date('2025-10-09T16:00:00'),
1027
- location: 'Room 105',
1028
- remarks: 'Advisor meeting for student council',
1029
- userId: teachers[1].id,
1030
- color: '#DC2626',
1031
- }
1032
- }),
1014
+ {
1015
+ name: 'AP Calculus BC - Period 2',
1016
+ startTime: new Date('2025-10-09T09:15:00'),
1017
+ endTime: new Date('2025-10-09T10:05:00'),
1018
+ location: 'Room 156',
1019
+ remarks: 'Integration introduction',
1020
+ userId: teachers[1].id,
1021
+ classId: mathClass.id,
1022
+ color: '#3B82F6',
1023
+ },
1024
+ {
1025
+ name: 'Professional Development',
1026
+ startTime: new Date('2025-10-09T11:00:00'),
1027
+ endTime: new Date('2025-10-09T12:30:00'),
1028
+ location: 'Library Conference Room',
1029
+ remarks: 'Technology in Mathematics Education workshop',
1030
+ userId: teachers[1].id,
1031
+ color: '#059669',
1032
+ },
1033
+ {
1034
+ name: 'AP Statistics - Period 5',
1035
+ startTime: new Date('2025-10-09T13:45:00'),
1036
+ endTime: new Date('2025-10-09T14:35:00'),
1037
+ location: 'Room 156',
1038
+ remarks: 'Chi-square tests',
1039
+ userId: teachers[1].id,
1040
+ color: '#3B82F6',
1041
+ },
1042
+ {
1043
+ name: 'Student Council Advisory',
1044
+ startTime: new Date('2025-10-09T15:00:00'),
1045
+ endTime: new Date('2025-10-09T16:00:00'),
1046
+ location: 'Room 105',
1047
+ remarks: 'Advisor meeting for student council',
1048
+ userId: teachers[1].id,
1049
+ color: '#DC2626',
1050
+ },
1033
1051
  // Thursday Oct 10
1034
- prisma.event.create({
1035
- data: {
1036
- name: 'AP Calculus BC - Period 2',
1037
- startTime: new Date('2025-10-10T09:15:00'),
1038
- endTime: new Date('2025-10-10T10:05:00'),
1039
- location: 'Room 156',
1040
- remarks: 'Integration by substitution',
1041
- userId: teachers[1].id,
1042
- classId: mathClass.id,
1043
- color: '#3B82F6',
1044
- }
1045
- }),
1046
- prisma.event.create({
1047
- data: {
1048
- name: 'Curriculum Committee',
1049
- startTime: new Date('2025-10-10T11:00:00'),
1050
- endTime: new Date('2025-10-10T12:00:00'),
1051
- location: 'Principal\'s Office',
1052
- remarks: 'Review new AP curriculum standards',
1053
- userId: teachers[1].id,
1054
- color: '#8B5CF6',
1055
- }
1056
- }),
1057
- prisma.event.create({
1058
- data: {
1059
- name: 'AP Statistics - Period 5',
1060
- startTime: new Date('2025-10-10T13:45:00'),
1061
- endTime: new Date('2025-10-10T14:35:00'),
1062
- location: 'Room 156',
1063
- remarks: 'ANOVA introduction',
1064
- userId: teachers[1].id,
1065
- color: '#3B82F6',
1066
- }
1067
- }),
1068
- prisma.event.create({
1069
- data: {
1070
- name: 'Parent Conference - Anderson Family',
1071
- startTime: new Date('2025-10-10T15:00:00'),
1072
- endTime: new Date('2025-10-10T15:30:00'),
1073
- location: 'Room 156',
1074
- remarks: 'Discuss Ethan\'s improvement strategies',
1075
- userId: teachers[1].id,
1076
- color: '#F59E0B',
1077
- }
1078
- }),
1079
- prisma.event.create({
1080
- data: {
1081
- name: 'Math Club Meeting',
1082
- startTime: new Date('2025-10-10T15:45:00'),
1083
- endTime: new Date('2025-10-10T16:45:00'),
1084
- location: 'Room 156',
1085
- remarks: 'Preparing for state math competition',
1086
- userId: teachers[1].id,
1087
- color: '#10B981',
1088
- }
1089
- }),
1052
+ {
1053
+ name: 'AP Calculus BC - Period 2',
1054
+ startTime: new Date('2025-10-10T09:15:00'),
1055
+ endTime: new Date('2025-10-10T10:05:00'),
1056
+ location: 'Room 156',
1057
+ remarks: 'Integration by substitution',
1058
+ userId: teachers[1].id,
1059
+ classId: mathClass.id,
1060
+ color: '#3B82F6',
1061
+ },
1062
+ {
1063
+ name: 'Curriculum Committee',
1064
+ startTime: new Date('2025-10-10T11:00:00'),
1065
+ endTime: new Date('2025-10-10T12:00:00'),
1066
+ location: 'Principal\'s Office',
1067
+ remarks: 'Review new AP curriculum standards',
1068
+ userId: teachers[1].id,
1069
+ color: '#8B5CF6',
1070
+ },
1071
+ {
1072
+ name: 'AP Statistics - Period 5',
1073
+ startTime: new Date('2025-10-10T13:45:00'),
1074
+ endTime: new Date('2025-10-10T14:35:00'),
1075
+ location: 'Room 156',
1076
+ remarks: 'ANOVA introduction',
1077
+ userId: teachers[1].id,
1078
+ color: '#3B82F6',
1079
+ },
1080
+ {
1081
+ name: 'Parent Conference - Anderson Family',
1082
+ startTime: new Date('2025-10-10T15:00:00'),
1083
+ endTime: new Date('2025-10-10T15:30:00'),
1084
+ location: 'Room 156',
1085
+ remarks: 'Discuss Ethan\'s improvement strategies',
1086
+ userId: teachers[1].id,
1087
+ color: '#F59E0B',
1088
+ },
1089
+ {
1090
+ name: 'Math Club Meeting',
1091
+ startTime: new Date('2025-10-10T15:45:00'),
1092
+ endTime: new Date('2025-10-10T16:45:00'),
1093
+ location: 'Room 156',
1094
+ remarks: 'Preparing for state math competition',
1095
+ userId: teachers[1].id,
1096
+ color: '#10B981',
1097
+ },
1090
1098
  // Friday Oct 11
1091
- prisma.event.create({
1092
- data: {
1093
- name: 'AP Calculus BC - Period 2',
1094
- startTime: new Date('2025-10-11T09:15:00'),
1095
- endTime: new Date('2025-10-11T10:05:00'),
1096
- location: 'Room 156',
1097
- remarks: 'Integration by parts',
1098
- userId: teachers[1].id,
1099
- classId: mathClass.id,
1100
- color: '#3B82F6',
1101
- }
1102
- }),
1103
- prisma.event.create({
1104
- data: {
1105
- name: 'IEP Meeting - Student Support',
1106
- startTime: new Date('2025-10-11T10:30:00'),
1107
- endTime: new Date('2025-10-11T11:30:00'),
1108
- location: 'Special Services Office',
1109
- remarks: 'Individualized Education Plan review',
1110
- userId: teachers[1].id,
1111
- color: '#F59E0B',
1112
- }
1113
- }),
1114
- prisma.event.create({
1115
- data: {
1116
- name: 'AP Statistics - Period 5',
1117
- startTime: new Date('2025-10-11T13:45:00'),
1118
- endTime: new Date('2025-10-11T14:35:00'),
1119
- location: 'Room 156',
1120
- remarks: 'ANOVA practice and review',
1121
- userId: teachers[1].id,
1122
- color: '#3B82F6',
1123
- }
1124
- }),
1125
- prisma.event.create({
1126
- data: {
1127
- name: 'Weekend Prep Session',
1128
- startTime: new Date('2025-10-11T15:00:00'),
1129
- endTime: new Date('2025-10-11T17:00:00'),
1130
- location: 'Room 156',
1131
- remarks: 'Voluntary AP exam prep session',
1132
- userId: teachers[1].id,
1133
- color: '#059669',
1134
- }
1135
- }),
1099
+ {
1100
+ name: 'AP Calculus BC - Period 2',
1101
+ startTime: new Date('2025-10-11T09:15:00'),
1102
+ endTime: new Date('2025-10-11T10:05:00'),
1103
+ location: 'Room 156',
1104
+ remarks: 'Integration by parts',
1105
+ userId: teachers[1].id,
1106
+ classId: mathClass.id,
1107
+ color: '#3B82F6',
1108
+ },
1109
+ {
1110
+ name: 'IEP Meeting - Student Support',
1111
+ startTime: new Date('2025-10-11T10:30:00'),
1112
+ endTime: new Date('2025-10-11T11:30:00'),
1113
+ location: 'Special Services Office',
1114
+ remarks: 'Individualized Education Plan review',
1115
+ userId: teachers[1].id,
1116
+ color: '#F59E0B',
1117
+ },
1118
+ {
1119
+ name: 'AP Statistics - Period 5',
1120
+ startTime: new Date('2025-10-11T13:45:00'),
1121
+ endTime: new Date('2025-10-11T14:35:00'),
1122
+ location: 'Room 156',
1123
+ remarks: 'ANOVA practice and review',
1124
+ userId: teachers[1].id,
1125
+ color: '#3B82F6',
1126
+ },
1127
+ {
1128
+ name: 'Weekend Prep Session',
1129
+ startTime: new Date('2025-10-11T15:00:00'),
1130
+ endTime: new Date('2025-10-11T17:00:00'),
1131
+ location: 'Room 156',
1132
+ remarks: 'Voluntary AP exam prep session',
1133
+ userId: teachers[1].id,
1134
+ color: '#059669',
1135
+ },
1136
1136
  // Some events for other teachers too
1137
- prisma.event.create({
1138
- data: {
1139
- name: 'Cell Biology Lab',
1140
- startTime: new Date(now.getTime() + 2 * 24 * 60 * 60 * 1000),
1141
- endTime: new Date(now.getTime() + 2 * 24 * 60 * 60 * 1000 + 90 * 60 * 1000), // 90 minutes
1142
- location: 'Science Lab Room 204',
1143
- remarks: 'Bring lab notebooks and safety goggles',
1144
- userId: teachers[0].id,
1145
- classId: biologyClass.id,
1146
- color: '#10B981',
1147
- }
1148
- }),
1149
- prisma.event.create({
1150
- data: {
1151
- name: 'Poetry Reading',
1152
- startTime: new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000),
1153
- endTime: new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000 + 60 * 60 * 1000),
1154
- location: 'Library',
1155
- remarks: 'Students will present their original poetry',
1156
- userId: teachers[2].id,
1157
- classId: englishClass.id,
1158
- color: '#8B5CF6',
1159
- }
1160
- }),
1161
- ]);
1137
+ {
1138
+ name: 'Cell Biology Lab',
1139
+ startTime: new Date(now.getTime() + 2 * 24 * 60 * 60 * 1000),
1140
+ endTime: new Date(now.getTime() + 2 * 24 * 60 * 60 * 1000 + 90 * 60 * 1000), // 90 minutes
1141
+ location: 'Science Lab Room 204',
1142
+ remarks: 'Bring lab notebooks and safety goggles',
1143
+ userId: teachers[0].id,
1144
+ classId: biologyClass.id,
1145
+ color: '#10B981',
1146
+ },
1147
+ {
1148
+ name: 'Poetry Reading',
1149
+ startTime: new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000),
1150
+ endTime: new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000 + 60 * 60 * 1000),
1151
+ location: 'Library',
1152
+ remarks: 'Students will present their original poetry',
1153
+ userId: teachers[2].id,
1154
+ classId: englishClass.id,
1155
+ color: '#8B5CF6',
1156
+ },
1157
+ ];
1158
+ // Create events in batches to avoid connection pool exhaustion
1159
+ const EVENT_BATCH_SIZE = 10;
1160
+ logger.info(`Creating ${eventsToCreate.length} events in batches of ${EVENT_BATCH_SIZE}`);
1161
+ for (let i = 0; i < eventsToCreate.length; i += EVENT_BATCH_SIZE) {
1162
+ const batch = eventsToCreate.slice(i, i + EVENT_BATCH_SIZE);
1163
+ await Promise.all(batch.map(event => prisma.event.create({ data: event })));
1164
+ // Small delay between batches
1165
+ if (i + EVENT_BATCH_SIZE < eventsToCreate.length) {
1166
+ await new Promise(resolve => setTimeout(resolve, 100));
1167
+ }
1168
+ }
1169
+ logger.info(`Successfully created all ${eventsToCreate.length} events`);
1162
1170
  // 13. Create attendance records
1163
1171
  const attendanceDate = new Date(now.getTime() - 24 * 60 * 60 * 1000);
1164
1172
  await Promise.all([
@@ -1446,8 +1454,14 @@ export const seedDatabase = async () => {
1446
1454
  createdAt: new Date('2024-10-11T12:30:00'),
1447
1455
  },
1448
1456
  ];
1449
- // Create all messages
1450
- await Promise.all(chatMessages.map(message => prisma.message.create({ data: message })));
1457
+ // Create all messages in batches to avoid connection pool exhaustion
1458
+ const MESSAGE_BATCH_SIZE = 10;
1459
+ logger.info(`Creating ${chatMessages.length} chat messages in batches of ${MESSAGE_BATCH_SIZE}`);
1460
+ for (let i = 0; i < chatMessages.length; i += MESSAGE_BATCH_SIZE) {
1461
+ const batch = chatMessages.slice(i, i + MESSAGE_BATCH_SIZE);
1462
+ await Promise.all(batch.map(message => prisma.message.create({ data: message })));
1463
+ }
1464
+ logger.info(`Successfully created all ${chatMessages.length} chat messages`);
1451
1465
  // 16. Create file structure for classes
1452
1466
  await Promise.all([
1453
1467
  prisma.folder.create({
@@ -1503,8 +1517,16 @@ export const seedDatabase = async () => {
1503
1517
  logger.info(' English Teacher: emma.davis@riverside.edu / demo123');
1504
1518
  logger.info(' Student: alex.martinez@student.riverside.edu / student123');
1505
1519
  };
1506
- (async () => {
1507
- logger.info('Seeding database');
1508
- await seedDatabase();
1509
- logger.info('Database seeded');
1510
- })();
1520
+ // Only run seedDatabase when executed directly (npm run seed)
1521
+ // Not when imported by other modules
1522
+ const isSeedScript = process.argv[1]?.includes('seedDatabase') ||
1523
+ process.argv.includes('seed');
1524
+ if (isSeedScript) {
1525
+ (async () => {
1526
+ logger.info('Seeding database');
1527
+ await seedDatabase();
1528
+ logger.info('Database seeded');
1529
+ })();
1530
+ }
1531
+ //# sourceMappingURL=seedDatabase.js.map
1532
+ //# debugId=4e5c4562-c500-5409-8250-b98dc8416587