@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
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
declare const envSchema: z.ZodObject<{
|
|
3
|
+
NODE_ENV: z.ZodDefault<z.ZodEnum<["development", "production", "test"]>>;
|
|
4
|
+
PORT: z.ZodDefault<z.ZodEffects<z.ZodString, number, string>>;
|
|
5
|
+
DATABASE_URL: z.ZodString;
|
|
6
|
+
} & {
|
|
7
|
+
NEXT_PUBLIC_APP_URL: z.ZodDefault<z.ZodString>;
|
|
8
|
+
BACKEND_URL: z.ZodDefault<z.ZodString>;
|
|
9
|
+
SENTRY_DSN: z.ZodOptional<z.ZodString>;
|
|
10
|
+
EMAIL_HOST: z.ZodString;
|
|
11
|
+
EMAIL_PORT: z.ZodDefault<z.ZodEffects<z.ZodString, number, string>>;
|
|
12
|
+
EMAIL_USER: z.ZodString;
|
|
13
|
+
EMAIL_PASS: z.ZodString;
|
|
14
|
+
EMAIL_DRY_RUN: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
15
|
+
GOOGLE_CLOUD_PROJECT_ID: z.ZodString;
|
|
16
|
+
GOOGLE_CLOUD_CLIENT_EMAIL: z.ZodString;
|
|
17
|
+
GOOGLE_CLOUD_PRIVATE_KEY: z.ZodString;
|
|
18
|
+
GOOGLE_CLOUD_BUCKET_NAME: z.ZodString;
|
|
19
|
+
PUSHER_APP_ID: z.ZodString;
|
|
20
|
+
PUSHER_KEY: z.ZodString;
|
|
21
|
+
PUSHER_SECRET: z.ZodString;
|
|
22
|
+
PUSHER_CLUSTER: z.ZodString;
|
|
23
|
+
PUSHER_AUTH_COOKIE_NAME: z.ZodOptional<z.ZodString>;
|
|
24
|
+
REDIS_URL: z.ZodOptional<z.ZodString>;
|
|
25
|
+
INFERENCE_API_KEY: z.ZodOptional<z.ZodString>;
|
|
26
|
+
INFERENCE_API_BASE_URL: z.ZodOptional<z.ZodString>;
|
|
27
|
+
OPENAI_API_KEY: z.ZodOptional<z.ZodString>;
|
|
28
|
+
LOG_MODE: z.ZodDefault<z.ZodEnum<["normal", "verbose", "quiet"]>>;
|
|
29
|
+
}, "strip", z.ZodTypeAny, {
|
|
30
|
+
NODE_ENV: "test" | "development" | "production";
|
|
31
|
+
LOG_MODE: "normal" | "verbose" | "quiet";
|
|
32
|
+
PORT: number;
|
|
33
|
+
DATABASE_URL: string;
|
|
34
|
+
NEXT_PUBLIC_APP_URL: string;
|
|
35
|
+
BACKEND_URL: string;
|
|
36
|
+
EMAIL_HOST: string;
|
|
37
|
+
EMAIL_PORT: number;
|
|
38
|
+
EMAIL_USER: string;
|
|
39
|
+
EMAIL_PASS: string;
|
|
40
|
+
EMAIL_DRY_RUN: string;
|
|
41
|
+
GOOGLE_CLOUD_PROJECT_ID: string;
|
|
42
|
+
GOOGLE_CLOUD_CLIENT_EMAIL: string;
|
|
43
|
+
GOOGLE_CLOUD_PRIVATE_KEY: string;
|
|
44
|
+
GOOGLE_CLOUD_BUCKET_NAME: string;
|
|
45
|
+
PUSHER_APP_ID: string;
|
|
46
|
+
PUSHER_KEY: string;
|
|
47
|
+
PUSHER_SECRET: string;
|
|
48
|
+
PUSHER_CLUSTER: string;
|
|
49
|
+
SENTRY_DSN?: string | undefined;
|
|
50
|
+
PUSHER_AUTH_COOKIE_NAME?: string | undefined;
|
|
51
|
+
REDIS_URL?: string | undefined;
|
|
52
|
+
INFERENCE_API_KEY?: string | undefined;
|
|
53
|
+
INFERENCE_API_BASE_URL?: string | undefined;
|
|
54
|
+
OPENAI_API_KEY?: string | undefined;
|
|
55
|
+
}, {
|
|
56
|
+
DATABASE_URL: string;
|
|
57
|
+
EMAIL_HOST: string;
|
|
58
|
+
EMAIL_USER: string;
|
|
59
|
+
EMAIL_PASS: string;
|
|
60
|
+
GOOGLE_CLOUD_PROJECT_ID: string;
|
|
61
|
+
GOOGLE_CLOUD_CLIENT_EMAIL: string;
|
|
62
|
+
GOOGLE_CLOUD_PRIVATE_KEY: string;
|
|
63
|
+
GOOGLE_CLOUD_BUCKET_NAME: string;
|
|
64
|
+
PUSHER_APP_ID: string;
|
|
65
|
+
PUSHER_KEY: string;
|
|
66
|
+
PUSHER_SECRET: string;
|
|
67
|
+
PUSHER_CLUSTER: string;
|
|
68
|
+
NODE_ENV?: "test" | "development" | "production" | undefined;
|
|
69
|
+
LOG_MODE?: "normal" | "verbose" | "quiet" | undefined;
|
|
70
|
+
PORT?: string | undefined;
|
|
71
|
+
NEXT_PUBLIC_APP_URL?: string | undefined;
|
|
72
|
+
BACKEND_URL?: string | undefined;
|
|
73
|
+
SENTRY_DSN?: string | undefined;
|
|
74
|
+
EMAIL_PORT?: string | undefined;
|
|
75
|
+
EMAIL_DRY_RUN?: string | undefined;
|
|
76
|
+
PUSHER_AUTH_COOKIE_NAME?: string | undefined;
|
|
77
|
+
REDIS_URL?: string | undefined;
|
|
78
|
+
INFERENCE_API_KEY?: string | undefined;
|
|
79
|
+
INFERENCE_API_BASE_URL?: string | undefined;
|
|
80
|
+
OPENAI_API_KEY?: string | undefined;
|
|
81
|
+
}> | z.ZodObject<{
|
|
82
|
+
NODE_ENV: z.ZodDefault<z.ZodEnum<["development", "production", "test"]>>;
|
|
83
|
+
PORT: z.ZodDefault<z.ZodEffects<z.ZodString, number, string>>;
|
|
84
|
+
DATABASE_URL: z.ZodString;
|
|
85
|
+
} & {
|
|
86
|
+
NEXT_PUBLIC_APP_URL: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
87
|
+
BACKEND_URL: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
88
|
+
SENTRY_DSN: z.ZodOptional<z.ZodString>;
|
|
89
|
+
EMAIL_HOST: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
90
|
+
EMAIL_PORT: z.ZodDefault<z.ZodEffects<z.ZodString, number, string>>;
|
|
91
|
+
EMAIL_USER: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
92
|
+
EMAIL_PASS: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
93
|
+
EMAIL_DRY_RUN: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
94
|
+
GOOGLE_CLOUD_PROJECT_ID: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
95
|
+
GOOGLE_CLOUD_CLIENT_EMAIL: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
96
|
+
GOOGLE_CLOUD_PRIVATE_KEY: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
97
|
+
GOOGLE_CLOUD_BUCKET_NAME: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
98
|
+
PUSHER_APP_ID: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
99
|
+
PUSHER_KEY: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
100
|
+
PUSHER_SECRET: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
101
|
+
PUSHER_CLUSTER: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
102
|
+
PUSHER_AUTH_COOKIE_NAME: z.ZodOptional<z.ZodString>;
|
|
103
|
+
REDIS_URL: z.ZodOptional<z.ZodString>;
|
|
104
|
+
INFERENCE_API_KEY: z.ZodOptional<z.ZodString>;
|
|
105
|
+
OPENAI_API_KEY: z.ZodOptional<z.ZodString>;
|
|
106
|
+
INFERENCE_API_BASE_URL: z.ZodOptional<z.ZodString>;
|
|
107
|
+
LOG_MODE: z.ZodDefault<z.ZodEnum<["normal", "verbose", "quiet"]>>;
|
|
108
|
+
}, "strip", z.ZodTypeAny, {
|
|
109
|
+
NODE_ENV: "test" | "development" | "production";
|
|
110
|
+
LOG_MODE: "normal" | "verbose" | "quiet";
|
|
111
|
+
PORT: number;
|
|
112
|
+
DATABASE_URL: string;
|
|
113
|
+
NEXT_PUBLIC_APP_URL: string;
|
|
114
|
+
BACKEND_URL: string;
|
|
115
|
+
EMAIL_HOST: string;
|
|
116
|
+
EMAIL_PORT: number;
|
|
117
|
+
EMAIL_USER: string;
|
|
118
|
+
EMAIL_PASS: string;
|
|
119
|
+
EMAIL_DRY_RUN: string;
|
|
120
|
+
GOOGLE_CLOUD_PROJECT_ID: string;
|
|
121
|
+
GOOGLE_CLOUD_CLIENT_EMAIL: string;
|
|
122
|
+
GOOGLE_CLOUD_PRIVATE_KEY: string;
|
|
123
|
+
GOOGLE_CLOUD_BUCKET_NAME: string;
|
|
124
|
+
PUSHER_APP_ID: string;
|
|
125
|
+
PUSHER_KEY: string;
|
|
126
|
+
PUSHER_SECRET: string;
|
|
127
|
+
PUSHER_CLUSTER: string;
|
|
128
|
+
SENTRY_DSN?: string | undefined;
|
|
129
|
+
PUSHER_AUTH_COOKIE_NAME?: string | undefined;
|
|
130
|
+
REDIS_URL?: string | undefined;
|
|
131
|
+
INFERENCE_API_KEY?: string | undefined;
|
|
132
|
+
INFERENCE_API_BASE_URL?: string | undefined;
|
|
133
|
+
OPENAI_API_KEY?: string | undefined;
|
|
134
|
+
}, {
|
|
135
|
+
DATABASE_URL: string;
|
|
136
|
+
NODE_ENV?: "test" | "development" | "production" | undefined;
|
|
137
|
+
LOG_MODE?: "normal" | "verbose" | "quiet" | undefined;
|
|
138
|
+
PORT?: string | undefined;
|
|
139
|
+
NEXT_PUBLIC_APP_URL?: string | undefined;
|
|
140
|
+
BACKEND_URL?: string | undefined;
|
|
141
|
+
SENTRY_DSN?: string | undefined;
|
|
142
|
+
EMAIL_HOST?: string | undefined;
|
|
143
|
+
EMAIL_PORT?: string | undefined;
|
|
144
|
+
EMAIL_USER?: string | undefined;
|
|
145
|
+
EMAIL_PASS?: string | undefined;
|
|
146
|
+
EMAIL_DRY_RUN?: string | undefined;
|
|
147
|
+
GOOGLE_CLOUD_PROJECT_ID?: string | undefined;
|
|
148
|
+
GOOGLE_CLOUD_CLIENT_EMAIL?: string | undefined;
|
|
149
|
+
GOOGLE_CLOUD_PRIVATE_KEY?: string | undefined;
|
|
150
|
+
GOOGLE_CLOUD_BUCKET_NAME?: string | undefined;
|
|
151
|
+
PUSHER_APP_ID?: string | undefined;
|
|
152
|
+
PUSHER_KEY?: string | undefined;
|
|
153
|
+
PUSHER_SECRET?: string | undefined;
|
|
154
|
+
PUSHER_CLUSTER?: string | undefined;
|
|
155
|
+
PUSHER_AUTH_COOKIE_NAME?: string | undefined;
|
|
156
|
+
REDIS_URL?: string | undefined;
|
|
157
|
+
INFERENCE_API_KEY?: string | undefined;
|
|
158
|
+
INFERENCE_API_BASE_URL?: string | undefined;
|
|
159
|
+
OPENAI_API_KEY?: string | undefined;
|
|
160
|
+
}>;
|
|
161
|
+
export declare const env: {
|
|
162
|
+
NODE_ENV: "test" | "development" | "production";
|
|
163
|
+
LOG_MODE: "normal" | "verbose" | "quiet";
|
|
164
|
+
PORT: number;
|
|
165
|
+
DATABASE_URL: string;
|
|
166
|
+
NEXT_PUBLIC_APP_URL: string;
|
|
167
|
+
BACKEND_URL: string;
|
|
168
|
+
EMAIL_HOST: string;
|
|
169
|
+
EMAIL_PORT: number;
|
|
170
|
+
EMAIL_USER: string;
|
|
171
|
+
EMAIL_PASS: string;
|
|
172
|
+
EMAIL_DRY_RUN: string;
|
|
173
|
+
GOOGLE_CLOUD_PROJECT_ID: string;
|
|
174
|
+
GOOGLE_CLOUD_CLIENT_EMAIL: string;
|
|
175
|
+
GOOGLE_CLOUD_PRIVATE_KEY: string;
|
|
176
|
+
GOOGLE_CLOUD_BUCKET_NAME: string;
|
|
177
|
+
PUSHER_APP_ID: string;
|
|
178
|
+
PUSHER_KEY: string;
|
|
179
|
+
PUSHER_SECRET: string;
|
|
180
|
+
PUSHER_CLUSTER: string;
|
|
181
|
+
SENTRY_DSN?: string | undefined;
|
|
182
|
+
PUSHER_AUTH_COOKIE_NAME?: string | undefined;
|
|
183
|
+
REDIS_URL?: string | undefined;
|
|
184
|
+
INFERENCE_API_KEY?: string | undefined;
|
|
185
|
+
INFERENCE_API_BASE_URL?: string | undefined;
|
|
186
|
+
OPENAI_API_KEY?: string | undefined;
|
|
187
|
+
};
|
|
188
|
+
export type Env = z.infer<typeof envSchema>;
|
|
189
|
+
export {};
|
|
190
|
+
//# sourceMappingURL=env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"/","sources":["lib/config/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAqFxB,QAAA,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAmC,CAAC;AA2CnD,eAAO,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;CAAgB,CAAC;AAGjC,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAC"}
|
|
@@ -0,0 +1,121 @@
|
|
|
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]="6fe796c8-7781-5540-892a-a320464bfbae")}catch(e){}}();
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import dotenv from 'dotenv';
|
|
5
|
+
import { resolve } from 'path';
|
|
6
|
+
import { logger } from '../../utils/logger.js';
|
|
7
|
+
// Determine which env file to load based on NODE_ENV
|
|
8
|
+
const nodeEnv = process.env.NODE_ENV || 'development';
|
|
9
|
+
const envFileMap = {
|
|
10
|
+
test: '.env.test',
|
|
11
|
+
development: '.env.development',
|
|
12
|
+
production: '.env.production',
|
|
13
|
+
};
|
|
14
|
+
// Load the appropriate env file
|
|
15
|
+
const envFile = envFileMap[nodeEnv] || '.env';
|
|
16
|
+
const envPath = resolve(process.cwd(), envFile);
|
|
17
|
+
// Load environment variables from the correct file
|
|
18
|
+
// First load .env (base), then override with environment-specific file
|
|
19
|
+
dotenv.config(); // Load .env first (base config)
|
|
20
|
+
dotenv.config({ path: envPath, override: true }); // Override with env-specific
|
|
21
|
+
const isTest = nodeEnv === 'test';
|
|
22
|
+
const isProduction = nodeEnv === 'production';
|
|
23
|
+
// Base schema with required vars for all environments
|
|
24
|
+
const baseSchema = z.object({
|
|
25
|
+
NODE_ENV: z.enum(['development', 'production', 'test']).default('development'),
|
|
26
|
+
PORT: z.string().transform(Number).default('3001'),
|
|
27
|
+
DATABASE_URL: z.string().url('DATABASE_URL must be a valid URL'),
|
|
28
|
+
});
|
|
29
|
+
// Production/development schema with all required vars
|
|
30
|
+
const fullSchema = baseSchema.extend({
|
|
31
|
+
NEXT_PUBLIC_APP_URL: z.string().url().default('http://localhost:3000'),
|
|
32
|
+
BACKEND_URL: z.string().url().default('http://localhost:3001'),
|
|
33
|
+
SENTRY_DSN: z.string().url().optional(),
|
|
34
|
+
EMAIL_HOST: z.string().min(1, 'EMAIL_HOST is required'),
|
|
35
|
+
EMAIL_PORT: z.string().transform(Number).default('587'),
|
|
36
|
+
EMAIL_USER: z.string().email('EMAIL_USER must be a valid email'),
|
|
37
|
+
EMAIL_PASS: z.string().min(1, 'EMAIL_PASS is required'),
|
|
38
|
+
EMAIL_DRY_RUN: z.string().optional().default('false'),
|
|
39
|
+
GOOGLE_CLOUD_PROJECT_ID: z.string().min(1, 'GOOGLE_CLOUD_PROJECT_ID is required'),
|
|
40
|
+
GOOGLE_CLOUD_CLIENT_EMAIL: z.string().email('GOOGLE_CLOUD_CLIENT_EMAIL must be a valid email'),
|
|
41
|
+
GOOGLE_CLOUD_PRIVATE_KEY: z.string().min(1, 'GOOGLE_CLOUD_PRIVATE_KEY is required'),
|
|
42
|
+
GOOGLE_CLOUD_BUCKET_NAME: z.string().min(1, 'GOOGLE_CLOUD_BUCKET_NAME is required'),
|
|
43
|
+
PUSHER_APP_ID: z.string().min(1, 'PUSHER_APP_ID is required'),
|
|
44
|
+
PUSHER_KEY: z.string().min(1, 'PUSHER_KEY is required'),
|
|
45
|
+
PUSHER_SECRET: z.string().min(1, 'PUSHER_SECRET is required'),
|
|
46
|
+
PUSHER_CLUSTER: z.string().min(1, 'PUSHER_CLUSTER is required'),
|
|
47
|
+
PUSHER_AUTH_COOKIE_NAME: z.string().optional(), // Cookie name for session token (default: 'token')
|
|
48
|
+
REDIS_URL: z.string().url().optional(), // Redis connection URL (e.g. redis://localhost:6379)
|
|
49
|
+
INFERENCE_API_KEY: z.string().optional(),
|
|
50
|
+
INFERENCE_API_BASE_URL: z.string().url().optional(),
|
|
51
|
+
OPENAI_API_KEY: z.string().optional(),
|
|
52
|
+
LOG_MODE: z.enum(['normal', 'verbose', 'quiet']).default('normal'),
|
|
53
|
+
});
|
|
54
|
+
// Test schema - only require what's needed for tests
|
|
55
|
+
const testSchema = baseSchema.extend({
|
|
56
|
+
NEXT_PUBLIC_APP_URL: z.string().url().optional().default('http://localhost:3000'),
|
|
57
|
+
BACKEND_URL: z.string().url().optional().default('http://localhost:3001'),
|
|
58
|
+
SENTRY_DSN: z.string().url().optional(),
|
|
59
|
+
EMAIL_HOST: z.string().optional().default('smtp.test.com'),
|
|
60
|
+
EMAIL_PORT: z.string().transform(Number).default('587'),
|
|
61
|
+
EMAIL_USER: z.string().email().optional().default('test@test.com'),
|
|
62
|
+
EMAIL_PASS: z.string().optional().default('test'),
|
|
63
|
+
EMAIL_DRY_RUN: z.string().optional().default('false'),
|
|
64
|
+
GOOGLE_CLOUD_PROJECT_ID: z.string().optional().default('test-project'),
|
|
65
|
+
GOOGLE_CLOUD_CLIENT_EMAIL: z.string().email().optional().default('test@test.iam.gserviceaccount.com'),
|
|
66
|
+
GOOGLE_CLOUD_PRIVATE_KEY: z.string().optional().default('test-key'),
|
|
67
|
+
GOOGLE_CLOUD_BUCKET_NAME: z.string().optional().default('test-bucket'),
|
|
68
|
+
PUSHER_APP_ID: z.string().optional().default('test-app-id'),
|
|
69
|
+
PUSHER_KEY: z.string().optional().default('test-key'),
|
|
70
|
+
PUSHER_SECRET: z.string().optional().default('test-secret'),
|
|
71
|
+
PUSHER_CLUSTER: z.string().optional().default('us2'),
|
|
72
|
+
PUSHER_AUTH_COOKIE_NAME: z.string().optional(),
|
|
73
|
+
REDIS_URL: z.string().url().optional(),
|
|
74
|
+
INFERENCE_API_KEY: z.string().optional(),
|
|
75
|
+
OPENAI_API_KEY: z.string().optional(),
|
|
76
|
+
INFERENCE_API_BASE_URL: z.string().url().optional(),
|
|
77
|
+
LOG_MODE: z.enum(['normal', 'verbose', 'quiet']).default('quiet'),
|
|
78
|
+
});
|
|
79
|
+
// Use test schema in test mode, full schema otherwise
|
|
80
|
+
const envSchema = isTest ? testSchema : fullSchema;
|
|
81
|
+
// Validate environment variables
|
|
82
|
+
function validateEnv() {
|
|
83
|
+
try {
|
|
84
|
+
const parsed = envSchema.parse(process.env);
|
|
85
|
+
// Only exit on validation failure in production
|
|
86
|
+
if (isProduction && !parsed.DATABASE_URL) {
|
|
87
|
+
logger.error('DATABASE_URL is required in production');
|
|
88
|
+
process.exit(1);
|
|
89
|
+
}
|
|
90
|
+
return parsed;
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
if (error instanceof z.ZodError) {
|
|
94
|
+
const missingVars = error.errors.map(err => ({
|
|
95
|
+
path: err.path.join('.'),
|
|
96
|
+
message: err.message,
|
|
97
|
+
}));
|
|
98
|
+
logger.error('Environment variable validation failed', {
|
|
99
|
+
envFile,
|
|
100
|
+
missingVars,
|
|
101
|
+
});
|
|
102
|
+
// Only exit in production - in test/dev, log warning but continue
|
|
103
|
+
if (isProduction) {
|
|
104
|
+
logger.error(`Please check your ${envFile} file and ensure all required variables are set.`);
|
|
105
|
+
process.exit(1);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
logger.warn('Continuing with defaults - some features may not work correctly', {
|
|
109
|
+
envFile,
|
|
110
|
+
});
|
|
111
|
+
// Return parsed with defaults for non-production
|
|
112
|
+
return envSchema.parse({ ...process.env });
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// Export validated environment variables
|
|
119
|
+
export const env = validateEnv();
|
|
120
|
+
//# sourceMappingURL=env.js.map
|
|
121
|
+
//# debugId=6fe796c8-7781-5540-892a-a320464bfbae
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sources":["lib/config/env.ts"],"sourceRoot":"/","sourcesContent":["import { z } from 'zod';\nimport dotenv from 'dotenv';\nimport { resolve } from 'path';\nimport { logger } from '../../utils/logger.js';\n\n// Determine which env file to load based on NODE_ENV\nconst nodeEnv = process.env.NODE_ENV || 'development';\nconst envFileMap: Record<string, string> = {\n test: '.env.test',\n development: '.env.development',\n production: '.env.production',\n};\n\n// Load the appropriate env file\nconst envFile = envFileMap[nodeEnv] || '.env';\nconst envPath = resolve(process.cwd(), envFile);\n\n// Load environment variables from the correct file\n// First load .env (base), then override with environment-specific file\ndotenv.config(); // Load .env first (base config)\ndotenv.config({ path: envPath, override: true }); // Override with env-specific\n\nconst isTest = nodeEnv === 'test';\nconst isProduction = nodeEnv === 'production';\n\n// Base schema with required vars for all environments\nconst baseSchema = z.object({\n NODE_ENV: z.enum(['development', 'production', 'test']).default('development'),\n PORT: z.string().transform(Number).default('3001'),\n DATABASE_URL: z.string().url('DATABASE_URL must be a valid URL'),\n});\n\n// Production/development schema with all required vars\nconst fullSchema = baseSchema.extend({\n NEXT_PUBLIC_APP_URL: z.string().url().default('http://localhost:3000'),\n BACKEND_URL: z.string().url().default('http://localhost:3001'),\n SENTRY_DSN: z.string().url().optional(),\n EMAIL_HOST: z.string().min(1, 'EMAIL_HOST is required'),\n EMAIL_PORT: z.string().transform(Number).default('587'),\n EMAIL_USER: z.string().email('EMAIL_USER must be a valid email'),\n EMAIL_PASS: z.string().min(1, 'EMAIL_PASS is required'),\n EMAIL_DRY_RUN: z.string().optional().default('false'),\n GOOGLE_CLOUD_PROJECT_ID: z.string().min(1, 'GOOGLE_CLOUD_PROJECT_ID is required'),\n GOOGLE_CLOUD_CLIENT_EMAIL: z.string().email('GOOGLE_CLOUD_CLIENT_EMAIL must be a valid email'),\n GOOGLE_CLOUD_PRIVATE_KEY: z.string().min(1, 'GOOGLE_CLOUD_PRIVATE_KEY is required'),\n GOOGLE_CLOUD_BUCKET_NAME: z.string().min(1, 'GOOGLE_CLOUD_BUCKET_NAME is required'),\n PUSHER_APP_ID: z.string().min(1, 'PUSHER_APP_ID is required'),\n PUSHER_KEY: z.string().min(1, 'PUSHER_KEY is required'),\n PUSHER_SECRET: z.string().min(1, 'PUSHER_SECRET is required'),\n PUSHER_CLUSTER: z.string().min(1, 'PUSHER_CLUSTER is required'),\n PUSHER_AUTH_COOKIE_NAME: z.string().optional(), // Cookie name for session token (default: 'token')\n REDIS_URL: z.string().url().optional(), // Redis connection URL (e.g. redis://localhost:6379)\n INFERENCE_API_KEY: z.string().optional(),\n INFERENCE_API_BASE_URL: z.string().url().optional(),\n OPENAI_API_KEY: z.string().optional(),\n LOG_MODE: z.enum(['normal', 'verbose', 'quiet']).default('normal'),\n});\n\n// Test schema - only require what's needed for tests\nconst testSchema = baseSchema.extend({\n NEXT_PUBLIC_APP_URL: z.string().url().optional().default('http://localhost:3000'),\n BACKEND_URL: z.string().url().optional().default('http://localhost:3001'),\n SENTRY_DSN: z.string().url().optional(),\n EMAIL_HOST: z.string().optional().default('smtp.test.com'),\n EMAIL_PORT: z.string().transform(Number).default('587'),\n EMAIL_USER: z.string().email().optional().default('test@test.com'),\n EMAIL_PASS: z.string().optional().default('test'),\n EMAIL_DRY_RUN: z.string().optional().default('false'),\n GOOGLE_CLOUD_PROJECT_ID: z.string().optional().default('test-project'),\n GOOGLE_CLOUD_CLIENT_EMAIL: z.string().email().optional().default('test@test.iam.gserviceaccount.com'),\n GOOGLE_CLOUD_PRIVATE_KEY: z.string().optional().default('test-key'),\n GOOGLE_CLOUD_BUCKET_NAME: z.string().optional().default('test-bucket'),\n PUSHER_APP_ID: z.string().optional().default('test-app-id'),\n PUSHER_KEY: z.string().optional().default('test-key'),\n PUSHER_SECRET: z.string().optional().default('test-secret'),\n PUSHER_CLUSTER: z.string().optional().default('us2'),\n PUSHER_AUTH_COOKIE_NAME: z.string().optional(),\n REDIS_URL: z.string().url().optional(),\n INFERENCE_API_KEY: z.string().optional(),\n OPENAI_API_KEY: z.string().optional(),\n INFERENCE_API_BASE_URL: z.string().url().optional(),\n LOG_MODE: z.enum(['normal', 'verbose', 'quiet']).default('quiet'),\n});\n\n// Use test schema in test mode, full schema otherwise\nconst envSchema = isTest ? testSchema : fullSchema;\n\n// Validate environment variables\nfunction validateEnv() {\n try {\n const parsed = envSchema.parse(process.env);\n \n // Only exit on validation failure in production\n if (isProduction && !parsed.DATABASE_URL) {\n logger.error('DATABASE_URL is required in production');\n process.exit(1);\n }\n \n return parsed;\n } catch (error) {\n if (error instanceof z.ZodError) {\n const missingVars = error.errors.map(err => ({\n path: err.path.join('.'),\n message: err.message,\n }));\n \n logger.error('Environment variable validation failed', {\n envFile,\n missingVars,\n });\n \n // Only exit in production - in test/dev, log warning but continue\n if (isProduction) {\n logger.error(`Please check your ${envFile} file and ensure all required variables are set.`);\n process.exit(1);\n } else {\n logger.warn('Continuing with defaults - some features may not work correctly', {\n envFile,\n });\n // Return parsed with defaults for non-production\n return envSchema.parse({ ...process.env });\n }\n }\n throw error;\n }\n}\n\n// Export validated environment variables\nexport const env = validateEnv();\n\n// Type-safe environment access\nexport type Env = z.infer<typeof envSchema>;"],"names":[],"mappings":"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","debug_id":"6fe796c8-7781-5540-892a-a320464bfbae"}
|
package/dist/lib/fileUpload.d.ts
CHANGED
|
@@ -49,7 +49,7 @@ export declare function getFileUrl(filePath: string): Promise<string>;
|
|
|
49
49
|
* @param submissionId Optional submission ID to associate the file with
|
|
50
50
|
* @returns The direct upload file information with signed URL
|
|
51
51
|
*/
|
|
52
|
-
export declare function createDirectUploadFile(file: DirectFileData, userId: string, directory?: string, assignmentId?: string, submissionId?: string): Promise<DirectUploadFile>;
|
|
52
|
+
export declare function createDirectUploadFile(file: DirectFileData, userId: string, directory?: string, assignmentId?: string, submissionId?: string, announcementId?: string): Promise<DirectUploadFile>;
|
|
53
53
|
/**
|
|
54
54
|
* Confirms a direct upload was successful
|
|
55
55
|
* @param fileId The ID of the file record
|
|
@@ -72,5 +72,5 @@ export declare function updateUploadProgress(fileId: string, progress: number):
|
|
|
72
72
|
* @param submissionId Optional submission ID to associate files with
|
|
73
73
|
* @returns Array of direct upload file information
|
|
74
74
|
*/
|
|
75
|
-
export declare function createDirectUploadFiles(files: DirectFileData[], userId: string, directory?: string, assignmentId?: string, submissionId?: string): Promise<DirectUploadFile[]>;
|
|
75
|
+
export declare function createDirectUploadFiles(files: DirectFileData[], userId: string, directory?: string, assignmentId?: string, submissionId?: string, announcementId?: string): Promise<DirectUploadFile[]>;
|
|
76
76
|
//# sourceMappingURL=fileUpload.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileUpload.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"fileUpload.d.ts","sourceRoot":"/","sources":["lib/fileUpload.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CAEd;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CAEd;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,IAAI,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;CACzB;AAKD;;GAEG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,EAClB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,YAAY,CAAC,CAKvB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,QAAQ,EAAE,EACjB,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,YAAY,EAAE,CAAC,CAKzB;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAUlE;AAED;;;;;;;;GAQG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,EAClB,YAAY,CAAC,EAAE,MAAM,EACrB,YAAY,CAAC,EAAE,MAAM,EACrB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,gBAAgB,CAAC,CA8F3B;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,OAAO,EACtB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CA+Df;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CA8Bf;AAED;;;;;;;;GAQG;AACH,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,cAAc,EAAE,EACvB,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,EAClB,YAAY,CAAC,EAAE,MAAM,EACrB,YAAY,CAAC,EAAE,MAAM,EACrB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAiB7B"}
|
package/dist/lib/fileUpload.js
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
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]="4ff4c0f2-8784-50fe-a248-6adcac3fa659")}catch(e){}}();
|
|
1
3
|
import { TRPCError } from "@trpc/server";
|
|
2
4
|
import { v4 as uuidv4 } from "uuid";
|
|
3
|
-
import { getSignedUrl } from "./googleCloudStorage.js";
|
|
5
|
+
import { getSignedUrl, objectExists } from "./googleCloudStorage.js";
|
|
4
6
|
import { prisma } from "./prisma.js";
|
|
7
|
+
import { logger } from "../utils/logger.js";
|
|
8
|
+
import { env } from "./config/env.js";
|
|
5
9
|
// DEPRECATED: These functions are no longer used - files are uploaded directly to GCS
|
|
6
10
|
// Use createDirectUploadFile() and createDirectUploadFiles() instead
|
|
7
11
|
/**
|
|
@@ -48,7 +52,7 @@ export async function getFileUrl(filePath) {
|
|
|
48
52
|
* @param submissionId Optional submission ID to associate the file with
|
|
49
53
|
* @returns The direct upload file information with signed URL
|
|
50
54
|
*/
|
|
51
|
-
export async function createDirectUploadFile(file, userId, directory, assignmentId, submissionId) {
|
|
55
|
+
export async function createDirectUploadFile(file, userId, directory, assignmentId, submissionId, announcementId) {
|
|
52
56
|
try {
|
|
53
57
|
// Validate file extension matches MIME type
|
|
54
58
|
const fileExtension = file.name.split('.').pop()?.toLowerCase();
|
|
@@ -74,7 +78,7 @@ export async function createDirectUploadFile(file, userId, directory, assignment
|
|
|
74
78
|
// Generate upload session ID
|
|
75
79
|
const uploadSessionId = uuidv4();
|
|
76
80
|
// Generate backend proxy upload URL (not direct GCS)
|
|
77
|
-
const baseUrl =
|
|
81
|
+
const baseUrl = env.BACKEND_URL || 'http://localhost:3001';
|
|
78
82
|
const uploadUrl = `${baseUrl}/api/upload/${encodeURIComponent(filePath)}`;
|
|
79
83
|
const uploadExpiresAt = new Date(Date.now() + 15 * 60 * 1000); // 15 minutes from now
|
|
80
84
|
// Create file record in database with PENDING status
|
|
@@ -105,6 +109,11 @@ export async function createDirectUploadFile(file, userId, directory, assignment
|
|
|
105
109
|
submission: {
|
|
106
110
|
connect: { id: submissionId }
|
|
107
111
|
}
|
|
112
|
+
}),
|
|
113
|
+
...(announcementId && {
|
|
114
|
+
announcement: {
|
|
115
|
+
connect: { id: announcementId }
|
|
116
|
+
}
|
|
108
117
|
})
|
|
109
118
|
},
|
|
110
119
|
});
|
|
@@ -120,7 +129,11 @@ export async function createDirectUploadFile(file, userId, directory, assignment
|
|
|
120
129
|
};
|
|
121
130
|
}
|
|
122
131
|
catch (error) {
|
|
123
|
-
|
|
132
|
+
logger.error('Error creating direct upload file:', { error: error instanceof Error ? {
|
|
133
|
+
name: error.name,
|
|
134
|
+
message: error.message,
|
|
135
|
+
stack: error.stack,
|
|
136
|
+
} : error });
|
|
124
137
|
throw new TRPCError({
|
|
125
138
|
code: 'INTERNAL_SERVER_ERROR',
|
|
126
139
|
message: 'Failed to create direct upload file',
|
|
@@ -135,15 +148,48 @@ export async function createDirectUploadFile(file, userId, directory, assignment
|
|
|
135
148
|
*/
|
|
136
149
|
export async function confirmDirectUpload(fileId, uploadSuccess, errorMessage) {
|
|
137
150
|
try {
|
|
151
|
+
// First fetch the file record to get the object path
|
|
152
|
+
const fileRecord = await prisma.file.findUnique({
|
|
153
|
+
where: { id: fileId },
|
|
154
|
+
select: { path: true }
|
|
155
|
+
});
|
|
156
|
+
if (!fileRecord) {
|
|
157
|
+
throw new TRPCError({
|
|
158
|
+
code: 'NOT_FOUND',
|
|
159
|
+
message: 'File record not found',
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
let actualUploadSuccess = uploadSuccess;
|
|
163
|
+
let actualErrorMessage = errorMessage;
|
|
164
|
+
// If uploadSuccess is true, verify the object actually exists in GCS
|
|
165
|
+
if (uploadSuccess) {
|
|
166
|
+
try {
|
|
167
|
+
const exists = await objectExists(env.GOOGLE_CLOUD_BUCKET_NAME, fileRecord.path);
|
|
168
|
+
if (!exists) {
|
|
169
|
+
actualUploadSuccess = false;
|
|
170
|
+
actualErrorMessage = 'File upload reported as successful but object not found in Google Cloud Storage';
|
|
171
|
+
logger.error(`File upload verification failed for ${fileId}: object ${fileRecord.path} not found in GCS`);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
logger.error(`Error verifying file existence in GCS for ${fileId}:`, { error: error instanceof Error ? {
|
|
176
|
+
name: error.name,
|
|
177
|
+
message: error.message,
|
|
178
|
+
stack: error.stack,
|
|
179
|
+
} : error });
|
|
180
|
+
actualUploadSuccess = false;
|
|
181
|
+
actualErrorMessage = 'Failed to verify file existence in Google Cloud Storage';
|
|
182
|
+
}
|
|
183
|
+
}
|
|
138
184
|
const updateData = {
|
|
139
|
-
uploadStatus:
|
|
140
|
-
uploadProgress:
|
|
185
|
+
uploadStatus: actualUploadSuccess ? 'COMPLETED' : 'FAILED',
|
|
186
|
+
uploadProgress: actualUploadSuccess ? 100 : 0,
|
|
141
187
|
};
|
|
142
|
-
if (!
|
|
143
|
-
updateData.uploadError =
|
|
188
|
+
if (!actualUploadSuccess && actualErrorMessage) {
|
|
189
|
+
updateData.uploadError = actualErrorMessage;
|
|
144
190
|
updateData.uploadRetryCount = { increment: 1 };
|
|
145
191
|
}
|
|
146
|
-
if (
|
|
192
|
+
if (actualUploadSuccess) {
|
|
147
193
|
updateData.uploadedAt = new Date();
|
|
148
194
|
}
|
|
149
195
|
await prisma.file.update({
|
|
@@ -152,7 +198,7 @@ export async function confirmDirectUpload(fileId, uploadSuccess, errorMessage) {
|
|
|
152
198
|
});
|
|
153
199
|
}
|
|
154
200
|
catch (error) {
|
|
155
|
-
|
|
201
|
+
logger.error('Error confirming direct upload:', { error });
|
|
156
202
|
throw new TRPCError({
|
|
157
203
|
code: 'INTERNAL_SERVER_ERROR',
|
|
158
204
|
message: 'Failed to confirm upload',
|
|
@@ -166,16 +212,31 @@ export async function confirmDirectUpload(fileId, uploadSuccess, errorMessage) {
|
|
|
166
212
|
*/
|
|
167
213
|
export async function updateUploadProgress(fileId, progress) {
|
|
168
214
|
try {
|
|
215
|
+
// await prisma.file.update({
|
|
216
|
+
// where: { id: fileId },
|
|
217
|
+
// data: {
|
|
218
|
+
// uploadStatus: 'UPLOADING',
|
|
219
|
+
// uploadProgress: Math.min(100, Math.max(0, progress))
|
|
220
|
+
// }
|
|
221
|
+
// });
|
|
222
|
+
const current = await prisma.file.findUnique({ where: { id: fileId }, select: { uploadStatus: true } });
|
|
223
|
+
if (!current || ['COMPLETED', 'FAILED', 'CANCELLED'].includes(current.uploadStatus))
|
|
224
|
+
return;
|
|
225
|
+
const clamped = Math.min(100, Math.max(0, progress));
|
|
169
226
|
await prisma.file.update({
|
|
170
227
|
where: { id: fileId },
|
|
171
228
|
data: {
|
|
172
229
|
uploadStatus: 'UPLOADING',
|
|
173
|
-
uploadProgress:
|
|
230
|
+
uploadProgress: clamped
|
|
174
231
|
}
|
|
175
232
|
});
|
|
176
233
|
}
|
|
177
234
|
catch (error) {
|
|
178
|
-
|
|
235
|
+
logger.error('Error updating upload progress:', { error: error instanceof Error ? {
|
|
236
|
+
name: error.name,
|
|
237
|
+
message: error.message,
|
|
238
|
+
stack: error.stack,
|
|
239
|
+
} : error });
|
|
179
240
|
throw new TRPCError({
|
|
180
241
|
code: 'INTERNAL_SERVER_ERROR',
|
|
181
242
|
message: 'Failed to update upload progress',
|
|
@@ -191,16 +252,22 @@ export async function updateUploadProgress(fileId, progress) {
|
|
|
191
252
|
* @param submissionId Optional submission ID to associate files with
|
|
192
253
|
* @returns Array of direct upload file information
|
|
193
254
|
*/
|
|
194
|
-
export async function createDirectUploadFiles(files, userId, directory, assignmentId, submissionId) {
|
|
255
|
+
export async function createDirectUploadFiles(files, userId, directory, assignmentId, submissionId, announcementId) {
|
|
195
256
|
try {
|
|
196
|
-
const uploadPromises = files.map(file => createDirectUploadFile(file, userId, directory, assignmentId, submissionId));
|
|
257
|
+
const uploadPromises = files.map(file => createDirectUploadFile(file, userId, directory, assignmentId, submissionId, announcementId));
|
|
197
258
|
return await Promise.all(uploadPromises);
|
|
198
259
|
}
|
|
199
260
|
catch (error) {
|
|
200
|
-
|
|
261
|
+
logger.error('Error creating direct upload files:', { error: error instanceof Error ? {
|
|
262
|
+
name: error.name,
|
|
263
|
+
message: error.message,
|
|
264
|
+
stack: error.stack,
|
|
265
|
+
} : error });
|
|
201
266
|
throw new TRPCError({
|
|
202
267
|
code: 'INTERNAL_SERVER_ERROR',
|
|
203
268
|
message: 'Failed to create direct upload files',
|
|
204
269
|
});
|
|
205
270
|
}
|
|
206
271
|
}
|
|
272
|
+
//# sourceMappingURL=fileUpload.js.map
|
|
273
|
+
//# debugId=4ff4c0f2-8784-50fe-a248-6adcac3fa659
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileUpload.js","sources":["lib/fileUpload.ts"],"sourceRoot":"/","sourcesContent":["import { TRPCError } from \"@trpc/server\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { getSignedUrl, objectExists } from \"./googleCloudStorage.js\";\nimport { prisma } from \"./prisma.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { env } from \"./config/env.js\";\n\nexport interface FileData {\n name: string;\n type: string;\n size: number;\n // No data field - for direct file uploads\n}\n\nexport interface DirectFileData {\n name: string;\n type: string;\n size: number;\n // No data field - for direct file uploads\n}\n\nexport interface UploadedFile {\n id: string;\n name: string;\n type: string;\n size: number;\n path: string;\n thumbnailId?: string;\n}\n\nexport interface DirectUploadFile {\n id: string;\n name: string;\n type: string;\n size: number;\n path: string;\n uploadUrl: string;\n uploadExpiresAt: Date;\n uploadSessionId: string;\n}\n\n// DEPRECATED: These functions are no longer used - files are uploaded directly to GCS\n// Use createDirectUploadFile() and createDirectUploadFiles() instead\n\n/**\n * @deprecated Use createDirectUploadFile instead\n */\nexport async function uploadFile(\n file: FileData,\n userId: string,\n directory?: string,\n assignmentId?: string\n): Promise<UploadedFile> {\n throw new TRPCError({\n code: 'NOT_IMPLEMENTED',\n message: 'uploadFile is deprecated. Use createDirectUploadFile instead.',\n });\n}\n\n/**\n * @deprecated Use createDirectUploadFiles instead\n */\nexport async function uploadFiles(\n files: FileData[], \n userId: string,\n directory?: string\n): Promise<UploadedFile[]> {\n throw new TRPCError({\n code: 'NOT_IMPLEMENTED',\n message: 'uploadFiles is deprecated. Use createDirectUploadFiles instead.',\n });\n}\n\n/**\n * Gets a signed URL for a file\n * @param filePath The path of the file in Google Cloud Storage\n * @returns The signed URL\n */\nexport async function getFileUrl(filePath: string): Promise<string> {\n try {\n return await getSignedUrl(filePath);\n } catch (error) {\n console.error('Error getting signed URL:', error);\n throw new TRPCError({\n code: 'INTERNAL_SERVER_ERROR',\n message: 'Failed to get file URL',\n });\n }\n}\n\n/**\n * Creates a file record for direct upload and generates signed URL\n * @param file The file metadata (no base64 data)\n * @param userId The ID of the user uploading the file\n * @param directory Optional directory to store the file in\n * @param assignmentId Optional assignment ID to associate the file with\n * @param submissionId Optional submission ID to associate the file with\n * @returns The direct upload file information with signed URL\n */\nexport async function createDirectUploadFile(\n file: DirectFileData,\n userId: string,\n directory?: string,\n assignmentId?: string,\n submissionId?: string,\n announcementId?: string\n): Promise<DirectUploadFile> {\n try {\n // Validate file extension matches MIME type\n const fileExtension = file.name.split('.').pop()?.toLowerCase();\n const mimeType = file.type.toLowerCase();\n \n const extensionMimeMap: Record<string, string[]> = {\n 'jpg': ['image/jpeg'],\n 'jpeg': ['image/jpeg'],\n 'png': ['image/png'],\n 'gif': ['image/gif'],\n 'webp': ['image/webp']\n };\n \n if (fileExtension && extensionMimeMap[fileExtension]) {\n if (!extensionMimeMap[fileExtension].includes(mimeType)) {\n throw new Error(`File extension .${fileExtension} does not match MIME type ${mimeType}`);\n }\n }\n \n // Create a unique filename\n const uniqueFilename = `${uuidv4()}.${fileExtension}`;\n \n // Construct the full path\n const filePath = directory \n ? `${directory}/${uniqueFilename}`\n : uniqueFilename;\n \n // Generate upload session ID\n const uploadSessionId = uuidv4();\n \n // Generate backend proxy upload URL (not direct GCS)\n const baseUrl = env.BACKEND_URL || 'http://localhost:3001';\n const uploadUrl = `${baseUrl}/api/upload/${encodeURIComponent(filePath)}`;\n const uploadExpiresAt = new Date(Date.now() + 15 * 60 * 1000); // 15 minutes from now\n \n // Create file record in database with PENDING status\n const fileRecord = await prisma.file.create({\n data: {\n name: file.name,\n type: file.type,\n size: file.size,\n path: filePath,\n uploadStatus: 'PENDING',\n uploadUrl,\n uploadExpiresAt,\n uploadSessionId,\n user: {\n connect: { id: userId }\n },\n ...(directory && {\n folder: {\n connect: {id: directory},\n },\n }),\n ...(assignmentId && {\n assignment: {\n connect: { id: assignmentId }\n }\n }),\n ...(submissionId && {\n submission: {\n connect: { id: submissionId }\n }\n }),\n ...(announcementId && {\n announcement: {\n connect: { id: announcementId }\n }\n })\n },\n });\n \n return {\n id: fileRecord.id,\n name: file.name,\n type: file.type,\n size: file.size,\n path: filePath,\n uploadUrl,\n uploadExpiresAt,\n uploadSessionId\n };\n } catch (error) {\n logger.error('Error creating direct upload file:', {error: error instanceof Error ? {\n name: error.name,\n message: error.message,\n stack: error.stack,\n } : error});\n throw new TRPCError({\n code: 'INTERNAL_SERVER_ERROR',\n message: 'Failed to create direct upload file',\n });\n }\n}\n\n/**\n * Confirms a direct upload was successful\n * @param fileId The ID of the file record\n * @param uploadSuccess Whether the upload was successful\n * @param errorMessage Optional error message if upload failed\n */\nexport async function confirmDirectUpload(\n fileId: string,\n uploadSuccess: boolean,\n errorMessage?: string\n): Promise<void> {\n try {\n // First fetch the file record to get the object path\n const fileRecord = await prisma.file.findUnique({\n where: { id: fileId },\n select: { path: true }\n });\n\n if (!fileRecord) {\n throw new TRPCError({\n code: 'NOT_FOUND',\n message: 'File record not found',\n });\n }\n\n let actualUploadSuccess = uploadSuccess;\n let actualErrorMessage = errorMessage;\n\n // If uploadSuccess is true, verify the object actually exists in GCS\n if (uploadSuccess) {\n try {\n const exists = await objectExists(env.GOOGLE_CLOUD_BUCKET_NAME!, fileRecord.path);\n if (!exists) {\n actualUploadSuccess = false;\n actualErrorMessage = 'File upload reported as successful but object not found in Google Cloud Storage';\n logger.error(`File upload verification failed for ${fileId}: object ${fileRecord.path} not found in GCS`);\n }\n } catch (error) {\n logger.error(`Error verifying file existence in GCS for ${fileId}:`, {error: error instanceof Error ? {\n name: error.name,\n message: error.message,\n stack: error.stack,\n } : error});\n actualUploadSuccess = false;\n actualErrorMessage = 'Failed to verify file existence in Google Cloud Storage';\n }\n }\n\n const updateData: any = {\n uploadStatus: actualUploadSuccess ? 'COMPLETED' : 'FAILED',\n uploadProgress: actualUploadSuccess ? 100 : 0,\n };\n \n if (!actualUploadSuccess && actualErrorMessage) {\n updateData.uploadError = actualErrorMessage;\n updateData.uploadRetryCount = { increment: 1 };\n }\n \n if (actualUploadSuccess) {\n updateData.uploadedAt = new Date();\n }\n \n await prisma.file.update({\n where: { id: fileId },\n data: updateData\n });\n } catch (error) {\n logger.error('Error confirming direct upload:', {error});\n throw new TRPCError({\n code: 'INTERNAL_SERVER_ERROR',\n message: 'Failed to confirm upload',\n });\n }\n}\n\n/**\n * Updates upload progress for a direct upload\n * @param fileId The ID of the file record\n * @param progress Progress percentage (0-100)\n */\nexport async function updateUploadProgress(\n fileId: string,\n progress: number\n): Promise<void> {\n try {\n // await prisma.file.update({\n // where: { id: fileId },\n // data: {\n // uploadStatus: 'UPLOADING',\n // uploadProgress: Math.min(100, Math.max(0, progress))\n // }\n // });\n const current = await prisma.file.findUnique({ where: { id: fileId }, select: { uploadStatus: true } });\n if (!current || ['COMPLETED','FAILED','CANCELLED'].includes(current.uploadStatus as string)) return;\n const clamped = Math.min(100, Math.max(0, progress));\n await prisma.file.update({\n where: { id: fileId },\n data: {\n uploadStatus: 'UPLOADING',\n uploadProgress: clamped\n }\n });\n } catch (error) {\n logger.error('Error updating upload progress:', {error: error instanceof Error ? {\n name: error.name,\n message: error.message,\n stack: error.stack,\n } : error}); \n throw new TRPCError({\n code: 'INTERNAL_SERVER_ERROR',\n message: 'Failed to update upload progress',\n });\n }\n}\n\n/**\n * Creates multiple direct upload files\n * @param files Array of file metadata\n * @param userId The ID of the user uploading the files\n * @param directory Optional subdirectory to store the files in\n * @param assignmentId Optional assignment ID to associate files with\n * @param submissionId Optional submission ID to associate files with\n * @returns Array of direct upload file information\n */\nexport async function createDirectUploadFiles(\n files: DirectFileData[], \n userId: string,\n directory?: string,\n assignmentId?: string,\n submissionId?: string,\n announcementId?: string\n): Promise<DirectUploadFile[]> {\n try {\n const uploadPromises = files.map(file => \n createDirectUploadFile(file, userId, directory, assignmentId, submissionId, announcementId)\n );\n return await Promise.all(uploadPromises);\n } catch (error) {\n logger.error('Error creating direct upload files:', {error: error instanceof Error ? {\n name: error.name,\n message: error.message,\n stack: error.stack,\n } : error});\n throw new TRPCError({\n code: 'INTERNAL_SERVER_ERROR',\n message: 'Failed to create direct upload files',\n });\n }\n}"],"names":[],"mappings":"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","debug_id":"4ff4c0f2-8784-50fe-a248-6adcac3fa659"}
|
|
@@ -10,4 +10,17 @@ export declare function getSignedUrl(filePath: string, action?: 'read' | 'write'
|
|
|
10
10
|
* @param filePath The path of the file to delete
|
|
11
11
|
*/
|
|
12
12
|
export declare function deleteFile(filePath: string): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Checks if an object exists in Google Cloud Storage
|
|
15
|
+
* @param bucketName The name of the bucket (unused, uses default bucket)
|
|
16
|
+
* @param objectPath The path of the object to check
|
|
17
|
+
* @returns Promise<boolean> True if the object exists, false otherwise
|
|
18
|
+
*/
|
|
19
|
+
export declare function objectExists(bucketName: string, objectPath: string): Promise<boolean>;
|
|
20
|
+
/**
|
|
21
|
+
* Copies a file within the same bucket to a new path
|
|
22
|
+
* @param sourcePath The GCS path of the source file
|
|
23
|
+
* @param destPath The GCS path for the destination
|
|
24
|
+
*/
|
|
25
|
+
export declare function copyFile(sourcePath: string, destPath: string): Promise<void>;
|
|
13
26
|
//# sourceMappingURL=googleCloudStorage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"googleCloudStorage.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"googleCloudStorage.d.ts","sourceRoot":"/","sources":["lib/googleCloudStorage.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,MAAM,wCAAgD,CAAC;AAQpE;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,GAAG,OAAgB,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAsB7H;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUhE;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAW3F;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUlF"}
|