@studious-lms/server 1.1.24 → 1.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.coderabbit.yaml +9 -0
- package/.env.example +53 -0
- package/.env.test.example +37 -0
- package/README.md +34 -7
- package/dist/exportType.d.ts.map +1 -1
- package/dist/exportType.js +4 -0
- package/dist/exportType.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +212 -51
- package/dist/index.js.map +1 -0
- package/dist/instrument.d.ts +2 -0
- package/dist/instrument.d.ts.map +1 -0
- package/dist/instrument.js +18 -0
- package/dist/instrument.js.map +1 -0
- package/dist/lib/config/env.d.ts +190 -0
- package/dist/lib/config/env.d.ts.map +1 -0
- package/dist/lib/config/env.js +121 -0
- package/dist/lib/config/env.js.map +1 -0
- package/dist/lib/fileUpload.d.ts +2 -2
- package/dist/lib/fileUpload.d.ts.map +1 -1
- package/dist/lib/fileUpload.js +82 -15
- package/dist/lib/fileUpload.js.map +1 -0
- package/dist/lib/googleCloudStorage.d.ts +13 -0
- package/dist/lib/googleCloudStorage.d.ts.map +1 -1
- package/dist/lib/googleCloudStorage.js +45 -6
- package/dist/lib/googleCloudStorage.js.map +1 -0
- package/dist/lib/jsonConversion.d.ts.map +1 -1
- package/dist/lib/jsonConversion.js +16 -14
- package/dist/lib/jsonConversion.js.map +1 -0
- package/dist/lib/jsonStyles.d.ts.map +1 -1
- package/dist/lib/jsonStyles.js +4 -0
- package/dist/lib/jsonStyles.js.map +1 -0
- package/dist/lib/notificationHandler.d.ts +25 -0
- package/dist/lib/notificationHandler.d.ts.map +1 -0
- package/dist/lib/notificationHandler.js +32 -0
- package/dist/lib/notificationHandler.js.map +1 -0
- package/dist/lib/prisma.d.ts +2 -2
- package/dist/lib/prisma.d.ts.map +1 -1
- package/dist/lib/prisma.js +24 -1
- package/dist/lib/prisma.js.map +1 -0
- package/dist/lib/pusher.d.ts +4 -1
- package/dist/lib/pusher.d.ts.map +1 -1
- package/dist/lib/pusher.js +14 -6
- package/dist/lib/pusher.js.map +1 -0
- package/dist/lib/redis.d.ts +5 -0
- package/dist/lib/redis.d.ts.map +1 -0
- package/dist/lib/redis.js +53 -0
- package/dist/lib/redis.js.map +1 -0
- package/dist/lib/thumbnailGenerator.d.ts +0 -21
- package/dist/lib/thumbnailGenerator.d.ts.map +1 -1
- package/dist/lib/thumbnailGenerator.js +159 -158
- package/dist/lib/thumbnailGenerator.js.map +1 -0
- package/dist/middleware/auth.d.ts.map +1 -1
- package/dist/middleware/auth.js +41 -93
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/logging.d.ts.map +1 -1
- package/dist/middleware/logging.js +4 -0
- package/dist/middleware/logging.js.map +1 -0
- package/dist/middleware/security.d.ts +5 -0
- package/dist/middleware/security.d.ts.map +1 -0
- package/dist/middleware/security.js +77 -0
- package/dist/middleware/security.js.map +1 -0
- package/dist/models/agenda.d.ts +97 -0
- package/dist/models/agenda.d.ts.map +1 -0
- package/dist/models/agenda.js +40 -0
- package/dist/models/agenda.js.map +1 -0
- package/dist/models/announcement.d.ts +223 -0
- package/dist/models/announcement.d.ts.map +1 -0
- package/dist/models/announcement.js +120 -0
- package/dist/models/announcement.js.map +1 -0
- package/dist/models/assignment.d.ts +1292 -0
- package/dist/models/assignment.d.ts.map +1 -0
- package/dist/models/assignment.js +309 -0
- package/dist/models/assignment.js.map +1 -0
- package/dist/models/attendance.d.ts +180 -0
- package/dist/models/attendance.d.ts.map +1 -0
- package/dist/models/attendance.js +188 -0
- package/dist/models/attendance.js.map +1 -0
- package/dist/models/auth.d.ts +153 -0
- package/dist/models/auth.d.ts.map +1 -0
- package/dist/models/auth.js +217 -0
- package/dist/models/auth.js.map +1 -0
- package/dist/models/class.d.ts +439 -0
- package/dist/models/class.d.ts.map +1 -0
- package/dist/models/class.js +546 -0
- package/dist/models/class.js.map +1 -0
- package/dist/models/comment.d.ts +171 -0
- package/dist/models/comment.d.ts.map +1 -0
- package/dist/models/comment.js +138 -0
- package/dist/models/comment.js.map +1 -0
- package/dist/models/conversation.d.ts +164 -0
- package/dist/models/conversation.d.ts.map +1 -0
- package/dist/models/conversation.js +175 -0
- package/dist/models/conversation.js.map +1 -0
- package/dist/models/event.d.ts +295 -0
- package/dist/models/event.d.ts.map +1 -0
- package/dist/models/event.js +145 -0
- package/dist/models/event.js.map +1 -0
- package/dist/models/file.d.ts +536 -0
- package/dist/models/file.d.ts.map +1 -0
- package/dist/models/file.js +126 -0
- package/dist/models/file.js.map +1 -0
- package/dist/models/folder.d.ts +295 -0
- package/dist/models/folder.d.ts.map +1 -0
- package/dist/models/folder.js +202 -0
- package/dist/models/folder.js.map +1 -0
- package/dist/models/labChat.d.ts +243 -0
- package/dist/models/labChat.d.ts.map +1 -0
- package/dist/models/labChat.js +204 -0
- package/dist/models/labChat.js.map +1 -0
- package/dist/models/marketing.d.ts +72 -0
- package/dist/models/marketing.d.ts.map +1 -0
- package/dist/models/marketing.js +26 -0
- package/dist/models/marketing.js.map +1 -0
- package/dist/models/message.d.ts +100 -0
- package/dist/models/message.d.ts.map +1 -0
- package/dist/models/message.js +131 -0
- package/dist/models/message.js.map +1 -0
- package/dist/models/newtonChat.d.ts +72 -0
- package/dist/models/newtonChat.d.ts.map +1 -0
- package/dist/models/newtonChat.js +61 -0
- package/dist/models/newtonChat.js.map +1 -0
- package/dist/models/notification.d.ts +65 -0
- package/dist/models/notification.d.ts.map +1 -0
- package/dist/models/notification.js +46 -0
- package/dist/models/notification.js.map +1 -0
- package/dist/models/section.d.ts +102 -0
- package/dist/models/section.d.ts.map +1 -0
- package/dist/models/section.js +83 -0
- package/dist/models/section.js.map +1 -0
- package/dist/models/user.d.ts +39 -0
- package/dist/models/user.d.ts.map +1 -0
- package/dist/models/user.js +38 -0
- package/dist/models/user.js.map +1 -0
- package/dist/models/worksheet.d.ts +460 -0
- package/dist/models/worksheet.d.ts.map +1 -0
- package/dist/models/worksheet.js +200 -0
- package/dist/models/worksheet.js.map +1 -0
- package/dist/pipelines/aiLabChat.d.ts +21 -0
- package/dist/pipelines/aiLabChat.d.ts.map +1 -0
- package/dist/pipelines/aiLabChat.js +460 -0
- package/dist/pipelines/aiLabChat.js.map +1 -0
- package/dist/pipelines/aiNewtonChat.d.ts +30 -0
- package/dist/pipelines/aiNewtonChat.d.ts.map +1 -0
- package/dist/pipelines/aiNewtonChat.js +289 -0
- package/dist/pipelines/aiNewtonChat.js.map +1 -0
- package/dist/pipelines/gradeWorksheet.d.ts +30 -0
- package/dist/pipelines/gradeWorksheet.d.ts.map +1 -0
- package/dist/pipelines/gradeWorksheet.js +252 -0
- package/dist/pipelines/gradeWorksheet.js.map +1 -0
- package/dist/routers/_app.d.ts +6403 -3741
- package/dist/routers/_app.d.ts.map +1 -1
- package/dist/routers/_app.js +10 -0
- package/dist/routers/_app.js.map +1 -0
- package/dist/routers/agenda.d.ts +58 -6
- package/dist/routers/agenda.d.ts.map +1 -1
- package/dist/routers/agenda.js +6 -58
- package/dist/routers/agenda.js.map +1 -0
- package/dist/routers/announcement.d.ts +325 -6
- package/dist/routers/announcement.d.ts.map +1 -1
- package/dist/routers/announcement.js +547 -57
- package/dist/routers/announcement.js.map +1 -0
- package/dist/routers/assignment.d.ts +431 -318
- package/dist/routers/assignment.d.ts.map +1 -1
- package/dist/routers/assignment.js +104 -1559
- package/dist/routers/assignment.js.map +1 -0
- package/dist/routers/attendance.d.ts +20 -9
- package/dist/routers/attendance.d.ts.map +1 -1
- package/dist/routers/attendance.js +10 -263
- package/dist/routers/attendance.js.map +1 -0
- package/dist/routers/auth.d.ts +21 -1
- package/dist/routers/auth.d.ts.map +1 -1
- package/dist/routers/auth.js +37 -241
- package/dist/routers/auth.js.map +1 -0
- package/dist/routers/class.d.ts +198 -68
- package/dist/routers/class.d.ts.map +1 -1
- package/dist/routers/class.js +88 -909
- package/dist/routers/class.js.map +1 -0
- package/dist/routers/comment.d.ts +153 -0
- package/dist/routers/comment.d.ts.map +1 -0
- package/dist/routers/comment.js +58 -0
- package/dist/routers/comment.js.map +1 -0
- package/dist/routers/conversation.d.ts +73 -3
- package/dist/routers/conversation.d.ts.map +1 -1
- package/dist/routers/conversation.js +23 -265
- package/dist/routers/conversation.js.map +1 -0
- package/dist/routers/event.d.ts +46 -37
- package/dist/routers/event.d.ts.map +1 -1
- package/dist/routers/event.js +15 -431
- package/dist/routers/event.js.map +1 -0
- package/dist/routers/file.d.ts +4 -2
- package/dist/routers/file.d.ts.map +1 -1
- package/dist/routers/file.js +11 -295
- package/dist/routers/file.js.map +1 -0
- package/dist/routers/folder.d.ts +21 -14
- package/dist/routers/folder.d.ts.map +1 -1
- package/dist/routers/folder.js +36 -743
- package/dist/routers/folder.js.map +1 -0
- package/dist/routers/labChat.d.ts +12 -9
- package/dist/routers/labChat.d.ts.map +1 -1
- package/dist/routers/labChat.js +21 -877
- package/dist/routers/labChat.js.map +1 -0
- package/dist/routers/marketing.d.ts +2 -2
- package/dist/routers/marketing.d.ts.map +1 -1
- package/dist/routers/marketing.js +9 -54
- package/dist/routers/marketing.js.map +1 -0
- package/dist/routers/message.d.ts +2 -1
- package/dist/routers/message.d.ts.map +1 -1
- package/dist/routers/message.js +29 -519
- package/dist/routers/message.js.map +1 -0
- package/dist/routers/newtonChat.d.ts +55 -0
- package/dist/routers/newtonChat.d.ts.map +1 -0
- package/dist/routers/newtonChat.js +22 -0
- package/dist/routers/newtonChat.js.map +1 -0
- package/dist/routers/notifications.d.ts +8 -8
- package/dist/routers/notifications.d.ts.map +1 -1
- package/dist/routers/notifications.js +20 -81
- package/dist/routers/notifications.js.map +1 -0
- package/dist/routers/section.d.ts +37 -6
- package/dist/routers/section.d.ts.map +1 -1
- package/dist/routers/section.js +26 -167
- package/dist/routers/section.js.map +1 -0
- package/dist/routers/user.d.ts +1 -1
- package/dist/routers/user.d.ts.map +1 -1
- package/dist/routers/user.js +34 -204
- package/dist/routers/user.js.map +1 -0
- package/dist/routers/worksheet.d.ts +362 -0
- package/dist/routers/worksheet.d.ts.map +1 -0
- package/dist/routers/worksheet.js +153 -0
- package/dist/routers/worksheet.js.map +1 -0
- package/dist/seedDatabase.d.ts +2 -3
- package/dist/seedDatabase.d.ts.map +1 -1
- package/dist/seedDatabase.js +311 -289
- package/dist/seedDatabase.js.map +1 -0
- package/dist/server/pipelines/aiLabChat.d.ts +21 -0
- package/dist/server/pipelines/aiLabChat.d.ts.map +1 -0
- package/dist/server/pipelines/aiLabChat.js +456 -0
- package/dist/server/pipelines/aiLabChat.js.map +1 -0
- package/dist/server/pipelines/aiNewtonChat.d.ts +30 -0
- package/dist/server/pipelines/aiNewtonChat.d.ts.map +1 -0
- package/dist/server/pipelines/aiNewtonChat.js +285 -0
- package/dist/server/pipelines/aiNewtonChat.js.map +1 -0
- package/dist/server/pipelines/gradeWorksheet.d.ts +30 -0
- package/dist/server/pipelines/gradeWorksheet.d.ts.map +1 -0
- package/dist/server/pipelines/gradeWorksheet.js +248 -0
- package/dist/server/pipelines/gradeWorksheet.js.map +1 -0
- package/dist/services/agenda.d.ts +100 -0
- package/dist/services/agenda.d.ts.map +1 -0
- package/dist/services/agenda.js +21 -0
- package/dist/services/agenda.js.map +1 -0
- package/dist/services/announcement.d.ts +135 -0
- package/dist/services/announcement.d.ts.map +1 -0
- package/dist/services/announcement.js +223 -0
- package/dist/services/announcement.js.map +1 -0
- package/dist/services/assignment.d.ts +1462 -0
- package/dist/services/assignment.d.ts.map +1 -0
- package/dist/services/assignment.js +898 -0
- package/dist/services/assignment.js.map +1 -0
- package/dist/services/attendance.d.ts +93 -0
- package/dist/services/attendance.d.ts.map +1 -0
- package/dist/services/attendance.js +61 -0
- package/dist/services/attendance.js.map +1 -0
- package/dist/services/auth.d.ts +68 -0
- package/dist/services/auth.d.ts.map +1 -0
- package/dist/services/auth.js +218 -0
- package/dist/services/auth.js.map +1 -0
- package/dist/services/class.d.ts +621 -0
- package/dist/services/class.d.ts.map +1 -0
- package/dist/services/class.js +474 -0
- package/dist/services/class.js.map +1 -0
- package/dist/services/comment.d.ts +100 -0
- package/dist/services/comment.d.ts.map +1 -0
- package/dist/services/comment.js +83 -0
- package/dist/services/comment.js.map +1 -0
- package/dist/services/conversation.d.ts +159 -0
- package/dist/services/conversation.d.ts.map +1 -0
- package/dist/services/conversation.js +138 -0
- package/dist/services/conversation.js.map +1 -0
- package/dist/services/event.d.ts +216 -0
- package/dist/services/event.d.ts.map +1 -0
- package/dist/services/event.js +168 -0
- package/dist/services/event.js.map +1 -0
- package/dist/services/file.d.ts +74 -0
- package/dist/services/file.d.ts.map +1 -0
- package/dist/services/file.js +133 -0
- package/dist/services/file.js.map +1 -0
- package/dist/services/folder.d.ts +239 -0
- package/dist/services/folder.d.ts.map +1 -0
- package/dist/services/folder.js +248 -0
- package/dist/services/folder.js.map +1 -0
- package/dist/services/labChat.d.ts +165 -0
- package/dist/services/labChat.d.ts.map +1 -0
- package/dist/services/labChat.js +289 -0
- package/dist/services/labChat.js.map +1 -0
- package/dist/services/marketing.d.ts +50 -0
- package/dist/services/marketing.d.ts.map +1 -0
- package/dist/services/marketing.js +32 -0
- package/dist/services/marketing.js.map +1 -0
- package/dist/services/message.d.ts +95 -0
- package/dist/services/message.d.ts.map +1 -0
- package/dist/services/message.js +350 -0
- package/dist/services/message.js.map +1 -0
- package/dist/services/newtonChat.d.ts +22 -0
- package/dist/services/newtonChat.d.ts.map +1 -0
- package/dist/services/newtonChat.js +174 -0
- package/dist/services/newtonChat.js.map +1 -0
- package/dist/services/notification.d.ts +65 -0
- package/dist/services/notification.d.ts.map +1 -0
- package/dist/services/notification.js +33 -0
- package/dist/services/notification.js.map +1 -0
- package/dist/services/section.d.ts +53 -0
- package/dist/services/section.d.ts.map +1 -0
- package/dist/services/section.js +199 -0
- package/dist/services/section.js.map +1 -0
- package/dist/services/user.d.ts +48 -0
- package/dist/services/user.d.ts.map +1 -0
- package/dist/services/user.js +141 -0
- package/dist/services/user.js.map +1 -0
- package/dist/services/worksheet.d.ts +239 -0
- package/dist/services/worksheet.d.ts.map +1 -0
- package/dist/services/worksheet.js +235 -0
- package/dist/services/worksheet.js.map +1 -0
- package/dist/socket/handlers.d.ts.map +1 -1
- package/dist/socket/handlers.js +4 -0
- package/dist/socket/handlers.js.map +1 -0
- package/dist/trpc.d.ts.map +1 -1
- package/dist/trpc.js +4 -0
- package/dist/trpc.js.map +1 -0
- package/dist/types/trpc.d.ts.map +1 -1
- package/dist/types/trpc.js +4 -0
- package/dist/types/trpc.js.map +1 -0
- package/dist/utils/aiUser.d.ts +1 -3
- package/dist/utils/aiUser.d.ts.map +1 -1
- package/dist/utils/aiUser.js +8 -3
- package/dist/utils/aiUser.js.map +1 -0
- package/dist/utils/email.d.ts +12 -1
- package/dist/utils/email.d.ts.map +1 -1
- package/dist/utils/email.js +26 -4
- package/dist/utils/email.js.map +1 -0
- package/dist/utils/generateInviteCode.d.ts +1 -2
- package/dist/utils/generateInviteCode.d.ts.map +1 -1
- package/dist/utils/generateInviteCode.js +5 -2
- package/dist/utils/generateInviteCode.js.map +1 -0
- package/dist/utils/inference.d.ts +8 -0
- package/dist/utils/inference.d.ts.map +1 -1
- package/dist/utils/inference.js +78 -10
- package/dist/utils/inference.js.map +1 -0
- package/dist/utils/logger.d.ts +4 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +35 -3
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/prismaErrorHandler.d.ts.map +1 -1
- package/dist/utils/prismaErrorHandler.js +7 -0
- package/dist/utils/prismaErrorHandler.js.map +1 -0
- package/dist/utils/prismaWrapper.d.ts +1 -0
- package/dist/utils/prismaWrapper.d.ts.map +1 -1
- package/dist/utils/prismaWrapper.js +8 -0
- package/dist/utils/prismaWrapper.js.map +1 -0
- package/docker-compose.yml +19 -0
- package/package.json +21 -4
- package/prisma/migrations/20251109122857_annuoncements_comments/migration.sql +30 -0
- package/prisma/migrations/20251109135555_reactions_announcements_comments/migration.sql +35 -0
- package/prisma/schema.prisma +180 -12
- package/scripts/test-pre-push.ts +14 -0
- package/src/index.ts +247 -52
- package/src/instrument.ts +15 -0
- package/src/lib/config/env.ts +132 -0
- package/src/lib/fileUpload.ts +81 -16
- package/src/lib/googleCloudStorage.ts +42 -6
- package/src/lib/jsonConversion.ts +12 -14
- package/src/lib/prisma.ts +23 -2
- package/src/lib/pusher.ts +11 -6
- package/src/lib/redis.ts +56 -0
- package/src/lib/thumbnailGenerator.ts +170 -168
- package/src/middleware/auth.ts +86 -137
- package/src/middleware/security.ts +80 -0
- package/src/models/agenda.ts +46 -0
- package/src/models/announcement.ts +134 -0
- package/src/models/assignment.ts +322 -0
- package/src/models/attendance.ts +208 -0
- package/src/models/auth.ts +247 -0
- package/src/models/class.ts +598 -0
- package/src/models/comment.ts +152 -0
- package/src/models/conversation.ts +200 -0
- package/src/models/event.ts +177 -0
- package/src/models/file.ts +129 -0
- package/src/models/folder.ts +225 -0
- package/src/models/labChat.ts +213 -0
- package/src/models/marketing.ts +45 -0
- package/src/models/message.ts +153 -0
- package/src/models/newtonChat.ts +70 -0
- package/src/models/notification.ts +54 -0
- package/src/models/section.ts +98 -0
- package/src/models/user.ts +47 -0
- package/src/models/worksheet.ts +294 -0
- package/src/pipelines/aiLabChat.ts +511 -0
- package/src/pipelines/aiNewtonChat.ts +347 -0
- package/src/pipelines/gradeWorksheet.ts +286 -0
- package/src/routers/_app.ts +6 -0
- package/src/routers/agenda.ts +3 -61
- package/src/routers/announcement.ts +622 -57
- package/src/routers/assignment.ts +157 -1688
- package/src/routers/attendance.ts +16 -277
- package/src/routers/auth.ts +79 -313
- package/src/routers/class.ts +265 -1038
- package/src/routers/comment.ts +76 -0
- package/src/routers/conversation.ts +53 -284
- package/src/routers/event.ts +50 -481
- package/src/routers/file.ts +45 -341
- package/src/routers/folder.ts +107 -836
- package/src/routers/labChat.ts +29 -960
- package/src/routers/marketing.ts +35 -77
- package/src/routers/message.ts +45 -571
- package/src/routers/newtonChat.ts +36 -0
- package/src/routers/notifications.ts +32 -82
- package/src/routers/section.ts +58 -200
- package/src/routers/user.ts +49 -226
- package/src/routers/worksheet.ts +252 -0
- package/src/seedDatabase.ts +330 -290
- package/src/services/agenda.ts +21 -0
- package/src/services/announcement.ts +290 -0
- package/src/services/assignment.ts +1198 -0
- package/src/services/attendance.ts +85 -0
- package/src/services/auth.ts +277 -0
- package/src/services/class.ts +622 -0
- package/src/services/comment.ts +106 -0
- package/src/services/conversation.ts +213 -0
- package/src/services/event.ts +231 -0
- package/src/services/file.ts +167 -0
- package/src/services/folder.ts +316 -0
- package/src/services/labChat.ts +352 -0
- package/src/services/marketing.ts +57 -0
- package/src/services/message.ts +461 -0
- package/src/services/newtonChat.ts +222 -0
- package/src/services/notification.ts +50 -0
- package/src/services/section.ts +283 -0
- package/src/services/user.ts +172 -0
- package/src/services/worksheet.ts +358 -0
- package/src/trpc.ts +4 -0
- package/src/utils/aiUser.ts +4 -3
- package/src/utils/email.ts +33 -4
- package/src/utils/generateInviteCode.ts +1 -3
- package/src/utils/inference.ts +89 -10
- package/src/utils/logger.ts +33 -3
- package/src/utils/prismaErrorHandler.ts +3 -0
- package/src/utils/prismaWrapper.ts +4 -0
- package/tests/globalSetup.ts +62 -0
- package/tests/helpers.ts +22 -0
- package/tests/middleware/security.test.ts +42 -0
- package/tests/routers/agenda.test.ts +138 -0
- package/tests/routers/announcement.test.ts +490 -0
- package/tests/routers/assignment.test.ts +837 -0
- package/tests/routers/attendance.test.ts +160 -0
- package/tests/routers/auth.test.ts +171 -0
- package/tests/{class.test.ts → routers/class.test.ts} +163 -92
- package/tests/routers/comment.test.ts +126 -0
- package/tests/routers/conversation.test.ts +145 -0
- package/tests/routers/event.test.ts +289 -0
- package/tests/routers/folder.test.ts +178 -0
- package/tests/routers/labChat.test.ts +115 -0
- package/tests/routers/marketing.test.ts +59 -0
- package/tests/routers/message.test.ts +123 -0
- package/tests/routers/notification.test.ts +69 -0
- package/tests/routers/section.test.ts +208 -0
- package/tests/server/rateLimit.test.ts +73 -0
- package/tests/setup.ts +39 -65
- package/tests/user.test.ts +136 -0
- package/tests/utils/aiUser.test.ts +22 -0
- package/tests/utils/generateInviteCode.test.ts +24 -0
- package/tests/utils/logger.test.ts +74 -0
- package/tests/utils/prismaErrorHandler.test.ts +101 -0
- package/tests/utils/prismaWrapper.test.ts +82 -0
- package/tests/worksheet.test.ts +181 -0
- package/tsconfig.json +9 -2
- package/vitest.config.ts +30 -1
- package/vitest.unit.config.ts +21 -0
- package/API_SPECIFICATION.md +0 -1597
- package/BASE64_REMOVAL_SUMMARY.md +0 -164
- package/CHAT_API_SPEC.md +0 -579
- package/LAB_CHAT_API_SPEC.md +0 -518
- package/dist/routers/school.d.ts +0 -208
- package/dist/routers/school.d.ts.map +0 -1
- package/dist/routers/school.js +0 -481
- package/tests/auth.test.ts +0 -25
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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]="77d89fdd-b454-5eb8-ac57-db46a6cbfcee")}catch(e){}}();
|
|
3
3
|
import { Storage } from '@google-cloud/storage';
|
|
4
4
|
import { TRPCError } from '@trpc/server';
|
|
5
|
+
import { env } from './config/env.js';
|
|
5
6
|
const storage = new Storage({
|
|
6
|
-
projectId:
|
|
7
|
+
projectId: env.GOOGLE_CLOUD_PROJECT_ID,
|
|
7
8
|
credentials: {
|
|
8
|
-
client_email:
|
|
9
|
-
private_key:
|
|
9
|
+
client_email: env.GOOGLE_CLOUD_CLIENT_EMAIL,
|
|
10
|
+
private_key: env.GOOGLE_CLOUD_PRIVATE_KEY?.replace(/\\n/g, '\n'),
|
|
10
11
|
},
|
|
11
12
|
});
|
|
12
|
-
export const bucket = storage.bucket(
|
|
13
|
+
export const bucket = storage.bucket(env.GOOGLE_CLOUD_BUCKET_NAME);
|
|
13
14
|
// Short expiration time for signed URLs (5 minutes)
|
|
14
15
|
const SIGNED_URL_EXPIRATION = 5 * 60 * 1000;
|
|
15
16
|
// DEPRECATED: This function is no longer used - files are uploaded directly to GCS
|
|
@@ -57,3 +58,41 @@ export async function deleteFile(filePath) {
|
|
|
57
58
|
});
|
|
58
59
|
}
|
|
59
60
|
}
|
|
61
|
+
/**
|
|
62
|
+
* Checks if an object exists in Google Cloud Storage
|
|
63
|
+
* @param bucketName The name of the bucket (unused, uses default bucket)
|
|
64
|
+
* @param objectPath The path of the object to check
|
|
65
|
+
* @returns Promise<boolean> True if the object exists, false otherwise
|
|
66
|
+
*/
|
|
67
|
+
export async function objectExists(bucketName, objectPath) {
|
|
68
|
+
try {
|
|
69
|
+
const [exists] = await bucket.file(objectPath).exists();
|
|
70
|
+
return exists;
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
console.error('Error checking if object exists in Google Cloud Storage:', error);
|
|
74
|
+
throw new TRPCError({
|
|
75
|
+
code: 'INTERNAL_SERVER_ERROR',
|
|
76
|
+
message: 'Failed to check object existence',
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Copies a file within the same bucket to a new path
|
|
82
|
+
* @param sourcePath The GCS path of the source file
|
|
83
|
+
* @param destPath The GCS path for the destination
|
|
84
|
+
*/
|
|
85
|
+
export async function copyFile(sourcePath, destPath) {
|
|
86
|
+
try {
|
|
87
|
+
await bucket.file(sourcePath).copy(destPath);
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
console.error('Error copying file in Google Cloud Storage:', error);
|
|
91
|
+
throw new TRPCError({
|
|
92
|
+
code: 'INTERNAL_SERVER_ERROR',
|
|
93
|
+
message: 'Failed to copy file in storage',
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=googleCloudStorage.js.map
|
|
98
|
+
//# debugId=77d89fdd-b454-5eb8-ac57-db46a6cbfcee
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"googleCloudStorage.js","sources":["lib/googleCloudStorage.ts"],"sourceRoot":"/","sourcesContent":["\nimport { Storage } from '@google-cloud/storage';\nimport { TRPCError } from '@trpc/server';\nimport { env } from './config/env.js';\n\nconst storage = new Storage({\n projectId: env.GOOGLE_CLOUD_PROJECT_ID,\n credentials: {\n client_email: env.GOOGLE_CLOUD_CLIENT_EMAIL,\n private_key: env.GOOGLE_CLOUD_PRIVATE_KEY?.replace(/\\\\n/g, '\\n'),\n },\n});\n\nexport const bucket = storage.bucket(env.GOOGLE_CLOUD_BUCKET_NAME!);\n\n// Short expiration time for signed URLs (5 minutes)\nconst SIGNED_URL_EXPIRATION = 5 * 60 * 1000;\n\n// DEPRECATED: This function is no longer used - files are uploaded directly to GCS\n// The backend proxy upload endpoint in index.ts handles direct uploads\n\n/**\n * Gets a signed URL for a file\n * @param filePath The path of the file in the bucket\n * @returns The signed URL\n */\nexport async function getSignedUrl(filePath: string, action: 'read' | 'write' = 'read', contentType?: string): Promise<string> {\n try {\n const options: any = {\n version: 'v4',\n action: action,\n expires: Date.now() + SIGNED_URL_EXPIRATION,\n };\n\n // For write operations, add content type if provided\n if (action === 'write' && contentType) {\n options.contentType = contentType;\n }\n\n const [url] = await bucket.file(filePath).getSignedUrl(options);\n return url;\n } catch (error) {\n console.error('Error getting signed URL:', error);\n throw new TRPCError({\n code: 'INTERNAL_SERVER_ERROR',\n message: 'Failed to get signed URL',\n });\n }\n}\n\n/**\n * Deletes a file from Google Cloud Storage\n * @param filePath The path of the file to delete\n */\nexport async function deleteFile(filePath: string): Promise<void> {\n try {\n await bucket.file(filePath).delete();\n } catch (error) {\n console.error('Error deleting file from Google Cloud Storage:', error);\n throw new TRPCError({\n code: 'INTERNAL_SERVER_ERROR',\n message: 'Failed to delete file from storage',\n });\n }\n}\n\n/**\n * Checks if an object exists in Google Cloud Storage\n * @param bucketName The name of the bucket (unused, uses default bucket)\n * @param objectPath The path of the object to check\n * @returns Promise<boolean> True if the object exists, false otherwise\n */\nexport async function objectExists(bucketName: string, objectPath: string): Promise<boolean> {\n try {\n const [exists] = await bucket.file(objectPath).exists();\n return exists;\n } catch (error) {\n console.error('Error checking if object exists in Google Cloud Storage:', error);\n throw new TRPCError({\n code: 'INTERNAL_SERVER_ERROR',\n message: 'Failed to check object existence',\n });\n }\n}\n\n/**\n * Copies a file within the same bucket to a new path\n * @param sourcePath The GCS path of the source file\n * @param destPath The GCS path for the destination\n */\nexport async function copyFile(sourcePath: string, destPath: string): Promise<void> {\n try {\n await bucket.file(sourcePath).copy(destPath);\n } catch (error) {\n console.error('Error copying file in Google Cloud Storage:', error);\n throw new TRPCError({\n code: 'INTERNAL_SERVER_ERROR',\n message: 'Failed to copy file in storage',\n });\n }\n} "],"names":[],"mappings":"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","debug_id":"77d89fdd-b454-5eb8-ac57-db46a6cbfcee"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonConversion.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"jsonConversion.d.ts","sourceRoot":"/","sources":["lib/jsonConversion.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAsB,MAAM,iBAAiB,CAAA;AAGnE,wBAAsB,SAAS,CAAC,MAAM,EAAE,aAAa,EAAE,wCAiuBtD"}
|
|
@@ -1,13 +1,16 @@
|
|
|
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]="9776dcc6-8195-5fbe-ace3-f75538ae087a")}catch(e){}}();
|
|
1
3
|
import { PDFDocument, StandardFonts, rgb } from 'pdf-lib';
|
|
2
4
|
import fontkit from '@pdf-lib/fontkit';
|
|
3
5
|
import { readFileSync } from 'fs';
|
|
4
6
|
import { join } from 'path';
|
|
5
7
|
import { FormatTypes, Fonts } from './jsonStyles.js';
|
|
8
|
+
import { logger } from '../utils/logger.js';
|
|
6
9
|
export async function createPdf(blocks) {
|
|
7
|
-
|
|
10
|
+
logger.info(`createPdf: Starting PDF creation with ${blocks.length} blocks`);
|
|
8
11
|
try {
|
|
9
12
|
const pdfDoc = await PDFDocument.create();
|
|
10
|
-
|
|
13
|
+
logger.info('createPdf: PDFDocument created successfully');
|
|
11
14
|
// Register fontkit to enable custom font embedding
|
|
12
15
|
pdfDoc.registerFontkit(fontkit);
|
|
13
16
|
// Load Unicode-compatible fonts (Noto Sans)
|
|
@@ -25,10 +28,10 @@ export async function createPdf(blocks) {
|
|
|
25
28
|
notoSansBold = await pdfDoc.embedFont(boldFontBytes);
|
|
26
29
|
notoSansItalic = await pdfDoc.embedFont(italicFontBytes);
|
|
27
30
|
courierFont = await pdfDoc.embedFont(StandardFonts.Courier); // Keep Courier for code blocks
|
|
28
|
-
|
|
31
|
+
logger.info('createPdf: Unicode fonts loaded successfully');
|
|
29
32
|
}
|
|
30
33
|
catch (fontError) {
|
|
31
|
-
|
|
34
|
+
logger.warn(`createPdf: Failed to load custom fonts, falling back to standard fonts: ${fontError}`);
|
|
32
35
|
// Fallback to standard fonts if custom fonts fail
|
|
33
36
|
notoSansRegular = await pdfDoc.embedFont(StandardFonts.Helvetica);
|
|
34
37
|
notoSansBold = await pdfDoc.embedFont(StandardFonts.HelveticaBold);
|
|
@@ -305,10 +308,10 @@ export async function createPdf(blocks) {
|
|
|
305
308
|
};
|
|
306
309
|
let y = height - marginTop;
|
|
307
310
|
let lastLineHeight = -1;
|
|
308
|
-
|
|
311
|
+
logger.info(`createPdf: Starting to process ${blocks.length} blocks`);
|
|
309
312
|
for (let i = 0; i < blocks.length; i++) {
|
|
310
313
|
const block = blocks[i];
|
|
311
|
-
|
|
314
|
+
logger.info(`createPdf: Processing block ${i + 1}/${blocks.length}, format: ${block.format}, content type: ${typeof block.content}`);
|
|
312
315
|
try {
|
|
313
316
|
const preset = STYLE_PRESETS[block.format] || { fontSize: defaultFontSize, lineHeight: defaultLineHeight };
|
|
314
317
|
const userLineHeight = block.metadata?.lineHeight;
|
|
@@ -659,25 +662,24 @@ export async function createPdf(blocks) {
|
|
|
659
662
|
}
|
|
660
663
|
}
|
|
661
664
|
}
|
|
662
|
-
|
|
665
|
+
logger.info(`createPdf: Successfully processed block ${i + 1}`);
|
|
663
666
|
y -= paragraphSpacing;
|
|
664
667
|
lastLineHeight = lineHeight;
|
|
665
668
|
}
|
|
666
669
|
catch (blockError) {
|
|
667
|
-
|
|
670
|
+
logger.error(`createPdf: Error processing block ${i + 1}: ${blockError}`);
|
|
668
671
|
throw blockError;
|
|
669
672
|
}
|
|
670
673
|
}
|
|
671
|
-
|
|
674
|
+
logger.info('createPdf: About to save PDF document');
|
|
672
675
|
const pdfBytes = await pdfDoc.save();
|
|
673
|
-
|
|
674
|
-
// writeFile('output.pdf', pdfBytes, () => {
|
|
675
|
-
// console.log('PDF created successfully') // Still only saves file, no API yet
|
|
676
|
-
// })
|
|
676
|
+
logger.info(`createPdf: PDF saved successfully, bytes length: ${pdfBytes.length}`);
|
|
677
677
|
return pdfBytes;
|
|
678
678
|
}
|
|
679
679
|
catch (error) {
|
|
680
|
-
|
|
680
|
+
logger.error(`createPdf: Error during PDF creation: ${error}`);
|
|
681
681
|
throw error;
|
|
682
682
|
}
|
|
683
683
|
}
|
|
684
|
+
//# sourceMappingURL=jsonConversion.js.map
|
|
685
|
+
//# debugId=9776dcc6-8195-5fbe-ace3-f75538ae087a
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonConversion.js","sources":["lib/jsonConversion.ts"],"sourceRoot":"/","sourcesContent":["import { PDFDocument, PDFFont, RGB, StandardFonts, last, rgb } from 'pdf-lib'\nimport fontkit from '@pdf-lib/fontkit'\nimport { readFileSync } from 'fs'\nimport { join } from 'path'\nimport { writeFile } from 'fs'\nimport { DocumentBlock, FormatTypes, Fonts } from './jsonStyles.js'\nimport { logger } from '../utils/logger.js'\n\nexport async function createPdf(blocks: DocumentBlock[]) {\n logger.info(`createPdf: Starting PDF creation with ${blocks.length} blocks`);\n try {\n const pdfDoc = await PDFDocument.create()\n logger.info('createPdf: PDFDocument created successfully');\n \n // Register fontkit to enable custom font embedding\n pdfDoc.registerFontkit(fontkit)\n \n // Load Unicode-compatible fonts (Noto Sans)\n const fontDir = join(process.cwd(), 'src', 'lib')\n \n let notoSansRegular: PDFFont\n let notoSansBold: PDFFont\n let notoSansItalic: PDFFont\n let courierFont: PDFFont\n \n try {\n // Try to load custom Unicode fonts\n const regularFontBytes = readFileSync(join(fontDir, 'NotoSans-Regular.ttf'))\n const boldFontBytes = readFileSync(join(fontDir, 'NotoSans-Bold.ttf'))\n const italicFontBytes = readFileSync(join(fontDir, 'NotoSans-Italic.ttf'))\n \n notoSansRegular = await pdfDoc.embedFont(regularFontBytes)\n notoSansBold = await pdfDoc.embedFont(boldFontBytes)\n notoSansItalic = await pdfDoc.embedFont(italicFontBytes)\n courierFont = await pdfDoc.embedFont(StandardFonts.Courier) // Keep Courier for code blocks\n \n logger.info('createPdf: Unicode fonts loaded successfully');\n } catch (fontError) {\n logger.warn(`createPdf: Failed to load custom fonts, falling back to standard fonts: ${fontError}`);\n // Fallback to standard fonts if custom fonts fail\n notoSansRegular = await pdfDoc.embedFont(StandardFonts.Helvetica)\n notoSansBold = await pdfDoc.embedFont(StandardFonts.HelveticaBold)\n notoSansItalic = await pdfDoc.embedFont(StandardFonts.HelveticaOblique)\n courierFont = await pdfDoc.embedFont(StandardFonts.Courier)\n }\n\n const defaultFont = notoSansRegular\n const defaultParagraphSpacing = 10;\n const defaultLineHeight = 1.3\n const defaultFontSize = 12\n const defaultIndentWidth = 14\n const defaultPadding = 10\n\n const headingColor = rgb(0.1, 0.1, 0.1)\n const paragraphColor = rgb(0.15, 0.15, 0.15)\n\n const FONTS: Record<number, PDFFont> = {\n [Fonts.TIMES_ROMAN]: notoSansRegular, // Use Noto Sans instead of Times\n [Fonts.COURIER]: courierFont,\n [Fonts.HELVETICA]: notoSansRegular,\n [Fonts.HELVETICA_BOLD]: notoSansBold,\n [Fonts.HELVETICA_ITALIC]: notoSansItalic,\n [Fonts.HELVETICA_BOLD_ITALIC]: notoSansBold, // Use bold for now, could add bold-italic later\n }\n\n const STYLE_PRESETS: Record<number,\n { fontSize: number; lineHeight: number; paragraphSpacing?: number; font?: PDFFont; color?: RGB; background?: RGB }> =\n {\n [FormatTypes.HEADER_1]: { fontSize: 28, lineHeight: 1.35, font: notoSansBold, color: headingColor },\n [FormatTypes.HEADER_2]: { fontSize: 22, lineHeight: 1.35, font: notoSansBold, color: headingColor },\n [FormatTypes.HEADER_3]: { fontSize: 18, lineHeight: 1.35, font: notoSansBold, color: headingColor },\n [FormatTypes.HEADER_4]: { fontSize: 16, lineHeight: 1.3, font: notoSansBold, color: headingColor },\n [FormatTypes.HEADER_5]: { fontSize: 14, lineHeight: 1.3, font: notoSansBold, color: headingColor },\n [FormatTypes.HEADER_6]: { fontSize: 12, lineHeight: 1.3, font: notoSansBold, color: headingColor },\n [FormatTypes.QUOTE]: { fontSize: 14, lineHeight: 1.5, color: rgb(0.35, 0.35, 0.35) },\n [FormatTypes.CODE_BLOCK]: { fontSize: 12, lineHeight: 1.6, font: courierFont, color: rgb(0.1, 0.1, 0.1), background: rgb(0.95, 0.95, 0.95) },\n [FormatTypes.PARAGRAPH]: { fontSize: 12, lineHeight: 1.3, color: paragraphColor },\n [FormatTypes.BULLET]: { fontSize: 12, lineHeight: 1.3, color: paragraphColor },\n [FormatTypes.NUMBERED]: { fontSize: 12, lineHeight: 1.3, color: paragraphColor },\n [FormatTypes.TABLE]: { fontSize: 12, lineHeight: 1.3, color: paragraphColor },\n [FormatTypes.IMAGE]: { fontSize: 12, lineHeight: 1.3 },\n }\n\n const hexToRgb = (hex) => {\n if (hex.length == 7) {\n const r = parseInt(hex.slice(1, 3), 16) / 255.0;\n const g = parseInt(hex.slice(3, 5), 16) / 255.0;\n const b = parseInt(hex.slice(5, 7), 16) / 255.0;\n return rgb(r, g, b);\n } else if (hex.length == 4) {\n const r = parseInt(hex.slice(1, 2), 16) / 15.0;\n const g = parseInt(hex.slice(2, 3), 16) / 15.0;\n const b = parseInt(hex.slice(3, 4), 16) / 15.0;\n return rgb(r, g, b);\n } else { return rgb(0.0, 0.0, 0.0) };\n };\n\n const colorParse = (color) => {\n if (typeof color === 'string') {\n return hexToRgb(color)\n } else {\n return color\n }\n }\n\n // Minimal sanitization - only remove truly problematic invisible characters\n // With Unicode fonts, we can now keep most characters as-is\n const sanitizeText = (text: string): string => {\n return text\n // Only remove invisible/control characters that break PDF generation\n .replace(/\\uFEFF/g, '') // Remove BOM (Byte Order Mark)\n .replace(/\\u200B/g, '') // Remove zero-width space\n .replace(/\\u200C/g, '') // Remove zero-width non-joiner\n .replace(/\\u200D/g, '') // Remove zero-width joiner\n .replace(/\\uFFFD/g, '?') // Replace replacement character with ?\n // Keep ALL visible Unicode characters - Noto Sans supports them!\n }\n\n // Parse markdown and return styled text segments\n interface TextSegment {\n text: string;\n font: PDFFont;\n color: RGB;\n }\n\n const parseMarkdown = (text: string, baseFont: PDFFont, baseColor: RGB): TextSegment[] => {\n const segments: TextSegment[] = [];\n let currentIndex = 0;\n \n // Regex patterns for markdown\n const patterns = [\n { regex: /\\*\\*(.*?)\\*\\*/g, font: notoSansBold }, // **bold**\n { regex: /__(.*?)__/g, font: notoSansBold }, // __bold__\n { regex: /\\*(.*?)\\*/g, font: notoSansItalic }, // *italic*\n { regex: /_(.*?)_/g, font: notoSansItalic }, // _italic_\n { regex: /`(.*?)`/g, font: courierFont, color: rgb(0.2, 0.2, 0.2) }, // `code`\n ];\n\n // Find all markdown matches\n const matches: Array<{start: number, end: number, text: string, font: PDFFont, color?: RGB}> = [];\n \n for (const pattern of patterns) {\n let match;\n pattern.regex.lastIndex = 0; // Reset regex\n while ((match = pattern.regex.exec(text)) !== null) {\n matches.push({\n start: match.index,\n end: match.index + match[0].length,\n text: match[1], // Captured group (content without markdown syntax)\n font: pattern.font,\n color: pattern.color\n });\n }\n }\n\n // Sort matches by start position\n matches.sort((a, b) => a.start - b.start);\n\n // Remove overlapping matches (keep the first one)\n const filteredMatches: Array<{start: number, end: number, text: string, font: PDFFont, color?: RGB}> = [];\n for (const match of matches) {\n const hasOverlap = filteredMatches.some(existing => \n (match.start < existing.end && match.end > existing.start)\n );\n if (!hasOverlap) {\n filteredMatches.push(match);\n }\n }\n\n // Build segments\n for (const match of filteredMatches) {\n // Add text before this match\n if (match.start > currentIndex) {\n const beforeText = text.substring(currentIndex, match.start);\n if (beforeText) {\n segments.push({\n text: sanitizeText(beforeText),\n font: baseFont,\n color: baseColor\n });\n }\n }\n\n // Add the styled match\n segments.push({\n text: sanitizeText(match.text),\n font: match.font,\n color: match.color || baseColor\n });\n\n currentIndex = match.end;\n }\n\n // Add remaining text\n if (currentIndex < text.length) {\n const remainingText = text.substring(currentIndex);\n if (remainingText) {\n segments.push({\n text: sanitizeText(remainingText),\n font: baseFont,\n color: baseColor\n });\n }\n }\n\n // If no markdown was found, return the whole text as one segment\n if (segments.length === 0) {\n segments.push({\n text: sanitizeText(text),\n font: baseFont,\n color: baseColor\n });\n }\n\n return segments;\n }\n\n // Enhanced text wrapping that handles styled segments\n const wrapStyledText = (segments: TextSegment[], fontSize: number, maxWidth: number): Array<{segments: TextSegment[], width: number}> => {\n const lines: Array<{segments: TextSegment[], width: number}> = [];\n let currentLine: TextSegment[] = [];\n let currentWidth = 0;\n\n for (let segmentIndex = 0; segmentIndex < segments.length; segmentIndex++) {\n const segment = segments[segmentIndex];\n const words = segment.text.split(/\\s+/).filter(word => word.length > 0);\n \n for (let i = 0; i < words.length; i++) {\n const word = words[i];\n const wordWidth = segment.font.widthOfTextAtSize(word, fontSize);\n const spaceWidth = segment.font.widthOfTextAtSize(' ', fontSize);\n \n // Add space before word if:\n // 1. Not the first word in the line AND\n // 2. (Not the first word in the segment OR not the first segment)\n const needSpace = currentLine.length > 0 && (i > 0 || segmentIndex > 0);\n const totalWidth = wordWidth + (needSpace ? spaceWidth : 0);\n\n // Check if we need to wrap to new line\n if (currentWidth + totalWidth > maxWidth && currentLine.length > 0) {\n // Finish current line\n lines.push({ segments: [...currentLine], width: currentWidth });\n currentLine = [];\n currentWidth = 0;\n }\n\n // Add the word to current line\n if (needSpace && currentLine.length > 0) {\n // Try to merge with last segment if same font and color\n const lastSegment = currentLine[currentLine.length - 1];\n if (lastSegment.font === segment.font && lastSegment.color === segment.color) {\n lastSegment.text += ' ' + word;\n currentWidth += spaceWidth + wordWidth;\n } else {\n // Add space + word as new segment\n currentLine.push({ text: ' ' + word, font: segment.font, color: segment.color });\n currentWidth += spaceWidth + wordWidth;\n }\n } else {\n // Add word without space (first word in line or first word overall)\n currentLine.push({ text: word, font: segment.font, color: segment.color });\n currentWidth += wordWidth;\n }\n }\n }\n\n // Add final line if it has content\n if (currentLine.length > 0) {\n lines.push({ segments: currentLine, width: currentWidth });\n }\n\n return lines.length > 0 ? lines : [{ segments: [{ text: '', font: defaultFont, color: rgb(0, 0, 0) }], width: 0 }];\n }\n\n let page = pdfDoc.addPage()\n let { width, height } = page.getSize()\n const { marginTop, marginBottom, marginLeft, marginRight } = { marginTop: 50, marginBottom: 50, marginLeft: 50, marginRight: 50 }\n\n const maxTextWidth = () => width - marginLeft - marginRight\n\n const wrapText = (text: string, font: any, fontSize: number, maxWidth: number): string[] => {\n if (!text) return ['']\n const words = text.split(/\\s+/)\n const lines: string[] = []\n let current = ''\n\n const measure = (t: string) => font.widthOfTextAtSize(t, fontSize)\n\n const pushCurrent = () => {\n if (current.length > 0) {\n lines.push(current)\n current = ''\n }\n }\n\n for (let i = 0; i < words.length; i++) {\n const word = words[i]\n if (current.length === 0) {\n // If a single word is too long, hard-break it\n if (measure(word) > maxWidth) {\n let chunk = ''\n for (const ch of word) {\n const test = chunk + ch\n if (measure(test) > maxWidth && chunk.length > 0) {\n lines.push(chunk)\n chunk = ch\n } else {\n chunk = test\n }\n }\n current = chunk\n } else {\n current = word\n }\n } else {\n const test = current + ' ' + word\n if (measure(test) <= maxWidth) {\n current = test\n } else {\n pushCurrent()\n // start new line with this word; hard-break if needed\n if (measure(word) > maxWidth) {\n let chunk = ''\n for (const ch of word) {\n const t2 = chunk + ch\n if (measure(t2) > maxWidth && chunk.length > 0) {\n lines.push(chunk)\n chunk = ch\n } else {\n chunk = t2\n }\n }\n current = chunk\n } else {\n current = word\n }\n }\n }\n }\n pushCurrent()\n return lines\n }\n\n let y = height - marginTop\n let lastLineHeight = -1\n logger.info(`createPdf: Starting to process ${blocks.length} blocks`);\n for (let i = 0; i < blocks.length; i++) {\n const block = blocks[i];\n logger.info(`createPdf: Processing block ${i + 1}/${blocks.length}, format: ${block.format}, content type: ${typeof block.content}`);\n try {\n const preset = STYLE_PRESETS[block.format] || { fontSize: defaultFontSize, lineHeight: defaultLineHeight }\n\n const userLineHeight = (block as any).metadata?.lineHeight\n\n const fontSize = (block as any).metadata?.fontSize || preset.fontSize\n const lineHeight = (userLineHeight ? fontSize * userLineHeight : fontSize * preset.lineHeight)\n const paragraphSpacing = (block as any).metadata?.paragraphSpacing || defaultParagraphSpacing\n const indentWidth = (block as any).metadata?.indentWidth || defaultIndentWidth\n\n const paddingX = (block as any).metadata?.paddingX || defaultPadding\n const paddingY = (block as any).metadata?.paddingY || defaultPadding\n\n const font = FONTS[(block as any).metadata?.font] || preset.font || defaultFont // Broken\n const color = colorParse((block as any).metadata?.color || preset.color || rgb(0.0, 0.0, 0.0))\n const background = colorParse((block as any).metadata?.background || preset.background || rgb(1.0, 1.0, 1.0))\n\n if (lastLineHeight >= 0) {\n y -= lineHeight - lastLineHeight\n } else {\n y -= fontSize\n }\n\n const ensureSpace = (needed: number) => {\n if (y - needed < marginBottom) {\n page = pdfDoc.addPage()\n ; ({ width, height } = page.getSize())\n y = height - marginTop - fontSize\n lastLineHeight = -1\n return true\n } else { return false }\n }\n\n const drawParagraph = (text: string) => {\n const segments = parseMarkdown(text, font, color);\n const lines = wrapStyledText(segments, fontSize, maxTextWidth());\n \n for (const line of lines) {\n ensureSpace(lineHeight);\n let currentX = marginLeft;\n \n for (const segment of line.segments) {\n if (segment.text.trim()) {\n page.drawText(segment.text, {\n x: currentX,\n y: y,\n size: fontSize,\n font: segment.font,\n color: segment.color,\n });\n currentX += segment.font.widthOfTextAtSize(segment.text, fontSize);\n }\n }\n y -= lineHeight;\n }\n }\n\n const drawHeading = (text: string, align?: 'left' | 'center' | 'right') => {\n const segments = parseMarkdown(text, font, color);\n const lines = wrapStyledText(segments, fontSize, maxTextWidth());\n \n for (const line of lines) {\n ensureSpace(lineHeight);\n let startX = marginLeft;\n \n if (align === 'center') {\n startX = marginLeft + (maxTextWidth() - line.width) / 2;\n } else if (align === 'right') {\n startX = marginLeft + maxTextWidth() - line.width;\n }\n \n let currentX = startX;\n for (const segment of line.segments) {\n if (segment.text.trim()) {\n page.drawText(segment.text, {\n x: currentX,\n y: y,\n size: fontSize,\n font: segment.font,\n color: segment.color,\n });\n currentX += segment.font.widthOfTextAtSize(segment.text, fontSize);\n }\n }\n y -= lineHeight;\n }\n }\n\n const drawBulletList = (items: string[]) => {\n const bulletIndent = indentWidth\n const gap = 8\n const contentWidth = maxTextWidth() - (bulletIndent + gap)\n for (const item of items) {\n // Clean up any bullet symbols that the AI might have added\n const cleanItem = item.replace(/^\\s*[•*-]\\s*/, '').trim();\n const segments = parseMarkdown(cleanItem, font, color);\n const lines = wrapStyledText(segments, fontSize, contentWidth);\n \n for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {\n const line = lines[lineIndex];\n ensureSpace(lineHeight);\n \n // Draw bullet only on first line\n if (lineIndex === 0) {\n page.drawText('•', {\n x: marginLeft + gap,\n y: y,\n size: fontSize,\n font: font,\n color: color,\n });\n }\n \n // Draw styled text\n let currentX = marginLeft + bulletIndent + gap;\n for (const segment of line.segments) {\n if (segment.text.trim()) {\n page.drawText(segment.text, {\n x: currentX,\n y: y,\n size: fontSize,\n font: segment.font,\n color: segment.color,\n });\n currentX += segment.font.widthOfTextAtSize(segment.text, fontSize);\n }\n }\n y -= lineHeight;\n }\n }\n }\n\n const drawNumberedList = (items: string[]) => {\n const numberIndent = indentWidth\n const gap = 8\n const contentWidth = maxTextWidth() - (numberIndent + gap)\n let index = 1\n for (const item of items) {\n // Clean up any numbers that the AI might have added\n const cleanItem = item.replace(/^\\s*\\d+\\.\\s*/, '').trim();\n const numLabel = `${index}.`\n const numWidth = font.widthOfTextAtSize(numLabel, fontSize)\n const segments = parseMarkdown(cleanItem, font, color);\n const lines = wrapStyledText(segments, fontSize, contentWidth);\n \n for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {\n const line = lines[lineIndex];\n ensureSpace(lineHeight);\n \n // Draw number only on first line\n if (lineIndex === 0) {\n page.drawText(numLabel, {\n x: marginLeft + gap,\n y: y,\n size: fontSize,\n font: font,\n color: color,\n });\n }\n \n // Draw styled text\n let currentX = marginLeft + Math.max(numberIndent, numWidth + 6) + gap;\n for (const segment of line.segments) {\n if (segment.text.trim()) {\n page.drawText(segment.text, {\n x: currentX,\n y: y,\n size: fontSize,\n font: segment.font,\n color: segment.color,\n });\n currentX += segment.font.widthOfTextAtSize(segment.text, fontSize);\n }\n }\n y -= lineHeight;\n }\n index++;\n }\n }\n\n const drawQuote = (text: string) => {\n const ruleWidth = 2\n const ruleGap = 8\n const contentX = marginLeft + ruleWidth + ruleGap\n const contentWidth = maxTextWidth() - (ruleWidth + ruleGap)\n const segments = parseMarkdown(text, font, color);\n const lines = wrapStyledText(segments, fontSize, contentWidth);\n const totalHeight = lines.length * lineHeight + fontSize\n var remainingHeight = totalHeight\n \n for (const line of lines) {\n let pageAdded = ensureSpace(lineHeight)\n if (pageAdded || remainingHeight == totalHeight) {\n let blockHeight = Math.floor(Math.min(remainingHeight, y - marginBottom) / lineHeight) * lineHeight\n page.drawRectangle({\n x: marginLeft,\n y: y + lineHeight,\n width: ruleWidth,\n height: -blockHeight - lineHeight + fontSize,\n color: color,\n })\n remainingHeight -= blockHeight + lineHeight - fontSize\n }\n \n // Draw styled text\n let currentX = contentX;\n for (const segment of line.segments) {\n if (segment.text.trim()) {\n page.drawText(segment.text, {\n x: currentX,\n y: y,\n size: fontSize,\n font: segment.font,\n color: segment.color,\n });\n currentX += segment.font.widthOfTextAtSize(segment.text, fontSize);\n }\n }\n y -= lineHeight;\n }\n y -= lineHeight - fontSize\n }\n\n const drawCodeBlock = (textLines: string[]) => {\n const codeFont = font\n \n // Detect indentation patterns\n const detectIndentation = (lines: string[]) => {\n let tabCount = 0\n let spaceCount = 0\n let minSpaces = Infinity\n \n for (const line of lines) {\n if (line.trim().length === 0) continue // Skip empty lines\n \n const leadingWhitespace = line.match(/^(\\s*)/)?.[1] || ''\n if (leadingWhitespace.includes('\\t')) {\n tabCount++\n } else if (leadingWhitespace.length > 0) {\n spaceCount++\n minSpaces = Math.min(minSpaces, leadingWhitespace.length)\n }\n }\n \n // Determine indentation strategy\n if (tabCount > spaceCount) {\n return { type: 'tab', width: indentWidth }\n } else if (spaceCount > 0) {\n // Use the most common space count, or default to 4\n const commonSpaces = minSpaces === Infinity ? 4 : minSpaces\n return { type: 'space', width: commonSpaces * (fontSize * 0.6) } // Approximate space width\n } else {\n return { type: 'space', width: fontSize * 2.4 } // Default 4 spaces\n }\n }\n \n const indentInfo = detectIndentation(textLines)\n \n // Process lines with indentation\n const processedLines: { text: string; indentLevel: number; originalLine: string }[] = []\n \n for (const line of textLines) {\n const leadingWhitespace = line.match(/^(\\s*)/)?.[1] || ''\n let indentLevel = 0\n \n if (indentInfo.type === 'tab') {\n indentLevel = leadingWhitespace.split('\\t').length - 1\n } else {\n // Count spaces, grouping by the detected space width\n const spaceWidth = indentInfo.width / (fontSize * 0.6) // Convert back to space count\n indentLevel = Math.floor(leadingWhitespace.length / spaceWidth)\n }\n \n processedLines.push({\n text: line.trim(),\n indentLevel,\n originalLine: line\n })\n }\n \n // Wrap each processed line separately to preserve line breaks and indentation\n const wrappedLines: { text: string; indentLevel: number; isContinuation: boolean }[] = []\n const contentW = maxTextWidth() - paddingX * 2\n \n for (const processedLine of processedLines) {\n if (processedLine.text.length === 0) {\n // Empty line - preserve as empty line\n wrappedLines.push({\n text: '',\n indentLevel: processedLine.indentLevel,\n isContinuation: false\n })\n } else {\n const parts = wrapText(processedLine.text, codeFont, fontSize, contentW)\n for (let i = 0; i < parts.length; i++) {\n wrappedLines.push({\n text: parts[i],\n indentLevel: processedLine.indentLevel,\n isContinuation: i > 0\n })\n }\n }\n }\n \n const totalHeight = wrappedLines.length * lineHeight + paddingY * 2\n var remainingHeight = totalHeight\n y -= paddingY\n \n for (const wrappedLine of wrappedLines) {\n let pageAdded = ensureSpace(lineHeight + paddingY)\n if (pageAdded || remainingHeight == totalHeight) {\n let blockHeight = Math.floor(Math.min(remainingHeight, y - marginBottom - paddingY) / lineHeight) * lineHeight\n page.drawRectangle({\n x: marginLeft,\n y: y + fontSize,\n width: maxTextWidth(),\n height: -blockHeight - paddingY * 2,\n color: background,\n })\n remainingHeight -= blockHeight\n y -= paddingY\n }\n \n // Calculate indentation offset\n const indentOffset = wrappedLine.indentLevel * indentInfo.width\n \n page.drawText(wrappedLine.text, {\n x: marginLeft + paddingX + indentOffset,\n y: y,\n size: fontSize,\n font: codeFont,\n color: color,\n })\n y -= lineHeight\n }\n y -= paddingY\n }\n\n // Render by block format\n switch (block.format) {\n case FormatTypes.HEADER_1:\n case FormatTypes.HEADER_2:\n case FormatTypes.HEADER_3:\n case FormatTypes.HEADER_4:\n case FormatTypes.HEADER_5:\n case FormatTypes.HEADER_6: {\n const align = (block as any).metadata?.align as 'left' | 'center' | 'right' | undefined\n drawHeading(String(block.content), align)\n break\n }\n case FormatTypes.BULLET: {\n const items = Array.isArray(block.content) ? block.content.map(String) : [String(block.content)]\n drawBulletList(items)\n break\n }\n case FormatTypes.NUMBERED: {\n const items = Array.isArray(block.content) ? block.content.map(String) : [String(block.content)]\n drawNumberedList(items)\n break\n }\n case FormatTypes.QUOTE: {\n drawQuote(String(block.content))\n break\n }\n case FormatTypes.CODE_BLOCK: {\n const lines = Array.isArray(block.content) ? block.content.map(String) : String(block.content).split('\\n')\n drawCodeBlock(lines)\n break\n }\n default: {\n if (typeof block.content === 'string') {\n drawParagraph(block.content)\n } else {\n for (const c of block.content) {\n drawParagraph(String(c))\n }\n }\n }\n }\n logger.info(`createPdf: Successfully processed block ${i + 1}`);\n y -= paragraphSpacing\n lastLineHeight = lineHeight\n } catch (blockError) {\n logger.error(`createPdf: Error processing block ${i + 1}: ${blockError}`);\n throw blockError;\n }\n }\n\n logger.info('createPdf: About to save PDF document');\n const pdfBytes = await pdfDoc.save()\n logger.info(`createPdf: PDF saved successfully, bytes length: ${pdfBytes.length}`);\n return pdfBytes\n } catch (error) {\n logger.error(`createPdf: Error during PDF creation: ${error}`);\n throw error;\n }\n}\n"],"names":[],"mappings":"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","debug_id":"9776dcc6-8195-5fbe-ace3-f75538ae087a"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonStyles.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"jsonStyles.d.ts","sourceRoot":"/","sources":["lib/jsonStyles.ts"],"names":[],"mappings":"AAGA,oBAAY,WAAW;IACnB,QAAQ,IAAA;IACR,QAAQ,IAAA;IACR,QAAQ,IAAA;IACR,QAAQ,IAAA;IACR,QAAQ,IAAA;IACR,QAAQ,IAAA;IACR,SAAS,IAAA;IACT,MAAM,IAAA;IACN,QAAQ,IAAA;IACR,KAAK,IAAA;IACL,KAAK,KAAA;IACL,UAAU,KAAA;IACV,KAAK,KAAA;CACR;AAGD,oBAAY,KAAK;IACb,WAAW,IAAA;IACX,OAAO,IAAA;IACP,SAAS,IAAA;IACT,cAAc,IAAA;IACd,gBAAgB,IAAA;IAChB,qBAAqB,IAAA;CACxB;AAID,MAAM,WAAW,aAAa;IAC1B,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAClC"}
|
package/dist/lib/jsonStyles.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
// -----------------------------
|
|
2
2
|
// Basic format enums and interfaces
|
|
3
3
|
// -----------------------------
|
|
4
|
+
|
|
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]="435981cf-b4a7-5529-bc50-65f51b5d66af")}catch(e){}}();
|
|
4
6
|
export var FormatTypes;
|
|
5
7
|
(function (FormatTypes) {
|
|
6
8
|
FormatTypes[FormatTypes["HEADER_1"] = 0] = "HEADER_1";
|
|
@@ -26,3 +28,5 @@ export var Fonts;
|
|
|
26
28
|
Fonts[Fonts["HELVETICA_ITALIC"] = 4] = "HELVETICA_ITALIC";
|
|
27
29
|
Fonts[Fonts["HELVETICA_BOLD_ITALIC"] = 5] = "HELVETICA_BOLD_ITALIC";
|
|
28
30
|
})(Fonts || (Fonts = {}));
|
|
31
|
+
//# sourceMappingURL=jsonStyles.js.map
|
|
32
|
+
//# debugId=435981cf-b4a7-5529-bc50-65f51b5d66af
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonStyles.js","sources":["lib/jsonStyles.ts"],"sourceRoot":"/","sourcesContent":["// -----------------------------\n// Basic format enums and interfaces\n// -----------------------------\nexport enum FormatTypes {\n HEADER_1,\n HEADER_2,\n HEADER_3,\n HEADER_4,\n HEADER_5,\n HEADER_6,\n PARAGRAPH,\n BULLET,\n NUMBERED,\n TABLE,\n IMAGE,\n CODE_BLOCK,\n QUOTE,\n}\n\n\nexport enum Fonts {\n TIMES_ROMAN,\n COURIER,\n HELVETICA,\n HELVETICA_BOLD,\n HELVETICA_ITALIC,\n HELVETICA_BOLD_ITALIC,\n}\n\n\n// Each content block in a document\nexport interface DocumentBlock {\n format: FormatTypes;\n content: string | string[]; // can be text, list items, etc. string as html / mrkdown\n metadata?: Record<string, any>; // optional extra formatting info (e.g. alignment)\n}\n"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,oCAAoC;AACpC,gCAAgC;;;AAChC,MAAM,CAAN,IAAY,WAcX;AAdD,WAAY,WAAW;IACnB,qDAAQ,CAAA;IACR,qDAAQ,CAAA;IACR,qDAAQ,CAAA;IACR,qDAAQ,CAAA;IACR,qDAAQ,CAAA;IACR,qDAAQ,CAAA;IACR,uDAAS,CAAA;IACT,iDAAM,CAAA;IACN,qDAAQ,CAAA;IACR,+CAAK,CAAA;IACL,gDAAK,CAAA;IACL,0DAAU,CAAA;IACV,gDAAK,CAAA;AACT,CAAC,EAdW,WAAW,KAAX,WAAW,QActB;AAGD,MAAM,CAAN,IAAY,KAOX;AAPD,WAAY,KAAK;IACb,+CAAW,CAAA;IACX,uCAAO,CAAA;IACP,2CAAS,CAAA;IACT,qDAAc,CAAA;IACd,yDAAgB,CAAA;IAChB,mEAAqB,CAAA;AACzB,CAAC,EAPW,KAAK,KAAL,KAAK,QAOhB","debug_id":"435981cf-b4a7-5529-bc50-65f51b5d66af"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
interface notificationData {
|
|
2
|
+
title: string;
|
|
3
|
+
content: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function sendNotification(receiver: string, data: notificationData): Promise<{
|
|
6
|
+
id: string;
|
|
7
|
+
title: string;
|
|
8
|
+
content: string;
|
|
9
|
+
createdAt: Date;
|
|
10
|
+
read: boolean;
|
|
11
|
+
senderId: string | null;
|
|
12
|
+
receiverId: string;
|
|
13
|
+
}>;
|
|
14
|
+
export declare function sendNotifications(receiverIds: Array<string>, data: notificationData): Promise<import(".prisma/client").Prisma.BatchPayload>;
|
|
15
|
+
export declare function markRead(id: string, read?: boolean): Promise<{
|
|
16
|
+
id: string;
|
|
17
|
+
title: string;
|
|
18
|
+
content: string;
|
|
19
|
+
createdAt: Date;
|
|
20
|
+
read: boolean;
|
|
21
|
+
senderId: string | null;
|
|
22
|
+
receiverId: string;
|
|
23
|
+
}>;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=notificationHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notificationHandler.d.ts","sourceRoot":"/","sources":["lib/notificationHandler.ts"],"names":[],"mappings":"AAEA,UAAU,gBAAgB;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAA;CAClB;AAED,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB;;;;;;;;GAS9E;AAED,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,gBAAgB,yDASzF;AAED,wBAAsB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,GAAE,OAAc;;;;;;;;GAM9D"}
|
|
@@ -0,0 +1,32 @@
|
|
|
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]="e0e01d37-e6fd-5751-a9d2-fece72c46422")}catch(e){}}();
|
|
3
|
+
import { prisma } from "./prisma.js";
|
|
4
|
+
export async function sendNotification(receiver, data) {
|
|
5
|
+
const notification = await prisma.notification.create({
|
|
6
|
+
data: {
|
|
7
|
+
receiverId: receiver,
|
|
8
|
+
title: data.title,
|
|
9
|
+
content: data.content,
|
|
10
|
+
},
|
|
11
|
+
});
|
|
12
|
+
return notification;
|
|
13
|
+
}
|
|
14
|
+
export async function sendNotifications(receiverIds, data) {
|
|
15
|
+
const notifications = await prisma.notification.createMany({
|
|
16
|
+
data: receiverIds.map(receiverId => ({
|
|
17
|
+
receiverId: receiverId,
|
|
18
|
+
title: data.title,
|
|
19
|
+
content: data.content,
|
|
20
|
+
})),
|
|
21
|
+
});
|
|
22
|
+
return notifications;
|
|
23
|
+
}
|
|
24
|
+
export async function markRead(id, read = true) {
|
|
25
|
+
const notification = await prisma.notification.update({
|
|
26
|
+
where: { id },
|
|
27
|
+
data: { read: read },
|
|
28
|
+
});
|
|
29
|
+
return notification;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=notificationHandler.js.map
|
|
32
|
+
//# debugId=e0e01d37-e6fd-5751-a9d2-fece72c46422
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notificationHandler.js","sources":["lib/notificationHandler.ts"],"sourceRoot":"/","sourcesContent":["import { prisma } from \"./prisma.js\";\n\ninterface notificationData {\n title: string,\n content: string\n}\n\nexport async function sendNotification(receiver: string, data: notificationData) {\n const notification = await prisma.notification.create({\n data: {\n receiverId: receiver,\n title: data.title,\n content: data.content,\n },\n });\n return notification;\n}\n\nexport async function sendNotifications(receiverIds: Array<string>, data: notificationData) {\n const notifications = await prisma.notification.createMany({\n data: receiverIds.map(receiverId => ({\n receiverId: receiverId,\n title: data.title,\n content: data.content,\n })),\n });\n return notifications;\n}\n\nexport async function markRead(id: string, read: boolean = true) {\n const notification = await prisma.notification.update({\n where: {id},\n data: {read: read},\n });\n return notification;\n}\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAOrC,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAAgB,EAAE,IAAsB;IAC3E,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC;QAClD,IAAI,EAAE;YACF,UAAU,EAAE,QAAQ;YACpB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,IAAI,CAAC,OAAO;SACxB;KACJ,CAAC,CAAC;IACH,OAAO,YAAY,CAAC;AACxB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,WAA0B,EAAE,IAAsB;IACtF,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC;QACvD,IAAI,EAAE,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YACjC,UAAU,EAAE,UAAU;YACtB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,IAAI,CAAC,OAAO;SACxB,CAAC,CAAC;KACN,CAAC,CAAC;IACH,OAAO,aAAa,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,EAAU,EAAE,OAAgB,IAAI;IAC3D,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC;QAClD,KAAK,EAAE,EAAC,EAAE,EAAC;QACX,IAAI,EAAE,EAAC,IAAI,EAAE,IAAI,EAAC;KACrB,CAAC,CAAC;IACH,OAAO,YAAY,CAAC;AACxB,CAAC","debug_id":"e0e01d37-e6fd-5751-a9d2-fece72c46422"}
|
package/dist/lib/prisma.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { PrismaClient } from '@prisma/client';
|
|
2
|
-
declare const prismaClientSingleton: () => PrismaClient<import(".prisma/client").Prisma.PrismaClientOptions, never, import("@prisma/client/runtime/library").DefaultArgs>;
|
|
2
|
+
declare const prismaClientSingleton: () => PrismaClient<import(".prisma/client").Prisma.PrismaClientOptions, never, import("@prisma/client/runtime/library.js").DefaultArgs>;
|
|
3
3
|
declare global {
|
|
4
4
|
var prisma: undefined | ReturnType<typeof prismaClientSingleton>;
|
|
5
5
|
}
|
|
6
|
-
export declare const prisma: PrismaClient<import(".prisma/client").Prisma.PrismaClientOptions, never, import("@prisma/client/runtime/library").DefaultArgs>;
|
|
6
|
+
export declare const prisma: PrismaClient<import(".prisma/client").Prisma.PrismaClientOptions, never, import("@prisma/client/runtime/library.js").DefaultArgs>;
|
|
7
7
|
export {};
|
|
8
8
|
//# sourceMappingURL=prisma.d.ts.map
|
package/dist/lib/prisma.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prisma.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"prisma.d.ts","sourceRoot":"/","sources":["lib/prisma.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAc9C,QAAA,MAAM,qBAAqB,yIAO1B,CAAC;AAGF,OAAO,CAAC,MAAM,CAAC;IACb,IAAI,MAAM,EAAE,SAAS,GAAG,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC;CAClE;AAED,eAAO,MAAM,MAAM,mIAA+C,CAAC"}
|
package/dist/lib/prisma.js
CHANGED
|
@@ -1,8 +1,31 @@
|
|
|
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]="ccd03fae-35bf-58da-b672-e834ceba3cc9")}catch(e){}}();
|
|
1
3
|
import { PrismaClient } from '@prisma/client';
|
|
4
|
+
import { env } from './config/env.js';
|
|
5
|
+
const getLogLevel = () => {
|
|
6
|
+
switch (env.NODE_ENV) {
|
|
7
|
+
case 'development':
|
|
8
|
+
return ['query', 'error', 'warn'];
|
|
9
|
+
case 'production':
|
|
10
|
+
return ['error'];
|
|
11
|
+
default:
|
|
12
|
+
return ['error'];
|
|
13
|
+
}
|
|
14
|
+
};
|
|
2
15
|
const prismaClientSingleton = () => {
|
|
16
|
+
// return new PrismaClient({
|
|
17
|
+
// log: env.NODE_ENV === 'development'
|
|
18
|
+
// ? ['query', 'error', 'warn']
|
|
19
|
+
// : ['error'],
|
|
20
|
+
// });
|
|
3
21
|
return new PrismaClient();
|
|
4
22
|
};
|
|
5
23
|
export const prisma = globalThis.prisma ?? prismaClientSingleton();
|
|
6
|
-
if (
|
|
24
|
+
if (env.NODE_ENV !== 'production') {
|
|
7
25
|
globalThis.prisma = prisma;
|
|
8
26
|
}
|
|
27
|
+
process.on('beforeExit', async () => {
|
|
28
|
+
await prisma.$disconnect();
|
|
29
|
+
});
|
|
30
|
+
//# sourceMappingURL=prisma.js.map
|
|
31
|
+
//# debugId=ccd03fae-35bf-58da-b672-e834ceba3cc9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma.js","sources":["lib/prisma.ts"],"sourceRoot":"/","sourcesContent":["import { PrismaClient } from '@prisma/client';\nimport { env } from './config/env.js';\n\nconst getLogLevel = () => {\n switch (env.NODE_ENV) {\n case 'development':\n return ['query', 'error', 'warn'];\n case 'production':\n return ['error'];\n default:\n return ['error'];\n }\n}\n\nconst prismaClientSingleton = () => {\n // return new PrismaClient({\n // log: env.NODE_ENV === 'development' \n // ? ['query', 'error', 'warn'] \n // : ['error'],\n // });\n return new PrismaClient();\n};\n\n// Prevent multiple instances of Prisma Client in development\ndeclare global {\n var prisma: undefined | ReturnType<typeof prismaClientSingleton>;\n}\n\nexport const prisma = globalThis.prisma ?? prismaClientSingleton();\n\nif (env.NODE_ENV !== 'production') {\n globalThis.prisma = prisma;\n}\n\nprocess.on('beforeExit', async () => {\n await prisma.$disconnect();\n});"],"names":[],"mappings":";;AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAEtC,MAAM,WAAW,GAAG,GAAG,EAAE;IACvB,QAAQ,GAAG,CAAC,QAAQ,EAAE,CAAC;QACrB,KAAK,aAAa;YAChB,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACpC,KAAK,YAAY;YACf,OAAO,CAAC,OAAO,CAAC,CAAC;QACnB;YACE,OAAO,CAAC,OAAO,CAAC,CAAC;IACrB,CAAC;AACH,CAAC,CAAA;AAED,MAAM,qBAAqB,GAAG,GAAG,EAAE;IACjC,4BAA4B;IAC5B,yCAAyC;IACzC,oCAAoC;IACpC,mBAAmB;IACnB,MAAM;IACN,OAAO,IAAI,YAAY,EAAE,CAAC;AAC5B,CAAC,CAAC;AAOF,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,IAAI,qBAAqB,EAAE,CAAC;AAEnE,IAAI,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;IAClC,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC;AAC7B,CAAC;AAED,OAAO,CAAC,EAAE,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE;IAClC,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;AAC7B,CAAC,CAAC,CAAC","debug_id":"ccd03fae-35bf-58da-b672-e834ceba3cc9"}
|
package/dist/lib/pusher.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import Pusher from 'pusher';
|
|
2
2
|
declare const pusher: Pusher;
|
|
3
|
-
|
|
3
|
+
declare const chatChannel: (conversationId: string) => string;
|
|
4
|
+
declare const worksheetChannel: (worksheetResponseId: string) => string;
|
|
5
|
+
declare const teacherChannel: (classId: string) => string;
|
|
6
|
+
export { pusher, chatChannel, worksheetChannel, teacherChannel };
|
|
4
7
|
//# sourceMappingURL=pusher.d.ts.map
|
package/dist/lib/pusher.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pusher.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"pusher.d.ts","sourceRoot":"/","sources":["lib/pusher.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAG5B,QAAA,MAAM,MAAM,QAMV,CAAC;AAEH,QAAA,MAAM,WAAW,GAAI,gBAAgB,MAAM,WAA6C,CAAC;AACzF,QAAA,MAAM,gBAAgB,GAAI,qBAAqB,MAAM,WAA+C,CAAC;AACrG,QAAA,MAAM,cAAc,GAAI,SAAS,MAAM,WAAiC,CAAC;AAEzE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,cAAc,EAAE,CAAC"}
|
package/dist/lib/pusher.js
CHANGED
|
@@ -1,9 +1,17 @@
|
|
|
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]="1a264a0a-82ea-5ed9-8854-d1fbea3098c1")}catch(e){}}();
|
|
1
3
|
import Pusher from 'pusher';
|
|
4
|
+
import { env } from './config/env.js';
|
|
2
5
|
const pusher = new Pusher({
|
|
3
|
-
appId:
|
|
4
|
-
key:
|
|
5
|
-
secret:
|
|
6
|
-
cluster:
|
|
7
|
-
useTLS:
|
|
6
|
+
appId: env.PUSHER_APP_ID,
|
|
7
|
+
key: env.PUSHER_KEY,
|
|
8
|
+
secret: env.PUSHER_SECRET,
|
|
9
|
+
cluster: env.PUSHER_CLUSTER,
|
|
10
|
+
useTLS: env.NODE_ENV !== 'development',
|
|
8
11
|
});
|
|
9
|
-
|
|
12
|
+
const chatChannel = (conversationId) => `private-conversation-${conversationId}`;
|
|
13
|
+
const worksheetChannel = (worksheetResponseId) => `private-worksheet-${worksheetResponseId}`;
|
|
14
|
+
const teacherChannel = (classId) => `private-teacher-${classId}`;
|
|
15
|
+
export { pusher, chatChannel, worksheetChannel, teacherChannel };
|
|
16
|
+
//# sourceMappingURL=pusher.js.map
|
|
17
|
+
//# debugId=1a264a0a-82ea-5ed9-8854-d1fbea3098c1
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pusher.js","sources":["lib/pusher.ts"],"sourceRoot":"/","sourcesContent":["import Pusher from 'pusher';\nimport { env } from './config/env.js';\n\nconst pusher = new Pusher({\n appId: env.PUSHER_APP_ID,\n key: env.PUSHER_KEY,\n secret: env.PUSHER_SECRET,\n cluster: env.PUSHER_CLUSTER,\n useTLS: env.NODE_ENV !== 'development',\n});\n\nconst chatChannel = (conversationId: string) => `private-conversation-${conversationId}`;\nconst worksheetChannel = (worksheetResponseId: string) => `private-worksheet-${worksheetResponseId}`;\nconst teacherChannel = (classId: string) => `private-teacher-${classId}`;\n\nexport { pusher, chatChannel, worksheetChannel, teacherChannel };\n"],"names":[],"mappings":";;AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAEtC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;IACxB,KAAK,EAAE,GAAG,CAAC,aAAa;IACxB,GAAG,EAAE,GAAG,CAAC,UAAU;IACnB,MAAM,EAAE,GAAG,CAAC,aAAa;IACzB,OAAO,EAAE,GAAG,CAAC,cAAc;IAC3B,MAAM,EAAE,GAAG,CAAC,QAAQ,KAAK,aAAa;CACvC,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,CAAC,cAAsB,EAAE,EAAE,CAAC,wBAAwB,cAAc,EAAE,CAAC;AACzF,MAAM,gBAAgB,GAAG,CAAC,mBAA2B,EAAE,EAAE,CAAC,qBAAqB,mBAAmB,EAAE,CAAC;AACrG,MAAM,cAAc,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC,mBAAmB,OAAO,EAAE,CAAC;AAEzE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,cAAc,EAAE,CAAC","debug_id":"1a264a0a-82ea-5ed9-8854-d1fbea3098c1"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis.d.ts","sourceRoot":"/","sources":["lib/redis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,SAAS,CAAC;AAM5B,wBAAgB,QAAQ,IAAI,KAAK,GAAG,IAAI,CAEvC;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAqC1D;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAMrD"}
|
|
@@ -0,0 +1,53 @@
|
|
|
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]="a165b965-e03f-5a84-9822-ff522ed34632")}catch(e){}}();
|
|
3
|
+
import Redis from 'ioredis';
|
|
4
|
+
import { env } from './config/env.js';
|
|
5
|
+
import { logger } from '../utils/logger.js';
|
|
6
|
+
let redis = null;
|
|
7
|
+
export function getRedis() {
|
|
8
|
+
return redis;
|
|
9
|
+
}
|
|
10
|
+
export async function connectRedis() {
|
|
11
|
+
const url = env.REDIS_URL;
|
|
12
|
+
if (!url) {
|
|
13
|
+
logger.info('Redis not configured (REDIS_URL not set), skipping');
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
if (redis) {
|
|
17
|
+
return redis;
|
|
18
|
+
}
|
|
19
|
+
redis = new Redis(url, {
|
|
20
|
+
maxRetriesPerRequest: 3,
|
|
21
|
+
retryStrategy(times) {
|
|
22
|
+
if (times > 3)
|
|
23
|
+
return null;
|
|
24
|
+
return Math.min(times * 200, 2000);
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
redis.on('error', (err) => {
|
|
28
|
+
logger.error('Redis connection error', { error: err.message });
|
|
29
|
+
});
|
|
30
|
+
redis.on('connect', () => {
|
|
31
|
+
logger.info('Redis connected');
|
|
32
|
+
});
|
|
33
|
+
try {
|
|
34
|
+
await redis.ping();
|
|
35
|
+
logger.info('Redis ready');
|
|
36
|
+
return redis;
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
logger.error('Redis ping failed', { error });
|
|
40
|
+
redis.disconnect();
|
|
41
|
+
redis = null;
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export async function disconnectRedis() {
|
|
46
|
+
if (redis) {
|
|
47
|
+
await redis.quit();
|
|
48
|
+
redis = null;
|
|
49
|
+
logger.info('Redis disconnected');
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=redis.js.map
|
|
53
|
+
//# debugId=a165b965-e03f-5a84-9822-ff522ed34632
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis.js","sources":["lib/redis.ts"],"sourceRoot":"/","sourcesContent":["import Redis from 'ioredis';\nimport { env } from './config/env.js';\nimport { logger } from '../utils/logger.js';\n\nlet redis: Redis | null = null;\n\nexport function getRedis(): Redis | null {\n return redis;\n}\n\nexport async function connectRedis(): Promise<Redis | null> {\n const url = env.REDIS_URL;\n if (!url) {\n logger.info('Redis not configured (REDIS_URL not set), skipping');\n return null;\n }\n\n if (redis) {\n return redis;\n }\n\n redis = new Redis(url, {\n maxRetriesPerRequest: 3,\n retryStrategy(times) {\n if (times > 3) return null;\n return Math.min(times * 200, 2000);\n },\n });\n\n redis.on('error', (err) => {\n logger.error('Redis connection error', { error: err.message });\n });\n\n redis.on('connect', () => {\n logger.info('Redis connected');\n });\n\n try {\n await redis.ping();\n logger.info('Redis ready');\n return redis;\n } catch (error) {\n logger.error('Redis ping failed', { error });\n redis.disconnect();\n redis = null;\n return null;\n }\n}\n\nexport async function disconnectRedis(): Promise<void> {\n if (redis) {\n await redis.quit();\n redis = null;\n logger.info('Redis disconnected');\n }\n}\n"],"names":[],"mappings":";;AAAA,OAAO,KAAK,MAAM,SAAS,CAAC;AAC5B,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,IAAI,KAAK,GAAiB,IAAI,CAAC;AAE/B,MAAM,UAAU,QAAQ;IACtB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC;IAC1B,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;QAClE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,GAAG,IAAI,KAAK,CAAC,GAAG,EAAE;QACrB,oBAAoB,EAAE,CAAC;QACvB,aAAa,CAAC,KAAK;YACjB,IAAI,KAAK,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC3B,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,EAAE,IAAI,CAAC,CAAC;QACrC,CAAC;KACF,CAAC,CAAC;IAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QACxB,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QACvB,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7C,KAAK,CAAC,UAAU,EAAE,CAAC;QACnB,KAAK,GAAG,IAAI,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,GAAG,IAAI,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACpC,CAAC;AACH,CAAC","debug_id":"a165b965-e03f-5a84-9822-ff522ed34632"}
|
|
@@ -1,22 +1 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generates a thumbnail for an image or PDF file
|
|
3
|
-
* @param fileBuffer The file buffer
|
|
4
|
-
* @param fileType The MIME type of the file
|
|
5
|
-
* @returns Thumbnail buffer
|
|
6
|
-
*/
|
|
7
|
-
export declare function generateMediaThumbnail(fileBuffer: Buffer, fileType: string): Promise<Buffer>;
|
|
8
|
-
/**
|
|
9
|
-
* Generates a thumbnail for a file
|
|
10
|
-
* @param fileName The name of the file in Google Cloud Storage
|
|
11
|
-
* @param fileType The MIME type of the file
|
|
12
|
-
* @returns The thumbnail buffer or null if thumbnail generation is not supported
|
|
13
|
-
*/
|
|
14
|
-
export declare function generateThumbnail(fileName: string, fileType: string): Promise<Buffer | null>;
|
|
15
|
-
/**
|
|
16
|
-
* Stores a thumbnail in Google Cloud Storage and creates a File entry
|
|
17
|
-
* @param thumbnailBuffer The thumbnail buffer to store
|
|
18
|
-
* @param originalFileName The original file name
|
|
19
|
-
* @param userId The user ID who owns the file
|
|
20
|
-
* @returns The ID of the created thumbnail File
|
|
21
|
-
*/
|
|
22
1
|
//# sourceMappingURL=thumbnailGenerator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thumbnailGenerator.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"thumbnailGenerator.d.ts","sourceRoot":"/","sources":["lib/thumbnailGenerator.ts"],"names":[],"mappings":""}
|