@studious-lms/server 1.2.52 → 1.3.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 +36 -94
- 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 +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 +1399 -1271
- 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 +140 -68
- package/dist/routers/class.d.ts.map +1 -1
- package/dist/routers/class.js +82 -1051
- 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 +11 -10
- package/dist/routers/labChat.d.ts.map +1 -1
- package/dist/routers/labChat.js +19 -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 +2 -2
- package/dist/routers/message.d.ts.map +1 -1
- package/dist/routers/message.js +27 -522
- 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 +51 -38
- 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/aiNewtonChat.d.ts.map +1 -1
- package/dist/server/pipelines/aiNewtonChat.js +8 -3
- package/dist/server/pipelines/aiNewtonChat.js.map +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 +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/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/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 +83 -136
- 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/{server/pipelines → pipelines}/aiLabChat.ts +11 -7
- package/src/{server/pipelines → pipelines}/aiNewtonChat.ts +15 -6
- 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 -1186
- 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 +29 -605
- package/src/routers/marketing.ts +35 -77
- package/src/routers/message.ts +45 -571
- 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 +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/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/tests/announcement.test.ts +0 -164
- package/tests/assignment.test.ts +0 -296
- package/tests/auth.test.ts +0 -48
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import { type WorksheetQuestionType } from "@prisma/client";
|
|
2
|
+
/** Get worksheet with questions and mark schemes. */
|
|
3
|
+
export declare function getWorksheet(worksheetId: string): Promise<{
|
|
4
|
+
class: {
|
|
5
|
+
id: string;
|
|
6
|
+
schoolId: string | null;
|
|
7
|
+
name: string;
|
|
8
|
+
subject: string;
|
|
9
|
+
color: string | null;
|
|
10
|
+
section: string;
|
|
11
|
+
syllabus: string | null;
|
|
12
|
+
} | null;
|
|
13
|
+
questions: {
|
|
14
|
+
options: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
15
|
+
type: import(".prisma/client").$Enums.WorksheetQuestionType;
|
|
16
|
+
id: string;
|
|
17
|
+
createdAt: Date;
|
|
18
|
+
updatedAt: Date;
|
|
19
|
+
order: number | null;
|
|
20
|
+
markScheme: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
21
|
+
question: string;
|
|
22
|
+
points: number;
|
|
23
|
+
worksheetId: string;
|
|
24
|
+
answer: string;
|
|
25
|
+
}[];
|
|
26
|
+
} & {
|
|
27
|
+
id: string;
|
|
28
|
+
createdAt: Date;
|
|
29
|
+
updatedAt: Date;
|
|
30
|
+
classId: string;
|
|
31
|
+
name: string;
|
|
32
|
+
}>;
|
|
33
|
+
/** Check if worksheet exists. */
|
|
34
|
+
export declare function worksheetExists(id: string): Promise<boolean>;
|
|
35
|
+
export declare function listWorksheets(classId: string): Promise<{
|
|
36
|
+
questionCount: number;
|
|
37
|
+
questions: {
|
|
38
|
+
id: string;
|
|
39
|
+
}[];
|
|
40
|
+
id: string;
|
|
41
|
+
createdAt: Date;
|
|
42
|
+
updatedAt: Date;
|
|
43
|
+
classId: string;
|
|
44
|
+
name: string;
|
|
45
|
+
}[]>;
|
|
46
|
+
export declare function updateWorksheetRecord(worksheetId: string, data: {
|
|
47
|
+
name?: string;
|
|
48
|
+
}): Promise<{
|
|
49
|
+
id: string;
|
|
50
|
+
createdAt: Date;
|
|
51
|
+
updatedAt: Date;
|
|
52
|
+
classId: string;
|
|
53
|
+
name: string;
|
|
54
|
+
}>;
|
|
55
|
+
export declare function deleteWorksheetRecord(worksheetId: string): Promise<{
|
|
56
|
+
id: string;
|
|
57
|
+
createdAt: Date;
|
|
58
|
+
updatedAt: Date;
|
|
59
|
+
classId: string;
|
|
60
|
+
name: string;
|
|
61
|
+
}>;
|
|
62
|
+
export declare function createWorksheetRecord(classId: string, name: string): Promise<{
|
|
63
|
+
id: string;
|
|
64
|
+
createdAt: Date;
|
|
65
|
+
updatedAt: Date;
|
|
66
|
+
classId: string;
|
|
67
|
+
name: string;
|
|
68
|
+
}>;
|
|
69
|
+
export declare function addQuestionToWorksheet(worksheetId: string, data: {
|
|
70
|
+
question: string;
|
|
71
|
+
answer: string;
|
|
72
|
+
points?: number;
|
|
73
|
+
options?: object;
|
|
74
|
+
markScheme?: object;
|
|
75
|
+
type: WorksheetQuestionType;
|
|
76
|
+
}): Promise<{
|
|
77
|
+
options: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
78
|
+
type: import(".prisma/client").$Enums.WorksheetQuestionType;
|
|
79
|
+
id: string;
|
|
80
|
+
createdAt: Date;
|
|
81
|
+
updatedAt: Date;
|
|
82
|
+
order: number | null;
|
|
83
|
+
markScheme: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
84
|
+
question: string;
|
|
85
|
+
points: number;
|
|
86
|
+
worksheetId: string;
|
|
87
|
+
answer: string;
|
|
88
|
+
}>;
|
|
89
|
+
export declare function reorderWorksheetQuestions(worksheetId: string, movedId: string, position: "before" | "after", targetId: string): Promise<{
|
|
90
|
+
id: string;
|
|
91
|
+
}[]>;
|
|
92
|
+
export declare function updateWorksheetQuestionRecord(worksheetId: string, questionId: string, data: {
|
|
93
|
+
question?: string;
|
|
94
|
+
answer?: string;
|
|
95
|
+
points?: number;
|
|
96
|
+
options?: object;
|
|
97
|
+
markScheme?: object;
|
|
98
|
+
type?: WorksheetQuestionType;
|
|
99
|
+
}): Promise<{
|
|
100
|
+
options: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
101
|
+
type: import(".prisma/client").$Enums.WorksheetQuestionType;
|
|
102
|
+
id: string;
|
|
103
|
+
createdAt: Date;
|
|
104
|
+
updatedAt: Date;
|
|
105
|
+
order: number | null;
|
|
106
|
+
markScheme: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
107
|
+
question: string;
|
|
108
|
+
points: number;
|
|
109
|
+
worksheetId: string;
|
|
110
|
+
answer: string;
|
|
111
|
+
}>;
|
|
112
|
+
export declare function deleteWorksheetQuestionRecord(worksheetId: string, questionId: string): Promise<{
|
|
113
|
+
options: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
114
|
+
type: import(".prisma/client").$Enums.WorksheetQuestionType;
|
|
115
|
+
id: string;
|
|
116
|
+
createdAt: Date;
|
|
117
|
+
updatedAt: Date;
|
|
118
|
+
order: number | null;
|
|
119
|
+
markScheme: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
120
|
+
question: string;
|
|
121
|
+
points: number;
|
|
122
|
+
worksheetId: string;
|
|
123
|
+
answer: string;
|
|
124
|
+
}>;
|
|
125
|
+
export declare function getWorksheetSubmission(worksheetId: string, submissionId: string): Promise<{
|
|
126
|
+
responses: ({
|
|
127
|
+
comments: {
|
|
128
|
+
id: string;
|
|
129
|
+
}[];
|
|
130
|
+
} & {
|
|
131
|
+
status: import(".prisma/client").$Enums.GenerationStatus | null;
|
|
132
|
+
id: string;
|
|
133
|
+
createdAt: Date;
|
|
134
|
+
updatedAt: Date | null;
|
|
135
|
+
feedback: string | null;
|
|
136
|
+
studentId: string;
|
|
137
|
+
response: string;
|
|
138
|
+
isCorrect: boolean;
|
|
139
|
+
markschemeState: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
140
|
+
points: number;
|
|
141
|
+
questionId: string;
|
|
142
|
+
studentWorksheetResponseId: string | null;
|
|
143
|
+
})[];
|
|
144
|
+
} & {
|
|
145
|
+
id: string;
|
|
146
|
+
createdAt: Date;
|
|
147
|
+
updatedAt: Date;
|
|
148
|
+
submissionId: string | null;
|
|
149
|
+
studentId: string;
|
|
150
|
+
submittedAt: Date | null;
|
|
151
|
+
submitted: boolean;
|
|
152
|
+
worksheetId: string;
|
|
153
|
+
}>;
|
|
154
|
+
export declare function answerWorksheetQuestion(worksheetResponseId: string, questionId: string, response: string, userId: string): Promise<{
|
|
155
|
+
responses: {
|
|
156
|
+
status: import(".prisma/client").$Enums.GenerationStatus | null;
|
|
157
|
+
id: string;
|
|
158
|
+
createdAt: Date;
|
|
159
|
+
updatedAt: Date | null;
|
|
160
|
+
feedback: string | null;
|
|
161
|
+
studentId: string;
|
|
162
|
+
response: string;
|
|
163
|
+
isCorrect: boolean;
|
|
164
|
+
markschemeState: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
165
|
+
points: number;
|
|
166
|
+
questionId: string;
|
|
167
|
+
studentWorksheetResponseId: string | null;
|
|
168
|
+
}[];
|
|
169
|
+
} & {
|
|
170
|
+
id: string;
|
|
171
|
+
createdAt: Date;
|
|
172
|
+
updatedAt: Date;
|
|
173
|
+
submissionId: string | null;
|
|
174
|
+
studentId: string;
|
|
175
|
+
submittedAt: Date | null;
|
|
176
|
+
submitted: boolean;
|
|
177
|
+
worksheetId: string;
|
|
178
|
+
}>;
|
|
179
|
+
export declare function cancelGrading(worksheetResponseId: string, progressId: string): Promise<{
|
|
180
|
+
status: import(".prisma/client").$Enums.GenerationStatus | null;
|
|
181
|
+
id: string;
|
|
182
|
+
createdAt: Date;
|
|
183
|
+
updatedAt: Date | null;
|
|
184
|
+
feedback: string | null;
|
|
185
|
+
studentId: string;
|
|
186
|
+
response: string;
|
|
187
|
+
isCorrect: boolean;
|
|
188
|
+
markschemeState: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
189
|
+
points: number;
|
|
190
|
+
questionId: string;
|
|
191
|
+
studentWorksheetResponseId: string | null;
|
|
192
|
+
}>;
|
|
193
|
+
export declare function regradeQuestion(worksheetResponseId: string, progressId: string): Promise<{
|
|
194
|
+
status: import(".prisma/client").$Enums.GenerationStatus | null;
|
|
195
|
+
id: string;
|
|
196
|
+
createdAt: Date;
|
|
197
|
+
updatedAt: Date | null;
|
|
198
|
+
feedback: string | null;
|
|
199
|
+
studentId: string;
|
|
200
|
+
response: string;
|
|
201
|
+
isCorrect: boolean;
|
|
202
|
+
markschemeState: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
203
|
+
points: number;
|
|
204
|
+
questionId: string;
|
|
205
|
+
studentWorksheetResponseId: string | null;
|
|
206
|
+
}>;
|
|
207
|
+
export declare function gradeAnswer(questionId: string, studentWorksheetResponseId: string, data: {
|
|
208
|
+
responseId?: string;
|
|
209
|
+
response?: string;
|
|
210
|
+
isCorrect: boolean;
|
|
211
|
+
feedback?: string;
|
|
212
|
+
markschemeState?: object;
|
|
213
|
+
points?: number;
|
|
214
|
+
}): Promise<{
|
|
215
|
+
status: import(".prisma/client").$Enums.GenerationStatus | null;
|
|
216
|
+
id: string;
|
|
217
|
+
createdAt: Date;
|
|
218
|
+
updatedAt: Date | null;
|
|
219
|
+
feedback: string | null;
|
|
220
|
+
studentId: string;
|
|
221
|
+
response: string;
|
|
222
|
+
isCorrect: boolean;
|
|
223
|
+
markschemeState: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
224
|
+
points: number;
|
|
225
|
+
questionId: string;
|
|
226
|
+
studentWorksheetResponseId: string | null;
|
|
227
|
+
}>;
|
|
228
|
+
export declare function addCommentToResponse(responseId: string, comment: string, authorId: string): Promise<{
|
|
229
|
+
status: import(".prisma/client").$Enums.GenerationStatus | null;
|
|
230
|
+
id: string;
|
|
231
|
+
createdAt: Date;
|
|
232
|
+
content: string;
|
|
233
|
+
modifiedAt: Date | null;
|
|
234
|
+
announcementId: string | null;
|
|
235
|
+
authorId: string;
|
|
236
|
+
parentCommentId: string | null;
|
|
237
|
+
studentQuestionProgressId: string | null;
|
|
238
|
+
}>;
|
|
239
|
+
//# sourceMappingURL=worksheet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worksheet.d.ts","sourceRoot":"/","sources":["services/worksheet.ts"],"names":[],"mappings":"AAKA,OAAO,EAAoB,KAAK,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AA4B9E,qDAAqD;AACrD,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GASrD;AAED,iCAAiC;AACjC,wBAAsB,eAAe,CAAC,EAAE,EAAE,MAAM,oBAG/C;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM;;;;;;;;;;KAMnD;AAED,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE;;;;;;GAGxB;AAED,wBAAsB,qBAAqB,CAAC,WAAW,EAAE,MAAM;;;;;;GAE9D;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;;;;;;GAExE;AAED,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE;IACJ,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,qBAAqB,CAAC;CAC7B;;;;;;;;;;;;GAaF;AAED,wBAAsB,yBAAyB,CAC7C,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,QAAQ,GAAG,OAAO,EAC5B,QAAQ,EAAE,MAAM;;KAqDjB;AAED,wBAAsB,6BAA6B,CACjD,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE;IACJ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,qBAAqB,CAAC;CAC9B;;;;;;;;;;;;GAUF;AAED,wBAAsB,6BAA6B,CACjD,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM;;;;;;;;;;;;GAUnB;AAED,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAcrB;AAED,wBAAsB,uBAAuB,CAC3C,mBAAmB,EAAE,MAAM,EAC3B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;GAwDf;AAED,wBAAsB,aAAa,CACjC,mBAAmB,EAAE,MAAM,EAC3B,UAAU,EAAE,MAAM;;;;;;;;;;;;;GAGnB;AAED,wBAAsB,eAAe,CACnC,mBAAmB,EAAE,MAAM,EAC3B,UAAU,EAAE,MAAM;;;;;;;;;;;;;GAGnB;AAED,wBAAsB,WAAW,CAC/B,UAAU,EAAE,MAAM,EAClB,0BAA0B,EAAE,MAAM,EAClC,IAAI,EAAE;IACJ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;;;;;;;;;;;;;GAgDF;AAED,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM;;;;;;;;;;GAOjB"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worksheet service – CRUD for worksheets, questions, submissions, and AI grading.
|
|
3
|
+
* Integrates with gradeWorksheet pipeline for auto-grading.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
!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]="cffbcf20-cef6-5fd4-979f-670d50592d0a")}catch(e){}}();
|
|
7
|
+
import { TRPCError } from "@trpc/server";
|
|
8
|
+
import { GenerationStatus } from "@prisma/client";
|
|
9
|
+
import { prisma } from "../lib/prisma.js";
|
|
10
|
+
import { cancelGradePipeline, regradeWorksheetPipeline } from "../pipelines/gradeWorksheet.js";
|
|
11
|
+
import { findWorksheetById, findWorksheetByIdMinimal, findWorksheetsByClassId, createWorksheet, updateWorksheet, deleteWorksheet, findQuestionsByWorksheetId, createWorksheetQuestion, updateWorksheetQuestion, deleteWorksheetQuestion, findSubmissionById, findOrCreateWorksheetResponse, findWorksheetResponseWithResponses, findWorksheetQuestionById, updateStudentQuestionProgress, createStudentQuestionProgress, findStudentQuestionProgress, updateStudentQuestionProgressForGrading, createStudentQuestionProgressForGrading, createComment, } from "../models/worksheet.js";
|
|
12
|
+
/** Get worksheet with questions and mark schemes. */
|
|
13
|
+
export async function getWorksheet(worksheetId) {
|
|
14
|
+
const worksheet = await findWorksheetById(worksheetId);
|
|
15
|
+
if (!worksheet) {
|
|
16
|
+
throw new TRPCError({
|
|
17
|
+
code: "NOT_FOUND",
|
|
18
|
+
message: "Worksheet not found",
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
return worksheet;
|
|
22
|
+
}
|
|
23
|
+
/** Check if worksheet exists. */
|
|
24
|
+
export async function worksheetExists(id) {
|
|
25
|
+
const worksheet = await findWorksheetByIdMinimal(id);
|
|
26
|
+
return !!worksheet;
|
|
27
|
+
}
|
|
28
|
+
export async function listWorksheets(classId) {
|
|
29
|
+
const worksheets = await findWorksheetsByClassId(classId);
|
|
30
|
+
return worksheets.map((w) => ({
|
|
31
|
+
...w,
|
|
32
|
+
questionCount: w.questions.length,
|
|
33
|
+
}));
|
|
34
|
+
}
|
|
35
|
+
export async function updateWorksheetRecord(worksheetId, data) {
|
|
36
|
+
return updateWorksheet(worksheetId, data);
|
|
37
|
+
}
|
|
38
|
+
export async function deleteWorksheetRecord(worksheetId) {
|
|
39
|
+
return deleteWorksheet(worksheetId);
|
|
40
|
+
}
|
|
41
|
+
export async function createWorksheetRecord(classId, name) {
|
|
42
|
+
return createWorksheet({ classId, name });
|
|
43
|
+
}
|
|
44
|
+
export async function addQuestionToWorksheet(worksheetId, data) {
|
|
45
|
+
const worksheet = await findWorksheetByIdMinimal(worksheetId);
|
|
46
|
+
if (!worksheet) {
|
|
47
|
+
throw new TRPCError({
|
|
48
|
+
code: "NOT_FOUND",
|
|
49
|
+
message: "Worksheet not found",
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
return createWorksheetQuestion({
|
|
53
|
+
worksheetId,
|
|
54
|
+
...data,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
export async function reorderWorksheetQuestions(worksheetId, movedId, position, targetId) {
|
|
58
|
+
const worksheet = await findWorksheetByIdMinimal(worksheetId);
|
|
59
|
+
if (!worksheet) {
|
|
60
|
+
throw new TRPCError({
|
|
61
|
+
code: "NOT_FOUND",
|
|
62
|
+
message: "Worksheet not found",
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
const questions = await findQuestionsByWorksheetId(worksheetId);
|
|
66
|
+
const movedIdx = questions.findIndex((q) => q.id === movedId);
|
|
67
|
+
if (movedIdx === -1) {
|
|
68
|
+
throw new TRPCError({
|
|
69
|
+
code: "NOT_FOUND",
|
|
70
|
+
message: "Moved question not found",
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
const targetIdx = questions.findIndex((q) => q.id === targetId);
|
|
74
|
+
if (targetIdx === -1) {
|
|
75
|
+
throw new TRPCError({
|
|
76
|
+
code: "NOT_FOUND",
|
|
77
|
+
message: "Target question not found",
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
const withoutMoved = questions.filter((q) => q.id !== movedId);
|
|
81
|
+
const next = position === "before"
|
|
82
|
+
? [
|
|
83
|
+
...withoutMoved.slice(0, targetIdx).map((item) => ({ id: item.id })),
|
|
84
|
+
{ id: movedId },
|
|
85
|
+
...withoutMoved.slice(targetIdx).map((item) => ({ id: item.id })),
|
|
86
|
+
]
|
|
87
|
+
: [
|
|
88
|
+
...withoutMoved
|
|
89
|
+
.slice(0, targetIdx + 1)
|
|
90
|
+
.map((item) => ({ id: item.id })),
|
|
91
|
+
{ id: movedId },
|
|
92
|
+
...withoutMoved
|
|
93
|
+
.slice(targetIdx + 1)
|
|
94
|
+
.map((item) => ({ id: item.id })),
|
|
95
|
+
];
|
|
96
|
+
await prisma.$transaction(next.map((item, index) => prisma.worksheetQuestion.update({
|
|
97
|
+
where: { id: item.id },
|
|
98
|
+
data: { order: index },
|
|
99
|
+
})));
|
|
100
|
+
return next;
|
|
101
|
+
}
|
|
102
|
+
export async function updateWorksheetQuestionRecord(worksheetId, questionId, data) {
|
|
103
|
+
const worksheet = await findWorksheetByIdMinimal(worksheetId);
|
|
104
|
+
if (!worksheet) {
|
|
105
|
+
throw new TRPCError({
|
|
106
|
+
code: "NOT_FOUND",
|
|
107
|
+
message: "Worksheet not found",
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
return updateWorksheetQuestion(questionId, data);
|
|
111
|
+
}
|
|
112
|
+
export async function deleteWorksheetQuestionRecord(worksheetId, questionId) {
|
|
113
|
+
const worksheet = await findWorksheetByIdMinimal(worksheetId);
|
|
114
|
+
if (!worksheet) {
|
|
115
|
+
throw new TRPCError({
|
|
116
|
+
code: "NOT_FOUND",
|
|
117
|
+
message: "Worksheet not found",
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
return deleteWorksheetQuestion(questionId);
|
|
121
|
+
}
|
|
122
|
+
export async function getWorksheetSubmission(worksheetId, submissionId) {
|
|
123
|
+
const submission = await findSubmissionById(submissionId);
|
|
124
|
+
if (!submission) {
|
|
125
|
+
throw new TRPCError({
|
|
126
|
+
code: "NOT_FOUND",
|
|
127
|
+
message: "Submission not found",
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
return findOrCreateWorksheetResponse(submissionId, worksheetId, submission.studentId);
|
|
131
|
+
}
|
|
132
|
+
export async function answerWorksheetQuestion(worksheetResponseId, questionId, response, userId) {
|
|
133
|
+
const worksheetResponse = await findWorksheetResponseWithResponses(worksheetResponseId, questionId);
|
|
134
|
+
if (!worksheetResponse) {
|
|
135
|
+
throw new TRPCError({
|
|
136
|
+
code: "NOT_FOUND",
|
|
137
|
+
message: "Worksheet response not found",
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
const question = await findWorksheetQuestionById(questionId);
|
|
141
|
+
const isMarkableByAlgo = question?.type === "MULTIPLE_CHOICE" || question?.type === "TRUE_FALSE";
|
|
142
|
+
const marksAwardedIfCorrect = question?.points || 0;
|
|
143
|
+
const correctAnswer = isMarkableByAlgo
|
|
144
|
+
? question?.type === "MULTIPLE_CHOICE"
|
|
145
|
+
? question?.options?.find((o) => o.isCorrect)?.id
|
|
146
|
+
: question?.answer?.toString()
|
|
147
|
+
: null;
|
|
148
|
+
const existingResponse = worksheetResponse.responses[0];
|
|
149
|
+
if (existingResponse) {
|
|
150
|
+
await updateStudentQuestionProgress(existingResponse.id, {
|
|
151
|
+
response,
|
|
152
|
+
...(isMarkableByAlgo && {
|
|
153
|
+
isCorrect: response === correctAnswer,
|
|
154
|
+
}),
|
|
155
|
+
...(isMarkableByAlgo && {
|
|
156
|
+
points: response === correctAnswer ? marksAwardedIfCorrect : 0,
|
|
157
|
+
}),
|
|
158
|
+
status: GenerationStatus.NOT_STARTED,
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
await createStudentQuestionProgress({
|
|
163
|
+
studentId: worksheetResponse.studentId,
|
|
164
|
+
questionId,
|
|
165
|
+
response,
|
|
166
|
+
studentWorksheetResponseId: worksheetResponseId,
|
|
167
|
+
...(isMarkableByAlgo && {
|
|
168
|
+
isCorrect: response === correctAnswer,
|
|
169
|
+
}),
|
|
170
|
+
...(isMarkableByAlgo && {
|
|
171
|
+
points: response === correctAnswer ? marksAwardedIfCorrect : 0,
|
|
172
|
+
}),
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
const updated = await prisma.studentWorksheetResponse.findUnique({
|
|
176
|
+
where: { id: worksheetResponseId },
|
|
177
|
+
include: { responses: true },
|
|
178
|
+
});
|
|
179
|
+
return updated;
|
|
180
|
+
}
|
|
181
|
+
export async function cancelGrading(worksheetResponseId, progressId) {
|
|
182
|
+
return cancelGradePipeline(worksheetResponseId, progressId);
|
|
183
|
+
}
|
|
184
|
+
export async function regradeQuestion(worksheetResponseId, progressId) {
|
|
185
|
+
return regradeWorksheetPipeline(worksheetResponseId, progressId);
|
|
186
|
+
}
|
|
187
|
+
export async function gradeAnswer(questionId, studentWorksheetResponseId, data) {
|
|
188
|
+
if (data.responseId) {
|
|
189
|
+
return updateStudentQuestionProgressForGrading(data.responseId, {
|
|
190
|
+
isCorrect: data.isCorrect,
|
|
191
|
+
feedback: data.feedback,
|
|
192
|
+
markschemeState: data.markschemeState,
|
|
193
|
+
points: data.points,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
const worksheetResponse = await prisma.studentWorksheetResponse.findUnique({
|
|
197
|
+
where: { id: studentWorksheetResponseId },
|
|
198
|
+
select: { studentId: true },
|
|
199
|
+
});
|
|
200
|
+
if (!worksheetResponse) {
|
|
201
|
+
throw new TRPCError({
|
|
202
|
+
code: "NOT_FOUND",
|
|
203
|
+
message: "Student worksheet response not found",
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
const existing = await findStudentQuestionProgress(worksheetResponse.studentId, questionId, studentWorksheetResponseId);
|
|
207
|
+
if (existing) {
|
|
208
|
+
return updateStudentQuestionProgressForGrading(existing.id, {
|
|
209
|
+
isCorrect: data.isCorrect,
|
|
210
|
+
response: data.response,
|
|
211
|
+
feedback: data.feedback,
|
|
212
|
+
markschemeState: data.markschemeState,
|
|
213
|
+
points: data.points,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
return createStudentQuestionProgressForGrading({
|
|
217
|
+
studentId: worksheetResponse.studentId,
|
|
218
|
+
questionId,
|
|
219
|
+
studentWorksheetResponseId,
|
|
220
|
+
response: data.response || "",
|
|
221
|
+
isCorrect: data.isCorrect,
|
|
222
|
+
feedback: data.feedback,
|
|
223
|
+
markschemeState: data.markschemeState,
|
|
224
|
+
points: data.points || 0,
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
export async function addCommentToResponse(responseId, comment, authorId) {
|
|
228
|
+
return createComment({
|
|
229
|
+
studentQuestionProgressId: responseId,
|
|
230
|
+
content: comment,
|
|
231
|
+
authorId,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=worksheet.js.map
|
|
235
|
+
//# debugId=cffbcf20-cef6-5fd4-979f-670d50592d0a
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worksheet.js","sources":["services/worksheet.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Worksheet service – CRUD for worksheets, questions, submissions, and AI grading.\n * Integrates with gradeWorksheet pipeline for auto-grading.\n */\nimport { TRPCError } from \"@trpc/server\";\nimport { GenerationStatus, type WorksheetQuestionType } from \"@prisma/client\";\nimport { prisma } from \"../lib/prisma.js\";\nimport { cancelGradePipeline, regradeWorksheetPipeline } from \"../pipelines/gradeWorksheet.js\";\nimport {\n findWorksheetById,\n findWorksheetByIdMinimal,\n findWorksheetsByClassId,\n createWorksheet,\n updateWorksheet,\n deleteWorksheet,\n findQuestionsByWorksheetId,\n createWorksheetQuestion,\n updateWorksheetQuestion,\n deleteWorksheetQuestion,\n findSubmissionById,\n findOrCreateWorksheetResponse,\n findWorksheetResponseWithResponses,\n findWorksheetQuestionById,\n updateStudentQuestionProgress,\n createStudentQuestionProgress,\n findStudentQuestionProgress,\n updateStudentQuestionProgressForGrading,\n createStudentQuestionProgressForGrading,\n createComment,\n} from \"../models/worksheet.js\";\n\ntype MCQOptions = { id: string; text: string; isCorrect: boolean }[];\n\n/** Get worksheet with questions and mark schemes. */\nexport async function getWorksheet(worksheetId: string) {\n const worksheet = await findWorksheetById(worksheetId);\n if (!worksheet) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Worksheet not found\",\n });\n }\n return worksheet;\n}\n\n/** Check if worksheet exists. */\nexport async function worksheetExists(id: string) {\n const worksheet = await findWorksheetByIdMinimal(id);\n return !!worksheet;\n}\n\nexport async function listWorksheets(classId: string) {\n const worksheets = await findWorksheetsByClassId(classId);\n return worksheets.map((w) => ({\n ...w,\n questionCount: w.questions.length,\n }));\n}\n\nexport async function updateWorksheetRecord(\n worksheetId: string,\n data: { name?: string }\n) {\n return updateWorksheet(worksheetId, data);\n}\n\nexport async function deleteWorksheetRecord(worksheetId: string) {\n return deleteWorksheet(worksheetId);\n}\n\nexport async function createWorksheetRecord(classId: string, name: string) {\n return createWorksheet({ classId, name });\n}\n\nexport async function addQuestionToWorksheet(\n worksheetId: string,\n data: {\n question: string;\n answer: string;\n points?: number;\n options?: object;\n markScheme?: object;\n type: WorksheetQuestionType;\n }\n) {\n const worksheet = await findWorksheetByIdMinimal(worksheetId);\n if (!worksheet) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Worksheet not found\",\n });\n }\n return createWorksheetQuestion({\n worksheetId,\n ...data,\n });\n}\n\nexport async function reorderWorksheetQuestions(\n worksheetId: string,\n movedId: string,\n position: \"before\" | \"after\",\n targetId: string\n) {\n const worksheet = await findWorksheetByIdMinimal(worksheetId);\n if (!worksheet) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Worksheet not found\",\n });\n }\n\n const questions = await findQuestionsByWorksheetId(worksheetId);\n const movedIdx = questions.findIndex((q) => q.id === movedId);\n if (movedIdx === -1) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Moved question not found\",\n });\n }\n const targetIdx = questions.findIndex((q) => q.id === targetId);\n if (targetIdx === -1) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Target question not found\",\n });\n }\n\n const withoutMoved = questions.filter((q) => q.id !== movedId);\n const next =\n position === \"before\"\n ? [\n ...withoutMoved.slice(0, targetIdx).map((item) => ({ id: item.id })),\n { id: movedId },\n ...withoutMoved.slice(targetIdx).map((item) => ({ id: item.id })),\n ]\n : [\n ...withoutMoved\n .slice(0, targetIdx + 1)\n .map((item) => ({ id: item.id })),\n { id: movedId },\n ...withoutMoved\n .slice(targetIdx + 1)\n .map((item) => ({ id: item.id })),\n ];\n\n await prisma.$transaction(\n next.map((item, index) =>\n prisma.worksheetQuestion.update({\n where: { id: item.id },\n data: { order: index },\n })\n )\n );\n return next;\n}\n\nexport async function updateWorksheetQuestionRecord(\n worksheetId: string,\n questionId: string,\n data: {\n question?: string;\n answer?: string;\n points?: number;\n options?: object;\n markScheme?: object;\n type?: WorksheetQuestionType;\n }\n) {\n const worksheet = await findWorksheetByIdMinimal(worksheetId);\n if (!worksheet) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Worksheet not found\",\n });\n }\n return updateWorksheetQuestion(questionId, data);\n}\n\nexport async function deleteWorksheetQuestionRecord(\n worksheetId: string,\n questionId: string\n) {\n const worksheet = await findWorksheetByIdMinimal(worksheetId);\n if (!worksheet) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Worksheet not found\",\n });\n }\n return deleteWorksheetQuestion(questionId);\n}\n\nexport async function getWorksheetSubmission(\n worksheetId: string,\n submissionId: string\n) {\n const submission = await findSubmissionById(submissionId);\n if (!submission) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Submission not found\",\n });\n }\n return findOrCreateWorksheetResponse(\n submissionId,\n worksheetId,\n submission.studentId\n );\n}\n\nexport async function answerWorksheetQuestion(\n worksheetResponseId: string,\n questionId: string,\n response: string,\n userId: string\n) {\n const worksheetResponse = await findWorksheetResponseWithResponses(\n worksheetResponseId,\n questionId\n );\n if (!worksheetResponse) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Worksheet response not found\",\n });\n }\n\n const question = await findWorksheetQuestionById(questionId);\n const isMarkableByAlgo =\n question?.type === \"MULTIPLE_CHOICE\" || question?.type === \"TRUE_FALSE\";\n const marksAwardedIfCorrect = question?.points || 0;\n const correctAnswer = isMarkableByAlgo\n ? question?.type === \"MULTIPLE_CHOICE\"\n ? (question?.options as MCQOptions)?.find((o) => o.isCorrect)?.id\n : question?.answer?.toString()\n : null;\n\n const existingResponse = worksheetResponse.responses[0];\n\n if (existingResponse) {\n await updateStudentQuestionProgress(existingResponse.id, {\n response,\n ...(isMarkableByAlgo && {\n isCorrect: response === correctAnswer,\n }),\n ...(isMarkableByAlgo && {\n points: response === correctAnswer ? marksAwardedIfCorrect : 0,\n }),\n status: GenerationStatus.NOT_STARTED,\n });\n } else {\n await createStudentQuestionProgress({\n studentId: worksheetResponse.studentId,\n questionId,\n response,\n studentWorksheetResponseId: worksheetResponseId,\n ...(isMarkableByAlgo && {\n isCorrect: response === correctAnswer,\n }),\n ...(isMarkableByAlgo && {\n points: response === correctAnswer ? marksAwardedIfCorrect : 0,\n }),\n });\n }\n\n const updated = await prisma.studentWorksheetResponse.findUnique({\n where: { id: worksheetResponseId },\n include: { responses: true },\n });\n return updated!;\n}\n\nexport async function cancelGrading(\n worksheetResponseId: string,\n progressId: string\n) {\n return cancelGradePipeline(worksheetResponseId, progressId);\n}\n\nexport async function regradeQuestion(\n worksheetResponseId: string,\n progressId: string\n) {\n return regradeWorksheetPipeline(worksheetResponseId, progressId);\n}\n\nexport async function gradeAnswer(\n questionId: string,\n studentWorksheetResponseId: string,\n data: {\n responseId?: string;\n response?: string;\n isCorrect: boolean;\n feedback?: string;\n markschemeState?: object;\n points?: number;\n }\n) {\n if (data.responseId) {\n return updateStudentQuestionProgressForGrading(data.responseId, {\n isCorrect: data.isCorrect,\n feedback: data.feedback,\n markschemeState: data.markschemeState,\n points: data.points,\n });\n }\n\n const worksheetResponse = await prisma.studentWorksheetResponse.findUnique({\n where: { id: studentWorksheetResponseId },\n select: { studentId: true },\n });\n if (!worksheetResponse) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Student worksheet response not found\",\n });\n }\n\n const existing = await findStudentQuestionProgress(\n worksheetResponse.studentId,\n questionId,\n studentWorksheetResponseId\n );\n\n if (existing) {\n return updateStudentQuestionProgressForGrading(existing.id, {\n isCorrect: data.isCorrect,\n response: data.response,\n feedback: data.feedback,\n markschemeState: data.markschemeState,\n points: data.points,\n });\n }\n\n return createStudentQuestionProgressForGrading({\n studentId: worksheetResponse.studentId,\n questionId,\n studentWorksheetResponseId,\n response: data.response || \"\",\n isCorrect: data.isCorrect,\n feedback: data.feedback,\n markschemeState: data.markschemeState,\n points: data.points || 0,\n });\n}\n\nexport async function addCommentToResponse(\n responseId: string,\n comment: string,\n authorId: string\n) {\n return createComment({\n studentQuestionProgressId: responseId,\n content: comment,\n authorId,\n });\n}\n"],"names":[],"mappings":"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","debug_id":"cffbcf20-cef6-5fd4-979f-670d50592d0a"}
|
package/dist/utils/aiUser.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aiUser.d.ts","sourceRoot":"/","sources":["utils/aiUser.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"aiUser.d.ts","sourceRoot":"/","sources":["utils/aiUser.ts"],"names":[],"mappings":"AAQA,uDAAuD;AACvD,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CA0CxD;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEhD"}
|
package/dist/utils/aiUser.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI user util – ensures AI assistant user exists, provides ID and isAIUser check.
|
|
3
|
+
*/
|
|
1
4
|
|
|
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]="
|
|
5
|
+
!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]="0ed01933-9d5a-548d-b86b-94f607dd41ed")}catch(e){}}();
|
|
3
6
|
import { prisma } from '../lib/prisma.js';
|
|
4
7
|
import { logger } from './logger.js';
|
|
5
8
|
const AI_USER_ID = 'AI_ASSISTANT';
|
|
6
|
-
/**
|
|
7
|
-
* Ensure AI assistant user exists in the database
|
|
8
|
-
*/
|
|
9
|
+
/** Ensure AI assistant user exists in the database. */
|
|
9
10
|
export async function ensureAIUserExists() {
|
|
10
11
|
try {
|
|
11
12
|
// Check if AI user already exists
|
|
@@ -58,4 +59,4 @@ export function isAIUser(userId) {
|
|
|
58
59
|
return userId === AI_USER_ID;
|
|
59
60
|
}
|
|
60
61
|
//# sourceMappingURL=aiUser.js.map
|
|
61
|
-
//# debugId=
|
|
62
|
+
//# debugId=0ed01933-9d5a-548d-b86b-94f607dd41ed
|
package/dist/utils/aiUser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aiUser.js","sources":["utils/aiUser.ts"],"sourceRoot":"/","sourcesContent":["
|
|
1
|
+
{"version":3,"file":"aiUser.js","sources":["utils/aiUser.ts"],"sourceRoot":"/","sourcesContent":["/**\n * AI user util – ensures AI assistant user exists, provides ID and isAIUser check.\n */\nimport { prisma } from '../lib/prisma.js';\nimport { logger } from './logger.js';\n\nconst AI_USER_ID = 'AI_ASSISTANT';\n\n/** Ensure AI assistant user exists in the database. */\nexport async function ensureAIUserExists(): Promise<void> {\n try {\n // Check if AI user already exists\n const existingAIUser = await prisma.user.findUnique({\n where: { id: AI_USER_ID },\n });\n\n if (existingAIUser) {\n return; // AI user already exists\n }\n\n // Create AI user\n await prisma.user.create({\n data: {\n id: AI_USER_ID,\n username: 'ai-assistant',\n email: 'ai@studious-lms.com',\n password: 'ai-system-user', // Not used for login\n verified: true,\n role: 'NONE', // Special role for AI\n profile: {\n create: {\n displayName: 'AI Assistant',\n bio: 'Intelligent assistant for lab chats and educational support',\n profilePicture: null,\n },\n },\n },\n });\n\n logger.info('AI user created successfully', { userId: AI_USER_ID });\n\n } catch (error) {\n // If user already exists (race condition), that's okay\n if (error instanceof Error && error.message.includes('unique constraint')) {\n logger.info('AI user already exists (race condition handled)');\n return;\n }\n\n logger.error('Failed to create AI user', { error });\n throw error;\n }\n}\n\n/**\n * Get the AI user ID\n */\nexport function getAIUserId(): string {\n return AI_USER_ID;\n}\n\n/**\n * Check if a user ID belongs to the AI assistant\n */\nexport function isAIUser(userId: string): boolean {\n return userId === AI_USER_ID;\n}\n"],"names":[],"mappings":"AAAA;;GAEG;;;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,UAAU,GAAG,cAAc,CAAC;AAElC,uDAAuD;AACvD,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,IAAI,CAAC;QACH,kCAAkC;QAClC,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;YAClD,KAAK,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE;SAC1B,CAAC,CAAC;QAEH,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO,CAAC,yBAAyB;QACnC,CAAC;QAED,iBAAiB;QACjB,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;YACvB,IAAI,EAAE;gBACJ,EAAE,EAAE,UAAU;gBACd,QAAQ,EAAE,cAAc;gBACxB,KAAK,EAAE,qBAAqB;gBAC5B,QAAQ,EAAE,gBAAgB,EAAE,qBAAqB;gBACjD,QAAQ,EAAE,IAAI;gBACd,IAAI,EAAE,MAAM,EAAE,sBAAsB;gBACpC,OAAO,EAAE;oBACP,MAAM,EAAE;wBACN,WAAW,EAAE,cAAc;wBAC3B,GAAG,EAAE,6DAA6D;wBAClE,cAAc,EAAE,IAAI;qBACrB;iBACF;aACF;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;IAEtE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,uDAAuD;QACvD,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;YAC1E,MAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;YAC/D,OAAO;QACT,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QACpD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,MAAc;IACrC,OAAO,MAAM,KAAK,UAAU,CAAC;AAC/B,CAAC","debug_id":"0ed01933-9d5a-548d-b86b-94f607dd41ed"}
|
package/dist/utils/email.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email.d.ts","sourceRoot":"/","sources":["utils/email.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"email.d.ts","sourceRoot":"/","sources":["utils/email.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,UAAU,MAAM,YAAY,CAAC;AAIpC,KAAK,aAAa,GAAG;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAGF,eAAO,MAAM,SAAS,oJAQlB,CAAC;AAGL,eAAO,MAAM,QAAQ,GAAU,6BAA6B,aAAa,kBAaxE,CAAC"}
|
package/dist/utils/email.js
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Email util – nodemailer transport and sendMail wrapper. Supports EMAIL_DRY_RUN.
|
|
3
|
+
*/
|
|
1
4
|
|
|
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]="
|
|
5
|
+
!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]="3fa5b5eb-3cd7-5eba-a26d-01b403a6ee46")}catch(e){}}();
|
|
3
6
|
import nodemailer from 'nodemailer';
|
|
4
7
|
import { env } from '../lib/config/env.js';
|
|
5
8
|
import { logger } from './logger.js';
|
|
6
9
|
export const transport = nodemailer.createTransport({
|
|
7
10
|
host: env.EMAIL_HOST,
|
|
8
|
-
port:
|
|
11
|
+
port: env.EMAIL_PORT,
|
|
9
12
|
secure: false,
|
|
10
13
|
auth: {
|
|
11
14
|
user: env.EMAIL_USER,
|
|
@@ -19,11 +22,11 @@ export const sendMail = async ({ from, to, subject, text }) => {
|
|
|
19
22
|
return;
|
|
20
23
|
}
|
|
21
24
|
await transport.sendMail({
|
|
22
|
-
from
|
|
25
|
+
from: `"Studious" <${from}>`,
|
|
23
26
|
to,
|
|
24
27
|
subject,
|
|
25
28
|
text,
|
|
26
29
|
});
|
|
27
30
|
};
|
|
28
31
|
//# sourceMappingURL=email.js.map
|
|
29
|
-
//# debugId=
|
|
32
|
+
//# debugId=3fa5b5eb-3cd7-5eba-a26d-01b403a6ee46
|
package/dist/utils/email.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email.js","sources":["utils/email.ts"],"sourceRoot":"/","sourcesContent":["
|
|
1
|
+
{"version":3,"file":"email.js","sources":["utils/email.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Email util – nodemailer transport and sendMail wrapper. Supports EMAIL_DRY_RUN.\n */\nimport nodemailer from 'nodemailer';\nimport { env } from '../lib/config/env.js';\nimport { logger } from './logger.js';\n\ntype sendMailProps = {\n from: string;\n to: string;\n subject: string;\n text: string;\n};\n\n\nexport const transport = nodemailer.createTransport({\n host: env.EMAIL_HOST,\n port: env.EMAIL_PORT,\n secure: false,\n auth: {\n user: env.EMAIL_USER,\n pass: env.EMAIL_PASS,\n },\n });\n\n\nexport const sendMail = async ({ from, to, subject, text }: sendMailProps) => {\n // Wrapper function for sending emails\n if (env.EMAIL_DRY_RUN == \"true\") {\n logger.info(`Email dry run enabled. Would have sent email to ${to} from ${from} with subject ${subject} and text ${text}`);\n return;\n }\n \n await transport.sendMail({\n from: `\"Studious\" <${from}>`,\n to,\n subject,\n text,\n });\n};\n"],"names":[],"mappings":"AAAA;;GAEG;;;AACH,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAUrC,MAAM,CAAC,MAAM,SAAS,GAAG,UAAU,CAAC,eAAe,CAAC;IAChD,IAAI,EAAE,GAAG,CAAC,UAAU;IACpB,IAAI,EAAE,GAAG,CAAC,UAAU;IACpB,MAAM,EAAE,KAAK;IACb,IAAI,EAAE;QACJ,IAAI,EAAE,GAAG,CAAC,UAAU;QACpB,IAAI,EAAE,GAAG,CAAC,UAAU;KACrB;CACF,CAAC,CAAC;AAGL,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAiB,EAAE,EAAE;IAC3E,sCAAsC;IACtC,IAAI,GAAG,CAAC,aAAa,IAAI,MAAM,EAAE,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,mDAAmD,EAAE,SAAS,IAAI,iBAAiB,OAAO,aAAa,IAAI,EAAE,CAAC,CAAC;QAC3H,OAAO;IACT,CAAC;IAED,MAAM,SAAS,CAAC,QAAQ,CAAC;QACvB,IAAI,EAAE,eAAe,IAAI,GAAG;QAC5B,EAAE;QACF,OAAO;QACP,IAAI;KACL,CAAC,CAAC;AACL,CAAC,CAAC","debug_id":"3fa5b5eb-3cd7-5eba-a26d-01b403a6ee46"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* @returns {string} The invite code with length 5
|
|
2
|
+
* Generate invite code util – random 5-char alphanumeric code for class invites.
|
|
4
3
|
*/
|
|
5
4
|
export declare const generateInviteCode: () => string;
|
|
6
5
|
//# sourceMappingURL=generateInviteCode.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateInviteCode.d.ts","sourceRoot":"/","sources":["utils/generateInviteCode.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"generateInviteCode.d.ts","sourceRoot":"/","sources":["utils/generateInviteCode.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,kBAAkB,cAE9B,CAAA"}
|