@studious-lms/server 1.2.53 → 1.4.0
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 +9 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +102 -8
- package/dist/index.js.map +1 -1
- package/dist/lib/config/env.d.ts +21 -0
- package/dist/lib/config/env.d.ts.map +1 -1
- package/dist/lib/config/env.js +8 -2
- package/dist/lib/config/env.js.map +1 -1
- package/dist/lib/fileUpload.d.ts.map +1 -1
- package/dist/lib/fileUpload.js +2 -2
- package/dist/lib/fileUpload.js.map +1 -1
- package/dist/lib/googleCloudStorage.d.ts +6 -0
- package/dist/lib/googleCloudStorage.d.ts.map +1 -1
- package/dist/lib/googleCloudStorage.js +19 -2
- package/dist/lib/googleCloudStorage.js.map +1 -1
- package/dist/lib/pusher.d.ts +4 -1
- package/dist/lib/pusher.d.ts.map +1 -1
- package/dist/lib/pusher.js +6 -3
- package/dist/lib/pusher.js.map +1 -1
- 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 +157 -160
- package/dist/lib/thumbnailGenerator.js.map +1 -1
- package/dist/middleware/auth.d.ts.map +1 -1
- package/dist/middleware/auth.js +33 -95
- package/dist/middleware/auth.js.map +1 -1
- 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 +461 -0
- package/dist/models/class.d.ts.map +1 -0
- package/dist/models/class.js +645 -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 +76 -0
- package/dist/pipelines/aiLabChat.d.ts.map +1 -0
- package/dist/pipelines/aiLabChat.js +599 -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 +1523 -1315
- package/dist/routers/_app.d.ts.map +1 -1
- package/dist/routers/agenda.d.ts +22 -22
- package/dist/routers/agenda.d.ts.map +1 -1
- package/dist/routers/agenda.js +4 -65
- package/dist/routers/agenda.js.map +1 -1
- package/dist/routers/announcement.d.ts +16 -16
- package/dist/routers/announcement.d.ts.map +1 -1
- package/dist/routers/announcement.js +37 -446
- package/dist/routers/announcement.js.map +1 -1
- package/dist/routers/assignment.d.ts +300 -378
- package/dist/routers/assignment.d.ts.map +1 -1
- package/dist/routers/assignment.js +78 -1868
- package/dist/routers/assignment.js.map +1 -1
- package/dist/routers/attendance.d.ts +19 -9
- package/dist/routers/attendance.d.ts.map +1 -1
- package/dist/routers/attendance.js +7 -264
- package/dist/routers/attendance.js.map +1 -1
- package/dist/routers/auth.d.ts +2 -2
- package/dist/routers/auth.d.ts.map +1 -1
- package/dist/routers/auth.js +29 -354
- package/dist/routers/auth.js.map +1 -1
- package/dist/routers/class.d.ts +160 -68
- package/dist/routers/class.d.ts.map +1 -1
- package/dist/routers/class.js +82 -1052
- package/dist/routers/class.js.map +1 -1
- package/dist/routers/comment.d.ts +6 -42
- package/dist/routers/comment.d.ts.map +1 -1
- package/dist/routers/comment.js +24 -244
- package/dist/routers/comment.js.map +1 -1
- package/dist/routers/conversation.d.ts +45 -7
- package/dist/routers/conversation.d.ts.map +1 -1
- package/dist/routers/conversation.js +19 -327
- package/dist/routers/conversation.js.map +1 -1
- package/dist/routers/event.d.ts +36 -36
- package/dist/routers/event.d.ts.map +1 -1
- package/dist/routers/event.js +13 -433
- package/dist/routers/event.js.map +1 -1
- package/dist/routers/file.d.ts +2 -2
- package/dist/routers/file.d.ts.map +1 -1
- package/dist/routers/file.js +9 -323
- package/dist/routers/file.js.map +1 -1
- package/dist/routers/folder.d.ts +21 -14
- package/dist/routers/folder.d.ts.map +1 -1
- package/dist/routers/folder.js +34 -745
- package/dist/routers/folder.js.map +1 -1
- package/dist/routers/labChat.d.ts +21 -11
- package/dist/routers/labChat.d.ts.map +1 -1
- package/dist/routers/labChat.js +22 -570
- package/dist/routers/labChat.js.map +1 -1
- package/dist/routers/marketing.d.ts +1 -1
- package/dist/routers/marketing.d.ts.map +1 -1
- package/dist/routers/marketing.js +7 -56
- package/dist/routers/marketing.js.map +1 -1
- package/dist/routers/message.d.ts +13 -2
- package/dist/routers/message.d.ts.map +1 -1
- package/dist/routers/message.js +32 -520
- package/dist/routers/message.js.map +1 -1
- package/dist/routers/newtonChat.d.ts +1 -1
- package/dist/routers/newtonChat.d.ts.map +1 -1
- package/dist/routers/newtonChat.js +7 -246
- package/dist/routers/newtonChat.js.map +1 -1
- package/dist/routers/notifications.d.ts +4 -4
- package/dist/routers/notifications.d.ts.map +1 -1
- package/dist/routers/notifications.js +18 -83
- package/dist/routers/notifications.js.map +1 -1
- package/dist/routers/section.d.ts +4 -4
- package/dist/routers/section.d.ts.map +1 -1
- package/dist/routers/section.js +14 -286
- package/dist/routers/section.js.map +1 -1
- package/dist/routers/user.d.ts +1 -1
- package/dist/routers/user.d.ts.map +1 -1
- package/dist/routers/user.js +32 -207
- package/dist/routers/user.js.map +1 -1
- package/dist/routers/worksheet.d.ts +68 -55
- package/dist/routers/worksheet.d.ts.map +1 -1
- package/dist/routers/worksheet.js +79 -394
- package/dist/routers/worksheet.js.map +1 -1
- package/dist/seedDatabase.d.ts +1 -1
- package/dist/server/pipelines/gradeWorksheet.d.ts +6 -6
- package/dist/server/pipelines/gradeWorksheet.d.ts.map +1 -1
- package/dist/server/pipelines/gradeWorksheet.js +12 -5
- package/dist/server/pipelines/gradeWorksheet.js.map +1 -1
- 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 +643 -0
- package/dist/services/class.d.ts.map +1 -0
- package/dist/services/class.js +486 -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 +169 -0
- package/dist/services/labChat.d.ts.map +1 -0
- package/dist/services/labChat.js +381 -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 +103 -0
- package/dist/services/message.d.ts.map +1 -0
- package/dist/services/message.js +422 -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/utils/aiUser.d.ts +1 -3
- package/dist/utils/aiUser.d.ts.map +1 -1
- package/dist/utils/aiUser.js +6 -5
- package/dist/utils/aiUser.js.map +1 -1
- package/dist/utils/email.d.ts +3 -0
- package/dist/utils/email.d.ts.map +1 -1
- package/dist/utils/email.js +7 -4
- package/dist/utils/email.js.map +1 -1
- package/dist/utils/generateInviteCode.d.ts +1 -2
- package/dist/utils/generateInviteCode.d.ts.map +1 -1
- package/dist/utils/generateInviteCode.js +3 -4
- package/dist/utils/generateInviteCode.js.map +1 -1
- package/dist/utils/inference.d.ts +3 -0
- package/dist/utils/inference.d.ts.map +1 -1
- package/dist/utils/inference.js +7 -4
- package/dist/utils/inference.js.map +1 -1
- package/dist/utils/logger.d.ts +3 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +5 -2
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/prismaErrorHandler.d.ts.map +1 -1
- package/dist/utils/prismaErrorHandler.js +5 -2
- package/dist/utils/prismaErrorHandler.js.map +1 -1
- package/dist/utils/prismaWrapper.d.ts +1 -0
- package/dist/utils/prismaWrapper.d.ts.map +1 -1
- package/dist/utils/prismaWrapper.js +6 -2
- package/dist/utils/prismaWrapper.js.map +1 -1
- package/docker-compose.yml +5 -0
- package/package.json +4 -3
- package/prisma/schema.prisma +1 -1
- package/src/index.ts +119 -12
- package/src/lib/config/env.ts +6 -0
- package/src/lib/fileUpload.ts +0 -1
- package/src/lib/googleCloudStorage.ts +17 -0
- package/src/lib/pusher.ts +5 -1
- package/src/lib/redis.ts +56 -0
- package/src/lib/thumbnailGenerator.ts +170 -168
- package/src/middleware/auth.ts +80 -137
- 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 +703 -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 +684 -0
- package/src/{server/pipelines → pipelines}/aiNewtonChat.ts +9 -5
- package/src/{server/pipelines → pipelines}/gradeWorksheet.ts +25 -14
- package/src/routers/agenda.ts +3 -66
- package/src/routers/announcement.ts +54 -495
- package/src/routers/assignment.ts +126 -2018
- package/src/routers/attendance.ts +15 -276
- package/src/routers/auth.ts +79 -442
- package/src/routers/class.ts +263 -1187
- package/src/routers/comment.ts +61 -288
- package/src/routers/conversation.ts +51 -360
- package/src/routers/event.ts +50 -481
- package/src/routers/file.ts +45 -368
- package/src/routers/folder.ts +107 -836
- package/src/routers/labChat.ts +35 -604
- package/src/routers/marketing.ts +35 -77
- package/src/routers/message.ts +54 -567
- package/src/routers/newtonChat.ts +17 -278
- package/src/routers/notifications.ts +32 -82
- package/src/routers/section.ts +46 -330
- package/src/routers/user.ts +49 -227
- package/src/routers/worksheet.ts +215 -503
- 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 +629 -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 +458 -0
- package/src/services/marketing.ts +57 -0
- package/src/services/message.ts +554 -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/utils/aiUser.ts +4 -3
- package/src/utils/email.ts +5 -3
- package/src/utils/generateInviteCode.ts +1 -3
- package/src/utils/inference.ts +5 -2
- package/src/utils/logger.ts +3 -1
- 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/{attendance.test.ts → routers/attendance.test.ts} +6 -14
- package/tests/routers/auth.test.ts +171 -0
- package/tests/{class.test.ts → routers/class.test.ts} +131 -85
- package/tests/routers/comment.test.ts +126 -0
- package/tests/routers/conversation.test.ts +145 -0
- package/tests/{event.test.ts → routers/event.test.ts} +93 -32
- 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/{section.test.ts → routers/section.test.ts} +5 -13
- package/tests/server/rateLimit.test.ts +73 -0
- package/tests/setup.ts +18 -92
- package/tests/user.test.ts +9 -31
- 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/vitest.config.ts +6 -3
- package/vitest.unit.config.ts +21 -0
- package/TODO.md +0 -2
- package/coverage/base.css +0 -224
- package/coverage/block-navigation.js +0 -87
- package/coverage/clover.xml +0 -12110
- package/coverage/coverage-final.json +0 -44
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +0 -221
- package/coverage/prettify.css +0 -1
- package/coverage/prettify.js +0 -2
- package/coverage/server/index.html +0 -116
- package/coverage/server/src/exportType.ts.html +0 -109
- package/coverage/server/src/index.html +0 -161
- package/coverage/server/src/index.ts.html +0 -1702
- package/coverage/server/src/instrument.ts.html +0 -130
- package/coverage/server/src/lib/config/env.ts.html +0 -448
- package/coverage/server/src/lib/config/index.html +0 -116
- package/coverage/server/src/lib/fileUpload.ts.html +0 -1138
- package/coverage/server/src/lib/googleCloudStorage.ts.html +0 -334
- package/coverage/server/src/lib/index.html +0 -206
- package/coverage/server/src/lib/jsonConversion.ts.html +0 -2323
- package/coverage/server/src/lib/jsonStyles.ts.html +0 -193
- package/coverage/server/src/lib/notificationHandler.ts.html +0 -193
- package/coverage/server/src/lib/pusher.ts.html +0 -121
- package/coverage/server/src/lib/thumbnailGenerator.ts.html +0 -592
- package/coverage/server/src/middleware/auth.ts.html +0 -646
- package/coverage/server/src/middleware/index.html +0 -146
- package/coverage/server/src/middleware/logging.ts.html +0 -244
- package/coverage/server/src/middleware/security.ts.html +0 -271
- package/coverage/server/src/routers/_app.ts.html +0 -232
- package/coverage/server/src/routers/agenda.ts.html +0 -319
- package/coverage/server/src/routers/announcement.ts.html +0 -3481
- package/coverage/server/src/routers/assignment.ts.html +0 -7633
- package/coverage/server/src/routers/attendance.ts.html +0 -1030
- package/coverage/server/src/routers/auth.ts.html +0 -1081
- package/coverage/server/src/routers/class.ts.html +0 -3535
- package/coverage/server/src/routers/comment.ts.html +0 -991
- package/coverage/server/src/routers/conversation.ts.html +0 -982
- package/coverage/server/src/routers/event.ts.html +0 -1609
- package/coverage/server/src/routers/file.ts.html +0 -1144
- package/coverage/server/src/routers/folder.ts.html +0 -2797
- package/coverage/server/src/routers/index.html +0 -386
- package/coverage/server/src/routers/labChat.ts.html +0 -3073
- package/coverage/server/src/routers/marketing.ts.html +0 -340
- package/coverage/server/src/routers/message.ts.html +0 -1912
- package/coverage/server/src/routers/notifications.ts.html +0 -364
- package/coverage/server/src/routers/section.ts.html +0 -1120
- package/coverage/server/src/routers/user.ts.html +0 -862
- package/coverage/server/src/routers/worksheet.ts.html +0 -1729
- package/coverage/server/src/trpc.ts.html +0 -397
- package/coverage/server/src/types/index.html +0 -116
- package/coverage/server/src/types/trpc.ts.html +0 -127
- package/coverage/server/src/utils/aiUser.ts.html +0 -280
- package/coverage/server/src/utils/email.ts.html +0 -121
- package/coverage/server/src/utils/generateInviteCode.ts.html +0 -106
- package/coverage/server/src/utils/index.html +0 -206
- package/coverage/server/src/utils/inference.ts.html +0 -709
- package/coverage/server/src/utils/logger.ts.html +0 -664
- package/coverage/server/src/utils/prismaErrorHandler.ts.html +0 -907
- package/coverage/server/src/utils/prismaWrapper.ts.html +0 -355
- package/coverage/server/vitest.config.ts.html +0 -196
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +0 -210
- package/src/lib/notificationHandler.ts +0 -36
- package/src/server/pipelines/aiLabChat.ts +0 -507
- package/tests/announcement.test.ts +0 -164
- package/tests/assignment.test.ts +0 -296
- package/tests/auth.test.ts +0 -48
|
@@ -1,162 +1,159 @@
|
|
|
1
|
+
"use strict";
|
|
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]="8a494bec-8974-5f11-ae01-d96a89e7d69b")}catch(e){}}();
|
|
1
3
|
|
|
2
|
-
|
|
3
|
-
import sharp from 'sharp';
|
|
4
|
-
import {
|
|
5
|
-
//
|
|
6
|
-
|
|
7
|
-
const
|
|
8
|
-
//
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
async function generateGenericThumbnail(fileType) {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
* @param userId The user ID who owns the file
|
|
157
|
-
* @returns The ID of the created thumbnail File
|
|
158
|
-
*/
|
|
159
|
-
// DEPRECATED: This function is no longer used - thumbnails are generated during direct uploads
|
|
160
|
-
// Thumbnail generation is now handled in the direct upload flow
|
|
4
|
+
// @deprecated: this is not used anymore
|
|
5
|
+
// import sharp from 'sharp';
|
|
6
|
+
// import { prisma } from './prisma.js';
|
|
7
|
+
// import { deleteFile, getSignedUrl } from './googleCloudStorage.js';
|
|
8
|
+
// // Thumbnail size configuration
|
|
9
|
+
// const THUMBNAIL_WIDTH = 200;
|
|
10
|
+
// const THUMBNAIL_HEIGHT = 200;
|
|
11
|
+
// // File type configurations
|
|
12
|
+
// const SUPPORTED_IMAGE_TYPES = [
|
|
13
|
+
// 'image/jpeg',
|
|
14
|
+
// 'image/png',
|
|
15
|
+
// 'image/gif',
|
|
16
|
+
// 'image/webp',
|
|
17
|
+
// 'image/tiff',
|
|
18
|
+
// 'image/bmp',
|
|
19
|
+
// 'image/avif'
|
|
20
|
+
// ];
|
|
21
|
+
// const DOCUMENT_TYPES = [
|
|
22
|
+
// 'application/pdf',
|
|
23
|
+
// 'application/msword',
|
|
24
|
+
// 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', // .docx
|
|
25
|
+
// 'application/vnd.ms-excel',
|
|
26
|
+
// 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', // .xlsx
|
|
27
|
+
// 'application/vnd.ms-powerpoint',
|
|
28
|
+
// 'application/vnd.openxmlformats-officedocument.presentationml.presentation', // .pptx
|
|
29
|
+
// 'text/plain',
|
|
30
|
+
// 'text/csv',
|
|
31
|
+
// 'application/json',
|
|
32
|
+
// 'text/html',
|
|
33
|
+
// 'text/javascript',
|
|
34
|
+
// 'text/css'
|
|
35
|
+
// ];
|
|
36
|
+
// const VIDEO_TYPES = [
|
|
37
|
+
// 'video/mp4',
|
|
38
|
+
// 'video/webm',
|
|
39
|
+
// 'video/ogg',
|
|
40
|
+
// 'video/quicktime'
|
|
41
|
+
// ];
|
|
42
|
+
// const AUDIO_TYPES = [
|
|
43
|
+
// 'audio/mpeg',
|
|
44
|
+
// 'audio/ogg',
|
|
45
|
+
// 'audio/wav',
|
|
46
|
+
// 'audio/webm'
|
|
47
|
+
// ];
|
|
48
|
+
// /**
|
|
49
|
+
// * Generates a thumbnail for an image or PDF file
|
|
50
|
+
// * @param fileBuffer The file buffer
|
|
51
|
+
// * @param fileType The MIME type of the file
|
|
52
|
+
// * @returns Thumbnail buffer
|
|
53
|
+
// */
|
|
54
|
+
// export async function generateMediaThumbnail(fileBuffer: Buffer, fileType: string): Promise<Buffer> {
|
|
55
|
+
// if (fileType === 'application/pdf') {
|
|
56
|
+
// // For PDFs, we need to use a different approach
|
|
57
|
+
// try {
|
|
58
|
+
// return await sharp(fileBuffer, {
|
|
59
|
+
// density: 300, // Higher density for better quality
|
|
60
|
+
// page: 0 // First page only
|
|
61
|
+
// })
|
|
62
|
+
// .resize(THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT, {
|
|
63
|
+
// fit: 'inside',
|
|
64
|
+
// withoutEnlargement: true,
|
|
65
|
+
// })
|
|
66
|
+
// .jpeg({ quality: 80 })
|
|
67
|
+
// .toBuffer();
|
|
68
|
+
// } catch (error) {
|
|
69
|
+
// console.warn('Failed to generate PDF thumbnail:', error);
|
|
70
|
+
// return generateGenericThumbnail(fileType);
|
|
71
|
+
// }
|
|
72
|
+
// }
|
|
73
|
+
// // For regular images
|
|
74
|
+
// return sharp(fileBuffer)
|
|
75
|
+
// .resize(THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT, {
|
|
76
|
+
// fit: 'inside',
|
|
77
|
+
// withoutEnlargement: true,
|
|
78
|
+
// })
|
|
79
|
+
// .jpeg({ quality: 80 })
|
|
80
|
+
// .toBuffer();
|
|
81
|
+
// }
|
|
82
|
+
// /**
|
|
83
|
+
// * Generates a generic icon-based thumbnail for a file type
|
|
84
|
+
// * @param fileType The MIME type of the file
|
|
85
|
+
// * @returns Thumbnail buffer
|
|
86
|
+
// */
|
|
87
|
+
// async function generateGenericThumbnail(fileType: string): Promise<Buffer> {
|
|
88
|
+
// // Create a blank canvas with a colored background based on file type
|
|
89
|
+
// const canvas = sharp({
|
|
90
|
+
// create: {
|
|
91
|
+
// width: THUMBNAIL_WIDTH,
|
|
92
|
+
// height: THUMBNAIL_HEIGHT,
|
|
93
|
+
// channels: 4,
|
|
94
|
+
// background: { r: 245, g: 245, b: 245, alpha: 1 }
|
|
95
|
+
// }
|
|
96
|
+
// });
|
|
97
|
+
// // Add a colored overlay based on file type
|
|
98
|
+
// let color = { r: 200, g: 200, b: 200, alpha: 0.5 }; // Default gray
|
|
99
|
+
// if (DOCUMENT_TYPES.includes(fileType)) {
|
|
100
|
+
// color = { r: 52, g: 152, b: 219, alpha: 0.5 }; // Blue for documents
|
|
101
|
+
// } else if (VIDEO_TYPES.includes(fileType)) {
|
|
102
|
+
// color = { r: 231, g: 76, b: 60, alpha: 0.5 }; // Red for videos
|
|
103
|
+
// } else if (AUDIO_TYPES.includes(fileType)) {
|
|
104
|
+
// color = { r: 46, g: 204, b: 113, alpha: 0.5 }; // Green for audio
|
|
105
|
+
// }
|
|
106
|
+
// return canvas
|
|
107
|
+
// .composite([{
|
|
108
|
+
// input: Buffer.from([color.r, color.g, color.b, Math.floor(color.alpha * 255)]),
|
|
109
|
+
// raw: {
|
|
110
|
+
// width: 1,
|
|
111
|
+
// height: 1,
|
|
112
|
+
// channels: 4
|
|
113
|
+
// },
|
|
114
|
+
// tile: true,
|
|
115
|
+
// blend: 'overlay'
|
|
116
|
+
// }])
|
|
117
|
+
// .jpeg({ quality: 80 })
|
|
118
|
+
// .toBuffer();
|
|
119
|
+
// }
|
|
120
|
+
// /**
|
|
121
|
+
// * Generates a thumbnail for a file
|
|
122
|
+
// * @param fileName The name of the file in Google Cloud Storage
|
|
123
|
+
// * @param fileType The MIME type of the file
|
|
124
|
+
// * @returns The thumbnail buffer or null if thumbnail generation is not supported
|
|
125
|
+
// */
|
|
126
|
+
// export async function generateThumbnail(fileName: string, fileType: string): Promise<Buffer | null> {
|
|
127
|
+
// try {
|
|
128
|
+
// const signedUrl = await getSignedUrl(fileName);
|
|
129
|
+
// const response = await fetch(signedUrl);
|
|
130
|
+
// if (!response.ok) {
|
|
131
|
+
// throw new Error(`Failed to download file from storage: ${response.status} ${response.statusText}`);
|
|
132
|
+
// }
|
|
133
|
+
// const fileBuffer = await response.arrayBuffer();
|
|
134
|
+
// if (SUPPORTED_IMAGE_TYPES.includes(fileType) || fileType === 'application/pdf') {
|
|
135
|
+
// try {
|
|
136
|
+
// const thumbnail = await generateMediaThumbnail(Buffer.from(fileBuffer), fileType);
|
|
137
|
+
// return thumbnail;
|
|
138
|
+
// } catch (error) {
|
|
139
|
+
// return generateGenericThumbnail(fileType);
|
|
140
|
+
// }
|
|
141
|
+
// } else if ([...DOCUMENT_TYPES, ...VIDEO_TYPES, ...AUDIO_TYPES].includes(fileType)) {
|
|
142
|
+
// return generateGenericThumbnail(fileType);
|
|
143
|
+
// }
|
|
144
|
+
// return null; // Unsupported file type
|
|
145
|
+
// } catch (error) {
|
|
146
|
+
// return null;
|
|
147
|
+
// }
|
|
148
|
+
// }
|
|
149
|
+
// /**
|
|
150
|
+
// * Stores a thumbnail in Google Cloud Storage and creates a File entry
|
|
151
|
+
// * @param thumbnailBuffer The thumbnail buffer to store
|
|
152
|
+
// * @param originalFileName The original file name
|
|
153
|
+
// * @param userId The user ID who owns the file
|
|
154
|
+
// * @returns The ID of the created thumbnail File
|
|
155
|
+
// */
|
|
156
|
+
// // DEPRECATED: This function is no longer used - thumbnails are generated during direct uploads
|
|
157
|
+
// // Thumbnail generation is now handled in the direct upload flow
|
|
161
158
|
//# sourceMappingURL=thumbnailGenerator.js.map
|
|
162
|
-
//# debugId=
|
|
159
|
+
//# debugId=8a494bec-8974-5f11-ae01-d96a89e7d69b
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thumbnailGenerator.js","sources":["lib/thumbnailGenerator.ts"],"sourceRoot":"/","sourcesContent":["import sharp from 'sharp';\
|
|
1
|
+
{"version":3,"file":"thumbnailGenerator.js","sources":["lib/thumbnailGenerator.ts"],"sourceRoot":"/","sourcesContent":["// @deprecated: this is not used anymore\n\n// import sharp from 'sharp';\n// import { prisma } from './prisma.js';\n// import { deleteFile, getSignedUrl } from './googleCloudStorage.js';\n\n// // Thumbnail size configuration\n// const THUMBNAIL_WIDTH = 200;\n// const THUMBNAIL_HEIGHT = 200;\n\n// // File type configurations\n// const SUPPORTED_IMAGE_TYPES = [\n// 'image/jpeg',\n// 'image/png',\n// 'image/gif',\n// 'image/webp',\n// 'image/tiff',\n// 'image/bmp',\n// 'image/avif'\n// ];\n\n// const DOCUMENT_TYPES = [\n// 'application/pdf',\n// 'application/msword',\n// 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', // .docx\n// 'application/vnd.ms-excel',\n// 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', // .xlsx\n// 'application/vnd.ms-powerpoint',\n// 'application/vnd.openxmlformats-officedocument.presentationml.presentation', // .pptx\n// 'text/plain',\n// 'text/csv',\n// 'application/json',\n// 'text/html',\n// 'text/javascript',\n// 'text/css'\n// ];\n\n// const VIDEO_TYPES = [\n// 'video/mp4',\n// 'video/webm',\n// 'video/ogg',\n// 'video/quicktime'\n// ];\n\n// const AUDIO_TYPES = [\n// 'audio/mpeg',\n// 'audio/ogg',\n// 'audio/wav',\n// 'audio/webm'\n// ];\n\n// /**\n// * Generates a thumbnail for an image or PDF file\n// * @param fileBuffer The file buffer\n// * @param fileType The MIME type of the file\n// * @returns Thumbnail buffer\n// */\n// export async function generateMediaThumbnail(fileBuffer: Buffer, fileType: string): Promise<Buffer> {\n// if (fileType === 'application/pdf') {\n// // For PDFs, we need to use a different approach\n// try {\n// return await sharp(fileBuffer, { \n// density: 300, // Higher density for better quality\n// page: 0 // First page only\n// })\n// .resize(THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT, {\n// fit: 'inside',\n// withoutEnlargement: true,\n// })\n// .jpeg({ quality: 80 })\n// .toBuffer();\n// } catch (error) {\n// console.warn('Failed to generate PDF thumbnail:', error);\n// return generateGenericThumbnail(fileType);\n// }\n// }\n \n// // For regular images\n// return sharp(fileBuffer)\n// .resize(THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT, {\n// fit: 'inside',\n// withoutEnlargement: true,\n// })\n// .jpeg({ quality: 80 })\n// .toBuffer();\n// }\n\n// /**\n// * Generates a generic icon-based thumbnail for a file type\n// * @param fileType The MIME type of the file\n// * @returns Thumbnail buffer\n// */\n// async function generateGenericThumbnail(fileType: string): Promise<Buffer> {\n// // Create a blank canvas with a colored background based on file type\n// const canvas = sharp({\n// create: {\n// width: THUMBNAIL_WIDTH,\n// height: THUMBNAIL_HEIGHT,\n// channels: 4,\n// background: { r: 245, g: 245, b: 245, alpha: 1 }\n// }\n// });\n\n// // Add a colored overlay based on file type\n// let color = { r: 200, g: 200, b: 200, alpha: 0.5 }; // Default gray\n\n// if (DOCUMENT_TYPES.includes(fileType)) {\n// color = { r: 52, g: 152, b: 219, alpha: 0.5 }; // Blue for documents\n// } else if (VIDEO_TYPES.includes(fileType)) {\n// color = { r: 231, g: 76, b: 60, alpha: 0.5 }; // Red for videos\n// } else if (AUDIO_TYPES.includes(fileType)) {\n// color = { r: 46, g: 204, b: 113, alpha: 0.5 }; // Green for audio\n// }\n\n// return canvas\n// .composite([{\n// input: Buffer.from([color.r, color.g, color.b, Math.floor(color.alpha * 255)]),\n// raw: {\n// width: 1,\n// height: 1,\n// channels: 4\n// },\n// tile: true,\n// blend: 'overlay'\n// }])\n// .jpeg({ quality: 80 })\n// .toBuffer();\n// }\n\n// /**\n// * Generates a thumbnail for a file\n// * @param fileName The name of the file in Google Cloud Storage\n// * @param fileType The MIME type of the file\n// * @returns The thumbnail buffer or null if thumbnail generation is not supported\n// */\n// export async function generateThumbnail(fileName: string, fileType: string): Promise<Buffer | null> {\n// try {\n// const signedUrl = await getSignedUrl(fileName);\n// const response = await fetch(signedUrl);\n \n// if (!response.ok) {\n// throw new Error(`Failed to download file from storage: ${response.status} ${response.statusText}`);\n// }\n\n// const fileBuffer = await response.arrayBuffer();\n\n// if (SUPPORTED_IMAGE_TYPES.includes(fileType) || fileType === 'application/pdf') {\n// try {\n// const thumbnail = await generateMediaThumbnail(Buffer.from(fileBuffer), fileType);\n// return thumbnail;\n// } catch (error) {\n// return generateGenericThumbnail(fileType);\n// }\n// } else if ([...DOCUMENT_TYPES, ...VIDEO_TYPES, ...AUDIO_TYPES].includes(fileType)) {\n// return generateGenericThumbnail(fileType);\n// }\n\n// return null; // Unsupported file type\n// } catch (error) {\n// return null;\n// }\n// }\n\n// /**\n// * Stores a thumbnail in Google Cloud Storage and creates a File entry\n// * @param thumbnailBuffer The thumbnail buffer to store\n// * @param originalFileName The original file name\n// * @param userId The user ID who owns the file\n// * @returns The ID of the created thumbnail File\n// */\n// // DEPRECATED: This function is no longer used - thumbnails are generated during direct uploads\n// // Thumbnail generation is now handled in the direct upload flow "],"names":[],"mappings":";;;AAAA,wCAAwC;AAExC,6BAA6B;AAC7B,wCAAwC;AACxC,sEAAsE;AAEtE,kCAAkC;AAClC,+BAA+B;AAC/B,gCAAgC;AAEhC,8BAA8B;AAC9B,kCAAkC;AAClC,oBAAoB;AACpB,mBAAmB;AACnB,mBAAmB;AACnB,oBAAoB;AACpB,oBAAoB;AACpB,mBAAmB;AACnB,mBAAmB;AACnB,KAAK;AAEL,2BAA2B;AAC3B,yBAAyB;AACzB,4BAA4B;AAC5B,0FAA0F;AAC1F,kCAAkC;AAClC,oFAAoF;AACpF,uCAAuC;AACvC,4FAA4F;AAC5F,oBAAoB;AACpB,kBAAkB;AAClB,0BAA0B;AAC1B,mBAAmB;AACnB,yBAAyB;AACzB,iBAAiB;AACjB,KAAK;AAEL,wBAAwB;AACxB,mBAAmB;AACnB,oBAAoB;AACpB,mBAAmB;AACnB,wBAAwB;AACxB,KAAK;AAEL,wBAAwB;AACxB,oBAAoB;AACpB,mBAAmB;AACnB,mBAAmB;AACnB,mBAAmB;AACnB,KAAK;AAEL,MAAM;AACN,oDAAoD;AACpD,uCAAuC;AACvC,+CAA+C;AAC/C,+BAA+B;AAC/B,MAAM;AACN,wGAAwG;AACxG,4CAA4C;AAC5C,2DAA2D;AAC3D,gBAAgB;AAChB,gDAAgD;AAChD,qEAAqE;AACrE,6CAA6C;AAC7C,iBAAiB;AACjB,2DAA2D;AAC3D,iCAAiC;AACjC,4CAA4C;AAC5C,iBAAiB;AACjB,qCAAqC;AACrC,2BAA2B;AAC3B,4BAA4B;AAC5B,wEAAwE;AACxE,yDAAyD;AACzD,YAAY;AACZ,QAAQ;AAER,4BAA4B;AAC5B,+BAA+B;AAC/B,uDAAuD;AACvD,6BAA6B;AAC7B,wCAAwC;AACxC,aAAa;AACb,iCAAiC;AACjC,uBAAuB;AACvB,IAAI;AAEJ,MAAM;AACN,8DAA8D;AAC9D,+CAA+C;AAC/C,+BAA+B;AAC/B,MAAM;AACN,+EAA+E;AAC/E,4EAA4E;AAC5E,6BAA6B;AAC7B,oBAAoB;AACpB,sCAAsC;AACtC,wCAAwC;AACxC,2BAA2B;AAC3B,+DAA+D;AAC/D,YAAY;AACZ,UAAU;AAEV,kDAAkD;AAClD,0EAA0E;AAE1E,+CAA+C;AAC/C,+EAA+E;AAC/E,mDAAmD;AACnD,0EAA0E;AAC1E,mDAAmD;AACnD,4EAA4E;AAC5E,QAAQ;AAER,oBAAoB;AACpB,wBAAwB;AACxB,8FAA8F;AAC9F,qBAAqB;AACrB,4BAA4B;AAC5B,6BAA6B;AAC7B,8BAA8B;AAC9B,iBAAiB;AACjB,0BAA0B;AAC1B,+BAA+B;AAC/B,cAAc;AACd,iCAAiC;AACjC,uBAAuB;AACvB,IAAI;AAEJ,MAAM;AACN,sCAAsC;AACtC,kEAAkE;AAClE,+CAA+C;AAC/C,oFAAoF;AACpF,MAAM;AACN,wGAAwG;AACxG,YAAY;AACZ,0DAA0D;AAC1D,mDAAmD;AAEnD,8BAA8B;AAC9B,kHAAkH;AAClH,YAAY;AAEZ,2DAA2D;AAE3D,4FAA4F;AAC5F,oBAAoB;AACpB,qGAAqG;AACrG,oCAAoC;AACpC,gCAAgC;AAChC,6DAA6D;AAC7D,gBAAgB;AAChB,+FAA+F;AAC/F,yDAAyD;AACzD,YAAY;AAEZ,gDAAgD;AAChD,wBAAwB;AACxB,uBAAuB;AACvB,QAAQ;AACR,IAAI;AAEJ,MAAM;AACN,yEAAyE;AACzE,0DAA0D;AAC1D,oDAAoD;AACpD,iDAAiD;AACjD,mDAAmD;AACnD,MAAM;AACN,kGAAkG;AAClG,oEAAoE","debug_id":"8a494bec-8974-5f11-ae01-d96a89e7d69b"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"/","sources":["middleware/auth.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"/","sources":["middleware/auth.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,oBAAoB,GAAI,GAAG,GAAG;;;;;CA+H1C,CAAC"}
|
package/dist/middleware/auth.js
CHANGED
|
@@ -1,41 +1,24 @@
|
|
|
1
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]="
|
|
3
|
-
import { TRPCError } from
|
|
4
|
-
import { prisma } from '../lib/prisma.js';
|
|
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]="f1f0bcb4-fc6b-5b13-92c1-e2fedb706ef2")}catch(e){}}();
|
|
3
|
+
import { TRPCError } from "@trpc/server";
|
|
5
4
|
import * as Sentry from "@sentry/node";
|
|
5
|
+
import { findUserBySessionToken, findTeacherClassesByUserId, findClassWithMember, findClassWithTeacher, } from "../models/auth.js";
|
|
6
6
|
export const createAuthMiddleware = (t) => {
|
|
7
|
-
// Auth middleware
|
|
8
7
|
const isAuthed = t.middleware(async ({ next, ctx }) => {
|
|
9
|
-
const
|
|
10
|
-
// Get user from request headers
|
|
11
|
-
const userHeader = ctx.req.headers['x-user'];
|
|
8
|
+
const userHeader = ctx.req.headers["x-user"];
|
|
12
9
|
if (!userHeader) {
|
|
13
10
|
throw new TRPCError({
|
|
14
|
-
code:
|
|
15
|
-
message:
|
|
11
|
+
code: "UNAUTHORIZED",
|
|
12
|
+
message: "Not authenticated - no token found",
|
|
16
13
|
});
|
|
17
14
|
}
|
|
18
15
|
try {
|
|
19
|
-
const token = typeof userHeader ===
|
|
20
|
-
|
|
21
|
-
const user = await prisma.user.findFirst({
|
|
22
|
-
where: {
|
|
23
|
-
sessions: {
|
|
24
|
-
some: {
|
|
25
|
-
id: token
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
},
|
|
29
|
-
select: {
|
|
30
|
-
id: true,
|
|
31
|
-
username: true,
|
|
32
|
-
// institutionId: true,
|
|
33
|
-
}
|
|
34
|
-
});
|
|
16
|
+
const token = typeof userHeader === "string" ? userHeader : userHeader[0];
|
|
17
|
+
const user = await findUserBySessionToken(token);
|
|
35
18
|
if (!user) {
|
|
36
19
|
throw new TRPCError({
|
|
37
|
-
code:
|
|
38
|
-
message:
|
|
20
|
+
code: "UNAUTHORIZED",
|
|
21
|
+
message: "Invalid or expired session",
|
|
39
22
|
});
|
|
40
23
|
}
|
|
41
24
|
return next({
|
|
@@ -46,120 +29,75 @@ export const createAuthMiddleware = (t) => {
|
|
|
46
29
|
});
|
|
47
30
|
}
|
|
48
31
|
catch (error) {
|
|
49
|
-
// Re-throw TRPCErrors as-is (e.g., UNAUTHORIZED from invalid session)
|
|
50
32
|
if (error instanceof TRPCError) {
|
|
51
33
|
throw error;
|
|
52
34
|
}
|
|
53
35
|
Sentry.captureException(error);
|
|
54
36
|
console.error(error);
|
|
55
37
|
throw new TRPCError({
|
|
56
|
-
code:
|
|
57
|
-
message:
|
|
38
|
+
code: "INTERNAL_SERVER_ERROR",
|
|
39
|
+
message: "Internal server error",
|
|
58
40
|
});
|
|
59
41
|
}
|
|
60
42
|
});
|
|
61
|
-
// Add computed flags middleware
|
|
62
43
|
const addComputedFlags = t.middleware(async ({ next, ctx }) => {
|
|
63
44
|
if (!ctx.user) {
|
|
64
45
|
throw new TRPCError({
|
|
65
|
-
code:
|
|
66
|
-
message:
|
|
46
|
+
code: "UNAUTHORIZED",
|
|
47
|
+
message: "Not authenticated",
|
|
67
48
|
});
|
|
68
49
|
}
|
|
69
|
-
|
|
70
|
-
const teacherClasses = await prisma.class.findMany({
|
|
71
|
-
where: {
|
|
72
|
-
teachers: {
|
|
73
|
-
some: {
|
|
74
|
-
id: ctx.user.id
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
},
|
|
78
|
-
select: {
|
|
79
|
-
id: true
|
|
80
|
-
}
|
|
81
|
-
});
|
|
50
|
+
const teacherClasses = await findTeacherClassesByUserId(ctx.user.id);
|
|
82
51
|
return next({
|
|
83
52
|
ctx: {
|
|
84
53
|
...ctx,
|
|
85
54
|
isTeacher: teacherClasses.length > 0,
|
|
86
|
-
teacherClassIds: teacherClasses.map((c) => c.id)
|
|
87
|
-
}
|
|
55
|
+
teacherClassIds: teacherClasses.map((c) => c.id),
|
|
56
|
+
},
|
|
88
57
|
});
|
|
89
58
|
});
|
|
90
|
-
// Student middleware
|
|
91
59
|
const isMemberInClass = t.middleware(async ({ next, ctx, input }) => {
|
|
92
60
|
if (!ctx.user) {
|
|
93
61
|
throw new TRPCError({
|
|
94
|
-
code:
|
|
95
|
-
message:
|
|
62
|
+
code: "UNAUTHORIZED",
|
|
63
|
+
message: "Not authenticated",
|
|
96
64
|
});
|
|
97
65
|
}
|
|
98
66
|
const classId = input?.classId;
|
|
99
67
|
if (!classId) {
|
|
100
68
|
throw new TRPCError({
|
|
101
|
-
code:
|
|
102
|
-
message:
|
|
69
|
+
code: "BAD_REQUEST",
|
|
70
|
+
message: "classId is required",
|
|
103
71
|
});
|
|
104
72
|
}
|
|
105
|
-
const isMember = await
|
|
106
|
-
where: {
|
|
107
|
-
id: classId,
|
|
108
|
-
OR: [
|
|
109
|
-
{
|
|
110
|
-
students: {
|
|
111
|
-
some: {
|
|
112
|
-
id: ctx.user.id
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
},
|
|
116
|
-
{
|
|
117
|
-
teachers: {
|
|
118
|
-
some: {
|
|
119
|
-
id: ctx.user.id
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
]
|
|
124
|
-
}
|
|
125
|
-
});
|
|
73
|
+
const isMember = await findClassWithMember(classId, ctx.user.id);
|
|
126
74
|
if (!isMember) {
|
|
127
75
|
throw new TRPCError({
|
|
128
|
-
code:
|
|
129
|
-
message:
|
|
76
|
+
code: "FORBIDDEN",
|
|
77
|
+
message: "Not a member in this class",
|
|
130
78
|
});
|
|
131
79
|
}
|
|
132
80
|
return next();
|
|
133
81
|
});
|
|
134
|
-
// Teacher middleware
|
|
135
82
|
const isTeacherInClass = t.middleware(async ({ next, ctx, input }) => {
|
|
136
83
|
if (!ctx.user) {
|
|
137
84
|
throw new TRPCError({
|
|
138
|
-
code:
|
|
139
|
-
message:
|
|
85
|
+
code: "UNAUTHORIZED",
|
|
86
|
+
message: "Not authenticated",
|
|
140
87
|
});
|
|
141
88
|
}
|
|
142
|
-
const classId = input
|
|
89
|
+
const classId = input?.classId;
|
|
143
90
|
if (!classId) {
|
|
144
91
|
throw new TRPCError({
|
|
145
|
-
code:
|
|
146
|
-
message:
|
|
92
|
+
code: "BAD_REQUEST",
|
|
93
|
+
message: "classId is required",
|
|
147
94
|
});
|
|
148
95
|
}
|
|
149
|
-
const isTeacher = await
|
|
150
|
-
where: {
|
|
151
|
-
id: classId,
|
|
152
|
-
teachers: {
|
|
153
|
-
some: {
|
|
154
|
-
id: ctx.user.id
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
});
|
|
96
|
+
const isTeacher = await findClassWithTeacher(classId, ctx.user.id);
|
|
159
97
|
if (!isTeacher) {
|
|
160
98
|
throw new TRPCError({
|
|
161
|
-
code:
|
|
162
|
-
message:
|
|
99
|
+
code: "FORBIDDEN",
|
|
100
|
+
message: "Not a teacher in this class",
|
|
163
101
|
});
|
|
164
102
|
}
|
|
165
103
|
return next();
|
|
@@ -172,4 +110,4 @@ export const createAuthMiddleware = (t) => {
|
|
|
172
110
|
};
|
|
173
111
|
};
|
|
174
112
|
//# sourceMappingURL=auth.js.map
|
|
175
|
-
//# debugId=
|
|
113
|
+
//# debugId=f1f0bcb4-fc6b-5b13-92c1-e2fedb706ef2
|