@studious-lms/server 1.19.0 → 1.21.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/Dockerfile +5 -2
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/pusher.d.ts +3 -1
- package/dist/lib/pusher.d.ts.map +1 -1
- package/dist/lib/pusher.js +5 -3
- package/dist/lib/pusher.js.map +1 -1
- package/dist/middleware/security.d.ts.map +1 -1
- package/dist/middleware/security.js +4 -4
- package/dist/middleware/security.js.map +1 -1
- package/dist/models/class.d.ts +1 -1
- package/dist/models/class.d.ts.map +1 -1
- package/dist/models/class.js +5 -4
- package/dist/models/class.js.map +1 -1
- package/dist/models/conversation.d.ts +17 -17
- package/dist/models/notification.d.ts +63 -11
- package/dist/models/notification.d.ts.map +1 -1
- package/dist/models/notification.js +24 -10
- package/dist/models/notification.js.map +1 -1
- package/dist/pipelines/aiLabChat.d.ts +1 -0
- package/dist/pipelines/aiLabChat.d.ts.map +1 -1
- package/dist/pipelines/aiLabChat.js +7 -2
- package/dist/pipelines/aiLabChat.js.map +1 -1
- package/dist/pipelines/aiNewtonChat.d.ts +2 -2
- package/dist/pipelines/aiNewtonChat.d.ts.map +1 -1
- package/dist/pipelines/aiNewtonChat.js +12 -4
- package/dist/pipelines/aiNewtonChat.js.map +1 -1
- package/dist/pipelines/gradeWorksheet.d.ts +3 -3
- package/dist/pipelines/gradeWorksheet.d.ts.map +1 -1
- package/dist/pipelines/gradeWorksheet.js +13 -9
- package/dist/pipelines/gradeWorksheet.js.map +1 -1
- package/dist/pipelines/pdfToWorksheet.d.ts +2 -0
- package/dist/pipelines/pdfToWorksheet.d.ts.map +1 -1
- package/dist/pipelines/pdfToWorksheet.js +3 -2
- package/dist/pipelines/pdfToWorksheet.js.map +1 -1
- package/dist/routers/_app.d.ts +322 -82
- package/dist/routers/_app.d.ts.map +1 -1
- package/dist/routers/announcement.d.ts.map +1 -1
- package/dist/routers/announcement.js +2 -2
- package/dist/routers/announcement.js.map +1 -1
- package/dist/routers/assignment.d.ts +74 -0
- package/dist/routers/assignment.d.ts.map +1 -1
- package/dist/routers/assignment.js +190 -2
- package/dist/routers/assignment.js.map +1 -1
- package/dist/routers/notifications.d.ts +51 -41
- package/dist/routers/notifications.d.ts.map +1 -1
- package/dist/routers/notifications.js +22 -18
- package/dist/routers/notifications.js.map +1 -1
- package/dist/routers/school.d.ts +30 -0
- package/dist/routers/school.d.ts.map +1 -1
- package/dist/routers/school.js +11 -2
- package/dist/routers/school.js.map +1 -1
- package/dist/routers/user.d.ts +12 -0
- package/dist/routers/user.d.ts.map +1 -1
- package/dist/routers/user.js +11 -2
- package/dist/routers/user.js.map +1 -1
- package/dist/seedDatabase.d.ts +4 -0
- package/dist/seedDatabase.d.ts.map +1 -1
- package/dist/services/aiChatStream.d.ts +5 -0
- package/dist/services/aiChatStream.d.ts.map +1 -1
- package/dist/services/aiChatStream.js +32 -3
- package/dist/services/aiChatStream.js.map +1 -1
- package/dist/services/aiStream.d.ts +5 -0
- package/dist/services/aiStream.d.ts.map +1 -1
- package/dist/services/aiStream.js +29 -3
- package/dist/services/aiStream.js.map +1 -1
- package/dist/services/aiUsage.d.ts +72 -0
- package/dist/services/aiUsage.d.ts.map +1 -0
- package/dist/services/aiUsage.js +150 -0
- package/dist/services/aiUsage.js.map +1 -0
- 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.map +1 -1
- package/dist/services/assignment.js +29 -4
- package/dist/services/assignment.js.map +1 -1
- package/dist/services/attendance.js +10 -2
- package/dist/services/attendance.js.map +1 -1
- package/dist/services/class.d.ts.map +1 -1
- package/dist/services/class.js +6 -2
- package/dist/services/class.js.map +1 -1
- package/dist/services/discussion.d.ts.map +1 -1
- package/dist/services/discussion.js +41 -12
- package/dist/services/discussion.js.map +1 -1
- package/dist/services/discussionSummary.d.ts.map +1 -1
- package/dist/services/discussionSummary.js +3 -2
- package/dist/services/discussionSummary.js.map +1 -1
- package/dist/services/notification.d.ts +79 -16
- package/dist/services/notification.d.ts.map +1 -1
- package/dist/services/notification.js +64 -16
- package/dist/services/notification.js.map +1 -1
- package/dist/services/studentProgress.d.ts.map +1 -1
- package/dist/services/studentProgress.js +6 -2
- package/dist/services/studentProgress.js.map +1 -1
- package/dist/services/userPrivacy.d.ts +4 -0
- package/dist/services/userPrivacy.d.ts.map +1 -1
- package/dist/services/userPrivacy.js +6 -2
- package/dist/services/userPrivacy.js.map +1 -1
- package/dist/services/worksheet.js +4 -4
- package/dist/services/worksheet.js.map +1 -1
- package/dist/utils/inference.d.ts +27 -0
- package/dist/utils/inference.d.ts.map +1 -1
- package/dist/utils/inference.js +23 -3
- package/dist/utils/inference.js.map +1 -1
- package/dist/workers/processors/aiLabChat.d.ts.map +1 -1
- package/dist/workers/processors/aiLabChat.js +4 -3
- package/dist/workers/processors/aiLabChat.js.map +1 -1
- package/dist/workers/processors/aiNewtonChat.d.ts.map +1 -1
- package/dist/workers/processors/aiNewtonChat.js +5 -5
- package/dist/workers/processors/aiNewtonChat.js.map +1 -1
- package/dist/workers/processors/gradeWorksheet.js +4 -4
- package/dist/workers/processors/gradeWorksheet.js.map +1 -1
- package/dist/workers/processors/pdfToWorksheet.d.ts.map +1 -1
- package/dist/workers/processors/pdfToWorksheet.js +7 -4
- package/dist/workers/processors/pdfToWorksheet.js.map +1 -1
- package/docker-entrypoint.sh +7 -0
- package/package.json +1 -1
- package/prisma/migrations/20260708011456_add_file_annotations/migration.sql +35 -0
- package/prisma/migrations/20260708011500_add_ai_usage_attribution/migration.sql +13 -0
- package/prisma/migrations/20260708013000_add_notification_type_and_entity/migration.sql +14 -0
- package/prisma/schema.prisma +99 -43
- package/src/index.ts +7 -0
- package/src/lib/pusher.ts +3 -1
- package/src/middleware/security.ts +2 -2
- package/src/models/class.ts +3 -2
- package/src/models/notification.ts +42 -13
- package/src/pipelines/aiLabChat.ts +6 -1
- package/src/pipelines/aiNewtonChat.ts +10 -0
- package/src/pipelines/gradeWorksheet.ts +25 -7
- package/src/pipelines/pdfToWorksheet.ts +3 -0
- package/src/routers/announcement.ts +0 -1
- package/src/routers/assignment.ts +214 -0
- package/src/routers/notifications.ts +26 -24
- package/src/routers/school.ts +12 -0
- package/src/routers/user.ts +12 -0
- package/src/services/aiChatStream.ts +35 -0
- package/src/services/aiStream.ts +34 -0
- package/src/services/aiUsage.ts +202 -0
- package/src/services/announcement.ts +5 -0
- package/src/services/assignment.ts +29 -2
- package/src/services/attendance.ts +12 -0
- package/src/services/class.ts +4 -0
- package/src/services/discussion.ts +50 -11
- package/src/services/discussionSummary.ts +1 -0
- package/src/services/notification.ts +83 -20
- package/src/services/studentProgress.ts +4 -0
- package/src/services/userPrivacy.ts +4 -0
- package/src/services/worksheet.ts +2 -2
- package/src/utils/inference.ts +40 -2
- package/src/workers/processors/aiLabChat.ts +2 -1
- package/src/workers/processors/aiNewtonChat.ts +3 -1
- package/src/workers/processors/gradeWorksheet.ts +2 -2
- package/src/workers/processors/pdfToWorksheet.ts +5 -2
- package/tests/integration/routers/notification.test.ts +68 -20
- package/tests/unit/services/aiUsage.test.ts +105 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assignment.js","sources":["routers/assignment.ts"],"sourceRoot":"/","sourcesContent":["import { z } from \"zod\";\nimport { createTRPCRouter, protectedProcedure, protectedClassMemberProcedure, protectedTeacherProcedure } from \"../trpc.js\";\nimport { TRPCError } from \"@trpc/server\";\nimport { prisma } from \"../lib/prisma.js\";\nimport { createDirectUploadFiles, type DirectUploadFile, confirmDirectUpload, updateUploadProgress, type UploadedFile } from \"../lib/fileUpload.js\";\nimport { deleteFile } from \"../lib/googleCloudStorage.js\";\nimport { logger } from \"../utils/logger.js\";\nimport {\n classMemberOrSchoolAdminWhere,\n classTeacherOrSchoolAdminWhere,\n} from \"../models/access.js\";\nimport {\n assignmentExists,\n getDueToday,\n getAssignment,\n getSubmission,\n getSubmissionById,\n getSubmissions,\n createAssignmentRecord,\n duplicateAssignmentRecord,\n updateAssignmentRecord,\n deleteAssignmentRecord,\n updateSubmissionRecord,\n updateSubmissionAsTeacherRecord,\n attachAssignmentToEventRecord,\n detachAssignmentFromEventRecord,\n getAvailableEventsForAssignment,\n attachMarkSchemeRecord,\n detachMarkSchemeRecord,\n attachGradingBoundaryRecord,\n detachGradingBoundaryRecord,\n reorderAssignmentRecord,\n moveAssignmentRecord,\n} from \"../services/assignment.js\";\nimport { sendToMultiple } from \"../services/notification.js\";\n\nfunction getCommenterName(comment: {\n author: {\n username: string;\n profile: { displayName: string | null } | null;\n };\n}) {\n return comment.author.profile?.displayName || comment.author.username;\n}\n\n// DEPRECATED: This schema is no longer used - files are uploaded directly to GCS\n// Use directFileSchema instead\n\n// New schema for direct file uploads (no base64 data)\nconst directFileSchema = z.object({\n name: z.string(),\n type: z.string(),\n size: z.number(),\n // No data field - for direct file uploads\n});\n\nconst createAssignmentSchema = z.object({\n classId: z.string(),\n id: z.string().optional(),\n title: z.string(),\n instructions: z.string(),\n dueDate: z.string(),\n files: z.array(directFileSchema).optional(), // Use direct file schema\n existingFileIds: z.array(z.string()).optional(),\n aiPolicyLevel: z.number().default(0),\n acceptFiles: z.boolean().optional(),\n acceptExtendedResponse: z.boolean().optional(),\n acceptWorksheet: z.boolean().optional(),\n worksheetIds: z.array(z.string()).optional(),\n gradeWithAI: z.boolean().optional(),\n studentIds: z.array(z.string()).optional(),\n maxGrade: z.number().optional(),\n graded: z.boolean().optional(),\n weight: z.number().optional(),\n sectionId: z.string().optional(),\n type: z.enum(['HOMEWORK', 'QUIZ', 'TEST', 'PROJECT', 'ESSAY', 'DISCUSSION', 'PRESENTATION', 'LAB', 'OTHER']).optional(),\n markSchemeId: z.string().optional(),\n gradingBoundaryId: z.string().optional(),\n inProgress: z.boolean().optional(),\n sourceAssignmentId: z.string().optional(),\n});\n\nconst updateAssignmentSchema = z.object({\n classId: z.string(),\n id: z.string(),\n title: z.string().optional(),\n instructions: z.string().optional(),\n dueDate: z.string().optional(),\n files: z.array(directFileSchema).optional(), // Use direct file schema\n aiPolicyLevel: z.number().default(0),\n acceptFiles: z.boolean().optional(),\n acceptExtendedResponse: z.boolean().optional(),\n acceptWorksheet: z.boolean().optional(),\n worksheetIds: z.array(z.string()).optional(),\n gradeWithAI: z.boolean().optional(),\n studentIds: z.array(z.string()).optional(),\n existingFileIds: z.array(z.string()).optional(),\n removedAttachments: z.array(z.string()).optional(),\n maxGrade: z.number().optional(),\n graded: z.boolean().optional(),\n weight: z.number().optional(),\n sectionId: z.string().nullable().optional(),\n type: z.enum(['HOMEWORK', 'QUIZ', 'TEST', 'PROJECT', 'ESSAY', 'DISCUSSION', 'PRESENTATION', 'LAB', 'OTHER']).optional(),\n inProgress: z.boolean().optional(),\n});\n\nconst deleteAssignmentSchema = z.object({\n id: z.string(),\n classId: z.string(),\n});\n\nconst getAssignmentSchema = z.object({\n id: z.string(),\n classId: z.string(),\n});\n\nconst submissionSchema = z.object({\n assignmentId: z.string(),\n classId: z.string(),\n submissionId: z.string(),\n submit: z.boolean().optional(),\n newAttachments: z.array(directFileSchema).optional(), // Use direct file schema\n extendedResponse: z.string().optional(),\n existingFileIds: z.array(z.string()).optional(),\n removedAttachments: z.array(z.string()).optional(),\n});\n\nconst updateSubmissionSchema = z.object({\n assignmentId: z.string(),\n classId: z.string(),\n submissionId: z.string(),\n return: z.boolean().optional(),\n gradeReceived: z.number().nullable().optional(),\n newAttachments: z.array(directFileSchema).optional(), // Use direct file schema\n existingFileIds: z.array(z.string()).optional(),\n removedAttachments: z.array(z.string()).optional(),\n feedback: z.string().optional(),\n rubricGrades: z.array(z.object({\n criteriaId: z.string(),\n selectedLevelId: z.string(),\n points: z.number(),\n comments: z.string(),\n })).optional(),\n});\n\n// New schemas for direct upload functionality\nconst getAssignmentUploadUrlsSchema = z.object({\n assignmentId: z.string(),\n classId: z.string(),\n files: z.array(directFileSchema),\n});\n\nconst getSubmissionUploadUrlsSchema = z.object({\n submissionId: z.string(),\n classId: z.string(),\n files: z.array(directFileSchema),\n});\n\nconst confirmAssignmentUploadSchema = z.object({\n fileId: z.string(),\n uploadSuccess: z.boolean(),\n errorMessage: z.string().optional(),\n});\n\nconst confirmSubmissionUploadSchema = z.object({\n fileId: z.string(),\n uploadSuccess: z.boolean(),\n errorMessage: z.string().optional(),\n});\n\nconst getAnnotationUploadUrlsSchema = z.object({\n submissionId: z.string(),\n classId: z.string(),\n files: z.array(directFileSchema),\n});\n\nconst confirmAnnotationUploadSchema = z.object({\n fileId: z.string(),\n uploadSuccess: z.boolean(),\n errorMessage: z.string().optional(),\n});\n\nconst updateUploadProgressSchema = z.object({\n fileId: z.string(),\n progress: z.number().min(0).max(100),\n});\n\nconst assignmentCommentSchema = z.object({\n assignmentId: z.string(),\n classId: z.string(),\n content: z.string().min(1, \"Comment cannot be empty\"),\n parentCommentId: z.string().optional(),\n});\n\nconst assignmentCommentsSchema = z.object({\n assignmentId: z.string(),\n classId: z.string(),\n});\n\nconst submissionCommentSchema = z.object({\n assignmentId: z.string(),\n classId: z.string(),\n submissionId: z.string(),\n content: z.string().min(1, \"Comment cannot be empty\"),\n parentCommentId: z.string().optional(),\n});\n\nconst submissionCommentsSchema = z.object({\n assignmentId: z.string(),\n classId: z.string(),\n submissionId: z.string(),\n});\n\nconst commentInclude = {\n author: {\n select: {\n id: true,\n username: true,\n profile: {\n select: {\n displayName: true,\n profilePicture: true,\n profilePictureThumbnail: true,\n },\n },\n },\n },\n replies: {\n include: {\n author: {\n select: {\n id: true,\n username: true,\n profile: {\n select: {\n displayName: true,\n profilePicture: true,\n profilePictureThumbnail: true,\n },\n },\n },\n },\n },\n orderBy: { createdAt: \"asc\" as const },\n },\n} as const;\n\nexport const assignmentRouter = createTRPCRouter({\n reorder: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n movedId: z.string(),\n position: z.enum(['start', 'end', 'before', 'after']),\n targetId: z.string().optional(),\n }))\n .mutation(({ ctx, input }) =>\n reorderAssignmentRecord(ctx.user!.id, {\n classId: input.classId,\n movedId: input.movedId,\n position: input.position,\n targetId: input.targetId,\n })\n ),\n\n exists: protectedClassMemberProcedure\n .input(z.object({ id: z.string() }))\n .query(({ input }) => assignmentExists(input.id)),\n move: protectedTeacherProcedure\n .input(z.object({\n id: z.string(),\n classId: z.string(),\n targetSectionId: z.string().nullable().optional(),\n }))\n .mutation(({ ctx, input }) =>\n moveAssignmentRecord(ctx.user!.id, {\n id: input.id,\n classId: input.classId,\n targetSectionId: (input.targetSectionId ?? null) || null,\n })\n ),\n\n create: protectedTeacherProcedure\n .input(createAssignmentSchema)\n .mutation(({ ctx, input }) => createAssignmentRecord(ctx.user!.id, input)),\n\n duplicateAssignment: protectedTeacherProcedure\n .input(\n z.object({\n classId: z.string(),\n title: z.string(),\n assignmentId: z.string(),\n })\n )\n .mutation(({ ctx, input }) =>\n duplicateAssignmentRecord(\n input.assignmentId,\n input.classId,\n input.title,\n ctx.user!.id\n )\n ),\n\n update: protectedTeacherProcedure\n .input(updateAssignmentSchema)\n .mutation(({ ctx, input }) => updateAssignmentRecord(ctx.user!.id, input)),\n\n delete: protectedProcedure\n .input(deleteAssignmentSchema)\n .mutation(({ ctx, input }) =>\n deleteAssignmentRecord(ctx.user!.id, input.id, input.classId)\n ),\n\n get: protectedClassMemberProcedure\n .input(getAssignmentSchema)\n .query(({ input }) => getAssignment(input.id, input.classId)),\n\n getSubmission: protectedClassMemberProcedure\n .input(z.object({ assignmentId: z.string(), classId: z.string() }))\n .query(({ ctx, input }) =>\n getSubmission(input.assignmentId, ctx.user!.id)\n ),\n\n getSubmissionById: protectedClassMemberProcedure\n .input(z.object({ classId: z.string(), submissionId: z.string() }))\n .query(({ ctx, input }) =>\n getSubmissionById(input.submissionId, input.classId, ctx.user!.id)\n ),\n\n updateSubmission: protectedClassMemberProcedure\n .input(submissionSchema)\n .mutation(({ ctx, input }) =>\n updateSubmissionRecord(ctx.user!.id, {\n submissionId: input.submissionId,\n assignmentId: input.assignmentId,\n classId: input.classId,\n submit: input.submit,\n newAttachments: input.newAttachments,\n extendedResponse: input.extendedResponse,\n existingFileIds: input.existingFileIds,\n removedAttachments: input.removedAttachments,\n })\n ),\n\n getSubmissions: protectedTeacherProcedure\n .input(z.object({ assignmentId: z.string(), classId: z.string() }))\n .query(({ ctx, input }) => getSubmissions(input.assignmentId, ctx.user!.id)),\n\n getComments: protectedClassMemberProcedure\n .input(assignmentCommentsSchema)\n .query(async ({ input }) => {\n const assignment = await prisma.assignment.findFirst({\n where: { id: input.assignmentId, classId: input.classId },\n select: { id: true },\n });\n if (!assignment) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Assignment not found\",\n });\n }\n\n const comments = await prisma.comment.findMany({\n where: {\n assignmentId: input.assignmentId,\n submissionId: null,\n parentCommentId: null,\n },\n include: commentInclude,\n orderBy: [{ isPinned: \"desc\" }, { createdAt: \"asc\" }],\n });\n\n return { comments };\n }),\n\n addComment: protectedClassMemberProcedure\n .input(assignmentCommentSchema)\n .mutation(async ({ ctx, input }) => {\n const assignment = await prisma.assignment.findFirst({\n where: { id: input.assignmentId, classId: input.classId },\n select: {\n id: true,\n title: true,\n class: {\n select: {\n id: true,\n name: true,\n students: { select: { id: true } },\n teachers: { select: { id: true } },\n },\n },\n },\n });\n if (!assignment) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Assignment not found\",\n });\n }\n\n if (input.parentCommentId) {\n const parentComment = await prisma.comment.findFirst({\n where: {\n id: input.parentCommentId,\n assignmentId: input.assignmentId,\n submissionId: null,\n },\n select: { id: true },\n });\n if (!parentComment) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Parent comment not found\",\n });\n }\n }\n\n const comment = await prisma.comment.create({\n data: {\n content: input.content,\n authorId: ctx.user!.id,\n assignmentId: input.assignmentId,\n ...(input.parentCommentId && { parentCommentId: input.parentCommentId }),\n },\n include: commentInclude,\n });\n\n const authorId = ctx.user!.id;\n const receiverIds = Array.from(\n new Set([\n ...assignment.class.students.map((s) => s.id),\n ...assignment.class.teachers.map((t) => t.id),\n ])\n ).filter((id) => id !== authorId);\n\n if (receiverIds.length > 0) {\n sendToMultiple({\n receiverIds,\n title: `New comment on ${assignment.title}`,\n content: `${getCommenterName(comment)} commented in ${assignment.class.name}:\\n\\n${input.content}\\n\\n[View assignment](/class/${assignment.class.id}/assignments/${assignment.id})`,\n }).catch((error) => {\n logger.error(\"Failed to send assignment comment notifications:\", error);\n });\n }\n\n return { comment };\n }),\n\n getSubmissionComments: protectedClassMemberProcedure\n .input(submissionCommentsSchema)\n .query(async ({ ctx, input }) => {\n const submission = await prisma.submission.findFirst({\n where: {\n id: input.submissionId,\n assignmentId: input.assignmentId,\n assignment: {\n classId: input.classId,\n class: classMemberOrSchoolAdminWhere(ctx.user!.id),\n },\n OR: [\n { studentId: ctx.user!.id },\n { assignment: { class: classTeacherOrSchoolAdminWhere(ctx.user!.id) } },\n ],\n },\n select: { id: true },\n });\n if (!submission) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Submission not found\",\n });\n }\n\n const comments = await prisma.comment.findMany({\n where: {\n submissionId: input.submissionId,\n parentCommentId: null,\n },\n include: commentInclude,\n orderBy: [{ isPinned: \"desc\" }, { createdAt: \"asc\" }],\n });\n\n return { comments };\n }),\n\n addSubmissionComment: protectedClassMemberProcedure\n .input(submissionCommentSchema)\n .mutation(async ({ ctx, input }) => {\n const submission = await prisma.submission.findFirst({\n where: {\n id: input.submissionId,\n assignmentId: input.assignmentId,\n assignment: { classId: input.classId },\n OR: [\n { studentId: ctx.user!.id },\n { assignment: { class: classTeacherOrSchoolAdminWhere(ctx.user!.id) } },\n ],\n },\n select: {\n id: true,\n studentId: true,\n assignment: {\n select: {\n id: true,\n title: true,\n class: {\n select: {\n id: true,\n name: true,\n teachers: { select: { id: true } },\n },\n },\n },\n },\n },\n });\n if (!submission) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Submission not found\",\n });\n }\n\n if (input.parentCommentId) {\n const parentComment = await prisma.comment.findFirst({\n where: {\n id: input.parentCommentId,\n submissionId: input.submissionId,\n },\n select: { id: true },\n });\n if (!parentComment) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Parent comment not found\",\n });\n }\n }\n\n const comment = await prisma.comment.create({\n data: {\n content: input.content,\n authorId: ctx.user!.id,\n submissionId: input.submissionId,\n ...(input.parentCommentId && { parentCommentId: input.parentCommentId }),\n },\n include: commentInclude,\n });\n\n const authorId = ctx.user!.id;\n const receiverIds = Array.from(\n new Set([\n submission.studentId,\n ...submission.assignment.class.teachers.map((t) => t.id),\n ])\n ).filter((id) => id !== authorId);\n\n if (receiverIds.length > 0) {\n sendToMultiple({\n receiverIds,\n title: `New private comment on ${submission.assignment.title}`,\n content: `${getCommenterName(comment)} commented on a submission in ${submission.assignment.class.name}:\\n\\n${input.content}\\n\\n[View submission](/class/${submission.assignment.class.id}/assignments/${submission.assignment.id}/submissions/${submission.id})`,\n }).catch((error) => {\n logger.error(\"Failed to send submission comment notifications:\", error);\n });\n }\n\n return { comment };\n }),\n\n updateSubmissionAsTeacher: protectedTeacherProcedure\n .input(updateSubmissionSchema)\n .mutation(({ ctx, input }) =>\n updateSubmissionAsTeacherRecord(ctx.user!.id, {\n submissionId: input.submissionId,\n assignmentId: input.assignmentId,\n classId: input.classId,\n return: input.return,\n gradeReceived: input.gradeReceived,\n newAttachments: input.newAttachments,\n existingFileIds: input.existingFileIds,\n removedAttachments: input.removedAttachments,\n rubricGrades: input.rubricGrades,\n feedback: input.feedback,\n })\n ),\n\n attachToEvent: protectedTeacherProcedure\n .input(z.object({ assignmentId: z.string(), eventId: z.string() }))\n .mutation(({ ctx, input }) =>\n attachAssignmentToEventRecord(ctx.user!.id, input.assignmentId, input.eventId)\n ),\n\n detachEvent: protectedTeacherProcedure\n .input(z.object({ assignmentId: z.string() }))\n .mutation(({ ctx, input }) =>\n detachAssignmentFromEventRecord(ctx.user!.id, input.assignmentId)\n ),\n\n getAvailableEvents: protectedTeacherProcedure\n .input(z.object({ assignmentId: z.string() }))\n .query(({ ctx, input }) =>\n getAvailableEventsForAssignment(ctx.user!.id, input.assignmentId)\n ),\n\n dueToday: protectedProcedure\n .query(() => getDueToday()),\n attachMarkScheme: protectedTeacherProcedure\n .input(z.object({\n assignmentId: z.string(),\n markSchemeId: z.string().nullable(),\n }))\n .mutation(({ ctx, input }) =>\n attachMarkSchemeRecord(ctx.user!.id, input.assignmentId, input.markSchemeId)\n ),\n detachMarkScheme: protectedTeacherProcedure\n .input(z.object({ assignmentId: z.string() }))\n .mutation(({ ctx, input }) =>\n detachMarkSchemeRecord(ctx.user!.id, input.assignmentId)\n ),\n attachGradingBoundary: protectedTeacherProcedure\n .input(z.object({\n assignmentId: z.string(),\n gradingBoundaryId: z.string().nullable(),\n }))\n .mutation(({ ctx, input }) =>\n attachGradingBoundaryRecord(ctx.user!.id, input.assignmentId, input.gradingBoundaryId)\n ),\n detachGradingBoundary: protectedTeacherProcedure\n .input(z.object({ classId: z.string(), assignmentId: z.string() }))\n .mutation(({ ctx, input }) =>\n detachGradingBoundaryRecord(ctx.user!.id, input.assignmentId)\n ),\n\n // New direct upload endpoints\n getAssignmentUploadUrls: protectedTeacherProcedure\n .input(getAssignmentUploadUrlsSchema)\n .mutation(async ({ ctx, input }) => {\n const { assignmentId, classId, files } = input;\n\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"You must be logged in to upload files\",\n });\n }\n\n // Verify user is a teacher of the class\n const classData = await prisma.class.findFirst({\n where: {\n id: classId,\n teachers: {\n some: {\n id: ctx.user.id,\n },\n },\n },\n });\n\n if (!classData) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Class not found or you are not a teacher\",\n });\n }\n\n // Verify assignment exists and belongs to the class\n const assignment = await prisma.assignment.findFirst({\n where: {\n id: assignmentId,\n classId: classId,\n },\n });\n\n if (!assignment) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Assignment not found\",\n });\n }\n\n // Create direct upload files\n const directUploadFiles = await createDirectUploadFiles(\n files,\n ctx.user.id,\n undefined, // No specific directory\n assignmentId\n );\n\n return {\n success: true,\n uploadFiles: directUploadFiles,\n };\n }),\n\n getSubmissionUploadUrls: protectedClassMemberProcedure\n .input(getSubmissionUploadUrlsSchema)\n .mutation(async ({ ctx, input }) => {\n const { submissionId, classId, files } = input;\n\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"You must be logged in to upload files\",\n });\n }\n\n // Verify submission exists and user has access\n const submission = await prisma.submission.findFirst({\n where: {\n id: submissionId,\n assignment: {\n classId: classId,\n },\n },\n include: {\n assignment: {\n include: {\n class: {\n include: {\n students: true,\n teachers: true,\n school: {\n include: {\n users: {\n select: { id: true },\n },\n memberships: {\n where: {\n role: \"ADMIN\",\n status: \"ACTIVE\",\n },\n select: { userId: true },\n },\n },\n },\n },\n },\n },\n },\n },\n });\n\n if (!submission) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Submission not found\",\n });\n }\n\n // Check if user is the student who owns the submission or a teacher of the class\n const isStudent = submission.studentId === ctx.user.id;\n const isTeacher = submission.assignment.class.teachers.some(teacher => teacher.id === ctx.user?.id);\n const isSchoolAdmin = Boolean(\n submission.assignment.class.school?.memberships.some(admin => admin.userId === ctx.user?.id) ||\n submission.assignment.class.school?.users.some(admin => admin.id === ctx.user?.id)\n );\n\n if (!isStudent && !isTeacher && !isSchoolAdmin) {\n throw new TRPCError({\n code: \"FORBIDDEN\",\n message: \"You don't have permission to upload files to this submission\",\n });\n }\n\n // Create direct upload files\n const directUploadFiles = await createDirectUploadFiles(\n files,\n ctx.user.id,\n undefined, // No specific directory\n undefined, // No assignment ID\n submissionId\n );\n\n return {\n success: true,\n uploadFiles: directUploadFiles,\n };\n }),\n\n confirmAssignmentUpload: protectedTeacherProcedure\n .input(confirmAssignmentUploadSchema)\n .mutation(async ({ ctx, input }) => {\n const { fileId, uploadSuccess, errorMessage } = input;\n\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"You must be logged in\",\n });\n }\n\n // Verify file belongs to user and is an assignment file\n const file = await prisma.file.findFirst({\n where: {\n id: fileId,\n userId: ctx.user.id,\n assignment: {\n isNot: null,\n },\n },\n });\n\n if (!file) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"File not found or you don't have permission\",\n });\n }\n\n await confirmDirectUpload(fileId, uploadSuccess, errorMessage);\n\n return {\n success: true,\n message: uploadSuccess ? \"Upload confirmed successfully\" : \"Upload failed\",\n };\n }),\n\n confirmSubmissionUpload: protectedClassMemberProcedure\n .input(confirmSubmissionUploadSchema)\n .mutation(async ({ ctx, input }) => {\n const { fileId, uploadSuccess, errorMessage } = input;\n\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"You must be logged in\",\n });\n }\n\n // Verify file belongs to user and is a submission file\n const file = await prisma.file.findFirst({\n where: {\n id: fileId,\n userId: ctx.user.id,\n submission: {\n isNot: null,\n },\n },\n });\n\n if (!file) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"File not found or you don't have permission\",\n });\n }\n\n await confirmDirectUpload(fileId, uploadSuccess, errorMessage);\n\n return {\n success: true,\n message: uploadSuccess ? \"Upload confirmed successfully\" : \"Upload failed\",\n };\n }),\n\n getAnnotationUploadUrls: protectedTeacherProcedure\n .input(getAnnotationUploadUrlsSchema)\n .mutation(async ({ ctx, input }) => {\n const { submissionId, classId, files } = input;\n\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"You must be logged in to upload files\",\n });\n }\n\n // Verify submission exists and user is a teacher of the class\n const submission = await prisma.submission.findFirst({\n where: {\n id: submissionId,\n assignment: {\n classId: classId,\n class: {\n teachers: {\n some: {\n id: ctx.user.id,\n },\n },\n },\n },\n },\n });\n\n if (!submission) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Submission not found or you are not a teacher of this class\",\n });\n }\n\n // Create direct upload files for annotations\n // Note: We pass submissionId as the 5th parameter, but these are annotations not submission files\n // We need to store them separately, so we'll use a different approach\n const directUploadFiles = await createDirectUploadFiles(\n files,\n ctx.user.id,\n undefined, // No specific directory\n undefined, // No assignment ID\n undefined // Don't link to submission yet (will be linked in confirmAnnotationUpload)\n );\n\n // Store the submissionId in the file record so we can link it to annotations later\n await Promise.all(\n directUploadFiles.map(file =>\n prisma.file.update({\n where: { id: file.id },\n data: {\n annotationId: submissionId, // Store as annotation\n }\n })\n )\n );\n\n return {\n success: true,\n uploadFiles: directUploadFiles,\n };\n }),\n\n confirmAnnotationUpload: protectedTeacherProcedure\n .input(confirmAnnotationUploadSchema)\n .mutation(async ({ ctx, input }) => {\n const { fileId, uploadSuccess, errorMessage } = input;\n\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"You must be logged in\",\n });\n }\n\n // Verify file belongs to user and is an annotation file\n const file = await prisma.file.findFirst({\n where: {\n id: fileId,\n userId: ctx.user.id,\n annotationId: {\n not: null,\n },\n },\n });\n\n if (!file) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"File not found or you don't have permission\",\n });\n }\n\n await confirmDirectUpload(fileId, uploadSuccess, errorMessage);\n\n return {\n success: true,\n message: uploadSuccess ? \"Annotation upload confirmed successfully\" : \"Annotation upload failed\",\n };\n }),\n\n updateUploadProgress: protectedProcedure\n .input(updateUploadProgressSchema)\n .mutation(async ({ ctx, input }) => {\n const { fileId, progress } = input;\n\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"You must be logged in\",\n });\n }\n\n // Verify file belongs to user\n const file = await prisma.file.findFirst({\n where: {\n id: fileId,\n userId: ctx.user.id,\n },\n });\n\n if (!file) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"File not found or you don't have permission\",\n });\n }\n\n await updateUploadProgress(fileId, progress);\n\n return {\n success: true,\n progress,\n };\n }),\n});\n"],"names":[],"mappings":"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","debug_id":"e990115c-dd02-53f4-a32e-f142a46bc39c"}
|
|
1
|
+
{"version":3,"file":"assignment.js","sources":["routers/assignment.ts"],"sourceRoot":"/","sourcesContent":["import { z } from \"zod\";\nimport { createTRPCRouter, protectedProcedure, protectedClassMemberProcedure, protectedTeacherProcedure } from \"../trpc.js\";\nimport { TRPCError } from \"@trpc/server\";\nimport { prisma } from \"../lib/prisma.js\";\nimport { createDirectUploadFiles, type DirectUploadFile, confirmDirectUpload, updateUploadProgress, type UploadedFile } from \"../lib/fileUpload.js\";\nimport { deleteFile } from \"../lib/googleCloudStorage.js\";\nimport { logger } from \"../utils/logger.js\";\nimport {\n classMemberOrSchoolAdminWhere,\n classTeacherOrSchoolAdminWhere,\n} from \"../models/access.js\";\nimport {\n assignmentExists,\n getDueToday,\n getAssignment,\n getSubmission,\n getSubmissionById,\n getSubmissions,\n createAssignmentRecord,\n duplicateAssignmentRecord,\n updateAssignmentRecord,\n deleteAssignmentRecord,\n updateSubmissionRecord,\n updateSubmissionAsTeacherRecord,\n attachAssignmentToEventRecord,\n detachAssignmentFromEventRecord,\n getAvailableEventsForAssignment,\n attachMarkSchemeRecord,\n detachMarkSchemeRecord,\n attachGradingBoundaryRecord,\n detachGradingBoundaryRecord,\n reorderAssignmentRecord,\n moveAssignmentRecord,\n} from \"../services/assignment.js\";\nimport { sendToMultiple } from \"../services/notification.js\";\n\nfunction getCommenterName(comment: {\n author: {\n username: string;\n profile: { displayName: string | null } | null;\n };\n}) {\n return comment.author.profile?.displayName || comment.author.username;\n}\n\n// DEPRECATED: This schema is no longer used - files are uploaded directly to GCS\n// Use directFileSchema instead\n\n// New schema for direct file uploads (no base64 data)\nconst directFileSchema = z.object({\n name: z.string(),\n type: z.string(),\n size: z.number(),\n // No data field - for direct file uploads\n});\n\nconst createAssignmentSchema = z.object({\n classId: z.string(),\n id: z.string().optional(),\n title: z.string(),\n instructions: z.string(),\n dueDate: z.string(),\n files: z.array(directFileSchema).optional(), // Use direct file schema\n existingFileIds: z.array(z.string()).optional(),\n aiPolicyLevel: z.number().default(0),\n acceptFiles: z.boolean().optional(),\n acceptExtendedResponse: z.boolean().optional(),\n acceptWorksheet: z.boolean().optional(),\n worksheetIds: z.array(z.string()).optional(),\n gradeWithAI: z.boolean().optional(),\n studentIds: z.array(z.string()).optional(),\n maxGrade: z.number().optional(),\n graded: z.boolean().optional(),\n weight: z.number().optional(),\n sectionId: z.string().optional(),\n type: z.enum(['HOMEWORK', 'QUIZ', 'TEST', 'PROJECT', 'ESSAY', 'DISCUSSION', 'PRESENTATION', 'LAB', 'OTHER']).optional(),\n markSchemeId: z.string().optional(),\n gradingBoundaryId: z.string().optional(),\n inProgress: z.boolean().optional(),\n sourceAssignmentId: z.string().optional(),\n});\n\nconst updateAssignmentSchema = z.object({\n classId: z.string(),\n id: z.string(),\n title: z.string().optional(),\n instructions: z.string().optional(),\n dueDate: z.string().optional(),\n files: z.array(directFileSchema).optional(), // Use direct file schema\n aiPolicyLevel: z.number().default(0),\n acceptFiles: z.boolean().optional(),\n acceptExtendedResponse: z.boolean().optional(),\n acceptWorksheet: z.boolean().optional(),\n worksheetIds: z.array(z.string()).optional(),\n gradeWithAI: z.boolean().optional(),\n studentIds: z.array(z.string()).optional(),\n existingFileIds: z.array(z.string()).optional(),\n removedAttachments: z.array(z.string()).optional(),\n maxGrade: z.number().optional(),\n graded: z.boolean().optional(),\n weight: z.number().optional(),\n sectionId: z.string().nullable().optional(),\n type: z.enum(['HOMEWORK', 'QUIZ', 'TEST', 'PROJECT', 'ESSAY', 'DISCUSSION', 'PRESENTATION', 'LAB', 'OTHER']).optional(),\n inProgress: z.boolean().optional(),\n});\n\nconst deleteAssignmentSchema = z.object({\n id: z.string(),\n classId: z.string(),\n});\n\nconst getAssignmentSchema = z.object({\n id: z.string(),\n classId: z.string(),\n});\n\nconst submissionSchema = z.object({\n assignmentId: z.string(),\n classId: z.string(),\n submissionId: z.string(),\n submit: z.boolean().optional(),\n newAttachments: z.array(directFileSchema).optional(), // Use direct file schema\n extendedResponse: z.string().optional(),\n existingFileIds: z.array(z.string()).optional(),\n removedAttachments: z.array(z.string()).optional(),\n});\n\nconst updateSubmissionSchema = z.object({\n assignmentId: z.string(),\n classId: z.string(),\n submissionId: z.string(),\n return: z.boolean().optional(),\n gradeReceived: z.number().nullable().optional(),\n newAttachments: z.array(directFileSchema).optional(), // Use direct file schema\n existingFileIds: z.array(z.string()).optional(),\n removedAttachments: z.array(z.string()).optional(),\n feedback: z.string().optional(),\n rubricGrades: z.array(z.object({\n criteriaId: z.string(),\n selectedLevelId: z.string(),\n points: z.number(),\n comments: z.string(),\n })).optional(),\n});\n\n// New schemas for direct upload functionality\nconst getAssignmentUploadUrlsSchema = z.object({\n assignmentId: z.string(),\n classId: z.string(),\n files: z.array(directFileSchema),\n});\n\nconst getSubmissionUploadUrlsSchema = z.object({\n submissionId: z.string(),\n classId: z.string(),\n files: z.array(directFileSchema),\n});\n\nconst confirmAssignmentUploadSchema = z.object({\n fileId: z.string(),\n uploadSuccess: z.boolean(),\n errorMessage: z.string().optional(),\n});\n\nconst confirmSubmissionUploadSchema = z.object({\n fileId: z.string(),\n uploadSuccess: z.boolean(),\n errorMessage: z.string().optional(),\n});\n\nconst getAnnotationUploadUrlsSchema = z.object({\n submissionId: z.string(),\n classId: z.string(),\n files: z.array(directFileSchema),\n});\n\nconst confirmAnnotationUploadSchema = z.object({\n fileId: z.string(),\n uploadSuccess: z.boolean(),\n errorMessage: z.string().optional(),\n});\n\nconst listFileAnnotationsSchema = z.object({\n classId: z.string(),\n submissionId: z.string(),\n fileId: z.string(),\n});\n\nconst upsertFileAnnotationSchema = z.object({\n classId: z.string(),\n submissionId: z.string(),\n fileId: z.string(),\n id: z.string().optional(),\n page: z.number().int().min(1),\n type: z.enum([\"HIGHLIGHT\", \"INK\", \"COMMENT\", \"TEXT\"]),\n geometry: z.record(z.string(), z.unknown()),\n text: z.string().optional(),\n color: z.string().optional(),\n});\n\nconst deleteFileAnnotationSchema = z.object({\n classId: z.string(),\n submissionId: z.string(),\n id: z.string(),\n});\n\nconst updateUploadProgressSchema = z.object({\n fileId: z.string(),\n progress: z.number().min(0).max(100),\n});\n\nconst assignmentCommentSchema = z.object({\n assignmentId: z.string(),\n classId: z.string(),\n content: z.string().min(1, \"Comment cannot be empty\"),\n parentCommentId: z.string().optional(),\n});\n\nconst assignmentCommentsSchema = z.object({\n assignmentId: z.string(),\n classId: z.string(),\n});\n\nconst submissionCommentSchema = z.object({\n assignmentId: z.string(),\n classId: z.string(),\n submissionId: z.string(),\n content: z.string().min(1, \"Comment cannot be empty\"),\n parentCommentId: z.string().optional(),\n});\n\nconst submissionCommentsSchema = z.object({\n assignmentId: z.string(),\n classId: z.string(),\n submissionId: z.string(),\n});\n\nconst commentInclude = {\n author: {\n select: {\n id: true,\n username: true,\n profile: {\n select: {\n displayName: true,\n profilePicture: true,\n profilePictureThumbnail: true,\n },\n },\n },\n },\n replies: {\n include: {\n author: {\n select: {\n id: true,\n username: true,\n profile: {\n select: {\n displayName: true,\n profilePicture: true,\n profilePictureThumbnail: true,\n },\n },\n },\n },\n },\n orderBy: { createdAt: \"asc\" as const },\n },\n} as const;\n\nexport const assignmentRouter = createTRPCRouter({\n reorder: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n movedId: z.string(),\n position: z.enum(['start', 'end', 'before', 'after']),\n targetId: z.string().optional(),\n }))\n .mutation(({ ctx, input }) =>\n reorderAssignmentRecord(ctx.user!.id, {\n classId: input.classId,\n movedId: input.movedId,\n position: input.position,\n targetId: input.targetId,\n })\n ),\n\n exists: protectedClassMemberProcedure\n .input(z.object({ id: z.string() }))\n .query(({ input }) => assignmentExists(input.id)),\n move: protectedTeacherProcedure\n .input(z.object({\n id: z.string(),\n classId: z.string(),\n targetSectionId: z.string().nullable().optional(),\n }))\n .mutation(({ ctx, input }) =>\n moveAssignmentRecord(ctx.user!.id, {\n id: input.id,\n classId: input.classId,\n targetSectionId: (input.targetSectionId ?? null) || null,\n })\n ),\n\n create: protectedTeacherProcedure\n .input(createAssignmentSchema)\n .mutation(({ ctx, input }) => createAssignmentRecord(ctx.user!.id, input)),\n\n duplicateAssignment: protectedTeacherProcedure\n .input(\n z.object({\n classId: z.string(),\n title: z.string(),\n assignmentId: z.string(),\n })\n )\n .mutation(({ ctx, input }) =>\n duplicateAssignmentRecord(\n input.assignmentId,\n input.classId,\n input.title,\n ctx.user!.id\n )\n ),\n\n update: protectedTeacherProcedure\n .input(updateAssignmentSchema)\n .mutation(({ ctx, input }) => updateAssignmentRecord(ctx.user!.id, input)),\n\n delete: protectedProcedure\n .input(deleteAssignmentSchema)\n .mutation(({ ctx, input }) =>\n deleteAssignmentRecord(ctx.user!.id, input.id, input.classId)\n ),\n\n get: protectedClassMemberProcedure\n .input(getAssignmentSchema)\n .query(({ input }) => getAssignment(input.id, input.classId)),\n\n getSubmission: protectedClassMemberProcedure\n .input(z.object({ assignmentId: z.string(), classId: z.string() }))\n .query(({ ctx, input }) =>\n getSubmission(input.assignmentId, ctx.user!.id)\n ),\n\n getSubmissionById: protectedClassMemberProcedure\n .input(z.object({ classId: z.string(), submissionId: z.string() }))\n .query(({ ctx, input }) =>\n getSubmissionById(input.submissionId, input.classId, ctx.user!.id)\n ),\n\n updateSubmission: protectedClassMemberProcedure\n .input(submissionSchema)\n .mutation(({ ctx, input }) =>\n updateSubmissionRecord(ctx.user!.id, {\n submissionId: input.submissionId,\n assignmentId: input.assignmentId,\n classId: input.classId,\n submit: input.submit,\n newAttachments: input.newAttachments,\n extendedResponse: input.extendedResponse,\n existingFileIds: input.existingFileIds,\n removedAttachments: input.removedAttachments,\n })\n ),\n\n getSubmissions: protectedTeacherProcedure\n .input(z.object({ assignmentId: z.string(), classId: z.string() }))\n .query(({ ctx, input }) => getSubmissions(input.assignmentId, ctx.user!.id)),\n\n getComments: protectedClassMemberProcedure\n .input(assignmentCommentsSchema)\n .query(async ({ input }) => {\n const assignment = await prisma.assignment.findFirst({\n where: { id: input.assignmentId, classId: input.classId },\n select: { id: true },\n });\n if (!assignment) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Assignment not found\",\n });\n }\n\n const comments = await prisma.comment.findMany({\n where: {\n assignmentId: input.assignmentId,\n submissionId: null,\n parentCommentId: null,\n },\n include: commentInclude,\n orderBy: [{ isPinned: \"desc\" }, { createdAt: \"asc\" }],\n });\n\n return { comments };\n }),\n\n addComment: protectedClassMemberProcedure\n .input(assignmentCommentSchema)\n .mutation(async ({ ctx, input }) => {\n const assignment = await prisma.assignment.findFirst({\n where: { id: input.assignmentId, classId: input.classId },\n select: {\n id: true,\n title: true,\n class: {\n select: {\n id: true,\n name: true,\n students: { select: { id: true } },\n teachers: { select: { id: true } },\n },\n },\n },\n });\n if (!assignment) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Assignment not found\",\n });\n }\n\n if (input.parentCommentId) {\n const parentComment = await prisma.comment.findFirst({\n where: {\n id: input.parentCommentId,\n assignmentId: input.assignmentId,\n submissionId: null,\n },\n select: { id: true },\n });\n if (!parentComment) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Parent comment not found\",\n });\n }\n }\n\n const comment = await prisma.comment.create({\n data: {\n content: input.content,\n authorId: ctx.user!.id,\n assignmentId: input.assignmentId,\n ...(input.parentCommentId && { parentCommentId: input.parentCommentId }),\n },\n include: commentInclude,\n });\n\n const authorId = ctx.user!.id;\n const receiverIds = Array.from(\n new Set([\n ...assignment.class.students.map((s) => s.id),\n ...assignment.class.teachers.map((t) => t.id),\n ])\n ).filter((id) => id !== authorId);\n\n if (receiverIds.length > 0) {\n sendToMultiple({\n receiverIds,\n title: `New comment on ${assignment.title}`,\n content: `${getCommenterName(comment)} commented in ${assignment.class.name}:\\n\\n${input.content}\\n\\n[View assignment](/class/${assignment.class.id}/assignments/${assignment.id})`,\n senderId: authorId,\n type: \"COMMENT_REPLY\",\n entityType: \"ASSIGNMENT\",\n entityId: assignment.id,\n classId: assignment.class.id,\n }).catch((error) => {\n logger.error(\"Failed to send assignment comment notifications:\", error);\n });\n }\n\n return { comment };\n }),\n\n getSubmissionComments: protectedClassMemberProcedure\n .input(submissionCommentsSchema)\n .query(async ({ ctx, input }) => {\n const submission = await prisma.submission.findFirst({\n where: {\n id: input.submissionId,\n assignmentId: input.assignmentId,\n assignment: {\n classId: input.classId,\n class: classMemberOrSchoolAdminWhere(ctx.user!.id),\n },\n OR: [\n { studentId: ctx.user!.id },\n { assignment: { class: classTeacherOrSchoolAdminWhere(ctx.user!.id) } },\n ],\n },\n select: { id: true },\n });\n if (!submission) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Submission not found\",\n });\n }\n\n const comments = await prisma.comment.findMany({\n where: {\n submissionId: input.submissionId,\n parentCommentId: null,\n },\n include: commentInclude,\n orderBy: [{ isPinned: \"desc\" }, { createdAt: \"asc\" }],\n });\n\n return { comments };\n }),\n\n addSubmissionComment: protectedClassMemberProcedure\n .input(submissionCommentSchema)\n .mutation(async ({ ctx, input }) => {\n const submission = await prisma.submission.findFirst({\n where: {\n id: input.submissionId,\n assignmentId: input.assignmentId,\n assignment: { classId: input.classId },\n OR: [\n { studentId: ctx.user!.id },\n { assignment: { class: classTeacherOrSchoolAdminWhere(ctx.user!.id) } },\n ],\n },\n select: {\n id: true,\n studentId: true,\n assignment: {\n select: {\n id: true,\n title: true,\n class: {\n select: {\n id: true,\n name: true,\n teachers: { select: { id: true } },\n },\n },\n },\n },\n },\n });\n if (!submission) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Submission not found\",\n });\n }\n\n if (input.parentCommentId) {\n const parentComment = await prisma.comment.findFirst({\n where: {\n id: input.parentCommentId,\n submissionId: input.submissionId,\n },\n select: { id: true },\n });\n if (!parentComment) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Parent comment not found\",\n });\n }\n }\n\n const comment = await prisma.comment.create({\n data: {\n content: input.content,\n authorId: ctx.user!.id,\n submissionId: input.submissionId,\n ...(input.parentCommentId && { parentCommentId: input.parentCommentId }),\n },\n include: commentInclude,\n });\n\n const authorId = ctx.user!.id;\n const receiverIds = Array.from(\n new Set([\n submission.studentId,\n ...submission.assignment.class.teachers.map((t) => t.id),\n ])\n ).filter((id) => id !== authorId);\n\n if (receiverIds.length > 0) {\n sendToMultiple({\n receiverIds,\n title: `New private comment on ${submission.assignment.title}`,\n content: `${getCommenterName(comment)} commented on a submission in ${submission.assignment.class.name}:\\n\\n${input.content}\\n\\n[View submission](/class/${submission.assignment.class.id}/assignments/${submission.assignment.id}/submissions/${submission.id})`,\n senderId: authorId,\n type: \"COMMENT_REPLY\",\n entityType: \"ASSIGNMENT\",\n entityId: submission.assignment.id,\n classId: submission.assignment.class.id,\n }).catch((error) => {\n logger.error(\"Failed to send submission comment notifications:\", error);\n });\n }\n\n return { comment };\n }),\n\n updateSubmissionAsTeacher: protectedTeacherProcedure\n .input(updateSubmissionSchema)\n .mutation(({ ctx, input }) =>\n updateSubmissionAsTeacherRecord(ctx.user!.id, {\n submissionId: input.submissionId,\n assignmentId: input.assignmentId,\n classId: input.classId,\n return: input.return,\n gradeReceived: input.gradeReceived,\n newAttachments: input.newAttachments,\n existingFileIds: input.existingFileIds,\n removedAttachments: input.removedAttachments,\n rubricGrades: input.rubricGrades,\n feedback: input.feedback,\n })\n ),\n\n attachToEvent: protectedTeacherProcedure\n .input(z.object({ assignmentId: z.string(), eventId: z.string() }))\n .mutation(({ ctx, input }) =>\n attachAssignmentToEventRecord(ctx.user!.id, input.assignmentId, input.eventId)\n ),\n\n detachEvent: protectedTeacherProcedure\n .input(z.object({ assignmentId: z.string() }))\n .mutation(({ ctx, input }) =>\n detachAssignmentFromEventRecord(ctx.user!.id, input.assignmentId)\n ),\n\n getAvailableEvents: protectedTeacherProcedure\n .input(z.object({ assignmentId: z.string() }))\n .query(({ ctx, input }) =>\n getAvailableEventsForAssignment(ctx.user!.id, input.assignmentId)\n ),\n\n dueToday: protectedProcedure\n .query(() => getDueToday()),\n attachMarkScheme: protectedTeacherProcedure\n .input(z.object({\n assignmentId: z.string(),\n markSchemeId: z.string().nullable(),\n }))\n .mutation(({ ctx, input }) =>\n attachMarkSchemeRecord(ctx.user!.id, input.assignmentId, input.markSchemeId)\n ),\n detachMarkScheme: protectedTeacherProcedure\n .input(z.object({ assignmentId: z.string() }))\n .mutation(({ ctx, input }) =>\n detachMarkSchemeRecord(ctx.user!.id, input.assignmentId)\n ),\n attachGradingBoundary: protectedTeacherProcedure\n .input(z.object({\n assignmentId: z.string(),\n gradingBoundaryId: z.string().nullable(),\n }))\n .mutation(({ ctx, input }) =>\n attachGradingBoundaryRecord(ctx.user!.id, input.assignmentId, input.gradingBoundaryId)\n ),\n detachGradingBoundary: protectedTeacherProcedure\n .input(z.object({ classId: z.string(), assignmentId: z.string() }))\n .mutation(({ ctx, input }) =>\n detachGradingBoundaryRecord(ctx.user!.id, input.assignmentId)\n ),\n\n // New direct upload endpoints\n getAssignmentUploadUrls: protectedTeacherProcedure\n .input(getAssignmentUploadUrlsSchema)\n .mutation(async ({ ctx, input }) => {\n const { assignmentId, classId, files } = input;\n\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"You must be logged in to upload files\",\n });\n }\n\n // Verify user is a teacher of the class\n const classData = await prisma.class.findFirst({\n where: {\n id: classId,\n teachers: {\n some: {\n id: ctx.user.id,\n },\n },\n },\n });\n\n if (!classData) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Class not found or you are not a teacher\",\n });\n }\n\n // Verify assignment exists and belongs to the class\n const assignment = await prisma.assignment.findFirst({\n where: {\n id: assignmentId,\n classId: classId,\n },\n });\n\n if (!assignment) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Assignment not found\",\n });\n }\n\n // Create direct upload files\n const directUploadFiles = await createDirectUploadFiles(\n files,\n ctx.user.id,\n undefined, // No specific directory\n assignmentId\n );\n\n return {\n success: true,\n uploadFiles: directUploadFiles,\n };\n }),\n\n getSubmissionUploadUrls: protectedClassMemberProcedure\n .input(getSubmissionUploadUrlsSchema)\n .mutation(async ({ ctx, input }) => {\n const { submissionId, classId, files } = input;\n\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"You must be logged in to upload files\",\n });\n }\n\n // Verify submission exists and user has access\n const submission = await prisma.submission.findFirst({\n where: {\n id: submissionId,\n assignment: {\n classId: classId,\n },\n },\n include: {\n assignment: {\n include: {\n class: {\n include: {\n students: true,\n teachers: true,\n school: {\n include: {\n users: {\n select: { id: true },\n },\n memberships: {\n where: {\n role: \"ADMIN\",\n status: \"ACTIVE\",\n },\n select: { userId: true },\n },\n },\n },\n },\n },\n },\n },\n },\n });\n\n if (!submission) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Submission not found\",\n });\n }\n\n // Check if user is the student who owns the submission or a teacher of the class\n const isStudent = submission.studentId === ctx.user.id;\n const isTeacher = submission.assignment.class.teachers.some(teacher => teacher.id === ctx.user?.id);\n const isSchoolAdmin = Boolean(\n submission.assignment.class.school?.memberships.some(admin => admin.userId === ctx.user?.id) ||\n submission.assignment.class.school?.users.some(admin => admin.id === ctx.user?.id)\n );\n\n if (!isStudent && !isTeacher && !isSchoolAdmin) {\n throw new TRPCError({\n code: \"FORBIDDEN\",\n message: \"You don't have permission to upload files to this submission\",\n });\n }\n\n // Create direct upload files\n const directUploadFiles = await createDirectUploadFiles(\n files,\n ctx.user.id,\n undefined, // No specific directory\n undefined, // No assignment ID\n submissionId\n );\n\n return {\n success: true,\n uploadFiles: directUploadFiles,\n };\n }),\n\n confirmAssignmentUpload: protectedTeacherProcedure\n .input(confirmAssignmentUploadSchema)\n .mutation(async ({ ctx, input }) => {\n const { fileId, uploadSuccess, errorMessage } = input;\n\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"You must be logged in\",\n });\n }\n\n // Verify file belongs to user and is an assignment file\n const file = await prisma.file.findFirst({\n where: {\n id: fileId,\n userId: ctx.user.id,\n assignment: {\n isNot: null,\n },\n },\n });\n\n if (!file) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"File not found or you don't have permission\",\n });\n }\n\n await confirmDirectUpload(fileId, uploadSuccess, errorMessage);\n\n return {\n success: true,\n message: uploadSuccess ? \"Upload confirmed successfully\" : \"Upload failed\",\n };\n }),\n\n confirmSubmissionUpload: protectedClassMemberProcedure\n .input(confirmSubmissionUploadSchema)\n .mutation(async ({ ctx, input }) => {\n const { fileId, uploadSuccess, errorMessage } = input;\n\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"You must be logged in\",\n });\n }\n\n // Verify file belongs to user and is a submission file\n const file = await prisma.file.findFirst({\n where: {\n id: fileId,\n userId: ctx.user.id,\n submission: {\n isNot: null,\n },\n },\n });\n\n if (!file) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"File not found or you don't have permission\",\n });\n }\n\n await confirmDirectUpload(fileId, uploadSuccess, errorMessage);\n\n return {\n success: true,\n message: uploadSuccess ? \"Upload confirmed successfully\" : \"Upload failed\",\n };\n }),\n\n getAnnotationUploadUrls: protectedTeacherProcedure\n .input(getAnnotationUploadUrlsSchema)\n .mutation(async ({ ctx, input }) => {\n const { submissionId, classId, files } = input;\n\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"You must be logged in to upload files\",\n });\n }\n\n // Verify submission exists and user is a teacher of the class\n const submission = await prisma.submission.findFirst({\n where: {\n id: submissionId,\n assignment: {\n classId: classId,\n class: {\n teachers: {\n some: {\n id: ctx.user.id,\n },\n },\n },\n },\n },\n });\n\n if (!submission) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Submission not found or you are not a teacher of this class\",\n });\n }\n\n // Create direct upload files for annotations\n // Note: We pass submissionId as the 5th parameter, but these are annotations not submission files\n // We need to store them separately, so we'll use a different approach\n const directUploadFiles = await createDirectUploadFiles(\n files,\n ctx.user.id,\n undefined, // No specific directory\n undefined, // No assignment ID\n undefined // Don't link to submission yet (will be linked in confirmAnnotationUpload)\n );\n\n // Store the submissionId in the file record so we can link it to annotations later\n await Promise.all(\n directUploadFiles.map(file =>\n prisma.file.update({\n where: { id: file.id },\n data: {\n annotationId: submissionId, // Store as annotation\n }\n })\n )\n );\n\n return {\n success: true,\n uploadFiles: directUploadFiles,\n };\n }),\n\n confirmAnnotationUpload: protectedTeacherProcedure\n .input(confirmAnnotationUploadSchema)\n .mutation(async ({ ctx, input }) => {\n const { fileId, uploadSuccess, errorMessage } = input;\n\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"You must be logged in\",\n });\n }\n\n // Verify file belongs to user and is an annotation file\n const file = await prisma.file.findFirst({\n where: {\n id: fileId,\n userId: ctx.user.id,\n annotationId: {\n not: null,\n },\n },\n });\n\n if (!file) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"File not found or you don't have permission\",\n });\n }\n\n await confirmDirectUpload(fileId, uploadSuccess, errorMessage);\n\n return {\n success: true,\n message: uploadSuccess ? \"Annotation upload confirmed successfully\" : \"Annotation upload failed\",\n };\n }),\n\n listFileAnnotations: protectedClassMemberProcedure\n .input(listFileAnnotationsSchema)\n .query(async ({ ctx, input }) => {\n const { classId, submissionId, fileId } = input;\n\n const submission = await prisma.submission.findFirst({\n where: {\n id: submissionId,\n assignment: { classId },\n },\n select: {\n id: true,\n studentId: true,\n returned: true,\n assignment: {\n select: {\n class: {\n select: {\n teachers: { where: { id: ctx.user!.id }, select: { id: true } },\n },\n },\n },\n },\n },\n });\n\n if (!submission) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Submission not found\",\n });\n }\n\n const isTeacher = submission.assignment.class.teachers.length > 0;\n const isOwningStudent = submission.studentId === ctx.user!.id;\n\n if (!isTeacher && !(isOwningStudent && submission.returned)) {\n throw new TRPCError({\n code: \"FORBIDDEN\",\n message: \"You don't have access to these annotations\",\n });\n }\n\n const annotations = await prisma.fileAnnotation.findMany({\n where: { submissionId, fileId },\n orderBy: { createdAt: \"asc\" },\n include: {\n author: {\n select: {\n id: true,\n username: true,\n profile: { select: { displayName: true } },\n },\n },\n },\n });\n\n return { annotations };\n }),\n\n upsertFileAnnotation: protectedTeacherProcedure\n .input(upsertFileAnnotationSchema)\n .mutation(async ({ ctx, input }) => {\n const { classId, submissionId, fileId, id, page, type, geometry, text, color } = input;\n\n const submission = await prisma.submission.findFirst({\n where: {\n id: submissionId,\n assignment: {\n classId,\n class: {\n teachers: {\n some: { id: ctx.user!.id },\n },\n },\n },\n },\n select: { id: true },\n });\n\n if (!submission) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Submission not found or you are not a teacher of this class\",\n });\n }\n\n const file = await prisma.file.findFirst({\n where: {\n id: fileId,\n OR: [{ submissionId }, { annotationId: submissionId }],\n },\n select: { id: true },\n });\n\n if (!file) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"File does not belong to this submission\",\n });\n }\n\n if (id) {\n const existing = await prisma.fileAnnotation.findFirst({\n where: { id, submissionId, fileId },\n select: { id: true },\n });\n\n if (!existing) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Annotation not found\",\n });\n }\n\n const annotation = await prisma.fileAnnotation.update({\n where: { id },\n data: {\n page,\n type,\n geometry: geometry as object,\n text: text ?? null,\n color: color ?? null,\n },\n });\n\n return { annotation };\n }\n\n const annotation = await prisma.fileAnnotation.create({\n data: {\n fileId,\n submissionId,\n authorId: ctx.user!.id,\n page,\n type,\n geometry: geometry as object,\n text: text ?? null,\n color: color ?? null,\n },\n });\n\n return { annotation };\n }),\n\n deleteFileAnnotation: protectedTeacherProcedure\n .input(deleteFileAnnotationSchema)\n .mutation(async ({ ctx, input }) => {\n const { classId, submissionId, id } = input;\n\n const annotation = await prisma.fileAnnotation.findFirst({\n where: {\n id,\n submissionId,\n submission: {\n assignment: {\n classId,\n class: {\n teachers: {\n some: { id: ctx.user!.id },\n },\n },\n },\n },\n },\n select: { id: true },\n });\n\n if (!annotation) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Annotation not found or you are not a teacher of this class\",\n });\n }\n\n await prisma.fileAnnotation.delete({ where: { id } });\n\n return { success: true };\n }),\n\n updateUploadProgress: protectedProcedure\n .input(updateUploadProgressSchema)\n .mutation(async ({ ctx, input }) => {\n const { fileId, progress } = input;\n\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"You must be logged in\",\n });\n }\n\n // Verify file belongs to user\n const file = await prisma.file.findFirst({\n where: {\n id: fileId,\n userId: ctx.user.id,\n },\n });\n\n if (!file) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"File not found or you don't have permission\",\n });\n }\n\n await updateUploadProgress(fileId, progress);\n\n return {\n success: true,\n progress,\n };\n }),\n});\n"],"names":[],"mappings":"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","debug_id":"07b5401b-6117-521f-94c9-8e2f5fb68c0f"}
|
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* Read-only notification API. Notifications are emitted exclusively by
|
|
4
|
+
* server-side domain services — there is intentionally no public "send"
|
|
5
|
+
* endpoint (the previous sendTo/sendToMultiple procedures allowed any logged-in
|
|
6
|
+
* user to notify arbitrary users and were removed).
|
|
7
|
+
*/
|
|
2
8
|
export declare const notificationRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
3
9
|
ctx: import("../trpc.js").Context;
|
|
4
10
|
meta: object;
|
|
@@ -17,23 +23,33 @@ export declare const notificationRouter: import("@trpc/server").TRPCBuiltRouter<
|
|
|
17
23
|
transformer: false;
|
|
18
24
|
}, import("@trpc/server").TRPCDecorateCreateRouterOptions<{
|
|
19
25
|
list: import("@trpc/server").TRPCQueryProcedure<{
|
|
20
|
-
input:
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
26
|
+
input: {
|
|
27
|
+
cursor?: string | null | undefined;
|
|
28
|
+
limit?: number | undefined;
|
|
29
|
+
} | undefined;
|
|
30
|
+
output: {
|
|
31
|
+
items: ({
|
|
32
|
+
sender: {
|
|
33
|
+
username: string;
|
|
34
|
+
} | null;
|
|
35
|
+
receiver: {
|
|
36
|
+
username: string;
|
|
37
|
+
};
|
|
38
|
+
} & {
|
|
39
|
+
type: import(".prisma/client").$Enums.NotificationType;
|
|
40
|
+
id: string;
|
|
41
|
+
createdAt: Date;
|
|
42
|
+
classId: string | null;
|
|
43
|
+
title: string;
|
|
44
|
+
content: string;
|
|
45
|
+
senderId: string | null;
|
|
46
|
+
read: boolean;
|
|
47
|
+
receiverId: string;
|
|
48
|
+
entityType: string | null;
|
|
49
|
+
entityId: string | null;
|
|
50
|
+
})[];
|
|
51
|
+
nextCursor: string | null;
|
|
52
|
+
};
|
|
37
53
|
meta: object;
|
|
38
54
|
}>;
|
|
39
55
|
get: import("@trpc/server").TRPCQueryProcedure<{
|
|
@@ -48,40 +64,23 @@ export declare const notificationRouter: import("@trpc/server").TRPCBuiltRouter<
|
|
|
48
64
|
username: string;
|
|
49
65
|
};
|
|
50
66
|
} & {
|
|
67
|
+
type: import(".prisma/client").$Enums.NotificationType;
|
|
51
68
|
id: string;
|
|
52
69
|
createdAt: Date;
|
|
70
|
+
classId: string | null;
|
|
53
71
|
title: string;
|
|
54
72
|
content: string;
|
|
55
73
|
senderId: string | null;
|
|
56
74
|
read: boolean;
|
|
57
75
|
receiverId: string;
|
|
76
|
+
entityType: string | null;
|
|
77
|
+
entityId: string | null;
|
|
58
78
|
};
|
|
59
79
|
meta: object;
|
|
60
80
|
}>;
|
|
61
|
-
|
|
62
|
-
input:
|
|
63
|
-
|
|
64
|
-
content: string;
|
|
65
|
-
receiverId: string;
|
|
66
|
-
};
|
|
67
|
-
output: {
|
|
68
|
-
id: string;
|
|
69
|
-
createdAt: Date;
|
|
70
|
-
title: string;
|
|
71
|
-
content: string;
|
|
72
|
-
senderId: string | null;
|
|
73
|
-
read: boolean;
|
|
74
|
-
receiverId: string;
|
|
75
|
-
};
|
|
76
|
-
meta: object;
|
|
77
|
-
}>;
|
|
78
|
-
sendToMultiple: import("@trpc/server").TRPCMutationProcedure<{
|
|
79
|
-
input: {
|
|
80
|
-
title: string;
|
|
81
|
-
content: string;
|
|
82
|
-
receiverIds: string[];
|
|
83
|
-
};
|
|
84
|
-
output: import("@prisma/client/runtime/library.js").GetBatchResult;
|
|
81
|
+
unreadCount: import("@trpc/server").TRPCQueryProcedure<{
|
|
82
|
+
input: void;
|
|
83
|
+
output: number;
|
|
85
84
|
meta: object;
|
|
86
85
|
}>;
|
|
87
86
|
markAsRead: import("@trpc/server").TRPCMutationProcedure<{
|
|
@@ -96,13 +95,24 @@ export declare const notificationRouter: import("@trpc/server").TRPCBuiltRouter<
|
|
|
96
95
|
username: string;
|
|
97
96
|
};
|
|
98
97
|
} & {
|
|
98
|
+
type: import(".prisma/client").$Enums.NotificationType;
|
|
99
99
|
id: string;
|
|
100
100
|
createdAt: Date;
|
|
101
|
+
classId: string | null;
|
|
101
102
|
title: string;
|
|
102
103
|
content: string;
|
|
103
104
|
senderId: string | null;
|
|
104
105
|
read: boolean;
|
|
105
106
|
receiverId: string;
|
|
107
|
+
entityType: string | null;
|
|
108
|
+
entityId: string | null;
|
|
109
|
+
};
|
|
110
|
+
meta: object;
|
|
111
|
+
}>;
|
|
112
|
+
markAllAsRead: import("@trpc/server").TRPCMutationProcedure<{
|
|
113
|
+
input: void;
|
|
114
|
+
output: {
|
|
115
|
+
count: number;
|
|
106
116
|
};
|
|
107
117
|
meta: object;
|
|
108
118
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notifications.d.ts","sourceRoot":"/","sources":["routers/notifications.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB,eAAO,MAAM,kBAAkB
|
|
1
|
+
{"version":3,"file":"notifications.d.ts","sourceRoot":"/","sources":["routers/notifications.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4B7B,CAAC"}
|
|
@@ -1,30 +1,34 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
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]="21917f4d-f637-5db5-b39f-2e1cfdbf692a")}catch(e){}}();
|
|
3
3
|
import { createTRPCRouter, protectedProcedure } from "../trpc.js";
|
|
4
4
|
import { z } from "zod";
|
|
5
|
-
import { listNotifications, getNotification,
|
|
5
|
+
import { listNotifications, getNotification, getUnreadCount, markAsRead, markAllAsRead, } from "../services/notification.js";
|
|
6
|
+
/**
|
|
7
|
+
* Read-only notification API. Notifications are emitted exclusively by
|
|
8
|
+
* server-side domain services — there is intentionally no public "send"
|
|
9
|
+
* endpoint (the previous sendTo/sendToMultiple procedures allowed any logged-in
|
|
10
|
+
* user to notify arbitrary users and were removed).
|
|
11
|
+
*/
|
|
6
12
|
export const notificationRouter = createTRPCRouter({
|
|
7
|
-
list: protectedProcedure
|
|
13
|
+
list: protectedProcedure
|
|
14
|
+
.input(z
|
|
15
|
+
.object({
|
|
16
|
+
limit: z.number().int().min(1).max(100).default(20),
|
|
17
|
+
cursor: z.string().nullish(),
|
|
18
|
+
})
|
|
19
|
+
.optional())
|
|
20
|
+
.query(({ ctx, input }) => listNotifications(ctx.user.id, {
|
|
21
|
+
limit: input?.limit,
|
|
22
|
+
cursor: input?.cursor,
|
|
23
|
+
})),
|
|
8
24
|
get: protectedProcedure
|
|
9
25
|
.input(z.object({ id: z.string() }))
|
|
10
26
|
.query(({ ctx, input }) => getNotification(ctx.user.id, input.id)),
|
|
11
|
-
|
|
12
|
-
.input(z.object({
|
|
13
|
-
receiverId: z.string(),
|
|
14
|
-
title: z.string(),
|
|
15
|
-
content: z.string(),
|
|
16
|
-
}))
|
|
17
|
-
.mutation(({ input }) => sendNotification(input)),
|
|
18
|
-
sendToMultiple: protectedProcedure
|
|
19
|
-
.input(z.object({
|
|
20
|
-
receiverIds: z.array(z.string()),
|
|
21
|
-
title: z.string(),
|
|
22
|
-
content: z.string(),
|
|
23
|
-
}))
|
|
24
|
-
.mutation(({ input }) => sendToMultiple(input)),
|
|
27
|
+
unreadCount: protectedProcedure.query(({ ctx }) => getUnreadCount(ctx.user.id)),
|
|
25
28
|
markAsRead: protectedProcedure
|
|
26
29
|
.input(z.object({ id: z.string() }))
|
|
27
30
|
.mutation(({ ctx, input }) => markAsRead(ctx.user.id, input.id)),
|
|
31
|
+
markAllAsRead: protectedProcedure.mutation(({ ctx }) => markAllAsRead(ctx.user.id)),
|
|
28
32
|
});
|
|
29
33
|
//# sourceMappingURL=notifications.js.map
|
|
30
|
-
//# debugId=
|
|
34
|
+
//# debugId=21917f4d-f637-5db5-b39f-2e1cfdbf692a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notifications.js","sources":["routers/notifications.ts"],"sourceRoot":"/","sourcesContent":["import { createTRPCRouter, protectedProcedure } from \"../trpc.js\";\nimport { z } from \"zod\";\nimport {\n listNotifications,\n getNotification,\n
|
|
1
|
+
{"version":3,"file":"notifications.js","sources":["routers/notifications.ts"],"sourceRoot":"/","sourcesContent":["import { createTRPCRouter, protectedProcedure } from \"../trpc.js\";\nimport { z } from \"zod\";\nimport {\n listNotifications,\n getNotification,\n getUnreadCount,\n markAsRead,\n markAllAsRead,\n} from \"../services/notification.js\";\n\n/**\n * Read-only notification API. Notifications are emitted exclusively by\n * server-side domain services — there is intentionally no public \"send\"\n * endpoint (the previous sendTo/sendToMultiple procedures allowed any logged-in\n * user to notify arbitrary users and were removed).\n */\nexport const notificationRouter = createTRPCRouter({\n list: protectedProcedure\n .input(\n z\n .object({\n limit: z.number().int().min(1).max(100).default(20),\n cursor: z.string().nullish(),\n })\n .optional()\n )\n .query(({ ctx, input }) =>\n listNotifications(ctx.user!.id, {\n limit: input?.limit,\n cursor: input?.cursor,\n })\n ),\n\n get: protectedProcedure\n .input(z.object({ id: z.string() }))\n .query(({ ctx, input }) => getNotification(ctx.user!.id, input.id)),\n\n unreadCount: protectedProcedure.query(({ ctx }) => getUnreadCount(ctx.user!.id)),\n\n markAsRead: protectedProcedure\n .input(z.object({ id: z.string() }))\n .mutation(({ ctx, input }) => markAsRead(ctx.user!.id, input.id)),\n\n markAllAsRead: protectedProcedure.mutation(({ ctx }) => markAllAsRead(ctx.user!.id)),\n});\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,UAAU,EACV,aAAa,GACd,MAAM,6BAA6B,CAAC;AAErC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,gBAAgB,CAAC;IACjD,IAAI,EAAE,kBAAkB;SACrB,KAAK,CACJ,CAAC;SACE,MAAM,CAAC;QACN,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE;KAC7B,CAAC;SACD,QAAQ,EAAE,CACd;SACA,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CACxB,iBAAiB,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE;QAC9B,KAAK,EAAE,KAAK,EAAE,KAAK;QACnB,MAAM,EAAE,KAAK,EAAE,MAAM;KACtB,CAAC,CACH;IAEH,GAAG,EAAE,kBAAkB;SACpB,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;SACnC,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;IAErE,WAAW,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,CAAC,CAAC;IAEhF,UAAU,EAAE,kBAAkB;SAC3B,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;SACnC,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;IAEnE,aAAa,EAAE,kBAAkB,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,CAAC,CAAC;CACrF,CAAC,CAAC","debug_id":"21917f4d-f637-5db5-b39f-2e1cfdbf692a"}
|
package/dist/routers/school.d.ts
CHANGED
|
@@ -361,6 +361,36 @@ export declare const schoolRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
361
361
|
};
|
|
362
362
|
meta: object;
|
|
363
363
|
}>;
|
|
364
|
+
getAiUsage: import("@trpc/server").TRPCQueryProcedure<{
|
|
365
|
+
input: {
|
|
366
|
+
schoolId: string;
|
|
367
|
+
startDate?: Date | undefined;
|
|
368
|
+
endDate?: Date | undefined;
|
|
369
|
+
topUsersLimit?: number | undefined;
|
|
370
|
+
};
|
|
371
|
+
output: {
|
|
372
|
+
topUsers: {
|
|
373
|
+
username: string | null;
|
|
374
|
+
displayName: string | null;
|
|
375
|
+
userId: string;
|
|
376
|
+
requests: number;
|
|
377
|
+
promptTokens: number;
|
|
378
|
+
completionTokens: number;
|
|
379
|
+
totalTokens: number;
|
|
380
|
+
}[];
|
|
381
|
+
totals: import("../services/aiUsage.js").UsageBucket;
|
|
382
|
+
byDay: Array<{
|
|
383
|
+
day: string;
|
|
384
|
+
} & import("../services/aiUsage.js").UsageBucket>;
|
|
385
|
+
byModel: Array<{
|
|
386
|
+
model: string;
|
|
387
|
+
} & import("../services/aiUsage.js").UsageBucket>;
|
|
388
|
+
byOperation: Array<{
|
|
389
|
+
operation: string;
|
|
390
|
+
} & import("../services/aiUsage.js").UsageBucket>;
|
|
391
|
+
};
|
|
392
|
+
meta: object;
|
|
393
|
+
}>;
|
|
364
394
|
listClasses: import("@trpc/server").TRPCQueryProcedure<{
|
|
365
395
|
input: {
|
|
366
396
|
schoolId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"school.d.ts","sourceRoot":"/","sources":["routers/school.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"school.d.ts","sourceRoot":"/","sources":["routers/school.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAqCxB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqMvB,CAAC"}
|
package/dist/routers/school.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
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]="759dd2ee-8976-5f58-97d2-8af3f9706ff4")}catch(e){}}();
|
|
3
3
|
import { z } from "zod";
|
|
4
4
|
import { createTRPCRouter, protectedProcedure, publicProcedure, } from "../trpc.js";
|
|
5
5
|
import { acceptInvite, addMember, confirmSchoolAssetUpload, createInvite, createSchoolClass, createSchoolRecord, getAdminOverview, getCurrentSchool, getInvite, getMemberTimeline, getSchoolAssetUploadUrl, getStudentTimeline, listClasses, listInvites, listMemberIds, listMembers, removeMember, revokeInvite, searchMembers, updateMemberRole, updateSchoolDetails, } from "../services/school.js";
|
|
6
|
+
import { getSchoolAiUsage } from "../services/aiUsage.js";
|
|
6
7
|
const schoolRoleSchema = z.enum(["ADMIN", "TEACHER", "STUDENT"]);
|
|
7
8
|
const schoolIdSchema = z.object({
|
|
8
9
|
schoolId: z.string(),
|
|
@@ -71,6 +72,14 @@ export const schoolRouter = createTRPCRouter({
|
|
|
71
72
|
getAdminOverview: protectedProcedure
|
|
72
73
|
.input(schoolIdSchema)
|
|
73
74
|
.query(({ ctx, input }) => getAdminOverview(ctx.user.id, input.schoolId)),
|
|
75
|
+
getAiUsage: protectedProcedure
|
|
76
|
+
.input(z.object({
|
|
77
|
+
schoolId: z.string(),
|
|
78
|
+
startDate: z.date().optional(),
|
|
79
|
+
endDate: z.date().optional(),
|
|
80
|
+
topUsersLimit: z.number().min(1).max(50).optional(),
|
|
81
|
+
}))
|
|
82
|
+
.query(({ ctx, input }) => getSchoolAiUsage(ctx.user.id, input)),
|
|
74
83
|
listClasses: protectedProcedure
|
|
75
84
|
.input(schoolIdSchema)
|
|
76
85
|
.query(({ ctx, input }) => listClasses(ctx.user.id, input.schoolId)),
|
|
@@ -133,4 +142,4 @@ export const schoolRouter = createTRPCRouter({
|
|
|
133
142
|
.mutation(({ ctx, input }) => acceptInvite(ctx.user.id, input.token)),
|
|
134
143
|
});
|
|
135
144
|
//# sourceMappingURL=school.js.map
|
|
136
|
-
//# debugId=
|
|
145
|
+
//# debugId=759dd2ee-8976-5f58-97d2-8af3f9706ff4
|