@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.
- package/.coderabbit.yaml +9 -0
- package/.env.example +53 -0
- package/.env.test.example +37 -0
- package/README.md +34 -7
- package/dist/exportType.d.ts.map +1 -1
- package/dist/exportType.js +4 -0
- package/dist/exportType.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +212 -51
- package/dist/index.js.map +1 -0
- package/dist/instrument.d.ts +2 -0
- package/dist/instrument.d.ts.map +1 -0
- package/dist/instrument.js +18 -0
- package/dist/instrument.js.map +1 -0
- package/dist/lib/config/env.d.ts +190 -0
- package/dist/lib/config/env.d.ts.map +1 -0
- package/dist/lib/config/env.js +121 -0
- package/dist/lib/config/env.js.map +1 -0
- package/dist/lib/fileUpload.d.ts +2 -2
- package/dist/lib/fileUpload.d.ts.map +1 -1
- package/dist/lib/fileUpload.js +82 -15
- package/dist/lib/fileUpload.js.map +1 -0
- package/dist/lib/googleCloudStorage.d.ts +13 -0
- package/dist/lib/googleCloudStorage.d.ts.map +1 -1
- package/dist/lib/googleCloudStorage.js +45 -6
- package/dist/lib/googleCloudStorage.js.map +1 -0
- package/dist/lib/jsonConversion.d.ts.map +1 -1
- package/dist/lib/jsonConversion.js +16 -14
- package/dist/lib/jsonConversion.js.map +1 -0
- package/dist/lib/jsonStyles.d.ts.map +1 -1
- package/dist/lib/jsonStyles.js +4 -0
- package/dist/lib/jsonStyles.js.map +1 -0
- package/dist/lib/notificationHandler.d.ts +25 -0
- package/dist/lib/notificationHandler.d.ts.map +1 -0
- package/dist/lib/notificationHandler.js +32 -0
- package/dist/lib/notificationHandler.js.map +1 -0
- package/dist/lib/prisma.d.ts +2 -2
- package/dist/lib/prisma.d.ts.map +1 -1
- package/dist/lib/prisma.js +24 -1
- package/dist/lib/prisma.js.map +1 -0
- package/dist/lib/pusher.d.ts +4 -1
- package/dist/lib/pusher.d.ts.map +1 -1
- package/dist/lib/pusher.js +14 -6
- package/dist/lib/pusher.js.map +1 -0
- package/dist/lib/redis.d.ts +5 -0
- package/dist/lib/redis.d.ts.map +1 -0
- package/dist/lib/redis.js +53 -0
- package/dist/lib/redis.js.map +1 -0
- package/dist/lib/thumbnailGenerator.d.ts +0 -21
- package/dist/lib/thumbnailGenerator.d.ts.map +1 -1
- package/dist/lib/thumbnailGenerator.js +159 -158
- package/dist/lib/thumbnailGenerator.js.map +1 -0
- package/dist/middleware/auth.d.ts.map +1 -1
- package/dist/middleware/auth.js +41 -93
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/logging.d.ts.map +1 -1
- package/dist/middleware/logging.js +4 -0
- package/dist/middleware/logging.js.map +1 -0
- package/dist/middleware/security.d.ts +5 -0
- package/dist/middleware/security.d.ts.map +1 -0
- package/dist/middleware/security.js +77 -0
- package/dist/middleware/security.js.map +1 -0
- package/dist/models/agenda.d.ts +97 -0
- package/dist/models/agenda.d.ts.map +1 -0
- package/dist/models/agenda.js +40 -0
- package/dist/models/agenda.js.map +1 -0
- package/dist/models/announcement.d.ts +223 -0
- package/dist/models/announcement.d.ts.map +1 -0
- package/dist/models/announcement.js +120 -0
- package/dist/models/announcement.js.map +1 -0
- package/dist/models/assignment.d.ts +1292 -0
- package/dist/models/assignment.d.ts.map +1 -0
- package/dist/models/assignment.js +309 -0
- package/dist/models/assignment.js.map +1 -0
- package/dist/models/attendance.d.ts +180 -0
- package/dist/models/attendance.d.ts.map +1 -0
- package/dist/models/attendance.js +188 -0
- package/dist/models/attendance.js.map +1 -0
- package/dist/models/auth.d.ts +153 -0
- package/dist/models/auth.d.ts.map +1 -0
- package/dist/models/auth.js +217 -0
- package/dist/models/auth.js.map +1 -0
- package/dist/models/class.d.ts +439 -0
- package/dist/models/class.d.ts.map +1 -0
- package/dist/models/class.js +546 -0
- package/dist/models/class.js.map +1 -0
- package/dist/models/comment.d.ts +171 -0
- package/dist/models/comment.d.ts.map +1 -0
- package/dist/models/comment.js +138 -0
- package/dist/models/comment.js.map +1 -0
- package/dist/models/conversation.d.ts +164 -0
- package/dist/models/conversation.d.ts.map +1 -0
- package/dist/models/conversation.js +175 -0
- package/dist/models/conversation.js.map +1 -0
- package/dist/models/event.d.ts +295 -0
- package/dist/models/event.d.ts.map +1 -0
- package/dist/models/event.js +145 -0
- package/dist/models/event.js.map +1 -0
- package/dist/models/file.d.ts +536 -0
- package/dist/models/file.d.ts.map +1 -0
- package/dist/models/file.js +126 -0
- package/dist/models/file.js.map +1 -0
- package/dist/models/folder.d.ts +295 -0
- package/dist/models/folder.d.ts.map +1 -0
- package/dist/models/folder.js +202 -0
- package/dist/models/folder.js.map +1 -0
- package/dist/models/labChat.d.ts +243 -0
- package/dist/models/labChat.d.ts.map +1 -0
- package/dist/models/labChat.js +204 -0
- package/dist/models/labChat.js.map +1 -0
- package/dist/models/marketing.d.ts +72 -0
- package/dist/models/marketing.d.ts.map +1 -0
- package/dist/models/marketing.js +26 -0
- package/dist/models/marketing.js.map +1 -0
- package/dist/models/message.d.ts +100 -0
- package/dist/models/message.d.ts.map +1 -0
- package/dist/models/message.js +131 -0
- package/dist/models/message.js.map +1 -0
- package/dist/models/newtonChat.d.ts +72 -0
- package/dist/models/newtonChat.d.ts.map +1 -0
- package/dist/models/newtonChat.js +61 -0
- package/dist/models/newtonChat.js.map +1 -0
- package/dist/models/notification.d.ts +65 -0
- package/dist/models/notification.d.ts.map +1 -0
- package/dist/models/notification.js +46 -0
- package/dist/models/notification.js.map +1 -0
- package/dist/models/section.d.ts +102 -0
- package/dist/models/section.d.ts.map +1 -0
- package/dist/models/section.js +83 -0
- package/dist/models/section.js.map +1 -0
- package/dist/models/user.d.ts +39 -0
- package/dist/models/user.d.ts.map +1 -0
- package/dist/models/user.js +38 -0
- package/dist/models/user.js.map +1 -0
- package/dist/models/worksheet.d.ts +460 -0
- package/dist/models/worksheet.d.ts.map +1 -0
- package/dist/models/worksheet.js +200 -0
- package/dist/models/worksheet.js.map +1 -0
- package/dist/pipelines/aiLabChat.d.ts +21 -0
- package/dist/pipelines/aiLabChat.d.ts.map +1 -0
- package/dist/pipelines/aiLabChat.js +460 -0
- package/dist/pipelines/aiLabChat.js.map +1 -0
- package/dist/pipelines/aiNewtonChat.d.ts +30 -0
- package/dist/pipelines/aiNewtonChat.d.ts.map +1 -0
- package/dist/pipelines/aiNewtonChat.js +289 -0
- package/dist/pipelines/aiNewtonChat.js.map +1 -0
- package/dist/pipelines/gradeWorksheet.d.ts +30 -0
- package/dist/pipelines/gradeWorksheet.d.ts.map +1 -0
- package/dist/pipelines/gradeWorksheet.js +252 -0
- package/dist/pipelines/gradeWorksheet.js.map +1 -0
- package/dist/routers/_app.d.ts +6403 -3741
- package/dist/routers/_app.d.ts.map +1 -1
- package/dist/routers/_app.js +10 -0
- package/dist/routers/_app.js.map +1 -0
- package/dist/routers/agenda.d.ts +58 -6
- package/dist/routers/agenda.d.ts.map +1 -1
- package/dist/routers/agenda.js +6 -58
- package/dist/routers/agenda.js.map +1 -0
- package/dist/routers/announcement.d.ts +325 -6
- package/dist/routers/announcement.d.ts.map +1 -1
- package/dist/routers/announcement.js +547 -57
- package/dist/routers/announcement.js.map +1 -0
- package/dist/routers/assignment.d.ts +431 -318
- package/dist/routers/assignment.d.ts.map +1 -1
- package/dist/routers/assignment.js +104 -1559
- package/dist/routers/assignment.js.map +1 -0
- package/dist/routers/attendance.d.ts +20 -9
- package/dist/routers/attendance.d.ts.map +1 -1
- package/dist/routers/attendance.js +10 -263
- package/dist/routers/attendance.js.map +1 -0
- package/dist/routers/auth.d.ts +21 -1
- package/dist/routers/auth.d.ts.map +1 -1
- package/dist/routers/auth.js +37 -241
- package/dist/routers/auth.js.map +1 -0
- package/dist/routers/class.d.ts +198 -68
- package/dist/routers/class.d.ts.map +1 -1
- package/dist/routers/class.js +88 -909
- package/dist/routers/class.js.map +1 -0
- package/dist/routers/comment.d.ts +153 -0
- package/dist/routers/comment.d.ts.map +1 -0
- package/dist/routers/comment.js +58 -0
- package/dist/routers/comment.js.map +1 -0
- package/dist/routers/conversation.d.ts +73 -3
- package/dist/routers/conversation.d.ts.map +1 -1
- package/dist/routers/conversation.js +23 -265
- package/dist/routers/conversation.js.map +1 -0
- package/dist/routers/event.d.ts +46 -37
- package/dist/routers/event.d.ts.map +1 -1
- package/dist/routers/event.js +15 -431
- package/dist/routers/event.js.map +1 -0
- package/dist/routers/file.d.ts +4 -2
- package/dist/routers/file.d.ts.map +1 -1
- package/dist/routers/file.js +11 -295
- package/dist/routers/file.js.map +1 -0
- package/dist/routers/folder.d.ts +21 -14
- package/dist/routers/folder.d.ts.map +1 -1
- package/dist/routers/folder.js +36 -743
- package/dist/routers/folder.js.map +1 -0
- package/dist/routers/labChat.d.ts +12 -9
- package/dist/routers/labChat.d.ts.map +1 -1
- package/dist/routers/labChat.js +21 -877
- package/dist/routers/labChat.js.map +1 -0
- package/dist/routers/marketing.d.ts +2 -2
- package/dist/routers/marketing.d.ts.map +1 -1
- package/dist/routers/marketing.js +9 -54
- package/dist/routers/marketing.js.map +1 -0
- package/dist/routers/message.d.ts +2 -1
- package/dist/routers/message.d.ts.map +1 -1
- package/dist/routers/message.js +29 -519
- package/dist/routers/message.js.map +1 -0
- package/dist/routers/newtonChat.d.ts +55 -0
- package/dist/routers/newtonChat.d.ts.map +1 -0
- package/dist/routers/newtonChat.js +22 -0
- package/dist/routers/newtonChat.js.map +1 -0
- package/dist/routers/notifications.d.ts +8 -8
- package/dist/routers/notifications.d.ts.map +1 -1
- package/dist/routers/notifications.js +20 -81
- package/dist/routers/notifications.js.map +1 -0
- package/dist/routers/section.d.ts +37 -6
- package/dist/routers/section.d.ts.map +1 -1
- package/dist/routers/section.js +26 -167
- package/dist/routers/section.js.map +1 -0
- package/dist/routers/user.d.ts +1 -1
- package/dist/routers/user.d.ts.map +1 -1
- package/dist/routers/user.js +34 -204
- package/dist/routers/user.js.map +1 -0
- package/dist/routers/worksheet.d.ts +362 -0
- package/dist/routers/worksheet.d.ts.map +1 -0
- package/dist/routers/worksheet.js +153 -0
- package/dist/routers/worksheet.js.map +1 -0
- package/dist/seedDatabase.d.ts +2 -3
- package/dist/seedDatabase.d.ts.map +1 -1
- package/dist/seedDatabase.js +311 -289
- package/dist/seedDatabase.js.map +1 -0
- package/dist/server/pipelines/aiLabChat.d.ts +21 -0
- package/dist/server/pipelines/aiLabChat.d.ts.map +1 -0
- package/dist/server/pipelines/aiLabChat.js +456 -0
- package/dist/server/pipelines/aiLabChat.js.map +1 -0
- package/dist/server/pipelines/aiNewtonChat.d.ts +30 -0
- package/dist/server/pipelines/aiNewtonChat.d.ts.map +1 -0
- package/dist/server/pipelines/aiNewtonChat.js +285 -0
- package/dist/server/pipelines/aiNewtonChat.js.map +1 -0
- package/dist/server/pipelines/gradeWorksheet.d.ts +30 -0
- package/dist/server/pipelines/gradeWorksheet.d.ts.map +1 -0
- package/dist/server/pipelines/gradeWorksheet.js +248 -0
- package/dist/server/pipelines/gradeWorksheet.js.map +1 -0
- package/dist/services/agenda.d.ts +100 -0
- package/dist/services/agenda.d.ts.map +1 -0
- package/dist/services/agenda.js +21 -0
- package/dist/services/agenda.js.map +1 -0
- package/dist/services/announcement.d.ts +135 -0
- package/dist/services/announcement.d.ts.map +1 -0
- package/dist/services/announcement.js +223 -0
- package/dist/services/announcement.js.map +1 -0
- package/dist/services/assignment.d.ts +1462 -0
- package/dist/services/assignment.d.ts.map +1 -0
- package/dist/services/assignment.js +898 -0
- package/dist/services/assignment.js.map +1 -0
- package/dist/services/attendance.d.ts +93 -0
- package/dist/services/attendance.d.ts.map +1 -0
- package/dist/services/attendance.js +61 -0
- package/dist/services/attendance.js.map +1 -0
- package/dist/services/auth.d.ts +68 -0
- package/dist/services/auth.d.ts.map +1 -0
- package/dist/services/auth.js +218 -0
- package/dist/services/auth.js.map +1 -0
- package/dist/services/class.d.ts +621 -0
- package/dist/services/class.d.ts.map +1 -0
- package/dist/services/class.js +474 -0
- package/dist/services/class.js.map +1 -0
- package/dist/services/comment.d.ts +100 -0
- package/dist/services/comment.d.ts.map +1 -0
- package/dist/services/comment.js +83 -0
- package/dist/services/comment.js.map +1 -0
- package/dist/services/conversation.d.ts +159 -0
- package/dist/services/conversation.d.ts.map +1 -0
- package/dist/services/conversation.js +138 -0
- package/dist/services/conversation.js.map +1 -0
- package/dist/services/event.d.ts +216 -0
- package/dist/services/event.d.ts.map +1 -0
- package/dist/services/event.js +168 -0
- package/dist/services/event.js.map +1 -0
- package/dist/services/file.d.ts +74 -0
- package/dist/services/file.d.ts.map +1 -0
- package/dist/services/file.js +133 -0
- package/dist/services/file.js.map +1 -0
- package/dist/services/folder.d.ts +239 -0
- package/dist/services/folder.d.ts.map +1 -0
- package/dist/services/folder.js +248 -0
- package/dist/services/folder.js.map +1 -0
- package/dist/services/labChat.d.ts +165 -0
- package/dist/services/labChat.d.ts.map +1 -0
- package/dist/services/labChat.js +289 -0
- package/dist/services/labChat.js.map +1 -0
- package/dist/services/marketing.d.ts +50 -0
- package/dist/services/marketing.d.ts.map +1 -0
- package/dist/services/marketing.js +32 -0
- package/dist/services/marketing.js.map +1 -0
- package/dist/services/message.d.ts +95 -0
- package/dist/services/message.d.ts.map +1 -0
- package/dist/services/message.js +350 -0
- package/dist/services/message.js.map +1 -0
- package/dist/services/newtonChat.d.ts +22 -0
- package/dist/services/newtonChat.d.ts.map +1 -0
- package/dist/services/newtonChat.js +174 -0
- package/dist/services/newtonChat.js.map +1 -0
- package/dist/services/notification.d.ts +65 -0
- package/dist/services/notification.d.ts.map +1 -0
- package/dist/services/notification.js +33 -0
- package/dist/services/notification.js.map +1 -0
- package/dist/services/section.d.ts +53 -0
- package/dist/services/section.d.ts.map +1 -0
- package/dist/services/section.js +199 -0
- package/dist/services/section.js.map +1 -0
- package/dist/services/user.d.ts +48 -0
- package/dist/services/user.d.ts.map +1 -0
- package/dist/services/user.js +141 -0
- package/dist/services/user.js.map +1 -0
- package/dist/services/worksheet.d.ts +239 -0
- package/dist/services/worksheet.d.ts.map +1 -0
- package/dist/services/worksheet.js +235 -0
- package/dist/services/worksheet.js.map +1 -0
- package/dist/socket/handlers.d.ts.map +1 -1
- package/dist/socket/handlers.js +4 -0
- package/dist/socket/handlers.js.map +1 -0
- package/dist/trpc.d.ts.map +1 -1
- package/dist/trpc.js +4 -0
- package/dist/trpc.js.map +1 -0
- package/dist/types/trpc.d.ts.map +1 -1
- package/dist/types/trpc.js +4 -0
- package/dist/types/trpc.js.map +1 -0
- package/dist/utils/aiUser.d.ts +1 -3
- package/dist/utils/aiUser.d.ts.map +1 -1
- package/dist/utils/aiUser.js +8 -3
- package/dist/utils/aiUser.js.map +1 -0
- package/dist/utils/email.d.ts +12 -1
- package/dist/utils/email.d.ts.map +1 -1
- package/dist/utils/email.js +26 -4
- package/dist/utils/email.js.map +1 -0
- package/dist/utils/generateInviteCode.d.ts +1 -2
- package/dist/utils/generateInviteCode.d.ts.map +1 -1
- package/dist/utils/generateInviteCode.js +5 -2
- package/dist/utils/generateInviteCode.js.map +1 -0
- package/dist/utils/inference.d.ts +8 -0
- package/dist/utils/inference.d.ts.map +1 -1
- package/dist/utils/inference.js +78 -10
- package/dist/utils/inference.js.map +1 -0
- package/dist/utils/logger.d.ts +4 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +35 -3
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/prismaErrorHandler.d.ts.map +1 -1
- package/dist/utils/prismaErrorHandler.js +7 -0
- package/dist/utils/prismaErrorHandler.js.map +1 -0
- package/dist/utils/prismaWrapper.d.ts +1 -0
- package/dist/utils/prismaWrapper.d.ts.map +1 -1
- package/dist/utils/prismaWrapper.js +8 -0
- package/dist/utils/prismaWrapper.js.map +1 -0
- package/docker-compose.yml +19 -0
- package/package.json +21 -4
- package/prisma/migrations/20251109122857_annuoncements_comments/migration.sql +30 -0
- package/prisma/migrations/20251109135555_reactions_announcements_comments/migration.sql +35 -0
- package/prisma/schema.prisma +180 -12
- package/scripts/test-pre-push.ts +14 -0
- package/src/index.ts +247 -52
- package/src/instrument.ts +15 -0
- package/src/lib/config/env.ts +132 -0
- package/src/lib/fileUpload.ts +81 -16
- package/src/lib/googleCloudStorage.ts +42 -6
- package/src/lib/jsonConversion.ts +12 -14
- package/src/lib/prisma.ts +23 -2
- package/src/lib/pusher.ts +11 -6
- package/src/lib/redis.ts +56 -0
- package/src/lib/thumbnailGenerator.ts +170 -168
- package/src/middleware/auth.ts +86 -137
- package/src/middleware/security.ts +80 -0
- package/src/models/agenda.ts +46 -0
- package/src/models/announcement.ts +134 -0
- package/src/models/assignment.ts +322 -0
- package/src/models/attendance.ts +208 -0
- package/src/models/auth.ts +247 -0
- package/src/models/class.ts +598 -0
- package/src/models/comment.ts +152 -0
- package/src/models/conversation.ts +200 -0
- package/src/models/event.ts +177 -0
- package/src/models/file.ts +129 -0
- package/src/models/folder.ts +225 -0
- package/src/models/labChat.ts +213 -0
- package/src/models/marketing.ts +45 -0
- package/src/models/message.ts +153 -0
- package/src/models/newtonChat.ts +70 -0
- package/src/models/notification.ts +54 -0
- package/src/models/section.ts +98 -0
- package/src/models/user.ts +47 -0
- package/src/models/worksheet.ts +294 -0
- package/src/pipelines/aiLabChat.ts +511 -0
- package/src/pipelines/aiNewtonChat.ts +347 -0
- package/src/pipelines/gradeWorksheet.ts +286 -0
- package/src/routers/_app.ts +6 -0
- package/src/routers/agenda.ts +3 -61
- package/src/routers/announcement.ts +622 -57
- package/src/routers/assignment.ts +157 -1688
- package/src/routers/attendance.ts +16 -277
- package/src/routers/auth.ts +79 -313
- package/src/routers/class.ts +265 -1038
- package/src/routers/comment.ts +76 -0
- package/src/routers/conversation.ts +53 -284
- package/src/routers/event.ts +50 -481
- package/src/routers/file.ts +45 -341
- package/src/routers/folder.ts +107 -836
- package/src/routers/labChat.ts +29 -960
- package/src/routers/marketing.ts +35 -77
- package/src/routers/message.ts +45 -571
- package/src/routers/newtonChat.ts +36 -0
- package/src/routers/notifications.ts +32 -82
- package/src/routers/section.ts +58 -200
- package/src/routers/user.ts +49 -226
- package/src/routers/worksheet.ts +252 -0
- package/src/seedDatabase.ts +330 -290
- package/src/services/agenda.ts +21 -0
- package/src/services/announcement.ts +290 -0
- package/src/services/assignment.ts +1198 -0
- package/src/services/attendance.ts +85 -0
- package/src/services/auth.ts +277 -0
- package/src/services/class.ts +622 -0
- package/src/services/comment.ts +106 -0
- package/src/services/conversation.ts +213 -0
- package/src/services/event.ts +231 -0
- package/src/services/file.ts +167 -0
- package/src/services/folder.ts +316 -0
- package/src/services/labChat.ts +352 -0
- package/src/services/marketing.ts +57 -0
- package/src/services/message.ts +461 -0
- package/src/services/newtonChat.ts +222 -0
- package/src/services/notification.ts +50 -0
- package/src/services/section.ts +283 -0
- package/src/services/user.ts +172 -0
- package/src/services/worksheet.ts +358 -0
- package/src/trpc.ts +4 -0
- package/src/utils/aiUser.ts +4 -3
- package/src/utils/email.ts +33 -4
- package/src/utils/generateInviteCode.ts +1 -3
- package/src/utils/inference.ts +89 -10
- package/src/utils/logger.ts +33 -3
- package/src/utils/prismaErrorHandler.ts +3 -0
- package/src/utils/prismaWrapper.ts +4 -0
- package/tests/globalSetup.ts +62 -0
- package/tests/helpers.ts +22 -0
- package/tests/middleware/security.test.ts +42 -0
- package/tests/routers/agenda.test.ts +138 -0
- package/tests/routers/announcement.test.ts +490 -0
- package/tests/routers/assignment.test.ts +837 -0
- package/tests/routers/attendance.test.ts +160 -0
- package/tests/routers/auth.test.ts +171 -0
- package/tests/{class.test.ts → routers/class.test.ts} +163 -92
- package/tests/routers/comment.test.ts +126 -0
- package/tests/routers/conversation.test.ts +145 -0
- package/tests/routers/event.test.ts +289 -0
- package/tests/routers/folder.test.ts +178 -0
- package/tests/routers/labChat.test.ts +115 -0
- package/tests/routers/marketing.test.ts +59 -0
- package/tests/routers/message.test.ts +123 -0
- package/tests/routers/notification.test.ts +69 -0
- package/tests/routers/section.test.ts +208 -0
- package/tests/server/rateLimit.test.ts +73 -0
- package/tests/setup.ts +39 -65
- package/tests/user.test.ts +136 -0
- package/tests/utils/aiUser.test.ts +22 -0
- package/tests/utils/generateInviteCode.test.ts +24 -0
- package/tests/utils/logger.test.ts +74 -0
- package/tests/utils/prismaErrorHandler.test.ts +101 -0
- package/tests/utils/prismaWrapper.test.ts +82 -0
- package/tests/worksheet.test.ts +181 -0
- package/tsconfig.json +9 -2
- package/vitest.config.ts +30 -1
- package/vitest.unit.config.ts +21 -0
- package/API_SPECIFICATION.md +0 -1597
- package/BASE64_REMOVAL_SUMMARY.md +0 -164
- package/CHAT_API_SPEC.md +0 -579
- package/LAB_CHAT_API_SPEC.md +0 -518
- package/dist/routers/school.d.ts +0 -208
- package/dist/routers/school.d.ts.map +0 -1
- package/dist/routers/school.js +0 -481
- package/tests/auth.test.ts +0 -25
package/src/seedDatabase.ts
CHANGED
|
@@ -5,8 +5,24 @@ import { logger } from "./utils/logger.js";
|
|
|
5
5
|
export async function clearDatabase() {
|
|
6
6
|
// Delete in order to respect foreign key constraints
|
|
7
7
|
// Delete notifications first (they reference users)
|
|
8
|
+
logger.info('Clearing database');
|
|
8
9
|
await prisma.notification.deleteMany();
|
|
9
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
|
+
|
|
10
26
|
// Delete chat-related records
|
|
11
27
|
await prisma.mention.deleteMany();
|
|
12
28
|
await prisma.message.deleteMany();
|
|
@@ -38,10 +54,19 @@ export async function clearDatabase() {
|
|
|
38
54
|
// Delete schools (which reference files for logos) - this will cascade delete the file references
|
|
39
55
|
await prisma.school.deleteMany();
|
|
40
56
|
|
|
57
|
+
// Delete marketing-related records
|
|
58
|
+
await prisma.schoolDevelopementProgram.deleteMany();
|
|
59
|
+
await prisma.earlyAccessRequest.deleteMany();
|
|
60
|
+
|
|
41
61
|
// Finally delete all files
|
|
42
62
|
await prisma.file.deleteMany();
|
|
43
63
|
}
|
|
44
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
|
+
|
|
45
70
|
export async function createUser(email: string, password: string, username: string) {
|
|
46
71
|
logger.debug("Creating user", { email, username, password });
|
|
47
72
|
|
|
@@ -94,7 +119,7 @@ export const seedDatabase = async () => {
|
|
|
94
119
|
|
|
95
120
|
// 3. Create Students (realistic names)
|
|
96
121
|
const students = await Promise.all([
|
|
97
|
-
createUser('alex.martinez@student.
|
|
122
|
+
createUser('alex.martinez@student.rverside.eidu', 'student123', 'alex.martinez'),
|
|
98
123
|
createUser('sophia.williams@student.riverside.edu', 'student123', 'sophia.williams'),
|
|
99
124
|
createUser('james.brown@student.riverside.edu', 'student123', 'james.brown'),
|
|
100
125
|
createUser('olivia.taylor@student.riverside.edu', 'student123', 'olivia.taylor'),
|
|
@@ -108,7 +133,7 @@ export const seedDatabase = async () => {
|
|
|
108
133
|
createUser('charlotte.walker@student.riverside.edu', 'student123', 'charlotte.walker'),
|
|
109
134
|
]);
|
|
110
135
|
|
|
111
|
-
// 4. Create User Profiles
|
|
136
|
+
// 4. Create User Profiles with DiceBear avatars
|
|
112
137
|
await Promise.all([
|
|
113
138
|
prisma.userProfile.create({
|
|
114
139
|
data: {
|
|
@@ -117,6 +142,7 @@ export const seedDatabase = async () => {
|
|
|
117
142
|
bio: 'Biology teacher with 15 years of experience. Passionate about making science accessible to all students.',
|
|
118
143
|
location: 'Riverside, CA',
|
|
119
144
|
website: 'https://sarahjohnson-bio.com',
|
|
145
|
+
profilePicture: getDiceBearAvatar(teachers[0].username),
|
|
120
146
|
}
|
|
121
147
|
}),
|
|
122
148
|
prisma.userProfile.create({
|
|
@@ -125,6 +151,7 @@ export const seedDatabase = async () => {
|
|
|
125
151
|
displayName: 'Mr. Michael Chen',
|
|
126
152
|
bio: 'Mathematics teacher and department head. Specializes in AP Calculus and Statistics.',
|
|
127
153
|
location: 'Riverside, CA',
|
|
154
|
+
profilePicture: getDiceBearAvatar(teachers[1].username),
|
|
128
155
|
}
|
|
129
156
|
}),
|
|
130
157
|
prisma.userProfile.create({
|
|
@@ -133,18 +160,24 @@ export const seedDatabase = async () => {
|
|
|
133
160
|
displayName: 'Ms. Emma Davis',
|
|
134
161
|
bio: 'English Literature teacher. Loves fostering creative writing and critical thinking.',
|
|
135
162
|
location: 'Riverside, CA',
|
|
163
|
+
profilePicture: getDiceBearAvatar(teachers[2].username),
|
|
136
164
|
}
|
|
137
165
|
}),
|
|
138
166
|
]);
|
|
139
167
|
|
|
140
|
-
// Add profiles for
|
|
141
|
-
await Promise.all(students.
|
|
142
|
-
const names = [
|
|
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
|
+
];
|
|
143
175
|
return prisma.userProfile.create({
|
|
144
176
|
data: {
|
|
145
177
|
userId: student.id,
|
|
146
|
-
displayName: names[index],
|
|
147
|
-
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),
|
|
148
181
|
}
|
|
149
182
|
});
|
|
150
183
|
}));
|
|
@@ -882,10 +915,29 @@ export const seedDatabase = async () => {
|
|
|
882
915
|
}
|
|
883
916
|
}
|
|
884
917
|
|
|
885
|
-
// Create all submissions
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
)
|
|
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`);
|
|
889
941
|
|
|
890
942
|
// 11. Create announcements
|
|
891
943
|
await Promise.all([
|
|
@@ -922,290 +974,262 @@ export const seedDatabase = async () => {
|
|
|
922
974
|
const oct10 = new Date('2025-10-10T08:00:00');
|
|
923
975
|
const oct11 = new Date('2025-10-11T08:00:00');
|
|
924
976
|
|
|
925
|
-
|
|
977
|
+
// Build events array first, then batch create them
|
|
978
|
+
const eventsToCreate = [
|
|
926
979
|
// Monday Oct 7 - Michael Chen's busy day
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
data: {
|
|
974
|
-
name: 'Math Tutoring Session',
|
|
975
|
-
startTime: new Date('2025-10-07T15:45:00'),
|
|
976
|
-
endTime: new Date('2025-10-07T16:45:00'),
|
|
977
|
-
location: 'Room 156',
|
|
978
|
-
remarks: 'Extra help for struggling students',
|
|
979
|
-
userId: teachers[1].id,
|
|
980
|
-
color: '#10B981',
|
|
981
|
-
}
|
|
982
|
-
}),
|
|
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
|
+
},
|
|
983
1026
|
|
|
984
1027
|
// Tuesday Oct 8
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
startTime: new Date('2025-10-08T15:00:00'),
|
|
1023
|
-
endTime: new Date('2025-10-08T16:00:00'),
|
|
1024
|
-
location: 'Room 201',
|
|
1025
|
-
remarks: '11th grade team coordination',
|
|
1026
|
-
userId: teachers[1].id,
|
|
1027
|
-
color: '#8B5CF6',
|
|
1028
|
-
}
|
|
1029
|
-
}),
|
|
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
|
+
},
|
|
1030
1065
|
|
|
1031
1066
|
// Wednesday Oct 9
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
startTime: new Date('2025-10-09T15:00:00'),
|
|
1070
|
-
endTime: new Date('2025-10-09T16:00:00'),
|
|
1071
|
-
location: 'Room 105',
|
|
1072
|
-
remarks: 'Advisor meeting for student council',
|
|
1073
|
-
userId: teachers[1].id,
|
|
1074
|
-
color: '#DC2626',
|
|
1075
|
-
}
|
|
1076
|
-
}),
|
|
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
|
+
},
|
|
1077
1104
|
|
|
1078
1105
|
// Thursday Oct 10
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
data: {
|
|
1126
|
-
name: 'Math Club Meeting',
|
|
1127
|
-
startTime: new Date('2025-10-10T15:45:00'),
|
|
1128
|
-
endTime: new Date('2025-10-10T16:45:00'),
|
|
1129
|
-
location: 'Room 156',
|
|
1130
|
-
remarks: 'Preparing for state math competition',
|
|
1131
|
-
userId: teachers[1].id,
|
|
1132
|
-
color: '#10B981',
|
|
1133
|
-
}
|
|
1134
|
-
}),
|
|
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
|
+
},
|
|
1135
1152
|
|
|
1136
1153
|
// Friday Oct 11
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
startTime: new Date('2025-10-11T15:00:00'),
|
|
1175
|
-
endTime: new Date('2025-10-11T17:00:00'),
|
|
1176
|
-
location: 'Room 156',
|
|
1177
|
-
remarks: 'Voluntary AP exam prep session',
|
|
1178
|
-
userId: teachers[1].id,
|
|
1179
|
-
color: '#059669',
|
|
1180
|
-
}
|
|
1181
|
-
}),
|
|
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
|
+
},
|
|
1182
1191
|
|
|
1183
1192
|
// Some events for other teachers too
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
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`);
|
|
1209
1233
|
|
|
1210
1234
|
// 13. Create attendance records
|
|
1211
1235
|
const attendanceDate = new Date(now.getTime() - 24 * 60 * 60 * 1000);
|
|
@@ -1510,10 +1534,19 @@ export const seedDatabase = async () => {
|
|
|
1510
1534
|
},
|
|
1511
1535
|
];
|
|
1512
1536
|
|
|
1513
|
-
// Create all messages
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
)
|
|
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`);
|
|
1517
1550
|
|
|
1518
1551
|
// 16. Create file structure for classes
|
|
1519
1552
|
await Promise.all([
|
|
@@ -1572,8 +1605,15 @@ export const seedDatabase = async () => {
|
|
|
1572
1605
|
logger.info(' Student: alex.martinez@student.riverside.edu / student123');
|
|
1573
1606
|
};
|
|
1574
1607
|
|
|
1575
|
-
|
|
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 () => {
|
|
1576
1615
|
logger.info('Seeding database');
|
|
1577
1616
|
await seedDatabase();
|
|
1578
1617
|
logger.info('Database seeded');
|
|
1579
|
-
})();
|
|
1618
|
+
})();
|
|
1619
|
+
}
|