@studious-lms/server 1.13.0 → 1.15.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/.dockerignore +28 -0
- package/.env.example +5 -0
- package/.github/workflows/deploy.yml +123 -0
- package/Dockerfile +54 -0
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/instrument.js +3 -3
- package/dist/instrument.js.map +1 -1
- package/dist/lib/config/cors.d.ts.map +1 -1
- package/dist/lib/config/cors.js +31 -11
- package/dist/lib/config/cors.js.map +1 -1
- package/dist/lib/config/env.d.ts +17 -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/googleCloudStorage.d.ts +10 -0
- package/dist/lib/googleCloudStorage.d.ts.map +1 -1
- package/dist/lib/googleCloudStorage.js +22 -2
- package/dist/lib/googleCloudStorage.js.map +1 -1
- package/dist/lib/inferDocumentFormat.d.ts +10 -0
- package/dist/lib/inferDocumentFormat.d.ts.map +1 -0
- package/dist/lib/inferDocumentFormat.js +48 -0
- package/dist/lib/inferDocumentFormat.js.map +1 -0
- package/dist/lib/legal.d.ts +3 -0
- package/dist/lib/legal.d.ts.map +1 -0
- package/dist/lib/legal.js +6 -0
- package/dist/lib/legal.js.map +1 -0
- package/dist/lib/prisma.d.ts +104 -5
- package/dist/lib/prisma.d.ts.map +1 -1
- package/dist/lib/prisma.js +33 -2
- package/dist/lib/prisma.js.map +1 -1
- package/dist/models/agenda.d.ts +20 -20
- package/dist/models/announcement.d.ts +211 -101
- package/dist/models/announcement.d.ts.map +1 -1
- package/dist/models/assignment.d.ts +560 -362
- package/dist/models/assignment.d.ts.map +1 -1
- package/dist/models/attendance.d.ts +197 -71
- package/dist/models/attendance.d.ts.map +1 -1
- package/dist/models/auth.d.ts +356 -114
- package/dist/models/auth.d.ts.map +1 -1
- package/dist/models/auth.js +4 -2
- package/dist/models/auth.js.map +1 -1
- package/dist/models/class.d.ts +327 -201
- package/dist/models/class.d.ts.map +1 -1
- package/dist/models/class.js +2 -2
- package/dist/models/class.js.map +1 -1
- package/dist/models/cloudStorage.d.ts +146 -56
- package/dist/models/cloudStorage.d.ts.map +1 -1
- package/dist/models/comment.d.ts +262 -110
- package/dist/models/comment.d.ts.map +1 -1
- package/dist/models/conversation.d.ts +206 -80
- package/dist/models/conversation.d.ts.map +1 -1
- package/dist/models/department.d.ts +196 -70
- package/dist/models/department.d.ts.map +1 -1
- package/dist/models/event.d.ts +305 -141
- package/dist/models/event.d.ts.map +1 -1
- package/dist/models/file.d.ts +422 -272
- package/dist/models/file.d.ts.map +1 -1
- package/dist/models/folder.d.ts +433 -181
- package/dist/models/folder.d.ts.map +1 -1
- package/dist/models/labChat.d.ts +205 -79
- package/dist/models/labChat.d.ts.map +1 -1
- package/dist/models/marketing.d.ts +79 -38
- package/dist/models/marketing.d.ts.map +1 -1
- package/dist/models/marketing.js +12 -4
- package/dist/models/marketing.js.map +1 -1
- package/dist/models/message.d.ts +97 -43
- package/dist/models/message.d.ts.map +1 -1
- package/dist/models/newtonChat.d.ts +84 -30
- package/dist/models/newtonChat.d.ts.map +1 -1
- package/dist/models/notification.d.ts +57 -21
- package/dist/models/notification.d.ts.map +1 -1
- package/dist/models/school.d.ts +349 -133
- package/dist/models/school.d.ts.map +1 -1
- package/dist/models/section.d.ts +216 -72
- package/dist/models/section.d.ts.map +1 -1
- package/dist/models/tag.d.ts +156 -48
- package/dist/models/tag.d.ts.map +1 -1
- package/dist/models/user.d.ts +82 -28
- package/dist/models/user.d.ts.map +1 -1
- package/dist/models/worksheet.d.ts +1032 -423
- package/dist/models/worksheet.d.ts.map +1 -1
- package/dist/models/worksheet.js +8 -2
- package/dist/models/worksheet.js.map +1 -1
- package/dist/pipelines/aiLabChat.d.ts +7 -9
- package/dist/pipelines/aiLabChat.d.ts.map +1 -1
- package/dist/pipelines/aiLabChat.js +194 -125
- package/dist/pipelines/aiLabChat.js.map +1 -1
- package/dist/pipelines/aiLabChatContract.d.ts +233 -389
- package/dist/pipelines/aiLabChatContract.d.ts.map +1 -1
- package/dist/pipelines/aiLabChatContract.js +54 -70
- package/dist/pipelines/aiLabChatContract.js.map +1 -1
- package/dist/pipelines/aiNewtonChat.d.ts.map +1 -1
- package/dist/pipelines/aiNewtonChat.js +41 -41
- package/dist/pipelines/aiNewtonChat.js.map +1 -1
- package/dist/pipelines/gradeWorksheet.d.ts +8 -8
- package/dist/pipelines/labChatPrompt.d.ts +18 -11
- package/dist/pipelines/labChatPrompt.d.ts.map +1 -1
- package/dist/pipelines/labChatPrompt.js +93 -75
- package/dist/pipelines/labChatPrompt.js.map +1 -1
- package/dist/pipelines/pdfToWorksheet.d.ts +1 -1
- package/dist/routers/_app.d.ts +2601 -2151
- package/dist/routers/_app.d.ts.map +1 -1
- package/dist/routers/_app.js +4 -2
- package/dist/routers/_app.js.map +1 -1
- package/dist/routers/admin.d.ts +13 -13
- package/dist/routers/agenda.d.ts +18 -18
- package/dist/routers/announcement.d.ts +60 -60
- package/dist/routers/assignment.d.ts +393 -383
- package/dist/routers/assignment.d.ts.map +1 -1
- package/dist/routers/attendance.d.ts +10 -10
- package/dist/routers/auth.d.ts +4 -2
- package/dist/routers/auth.d.ts.map +1 -1
- package/dist/routers/auth.js +15 -2
- package/dist/routers/auth.js.map +1 -1
- package/dist/routers/class.d.ts +157 -153
- package/dist/routers/class.d.ts.map +1 -1
- package/dist/routers/comment.d.ts +18 -18
- package/dist/routers/conversation.d.ts +11 -11
- package/dist/routers/department.d.ts +34 -34
- package/dist/routers/discussion.d.ts +68 -56
- package/dist/routers/discussion.d.ts.map +1 -1
- package/dist/routers/discussion.js +6 -2
- package/dist/routers/discussion.js.map +1 -1
- package/dist/routers/embedding.d.ts +73 -0
- package/dist/routers/embedding.d.ts.map +1 -0
- package/dist/routers/embedding.js +151 -0
- package/dist/routers/embedding.js.map +1 -0
- package/dist/routers/event.d.ts +57 -55
- package/dist/routers/event.d.ts.map +1 -1
- package/dist/routers/file.d.ts +14 -14
- package/dist/routers/folder.d.ts +38 -38
- package/dist/routers/labChat.d.ts +16 -16
- package/dist/routers/marketing.d.ts +1 -14
- package/dist/routers/marketing.d.ts.map +1 -1
- package/dist/routers/message.d.ts +13 -13
- package/dist/routers/newtonChat.d.ts +4 -4
- package/dist/routers/notifications.d.ts +5 -5
- package/dist/routers/permissions.d.ts +14 -14
- package/dist/routers/school.d.ts +59 -55
- package/dist/routers/school.d.ts.map +1 -1
- package/dist/routers/search.d.ts +22 -1
- package/dist/routers/search.d.ts.map +1 -1
- package/dist/routers/search.js +9 -3
- package/dist/routers/search.js.map +1 -1
- package/dist/routers/section.d.ts +4 -4
- package/dist/routers/studentProgress.d.ts +1 -1
- package/dist/routers/tag.d.ts +7 -7
- package/dist/routers/user.d.ts +99 -10
- package/dist/routers/user.d.ts.map +1 -1
- package/dist/routers/user.js +19 -2
- package/dist/routers/user.js.map +1 -1
- package/dist/routers/worksheet.d.ts +93 -55
- package/dist/routers/worksheet.d.ts.map +1 -1
- package/dist/routers/worksheet.js +26 -2
- package/dist/routers/worksheet.js.map +1 -1
- package/dist/routes/aiStream.d.ts +2 -0
- package/dist/routes/aiStream.d.ts.map +1 -0
- package/dist/routes/aiStream.js +726 -0
- package/dist/routes/aiStream.js.map +1 -0
- package/dist/seedDatabase.d.ts +3 -1
- package/dist/seedDatabase.d.ts.map +1 -1
- package/dist/seedDatabase.js +6 -6
- package/dist/seedDatabase.js.map +1 -1
- package/dist/services/adminInstitution.d.ts +8 -8
- package/dist/services/adminRunJob.d.ts +4 -4
- package/dist/services/agenda.d.ts +18 -18
- package/dist/services/aiChatStream.d.ts +88 -0
- package/dist/services/aiChatStream.d.ts.map +1 -0
- package/dist/services/aiChatStream.js +254 -0
- package/dist/services/aiChatStream.js.map +1 -0
- package/dist/services/aiModifierTools.d.ts +16 -0
- package/dist/services/aiModifierTools.d.ts.map +1 -0
- package/dist/services/aiModifierTools.js +274 -0
- package/dist/services/aiModifierTools.js.map +1 -0
- package/dist/services/aiProposalTools.d.ts +32 -0
- package/dist/services/aiProposalTools.d.ts.map +1 -0
- package/dist/services/aiProposalTools.js +207 -0
- package/dist/services/aiProposalTools.js.map +1 -0
- package/dist/services/aiStream.d.ts +22 -0
- package/dist/services/aiStream.d.ts.map +1 -0
- package/dist/services/aiStream.js +142 -0
- package/dist/services/aiStream.js.map +1 -0
- package/dist/services/aiTools.d.ts +16 -0
- package/dist/services/aiTools.d.ts.map +1 -0
- package/dist/services/aiTools.js +271 -0
- package/dist/services/aiTools.js.map +1 -0
- package/dist/services/announcement.d.ts +42 -42
- package/dist/services/announcement.d.ts.map +1 -1
- package/dist/services/announcement.js +7 -2
- package/dist/services/announcement.js.map +1 -1
- package/dist/services/assignment.d.ts +355 -345
- package/dist/services/assignment.d.ts.map +1 -1
- package/dist/services/assignment.js +30 -9
- package/dist/services/assignment.js.map +1 -1
- package/dist/services/attendance.d.ts +10 -10
- package/dist/services/auth.d.ts +4 -2
- package/dist/services/auth.d.ts.map +1 -1
- package/dist/services/auth.js +13 -4
- package/dist/services/auth.js.map +1 -1
- package/dist/services/class.d.ts +146 -142
- package/dist/services/class.d.ts.map +1 -1
- package/dist/services/class.js +24 -4
- package/dist/services/class.js.map +1 -1
- package/dist/services/comment.d.ts +18 -18
- package/dist/services/conversation.d.ts +11 -11
- package/dist/services/department.d.ts +33 -33
- package/dist/services/discussion.d.ts +58 -58
- package/dist/services/discussion.d.ts.map +1 -1
- package/dist/services/discussion.js +15 -8
- package/dist/services/discussion.js.map +1 -1
- package/dist/services/discussionSummary.d.ts +21 -0
- package/dist/services/discussionSummary.d.ts.map +1 -0
- package/dist/services/discussionSummary.js +179 -0
- package/dist/services/discussionSummary.js.map +1 -0
- package/dist/services/embedding.d.ts +85 -0
- package/dist/services/embedding.d.ts.map +1 -0
- package/dist/services/embedding.js +372 -0
- package/dist/services/embedding.js.map +1 -0
- package/dist/services/event.d.ts +55 -53
- package/dist/services/event.d.ts.map +1 -1
- package/dist/services/file.d.ts +28 -28
- package/dist/services/folder.d.ts +36 -36
- package/dist/services/folder.d.ts.map +1 -1
- package/dist/services/folder.js +32 -2
- package/dist/services/folder.js.map +1 -1
- package/dist/services/labChat.d.ts +16 -16
- package/dist/services/marketing.d.ts +2 -15
- package/dist/services/marketing.d.ts.map +1 -1
- package/dist/services/marketing.js +5 -5
- package/dist/services/marketing.js.map +1 -1
- package/dist/services/message.d.ts +11 -11
- package/dist/services/message.d.ts.map +1 -1
- package/dist/services/message.js +2 -2
- package/dist/services/message.js.map +1 -1
- package/dist/services/newtonChat.d.ts +4 -4
- package/dist/services/notification.d.ts +5 -5
- package/dist/services/notification.d.ts.map +1 -1
- package/dist/services/openaiDocumentGen.d.ts +37 -0
- package/dist/services/openaiDocumentGen.d.ts.map +1 -0
- package/dist/services/openaiDocumentGen.js +262 -0
- package/dist/services/openaiDocumentGen.js.map +1 -0
- package/dist/services/permissions.d.ts +14 -14
- package/dist/services/school.d.ts +54 -50
- package/dist/services/school.d.ts.map +1 -1
- package/dist/services/search.d.ts +13 -1
- package/dist/services/search.d.ts.map +1 -1
- package/dist/services/search.js +145 -2
- package/dist/services/search.js.map +1 -1
- package/dist/services/section.d.ts +3 -3
- package/dist/services/tag.d.ts +4 -4
- package/dist/services/user.d.ts +4 -4
- package/dist/services/user.d.ts.map +1 -1
- package/dist/services/user.js +10 -15
- package/dist/services/user.js.map +1 -1
- package/dist/services/userPrivacy.d.ts +86 -0
- package/dist/services/userPrivacy.d.ts.map +1 -0
- package/dist/services/userPrivacy.js +184 -0
- package/dist/services/userPrivacy.js.map +1 -0
- package/dist/services/worksheet.d.ts +86 -57
- package/dist/services/worksheet.d.ts.map +1 -1
- package/dist/services/worksheet.js +57 -5
- package/dist/services/worksheet.js.map +1 -1
- package/dist/utils/email.d.ts.map +1 -1
- package/dist/utils/email.js +7 -3
- package/dist/utils/email.js.map +1 -1
- package/dist/utils/streamBroadcast.d.ts +11 -0
- package/dist/utils/streamBroadcast.d.ts.map +1 -0
- package/dist/utils/streamBroadcast.js +32 -0
- package/dist/utils/streamBroadcast.js.map +1 -0
- package/dist/workers/connection.d.ts +15 -0
- package/dist/workers/connection.d.ts.map +1 -1
- package/dist/workers/connection.js +20 -2
- package/dist/workers/connection.js.map +1 -1
- package/dist/workers/index.js +4 -2
- package/dist/workers/index.js.map +1 -1
- package/dist/workers/processors/createRunJobWorker.d.ts.map +1 -1
- package/dist/workers/processors/createRunJobWorker.js +31 -8
- package/dist/workers/processors/createRunJobWorker.js.map +1 -1
- package/dist/workers/processors/embedContent.d.ts +8 -0
- package/dist/workers/processors/embedContent.d.ts.map +1 -0
- package/dist/workers/processors/embedContent.js +67 -0
- package/dist/workers/processors/embedContent.js.map +1 -0
- package/dist/workers/queues.d.ts +6 -0
- package/dist/workers/queues.d.ts.map +1 -1
- package/dist/workers/queues.js +5 -3
- package/dist/workers/queues.js.map +1 -1
- package/package.json +5 -1
- package/prisma/migrations/20260609215135_init/migration.sql +1412 -0
- package/prisma/migrations/20260610130000_add_worksheet_tags/migration.sql +13 -0
- package/prisma/migrations/20260610140000_expand_embedding_source_types/migration.sql +4 -0
- package/prisma/migrations/20260611120000_add_user_terms_acceptance/migration.sql +3 -0
- package/prisma/schema.prisma +44 -7
- package/src/index.ts +4 -0
- package/src/instrument.ts +1 -1
- package/src/lib/config/cors.ts +32 -9
- package/src/lib/config/env.ts +6 -0
- package/src/lib/googleCloudStorage.ts +21 -0
- package/src/lib/inferDocumentFormat.ts +58 -0
- package/src/lib/legal.ts +2 -0
- package/src/lib/prisma.ts +40 -1
- package/src/models/auth.ts +4 -0
- package/src/models/class.ts +3 -2
- package/src/models/marketing.ts +10 -2
- package/src/models/worksheet.ts +5 -2
- package/src/pipelines/aiLabChat.ts +245 -146
- package/src/pipelines/aiLabChatContract.ts +59 -69
- package/src/pipelines/aiNewtonChat.ts +46 -43
- package/src/pipelines/labChatPrompt.ts +115 -90
- package/src/routers/_app.ts +2 -0
- package/src/routers/auth.ts +13 -0
- package/src/routers/discussion.ts +7 -0
- package/src/routers/embedding.ts +164 -0
- package/src/routers/search.ts +10 -1
- package/src/routers/user.ts +26 -0
- package/src/routers/worksheet.ts +27 -0
- package/src/routes/aiStream.ts +827 -0
- package/src/seedDatabase.ts +4 -4
- package/src/services/aiChatStream.ts +341 -0
- package/src/services/aiModifierTools.ts +341 -0
- package/src/services/aiProposalTools.ts +274 -0
- package/src/services/aiStream.ts +175 -0
- package/src/services/aiTools.ts +290 -0
- package/src/services/announcement.ts +7 -0
- package/src/services/assignment.ts +31 -7
- package/src/services/auth.ts +14 -2
- package/src/services/class.ts +27 -2
- package/src/services/discussion.ts +22 -8
- package/src/services/discussionSummary.ts +226 -0
- package/src/services/embedding.ts +446 -0
- package/src/services/folder.ts +31 -0
- package/src/services/marketing.ts +3 -3
- package/src/services/message.ts +2 -2
- package/src/services/openaiDocumentGen.ts +319 -0
- package/src/services/search.ts +163 -1
- package/src/services/user.ts +9 -17
- package/src/services/userPrivacy.ts +196 -0
- package/src/services/worksheet.ts +77 -3
- package/src/utils/email.ts +5 -1
- package/src/utils/streamBroadcast.ts +48 -0
- package/src/workers/connection.ts +19 -0
- package/src/workers/index.ts +2 -0
- package/src/workers/processors/createRunJobWorker.ts +32 -6
- package/src/workers/processors/embedContent.ts +86 -0
- package/src/workers/queues.ts +5 -1
- package/tests/helpers/registerInput.ts +20 -0
- package/tests/integration/globalSetup.ts +10 -18
- package/tests/integration/routers/auth.test.ts +13 -18
- package/tests/unit/lib/inferDocumentFormat.test.ts +33 -0
- package/tests/unit/pipelines/aiLabChatContract.test.ts +38 -21
- package/tests/unit/pipelines/labChatPrompt.test.ts +23 -36
- package/tests/unit/services/aiChatStream.test.ts +92 -0
- package/tests/unit/services/openaiDocumentGen.test.ts +65 -0
- package/prisma/migrations/20250807062924_init/migration.sql +0 -436
- package/prisma/migrations/20250919063704_init2/migration.sql +0 -24
- package/prisma/migrations/20250920143543_add_profile_fields/migration.sql +0 -15
- package/prisma/migrations/20250922165147_add_chat_models/migration.sql +0 -68
- package/prisma/migrations/20250922165314_add_chat_roles/migration.sql +0 -5
- package/prisma/migrations/20250922171242_refactor_notification_system/migration.sql +0 -20
- package/prisma/migrations/20250922172208_add_mentions_system/migration.sql +0 -21
- package/prisma/migrations/20250925072732_add_lab_chat_system/migration.sql +0 -25
- package/prisma/migrations/20251020151505_add_upload_tracking_fields/migration.sql +0 -57
- package/prisma/migrations/20251109122857_annuoncements_comments/migration.sql +0 -30
- package/prisma/migrations/20251109135555_reactions_announcements_comments/migration.sql +0 -35
- package/prisma/migrations/20260410124000_add_submission_recommendation_state/migration.sql +0 -14
- package/prisma/migrations/20260415103500_add_session_type/migration.sql +0 -33
- package/prisma/migrations/20260415133000_add_ai_usage_logs/migration.sql +0 -19
- package/prisma/migrations/20260417083000_add_conversation_member_hidden_at/migration.sql +0 -2
- package/prisma/migrations/20260502230500_assignment_submission_comments/migration.sql +0 -60
- package/prisma/migrations/20260504071500_school_memberships/migration.sql +0 -81
- package/prisma/migrations/20260506162500_consolidate_run_job_and_unify_job_status/migration.sql +0 -166
- package/prisma/migrations/20260509220000_institution_overhaul/migration.sql +0 -184
- package/prisma/migrations/20260510170000_add_folder_permissions/migration.sql +0 -93
- package/prisma/migrations/20260510183000_add_discussions/migration.sql +0 -151
- /package/.github/workflows/{npm.yml → npm-publish.yml} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"userPrivacy.js","sources":["services/userPrivacy.ts"],"sourceRoot":"/","sourcesContent":["/**\n * User privacy service — data export and account erasure (anonymization).\n */\nimport { TRPCError } from \"@trpc/server\";\nimport { randomBytes } from \"node:crypto\";\nimport { hash } from \"bcryptjs\";\nimport { prisma } from \"../lib/prisma.js\";\nimport { deleteSessionsByUserId } from \"../models/auth.js\";\n\nasync function assertAccountCanBeErased(userId: string) {\n const user = await prisma.user.findUnique({\n where: { id: userId },\n select: {\n id: true,\n teacherIn: {\n select: {\n id: true,\n name: true,\n _count: { select: { students: true } },\n },\n },\n _count: {\n select: {\n assignments: true,\n createdLabChats: true,\n },\n },\n },\n });\n\n if (!user) {\n throw new TRPCError({ code: \"NOT_FOUND\", message: \"User not found\" });\n }\n\n const classesWithStudents = user.teacherIn.filter(\n (cls) => cls._count.students > 0,\n );\n if (classesWithStudents.length > 0) {\n throw new TRPCError({\n code: \"PRECONDITION_FAILED\",\n message:\n \"Delete or transfer your classes before deleting your account.\",\n });\n }\n\n if (user._count.assignments > 0) {\n throw new TRPCError({\n code: \"PRECONDITION_FAILED\",\n message:\n \"Remove or reassign your assignments before deleting your account.\",\n });\n }\n\n if (user._count.createdLabChats > 0) {\n throw new TRPCError({\n code: \"PRECONDITION_FAILED\",\n message: \"Remove your AI lab chats before deleting your account.\",\n });\n }\n}\n\n/** Export a portable snapshot of the authenticated user's personal data. */\nexport async function exportUserData(userId: string) {\n const user = await prisma.user.findUnique({\n where: { id: userId },\n select: {\n id: true,\n username: true,\n email: true,\n verified: true,\n termsAcceptedAt: true,\n termsVersion: true,\n profile: true,\n teacherIn: {\n select: { id: true, name: true, subject: true, section: true },\n },\n studentIn: {\n select: { id: true, name: true, subject: true, section: true },\n },\n schoolMemberships: {\n select: {\n role: true,\n status: true,\n school: { select: { id: true, name: true } },\n },\n },\n submissions: {\n select: {\n id: true,\n createdAt: true,\n submittedAt: true,\n gradeReceived: true,\n extendedResponse: true,\n assignment: { select: { id: true, title: true, classId: true } },\n },\n },\n events: {\n select: {\n id: true,\n name: true,\n startTime: true,\n endTime: true,\n location: true,\n remarks: true,\n },\n },\n sentMessages: {\n select: {\n id: true,\n content: true,\n createdAt: true,\n conversationId: true,\n },\n take: 500,\n orderBy: { createdAt: \"desc\" },\n },\n notificationsReceived: {\n select: {\n id: true,\n title: true,\n content: true,\n read: true,\n createdAt: true,\n },\n take: 200,\n orderBy: { createdAt: \"desc\" },\n },\n },\n });\n\n if (!user) {\n throw new TRPCError({ code: \"NOT_FOUND\", message: \"User not found\" });\n }\n\n return {\n exportedAt: new Date().toISOString(),\n user,\n };\n}\n\n/**\n * Erase personal account data by anonymizing the user record and removing\n * sessions and memberships. Educational records tied to classes (e.g.\n * submissions) remain with an anonymized identity where required.\n */\nexport async function deleteUserAccount(userId: string) {\n await assertAccountCanBeErased(userId);\n await deleteSessionsByUserId(userId);\n\n const anonUsername = `deleted_${userId.slice(0, 8)}`;\n const anonEmail = `deleted+${userId}@studious.invalid`;\n const randomPassword = await hash(randomBytes(32).toString(\"hex\"), 10);\n\n await prisma.$transaction([\n prisma.conversationMember.deleteMany({ where: { userId } }),\n prisma.notification.deleteMany({\n where: { OR: [{ senderId: userId }, { receiverId: userId }] },\n }),\n prisma.schoolMembership.deleteMany({ where: { userId } }),\n prisma.permission.deleteMany({\n where: { OR: [{ userId }, { grantedById: userId }] },\n }),\n prisma.user.update({\n where: { id: userId },\n data: {\n teacherIn: { set: [] },\n studentIn: { set: [] },\n departments: { set: [] },\n tags: { set: [] },\n specificAssignments: { set: [] },\n presentAttendance: { set: [] },\n lateAttendance: { set: [] },\n absentAttendance: { set: [] },\n schoolId: null,\n username: anonUsername,\n email: anonEmail,\n password: randomPassword,\n verified: false,\n termsAcceptedAt: null,\n termsVersion: null,\n profile: {\n update: {\n displayName: null,\n bio: null,\n location: null,\n website: null,\n profilePicture: null,\n profilePictureThumbnail: null,\n },\n },\n },\n }),\n ]);\n\n return { success: true };\n}\n"],"names":[],"mappings":"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","debug_id":"7184e3ea-1921-5a91-936e-6fa9a92f8a03"}
|
|
@@ -1,38 +1,44 @@
|
|
|
1
|
-
import { type WorksheetQuestionType } from "@prisma/client";
|
|
1
|
+
import { Prisma, type WorksheetQuestionType } from "@prisma/client";
|
|
2
2
|
/** Get worksheet with questions and mark schemes. */
|
|
3
3
|
export declare function getWorksheet(worksheetId: string, userId: string): Promise<{
|
|
4
4
|
class: {
|
|
5
|
-
|
|
5
|
+
section: string;
|
|
6
6
|
id: string;
|
|
7
|
+
name: string;
|
|
7
8
|
schoolId: string | null;
|
|
8
|
-
subject: string;
|
|
9
9
|
color: string | null;
|
|
10
|
-
|
|
10
|
+
subject: string;
|
|
11
11
|
syllabus: string | null;
|
|
12
12
|
departmentId: string | null;
|
|
13
13
|
discussionsEnabled: boolean;
|
|
14
14
|
studentsCanCreateDiscussions: boolean;
|
|
15
15
|
studentsCanReply: boolean;
|
|
16
16
|
} | null;
|
|
17
|
+
tags: {
|
|
18
|
+
id: string;
|
|
19
|
+
name: string;
|
|
20
|
+
color: string;
|
|
21
|
+
classId: string;
|
|
22
|
+
}[];
|
|
17
23
|
questions: {
|
|
18
24
|
type: import(".prisma/client").$Enums.WorksheetQuestionType;
|
|
19
|
-
options:
|
|
25
|
+
options: Prisma.JsonValue | null;
|
|
26
|
+
markScheme: Prisma.JsonValue | null;
|
|
20
27
|
id: string;
|
|
21
28
|
createdAt: Date;
|
|
22
29
|
updatedAt: Date;
|
|
23
|
-
order: number | null;
|
|
24
30
|
points: number;
|
|
25
|
-
worksheetId: string;
|
|
26
|
-
markScheme: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
27
31
|
question: string;
|
|
32
|
+
worksheetId: string;
|
|
33
|
+
order: number | null;
|
|
28
34
|
answer: string;
|
|
29
35
|
}[];
|
|
30
36
|
} & {
|
|
31
37
|
status: import(".prisma/client").$Enums.JobStatus | null;
|
|
32
|
-
name: string;
|
|
33
38
|
id: string;
|
|
34
39
|
createdAt: Date;
|
|
35
40
|
updatedAt: Date;
|
|
41
|
+
name: string;
|
|
36
42
|
classId: string;
|
|
37
43
|
runJobId: string | null;
|
|
38
44
|
sourceUrl: string | null;
|
|
@@ -41,14 +47,20 @@ export declare function getWorksheet(worksheetId: string, userId: string): Promi
|
|
|
41
47
|
export declare function worksheetExists(id: string): Promise<boolean>;
|
|
42
48
|
export declare function listWorksheets(classId: string): Promise<{
|
|
43
49
|
questionCount: number;
|
|
50
|
+
tags: {
|
|
51
|
+
id: string;
|
|
52
|
+
name: string;
|
|
53
|
+
color: string;
|
|
54
|
+
classId: string;
|
|
55
|
+
}[];
|
|
44
56
|
questions: {
|
|
45
57
|
id: string;
|
|
46
58
|
}[];
|
|
47
59
|
status: import(".prisma/client").$Enums.JobStatus | null;
|
|
48
|
-
name: string;
|
|
49
60
|
id: string;
|
|
50
61
|
createdAt: Date;
|
|
51
62
|
updatedAt: Date;
|
|
63
|
+
name: string;
|
|
52
64
|
classId: string;
|
|
53
65
|
runJobId: string | null;
|
|
54
66
|
sourceUrl: string | null;
|
|
@@ -57,30 +69,30 @@ export declare function updateWorksheetRecord(worksheetId: string, userId: strin
|
|
|
57
69
|
name?: string;
|
|
58
70
|
}): Promise<{
|
|
59
71
|
status: import(".prisma/client").$Enums.JobStatus | null;
|
|
60
|
-
name: string;
|
|
61
72
|
id: string;
|
|
62
73
|
createdAt: Date;
|
|
63
74
|
updatedAt: Date;
|
|
75
|
+
name: string;
|
|
64
76
|
classId: string;
|
|
65
77
|
runJobId: string | null;
|
|
66
78
|
sourceUrl: string | null;
|
|
67
79
|
}>;
|
|
68
80
|
export declare function deleteWorksheetRecord(worksheetId: string, userId: string): Promise<{
|
|
69
81
|
status: import(".prisma/client").$Enums.JobStatus | null;
|
|
70
|
-
name: string;
|
|
71
82
|
id: string;
|
|
72
83
|
createdAt: Date;
|
|
73
84
|
updatedAt: Date;
|
|
85
|
+
name: string;
|
|
74
86
|
classId: string;
|
|
75
87
|
runJobId: string | null;
|
|
76
88
|
sourceUrl: string | null;
|
|
77
89
|
}>;
|
|
78
90
|
export declare function createWorksheetRecord(classId: string, name: string): Promise<{
|
|
79
91
|
status: import(".prisma/client").$Enums.JobStatus | null;
|
|
80
|
-
name: string;
|
|
81
92
|
id: string;
|
|
82
93
|
createdAt: Date;
|
|
83
94
|
updatedAt: Date;
|
|
95
|
+
name: string;
|
|
84
96
|
classId: string;
|
|
85
97
|
runJobId: string | null;
|
|
86
98
|
sourceUrl: string | null;
|
|
@@ -91,10 +103,10 @@ export declare function createWorksheetRecord(classId: string, name: string): Pr
|
|
|
91
103
|
*/
|
|
92
104
|
export declare function duplicateWorksheetRecord(worksheetId: string, classId: string, name: string, userId: string): Promise<{
|
|
93
105
|
status: import(".prisma/client").$Enums.JobStatus | null;
|
|
94
|
-
name: string;
|
|
95
106
|
id: string;
|
|
96
107
|
createdAt: Date;
|
|
97
108
|
updatedAt: Date;
|
|
109
|
+
name: string;
|
|
98
110
|
classId: string;
|
|
99
111
|
runJobId: string | null;
|
|
100
112
|
sourceUrl: string | null;
|
|
@@ -113,10 +125,10 @@ export declare function createWorksheetFromPdf(classId: string, url: string, use
|
|
|
113
125
|
}): Promise<{
|
|
114
126
|
runJobId: string;
|
|
115
127
|
status: import(".prisma/client").$Enums.JobStatus | null;
|
|
116
|
-
name: string;
|
|
117
128
|
id: string;
|
|
118
129
|
createdAt: Date;
|
|
119
130
|
updatedAt: Date;
|
|
131
|
+
name: string;
|
|
120
132
|
classId: string;
|
|
121
133
|
sourceUrl: string | null;
|
|
122
134
|
}>;
|
|
@@ -128,10 +140,10 @@ export declare function createWorksheetFromUploadedPdf(classId: string, fileId:
|
|
|
128
140
|
}): Promise<{
|
|
129
141
|
runJobId: string;
|
|
130
142
|
status: import(".prisma/client").$Enums.JobStatus | null;
|
|
131
|
-
name: string;
|
|
132
143
|
id: string;
|
|
133
144
|
createdAt: Date;
|
|
134
145
|
updatedAt: Date;
|
|
146
|
+
name: string;
|
|
135
147
|
classId: string;
|
|
136
148
|
sourceUrl: string | null;
|
|
137
149
|
}>;
|
|
@@ -145,17 +157,34 @@ export declare function addQuestionToWorksheet(worksheetId: string, userId: stri
|
|
|
145
157
|
order?: number;
|
|
146
158
|
}): Promise<{
|
|
147
159
|
type: import(".prisma/client").$Enums.WorksheetQuestionType;
|
|
148
|
-
options:
|
|
160
|
+
options: Prisma.JsonValue | null;
|
|
161
|
+
markScheme: Prisma.JsonValue | null;
|
|
149
162
|
id: string;
|
|
150
163
|
createdAt: Date;
|
|
151
164
|
updatedAt: Date;
|
|
152
|
-
order: number | null;
|
|
153
165
|
points: number;
|
|
154
|
-
worksheetId: string;
|
|
155
|
-
markScheme: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
156
166
|
question: string;
|
|
167
|
+
worksheetId: string;
|
|
168
|
+
order: number | null;
|
|
157
169
|
answer: string;
|
|
158
170
|
}>;
|
|
171
|
+
/** A question's full editable state as captured before an AI modifier run. */
|
|
172
|
+
export interface WorksheetQuestionSnapshot {
|
|
173
|
+
id: string;
|
|
174
|
+
type: WorksheetQuestionType;
|
|
175
|
+
question: string;
|
|
176
|
+
answer: string;
|
|
177
|
+
options: unknown;
|
|
178
|
+
markScheme: unknown;
|
|
179
|
+
points: number;
|
|
180
|
+
order: number | null;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Restore a worksheet's questions to a snapshot: deletes questions not in the
|
|
184
|
+
* snapshot, re-creates deleted ones (with their original ids), and reverts
|
|
185
|
+
* edited ones. Used by AI modifier undo.
|
|
186
|
+
*/
|
|
187
|
+
export declare function restoreWorksheetQuestions(worksheetId: string, userId: string, questions: WorksheetQuestionSnapshot[]): Promise<void>;
|
|
159
188
|
export declare function reorderWorksheetQuestions(worksheetId: string, userId: string, movedId: string, position: "before" | "after", targetId: string): Promise<{
|
|
160
189
|
id: string;
|
|
161
190
|
}[]>;
|
|
@@ -168,28 +197,28 @@ export declare function updateWorksheetQuestionRecord(worksheetId: string, quest
|
|
|
168
197
|
type?: WorksheetQuestionType;
|
|
169
198
|
}): Promise<{
|
|
170
199
|
type: import(".prisma/client").$Enums.WorksheetQuestionType;
|
|
171
|
-
options:
|
|
200
|
+
options: Prisma.JsonValue | null;
|
|
201
|
+
markScheme: Prisma.JsonValue | null;
|
|
172
202
|
id: string;
|
|
173
203
|
createdAt: Date;
|
|
174
204
|
updatedAt: Date;
|
|
175
|
-
order: number | null;
|
|
176
205
|
points: number;
|
|
177
|
-
worksheetId: string;
|
|
178
|
-
markScheme: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
179
206
|
question: string;
|
|
207
|
+
worksheetId: string;
|
|
208
|
+
order: number | null;
|
|
180
209
|
answer: string;
|
|
181
210
|
}>;
|
|
182
211
|
export declare function deleteWorksheetQuestionRecord(worksheetId: string, questionId: string, userId: string): Promise<{
|
|
183
212
|
type: import(".prisma/client").$Enums.WorksheetQuestionType;
|
|
184
|
-
options:
|
|
213
|
+
options: Prisma.JsonValue | null;
|
|
214
|
+
markScheme: Prisma.JsonValue | null;
|
|
185
215
|
id: string;
|
|
186
216
|
createdAt: Date;
|
|
187
217
|
updatedAt: Date;
|
|
188
|
-
order: number | null;
|
|
189
218
|
points: number;
|
|
190
|
-
worksheetId: string;
|
|
191
|
-
markScheme: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
192
219
|
question: string;
|
|
220
|
+
worksheetId: string;
|
|
221
|
+
order: number | null;
|
|
193
222
|
answer: string;
|
|
194
223
|
}>;
|
|
195
224
|
export declare function getWorksheetSubmission(worksheetId: string, submissionId: string, userId: string): Promise<{
|
|
@@ -203,15 +232,15 @@ export declare function getWorksheetSubmission(worksheetId: string, submissionId
|
|
|
203
232
|
id: string;
|
|
204
233
|
createdAt: Date;
|
|
205
234
|
updatedAt: Date | null;
|
|
206
|
-
|
|
207
|
-
|
|
235
|
+
feedback: string | null;
|
|
236
|
+
runJobId: string | null;
|
|
208
237
|
response: string;
|
|
209
238
|
isCorrect: boolean;
|
|
210
|
-
markschemeState:
|
|
239
|
+
markschemeState: Prisma.JsonValue | null;
|
|
211
240
|
points: number;
|
|
212
|
-
|
|
241
|
+
studentId: string;
|
|
242
|
+
questionId: string;
|
|
213
243
|
studentWorksheetResponseId: string | null;
|
|
214
|
-
runJobId: string | null;
|
|
215
244
|
})[];
|
|
216
245
|
} & {
|
|
217
246
|
id: string;
|
|
@@ -219,9 +248,9 @@ export declare function getWorksheetSubmission(worksheetId: string, submissionId
|
|
|
219
248
|
updatedAt: Date;
|
|
220
249
|
submissionId: string | null;
|
|
221
250
|
studentId: string;
|
|
251
|
+
worksheetId: string;
|
|
222
252
|
submittedAt: Date | null;
|
|
223
253
|
submitted: boolean;
|
|
224
|
-
worksheetId: string;
|
|
225
254
|
}>;
|
|
226
255
|
export declare function answerWorksheetQuestion(worksheetResponseId: string, questionId: string, response: string, userId: string): Promise<{
|
|
227
256
|
responses: {
|
|
@@ -229,15 +258,15 @@ export declare function answerWorksheetQuestion(worksheetResponseId: string, que
|
|
|
229
258
|
id: string;
|
|
230
259
|
createdAt: Date;
|
|
231
260
|
updatedAt: Date | null;
|
|
232
|
-
|
|
233
|
-
|
|
261
|
+
feedback: string | null;
|
|
262
|
+
runJobId: string | null;
|
|
234
263
|
response: string;
|
|
235
264
|
isCorrect: boolean;
|
|
236
|
-
markschemeState:
|
|
265
|
+
markschemeState: Prisma.JsonValue | null;
|
|
237
266
|
points: number;
|
|
238
|
-
|
|
267
|
+
studentId: string;
|
|
268
|
+
questionId: string;
|
|
239
269
|
studentWorksheetResponseId: string | null;
|
|
240
|
-
runJobId: string | null;
|
|
241
270
|
}[];
|
|
242
271
|
} & {
|
|
243
272
|
id: string;
|
|
@@ -245,39 +274,39 @@ export declare function answerWorksheetQuestion(worksheetResponseId: string, que
|
|
|
245
274
|
updatedAt: Date;
|
|
246
275
|
submissionId: string | null;
|
|
247
276
|
studentId: string;
|
|
277
|
+
worksheetId: string;
|
|
248
278
|
submittedAt: Date | null;
|
|
249
279
|
submitted: boolean;
|
|
250
|
-
worksheetId: string;
|
|
251
280
|
}>;
|
|
252
281
|
export declare function cancelGrading(worksheetResponseId: string, progressId: string, userId: string): Promise<{
|
|
253
282
|
status: import(".prisma/client").$Enums.JobStatus | null;
|
|
254
283
|
id: string;
|
|
255
284
|
createdAt: Date;
|
|
256
285
|
updatedAt: Date | null;
|
|
257
|
-
|
|
258
|
-
|
|
286
|
+
feedback: string | null;
|
|
287
|
+
runJobId: string | null;
|
|
259
288
|
response: string;
|
|
260
289
|
isCorrect: boolean;
|
|
261
|
-
markschemeState:
|
|
290
|
+
markschemeState: Prisma.JsonValue | null;
|
|
262
291
|
points: number;
|
|
263
|
-
|
|
292
|
+
studentId: string;
|
|
293
|
+
questionId: string;
|
|
264
294
|
studentWorksheetResponseId: string | null;
|
|
265
|
-
runJobId: string | null;
|
|
266
295
|
}>;
|
|
267
296
|
export declare function regradeQuestion(worksheetResponseId: string, progressId: string, userId: string): Promise<{
|
|
268
297
|
status: import(".prisma/client").$Enums.JobStatus | null;
|
|
269
298
|
id: string;
|
|
270
299
|
createdAt: Date;
|
|
271
300
|
updatedAt: Date | null;
|
|
272
|
-
|
|
273
|
-
|
|
301
|
+
feedback: string | null;
|
|
302
|
+
runJobId: string | null;
|
|
274
303
|
response: string;
|
|
275
304
|
isCorrect: boolean;
|
|
276
|
-
markschemeState:
|
|
305
|
+
markschemeState: Prisma.JsonValue | null;
|
|
277
306
|
points: number;
|
|
278
|
-
|
|
307
|
+
studentId: string;
|
|
308
|
+
questionId: string;
|
|
279
309
|
studentWorksheetResponseId: string | null;
|
|
280
|
-
runJobId: string | null;
|
|
281
310
|
} | null>;
|
|
282
311
|
export declare function gradeAnswer(questionId: string, studentWorksheetResponseId: string, userId: string, data: {
|
|
283
312
|
responseId?: string;
|
|
@@ -291,27 +320,27 @@ export declare function gradeAnswer(questionId: string, studentWorksheetResponse
|
|
|
291
320
|
id: string;
|
|
292
321
|
createdAt: Date;
|
|
293
322
|
updatedAt: Date | null;
|
|
294
|
-
|
|
295
|
-
|
|
323
|
+
feedback: string | null;
|
|
324
|
+
runJobId: string | null;
|
|
296
325
|
response: string;
|
|
297
326
|
isCorrect: boolean;
|
|
298
|
-
markschemeState:
|
|
327
|
+
markschemeState: Prisma.JsonValue | null;
|
|
299
328
|
points: number;
|
|
300
|
-
|
|
329
|
+
studentId: string;
|
|
330
|
+
questionId: string;
|
|
301
331
|
studentWorksheetResponseId: string | null;
|
|
302
|
-
runJobId: string | null;
|
|
303
332
|
}>;
|
|
304
333
|
export declare function addCommentToResponse(responseId: string, comment: string, authorId: string): Promise<{
|
|
305
334
|
id: string;
|
|
306
335
|
createdAt: Date;
|
|
336
|
+
content: string;
|
|
307
337
|
assignmentId: string | null;
|
|
308
338
|
submissionId: string | null;
|
|
309
339
|
announcementId: string | null;
|
|
310
340
|
modifiedAt: Date | null;
|
|
311
|
-
content: string;
|
|
312
341
|
authorId: string;
|
|
313
|
-
parentCommentId: string | null;
|
|
314
342
|
isPinned: boolean;
|
|
343
|
+
parentCommentId: string | null;
|
|
315
344
|
studentQuestionProgressId: string | null;
|
|
316
345
|
}>;
|
|
317
346
|
//# sourceMappingURL=worksheet.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worksheet.d.ts","sourceRoot":"/","sources":["services/worksheet.ts"],"names":[],"mappings":"AAKA,OAAO,EAAa,KAAK,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"worksheet.d.ts","sourceRoot":"/","sources":["services/worksheet.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,15 +3,16 @@
|
|
|
3
3
|
* Integrates with gradeWorksheet pipeline for auto-grading.
|
|
4
4
|
*/
|
|
5
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]="
|
|
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]="ecf79b03-756f-53ee-81b5-52a53a17b0e8")}catch(e){}}();
|
|
7
7
|
import { TRPCError } from "@trpc/server";
|
|
8
|
-
import { JobStatus } from "@prisma/client";
|
|
8
|
+
import { JobStatus, Prisma } from "@prisma/client";
|
|
9
9
|
import { prisma } from "../lib/prisma.js";
|
|
10
10
|
import { getFileUrl } from "../lib/fileUpload.js";
|
|
11
11
|
import { cancelGradePipeline, regradeWorksheetPipeline } from "../pipelines/gradeWorksheet.js";
|
|
12
12
|
import { enqueueRunJob } from "../workers/queues.js";
|
|
13
13
|
import { logger } from "../utils/logger.js";
|
|
14
14
|
import { findWorksheetByIdMinimal, findWorksheetByIdForClassMember, findWorksheetByIdForTeacher, findWorksheetsByClassId, createWorksheet, duplicateWorksheet, updateWorksheet, deleteWorksheet, findQuestionsByWorksheetId, createWorksheetQuestion, updateWorksheetQuestion, deleteWorksheetQuestion, findSubmissionByIdForWorksheetAccess, findOrCreateWorksheetResponse, findWorksheetResponseByIdForTeacher, findWorksheetResponseWithResponsesForStudent, findWorksheetQuestionByIdForTeacher, findWorksheetQuestionByIdInWorksheet, updateStudentQuestionProgress, createStudentQuestionProgress, findStudentQuestionProgress, updateStudentQuestionProgressForGrading, createStudentQuestionProgressForGrading, createComment, findStudentQuestionProgressByIdForTeacher, findStudentQuestionProgressByIdForStudentOrTeacher, findStudentQuestionProgressByIdForTeacherAndResponse, } from "../models/worksheet.js";
|
|
15
|
+
import { enqueueEmbedding } from "./embedding.js";
|
|
15
16
|
const sanitizeQuestionOptionsForStudent = (options) => {
|
|
16
17
|
if (!Array.isArray(options))
|
|
17
18
|
return options;
|
|
@@ -66,7 +67,10 @@ export async function updateWorksheetRecord(worksheetId, userId, data) {
|
|
|
66
67
|
message: "Only class teachers can update worksheets",
|
|
67
68
|
});
|
|
68
69
|
}
|
|
69
|
-
|
|
70
|
+
const updated = await updateWorksheet(worksheetId, data);
|
|
71
|
+
// Re-index worksheet for RAG search
|
|
72
|
+
enqueueEmbedding(worksheet.classId, 'WORKSHEET', worksheetId);
|
|
73
|
+
return updated;
|
|
70
74
|
}
|
|
71
75
|
export async function deleteWorksheetRecord(worksheetId, userId) {
|
|
72
76
|
const worksheet = await findWorksheetByIdForTeacher(worksheetId, userId);
|
|
@@ -79,7 +83,10 @@ export async function deleteWorksheetRecord(worksheetId, userId) {
|
|
|
79
83
|
return deleteWorksheet(worksheetId);
|
|
80
84
|
}
|
|
81
85
|
export async function createWorksheetRecord(classId, name) {
|
|
82
|
-
|
|
86
|
+
const worksheet = await createWorksheet({ classId, name });
|
|
87
|
+
// Auto-index worksheet for RAG search
|
|
88
|
+
enqueueEmbedding(classId, 'WORKSHEET', worksheet.id);
|
|
89
|
+
return worksheet;
|
|
83
90
|
}
|
|
84
91
|
/**
|
|
85
92
|
* Duplicate a worksheet into another class. Caller must teach both the source worksheet's class
|
|
@@ -219,6 +226,51 @@ export async function addQuestionToWorksheet(worksheetId, userId, data) {
|
|
|
219
226
|
...data,
|
|
220
227
|
});
|
|
221
228
|
}
|
|
229
|
+
const toJsonInput = (value) => value === null || value === undefined
|
|
230
|
+
? Prisma.JsonNull
|
|
231
|
+
: value;
|
|
232
|
+
/**
|
|
233
|
+
* Restore a worksheet's questions to a snapshot: deletes questions not in the
|
|
234
|
+
* snapshot, re-creates deleted ones (with their original ids), and reverts
|
|
235
|
+
* edited ones. Used by AI modifier undo.
|
|
236
|
+
*/
|
|
237
|
+
export async function restoreWorksheetQuestions(worksheetId, userId, questions) {
|
|
238
|
+
const worksheet = await findWorksheetByIdForTeacher(worksheetId, userId);
|
|
239
|
+
if (!worksheet) {
|
|
240
|
+
throw new TRPCError({
|
|
241
|
+
code: "FORBIDDEN",
|
|
242
|
+
message: "Only class teachers can modify worksheet questions",
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
await prisma.$transaction([
|
|
246
|
+
prisma.worksheetQuestion.deleteMany({
|
|
247
|
+
where: { worksheetId, id: { notIn: questions.map((q) => q.id) } },
|
|
248
|
+
}),
|
|
249
|
+
...questions.map((q) => prisma.worksheetQuestion.upsert({
|
|
250
|
+
where: { id: q.id },
|
|
251
|
+
create: {
|
|
252
|
+
id: q.id,
|
|
253
|
+
worksheetId,
|
|
254
|
+
type: q.type,
|
|
255
|
+
question: q.question,
|
|
256
|
+
answer: q.answer,
|
|
257
|
+
options: toJsonInput(q.options),
|
|
258
|
+
markScheme: toJsonInput(q.markScheme),
|
|
259
|
+
points: q.points,
|
|
260
|
+
order: q.order,
|
|
261
|
+
},
|
|
262
|
+
update: {
|
|
263
|
+
type: q.type,
|
|
264
|
+
question: q.question,
|
|
265
|
+
answer: q.answer,
|
|
266
|
+
options: toJsonInput(q.options),
|
|
267
|
+
markScheme: toJsonInput(q.markScheme),
|
|
268
|
+
points: q.points,
|
|
269
|
+
order: q.order,
|
|
270
|
+
},
|
|
271
|
+
})),
|
|
272
|
+
]);
|
|
273
|
+
}
|
|
222
274
|
export async function reorderWorksheetQuestions(worksheetId, userId, movedId, position, targetId) {
|
|
223
275
|
const worksheet = await findWorksheetByIdForTeacher(worksheetId, userId);
|
|
224
276
|
if (!worksheet) {
|
|
@@ -442,4 +494,4 @@ export async function addCommentToResponse(responseId, comment, authorId) {
|
|
|
442
494
|
});
|
|
443
495
|
}
|
|
444
496
|
//# sourceMappingURL=worksheet.js.map
|
|
445
|
-
//# debugId=
|
|
497
|
+
//# debugId=ecf79b03-756f-53ee-81b5-52a53a17b0e8
|