@studious-lms/server 1.12.0 → 1.13.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/dist/models/class.d.ts +10 -0
- package/dist/models/class.d.ts.map +1 -1
- package/dist/models/class.js +9 -3
- package/dist/models/class.js.map +1 -1
- package/dist/models/comment.d.ts +7 -0
- package/dist/models/comment.d.ts.map +1 -1
- package/dist/models/comment.js +3 -2
- package/dist/models/comment.js.map +1 -1
- package/dist/models/conversation.d.ts +17 -0
- package/dist/models/conversation.d.ts.map +1 -1
- package/dist/models/conversation.js +13 -2
- package/dist/models/conversation.js.map +1 -1
- package/dist/models/worksheet.d.ts +4 -0
- package/dist/models/worksheet.d.ts.map +1 -1
- package/dist/models/worksheet.js +13 -7
- package/dist/models/worksheet.js.map +1 -1
- package/dist/pipelines/gradeWorksheet.d.ts.map +1 -1
- package/dist/pipelines/gradeWorksheet.js +59 -14
- package/dist/pipelines/gradeWorksheet.js.map +1 -1
- package/dist/routers/_app.d.ts +124 -0
- package/dist/routers/_app.d.ts.map +1 -1
- package/dist/routers/announcement.d.ts +4 -0
- package/dist/routers/announcement.d.ts.map +1 -1
- package/dist/routers/announcement.js +6 -5
- package/dist/routers/announcement.js.map +1 -1
- package/dist/routers/assignment.d.ts +8 -0
- package/dist/routers/assignment.d.ts.map +1 -1
- package/dist/routers/assignment.js +4 -4
- package/dist/routers/assignment.js.map +1 -1
- package/dist/routers/class.d.ts +23 -0
- package/dist/routers/class.d.ts.map +1 -1
- package/dist/routers/comment.d.ts +24 -0
- package/dist/routers/comment.d.ts.map +1 -1
- package/dist/routers/comment.js +6 -3
- package/dist/routers/comment.js.map +1 -1
- package/dist/routers/worksheet.d.ts +3 -0
- package/dist/routers/worksheet.d.ts.map +1 -1
- package/dist/routers/worksheet.js +4 -2
- package/dist/routers/worksheet.js.map +1 -1
- package/dist/services/assignment.d.ts.map +1 -1
- package/dist/services/assignment.js +10 -8
- package/dist/services/assignment.js.map +1 -1
- package/dist/services/class.d.ts +23 -0
- package/dist/services/class.d.ts.map +1 -1
- package/dist/services/class.js +8 -3
- package/dist/services/class.js.map +1 -1
- package/dist/services/comment.d.ts +18 -0
- package/dist/services/comment.d.ts.map +1 -1
- package/dist/services/comment.js +23 -2
- package/dist/services/comment.js.map +1 -1
- package/dist/services/conversation.d.ts.map +1 -1
- package/dist/services/conversation.js +9 -7
- package/dist/services/conversation.js.map +1 -1
- package/dist/services/worksheet.d.ts +3 -0
- package/dist/services/worksheet.d.ts.map +1 -1
- package/dist/services/worksheet.js +2 -2
- package/dist/services/worksheet.js.map +1 -1
- package/package.json +1 -1
- package/prisma/schema.prisma +1 -0
- package/src/models/class.ts +7 -1
- package/src/models/comment.ts +1 -0
- package/src/models/conversation.ts +12 -0
- package/src/models/worksheet.ts +11 -5
- package/src/pipelines/gradeWorksheet.ts +66 -15
- package/src/routers/announcement.ts +4 -3
- package/src/routers/assignment.ts +2 -2
- package/src/routers/comment.ts +5 -0
- package/src/routers/worksheet.ts +2 -0
- package/src/services/assignment.ts +8 -7
- package/src/services/class.ts +10 -1
- package/src/services/comment.ts +22 -0
- package/src/services/conversation.ts +9 -4
- package/src/services/worksheet.ts +1 -0
- package/tests/integration/routers/conversation.test.ts +9 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"announcement.js","sources":["routers/announcement.ts"],"sourceRoot":"/","sourcesContent":["import { z } from \"zod\";\nimport { createTRPCRouter, protectedClassMemberProcedure, protectedTeacherProcedure, protectedProcedure } from \"../trpc.js\";\nimport { prisma } from \"../lib/prisma.js\";\nimport { TRPCError } from \"@trpc/server\";\nimport {\n getAllAnnouncements,\n getAnnouncement,\n createAnnouncementRecord,\n updateAnnouncementRecord,\n deleteAnnouncementRecord,\n} from \"../services/announcement.js\";\nimport { findAnnouncementByIdAndClass } from \"../models/announcement.js\";\nimport {\n findCommentWithAnnouncement,\n findReactionByUserAndComment,\n upsertReaction,\n deleteReactionById,\n} from \"../models/comment.js\";\nimport { getReactions as getCommentReactions } from \"../services/comment.js\";\n\nimport { logger } from \"../utils/logger.js\";\nimport { createDirectUploadFiles, type UploadedFile, type DirectUploadFile, confirmDirectUpload } from \"../lib/fileUpload.js\";\nimport { deleteFile } from \"../lib/googleCloudStorage.js\";\nimport { sendToMultiple } from \"../services/notification.js\";\n\n// 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});\n\n// Schemas for file upload endpoints\nconst getAnnouncementUploadUrlsSchema = z.object({\n announcementId: z.string(),\n classId: z.string(),\n files: z.array(directFileSchema),\n});\n\nconst confirmAnnouncementUploadSchema = z.object({\n fileId: z.string(),\n uploadSuccess: z.boolean(),\n errorMessage: z.string().optional(),\n});\n\nexport const announcementRouter = createTRPCRouter({\n getAll: protectedClassMemberProcedure\n .input(z.object({ classId: z.string() }))\n .query(({ input }) => getAllAnnouncements(input.classId)),\n\n get: protectedClassMemberProcedure\n .input(z.object({ id: z.string(), classId: z.string() }))\n .query(({ input }) => getAnnouncement(input.id, input.classId)),\n\n create: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n remarks: z.string().min(1, \"Remarks cannot be empty\"),\n files: z.array(directFileSchema).optional(),\n existingFileIds: z.array(z.string()).optional(),\n }))\n .mutation(({ ctx, input }) =>\n createAnnouncementRecord(ctx.user!.id, {\n classId: input.classId,\n remarks: input.remarks,\n files: input.files,\n existingFileIds: input.existingFileIds,\n })\n ),\n\n update: protectedTeacherProcedure\n .input(z.object({\n id: z.string(),\n classId: z.string(),\n data: z.object({\n remarks: z.string().min(1, \"Remarks cannot be empty\").optional(),\n files: z.array(directFileSchema).optional(),\n existingFileIds: z.array(z.string()).optional(),\n removedAttachments: z.array(z.string()).optional(),\n }),\n }))\n .mutation(({ ctx, input }) =>\n updateAnnouncementRecord(ctx.user!.id, {\n id: input.id,\n classId: input.classId,\n data: input.data,\n })\n ),\n\n delete: protectedTeacherProcedure\n .input(z.object({ id: z.string(), classId: z.string() }))\n .mutation(({ ctx, input }) =>\n deleteAnnouncementRecord(ctx.user!.id, input.id, input.classId)\n ),\n\n getAnnouncementUploadUrls: protectedTeacherProcedure\n .input(getAnnouncementUploadUrlsSchema)\n .mutation(async ({ ctx, input }) => {\n const { announcementId, 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 const announcement = await findAnnouncementByIdAndClass(announcementId, classId);\n if (!announcement) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Announcement 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 undefined, // No assignment ID\n undefined, // No submission ID\n announcementId\n );\n\n return {\n success: true,\n uploadFiles: directUploadFiles,\n };\n }),\n\n confirmAnnouncementUpload: protectedTeacherProcedure\n .input(confirmAnnouncementUploadSchema)\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 announcement file\n const file = await prisma.file.findFirst({\n where: {\n id: fileId,\n userId: ctx.user.id,\n announcement: {\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 // Comment endpoints\n addComment: protectedClassMemberProcedure\n .input(z.object({\n announcementId: z.string(),\n classId: z.string(),\n content: z.string().min(1, \"Comment cannot be empty\"),\n parentCommentId: z.string().optional(),\n }))\n .mutation(async ({ ctx, input }) => {\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"User must be authenticated\",\n });\n }\n\n const announcement = await findAnnouncementByIdAndClass(input.announcementId, input.classId);\n if (!announcement) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Announcement not found\",\n });\n }\n\n // If replying to a comment, verify parent comment exists and belongs to the same announcement\n if (input.parentCommentId) {\n const parentComment = await prisma.comment.findFirst({\n where: {\n id: input.parentCommentId,\n announcementId: input.announcementId,\n },\n });\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 author: {\n connect: { id: ctx.user.id },\n },\n announcement: {\n connect: { id: input.announcementId },\n },\n ...(input.parentCommentId && {\n parentComment: {\n connect: { id: input.parentCommentId },\n },\n }),\n },\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 });\n\n return { comment };\n }),\n\n updateComment: protectedProcedure\n .input(z.object({\n id: z.string(),\n content: z.string().min(1, \"Comment cannot be empty\"),\n }))\n .mutation(async ({ ctx, input }) => {\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"User must be authenticated\",\n });\n }\n\n const comment = await prisma.comment.findUnique({\n where: { id: input.id },\n });\n\n if (!comment) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Comment not found\",\n });\n }\n\n // Only the author can update their comment\n if (comment.authorId !== ctx.user.id) {\n throw new TRPCError({\n code: \"FORBIDDEN\",\n message: \"Only the comment author can update this comment\",\n });\n }\n\n const updatedComment = await prisma.comment.update({\n where: { id: input.id },\n data: {\n content: input.content,\n },\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 });\n\n return { comment: updatedComment };\n }),\n\n deleteComment: protectedProcedure\n .input(z.object({\n id: z.string(),\n }))\n .mutation(async ({ ctx, input }) => {\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"User must be authenticated\",\n });\n }\n\n const comment = await prisma.comment.findUnique({\n where: { id: input.id },\n include: {\n announcement: {\n include: {\n class: {\n include: {\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: {\n userId: true,\n },\n },\n },\n },\n },\n },\n },\n },\n },\n });\n\n if (!comment) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Comment not found\",\n });\n }\n\n // Only the author, a class teacher, or the class school admin can delete comments\n const userId = ctx.user.id;\n const isAuthor = comment.authorId === userId;\n const isClassTeacher = comment.announcement!.class.teachers.some(\n (teacher) => teacher.id === userId\n );\n const isSchoolAdmin = Boolean(\n comment.announcement!.class.school?.memberships.some(\n (admin) => admin.userId === userId\n ) ||\n comment.announcement!.class.school?.users.some(\n (admin) => admin.id === userId\n )\n );\n\n if (!isAuthor && !isClassTeacher && !isSchoolAdmin) {\n throw new TRPCError({\n code: \"FORBIDDEN\",\n message: \"Only the comment author, class teachers, or school admins can delete comments\",\n });\n }\n\n await prisma.comment.delete({\n where: { id: input.id },\n });\n\n return { success: true };\n }),\n\n getComments: protectedClassMemberProcedure\n .input(z.object({\n announcementId: z.string(),\n classId: z.string(),\n }))\n .query(async ({ ctx, input }) => {\n const announcement = await findAnnouncementByIdAndClass(input.announcementId, input.classId);\n if (!announcement) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Announcement not found\",\n });\n }\n\n // Get all top-level comments (no parent)\n const comments = await prisma.comment.findMany({\n where: {\n announcementId: input.announcementId,\n parentCommentId: null,\n },\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 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: {\n createdAt: 'asc',\n },\n },\n },\n orderBy: {\n createdAt: 'asc',\n },\n });\n\n return { comments };\n }),\n\n // Reaction endpoints\n addReaction: protectedClassMemberProcedure\n .input(z.object({\n announcementId: z.string().optional(),\n commentId: z.string().optional(),\n classId: z.string(),\n type: z.enum(['THUMBSUP', 'CELEBRATE', 'CARE', 'HEART', 'IDEA', 'HAPPY']),\n }))\n .mutation(async ({ ctx, input }) => {\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"User must be authenticated\",\n });\n }\n\n // Exactly one of announcementId or commentId must be provided\n if (!input.announcementId && !input.commentId) {\n throw new TRPCError({\n code: \"BAD_REQUEST\",\n message: \"Either announcementId or commentId must be provided\",\n });\n }\n\n if (input.announcementId && input.commentId) {\n throw new TRPCError({\n code: \"BAD_REQUEST\",\n message: \"Cannot react to both announcement and comment at the same time\",\n });\n }\n\n const userId = ctx.user.id;\n\n if (input.announcementId) {\n const announcement = await findAnnouncementByIdAndClass(input.announcementId, input.classId);\n if (!announcement) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Announcement not found\",\n });\n }\n\n // Upsert reaction: update if exists, create if not\n const reaction = await prisma.reaction.upsert({\n where: {\n userId_announcementId: {\n userId,\n announcementId: input.announcementId,\n },\n },\n update: {\n type: input.type,\n },\n create: {\n type: input.type,\n userId,\n announcementId: input.announcementId,\n },\n include: {\n user: {\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 });\n\n return { reaction };\n } else if (input.commentId) {\n const comment = await findCommentWithAnnouncement(input.commentId);\n if (!comment) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Comment not found\",\n });\n }\n if (comment.announcement!.classId !== input.classId) {\n throw new TRPCError({\n code: \"FORBIDDEN\",\n message: \"Comment does not belong to this class\",\n });\n }\n\n const reaction = await upsertReaction({\n userId,\n commentId: input.commentId,\n type: input.type,\n });\n return { reaction };\n }\n\n throw new TRPCError({\n code: \"INTERNAL_SERVER_ERROR\",\n message: \"Unexpected error\",\n });\n }),\n\n removeReaction: protectedProcedure\n .input(z.object({\n announcementId: z.string().optional(),\n commentId: z.string().optional(),\n }))\n .mutation(async ({ ctx, input }) => {\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"User must be authenticated\",\n });\n }\n\n // Exactly one of announcementId or commentId must be provided\n if (!input.announcementId && !input.commentId) {\n throw new TRPCError({\n code: \"BAD_REQUEST\",\n message: \"Either announcementId or commentId must be provided\",\n });\n }\n\n const userId = ctx.user.id;\n\n if (input.announcementId) {\n const reaction = await prisma.reaction.findUnique({\n where: {\n userId_announcementId: {\n userId,\n announcementId: input.announcementId,\n },\n },\n });\n\n if (!reaction) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Reaction not found\",\n });\n }\n\n await prisma.reaction.delete({\n where: { id: reaction.id },\n });\n\n return { success: true };\n } else if (input.commentId) {\n const reaction = await findReactionByUserAndComment(userId, input.commentId);\n if (!reaction) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Reaction not found\",\n });\n }\n await deleteReactionById(reaction.id);\n return { success: true };\n }\n\n throw new TRPCError({\n code: \"INTERNAL_SERVER_ERROR\",\n message: \"Unexpected error\",\n });\n }),\n\n getReactions: protectedClassMemberProcedure\n .input(z.object({\n announcementId: z.string().optional(),\n commentId: z.string().optional(),\n classId: z.string(),\n }))\n .query(async ({ ctx, input }) => {\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"User must be authenticated\",\n });\n }\n\n // Exactly one of announcementId or commentId must be provided\n if (!input.announcementId && !input.commentId) {\n throw new TRPCError({\n code: \"BAD_REQUEST\",\n message: \"Either announcementId or commentId must be provided\",\n });\n }\n\n const userId = ctx.user.id;\n\n if (input.announcementId) {\n const announcement = await findAnnouncementByIdAndClass(input.announcementId, input.classId);\n if (!announcement) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Announcement not found\",\n });\n }\n\n // Get reaction counts by type\n const reactionCounts = await prisma.reaction.groupBy({\n by: ['type'],\n where: { announcementId: input.announcementId },\n _count: { type: true },\n });\n\n // Get current user's reaction\n const userReaction = await prisma.reaction.findUnique({\n where: {\n userId_announcementId: {\n userId,\n announcementId: input.announcementId,\n },\n },\n });\n\n // Format counts\n const counts = {\n THUMBSUP: 0,\n CELEBRATE: 0,\n CARE: 0,\n HEART: 0,\n IDEA: 0,\n HAPPY: 0,\n };\n\n reactionCounts.forEach((item) => {\n counts[item.type as keyof typeof counts] = item._count.type;\n });\n\n return {\n counts,\n userReaction: userReaction?.type || null,\n total: reactionCounts.reduce((sum, item) => sum + item._count.type, 0),\n };\n } else if (input.commentId) {\n const comment = await findCommentWithAnnouncement(input.commentId);\n if (!comment) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Comment not found\",\n });\n }\n if (comment.announcement!.classId !== input.classId) {\n throw new TRPCError({\n code: \"FORBIDDEN\",\n message: \"Comment does not belong to this class\",\n });\n }\n return getCommentReactions(userId, input.commentId);\n }\n\n throw new TRPCError({\n code: \"INTERNAL_SERVER_ERROR\",\n message: \"Unexpected error\",\n });\n }),\n});\n"],"names":[],"mappings":"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","debug_id":"11ac20ce-3232-54d9-add4-b9e9e71fa20c"}
|
|
1
|
+
{"version":3,"file":"announcement.js","sources":["routers/announcement.ts"],"sourceRoot":"/","sourcesContent":["import { z } from \"zod\";\nimport { createTRPCRouter, protectedClassMemberProcedure, protectedTeacherProcedure, protectedProcedure } from \"../trpc.js\";\nimport { prisma } from \"../lib/prisma.js\";\nimport { TRPCError } from \"@trpc/server\";\nimport {\n getAllAnnouncements,\n getAnnouncement,\n createAnnouncementRecord,\n updateAnnouncementRecord,\n deleteAnnouncementRecord,\n} from \"../services/announcement.js\";\nimport { findAnnouncementByIdAndClass } from \"../models/announcement.js\";\nimport {\n findCommentWithAnnouncement,\n findReactionByUserAndComment,\n upsertReaction,\n deleteReactionById,\n} from \"../models/comment.js\";\nimport { getReactions as getCommentReactions } from \"../services/comment.js\";\n\nimport { logger } from \"../utils/logger.js\";\nimport { createDirectUploadFiles, type UploadedFile, type DirectUploadFile, confirmDirectUpload } from \"../lib/fileUpload.js\";\nimport { deleteFile } from \"../lib/googleCloudStorage.js\";\nimport { sendToMultiple } from \"../services/notification.js\";\n\n// 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});\n\n// Schemas for file upload endpoints\nconst getAnnouncementUploadUrlsSchema = z.object({\n announcementId: z.string(),\n classId: z.string(),\n files: z.array(directFileSchema),\n});\n\nconst confirmAnnouncementUploadSchema = z.object({\n fileId: z.string(),\n uploadSuccess: z.boolean(),\n errorMessage: z.string().optional(),\n});\n\nexport const announcementRouter = createTRPCRouter({\n getAll: protectedClassMemberProcedure\n .input(z.object({ classId: z.string() }))\n .query(({ input }) => getAllAnnouncements(input.classId)),\n\n get: protectedClassMemberProcedure\n .input(z.object({ id: z.string(), classId: z.string() }))\n .query(({ input }) => getAnnouncement(input.id, input.classId)),\n\n create: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n remarks: z.string().min(1, \"Remarks cannot be empty\"),\n files: z.array(directFileSchema).optional(),\n existingFileIds: z.array(z.string()).optional(),\n }))\n .mutation(({ ctx, input }) =>\n createAnnouncementRecord(ctx.user!.id, {\n classId: input.classId,\n remarks: input.remarks,\n files: input.files,\n existingFileIds: input.existingFileIds,\n })\n ),\n\n update: protectedTeacherProcedure\n .input(z.object({\n id: z.string(),\n classId: z.string(),\n data: z.object({\n remarks: z.string().min(1, \"Remarks cannot be empty\").optional(),\n files: z.array(directFileSchema).optional(),\n existingFileIds: z.array(z.string()).optional(),\n removedAttachments: z.array(z.string()).optional(),\n }),\n }))\n .mutation(({ ctx, input }) =>\n updateAnnouncementRecord(ctx.user!.id, {\n id: input.id,\n classId: input.classId,\n data: input.data,\n })\n ),\n\n delete: protectedTeacherProcedure\n .input(z.object({ id: z.string(), classId: z.string() }))\n .mutation(({ ctx, input }) =>\n deleteAnnouncementRecord(ctx.user!.id, input.id, input.classId)\n ),\n\n getAnnouncementUploadUrls: protectedTeacherProcedure\n .input(getAnnouncementUploadUrlsSchema)\n .mutation(async ({ ctx, input }) => {\n const { announcementId, 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 const announcement = await findAnnouncementByIdAndClass(announcementId, classId);\n if (!announcement) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Announcement 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 undefined, // No assignment ID\n undefined, // No submission ID\n announcementId\n );\n\n return {\n success: true,\n uploadFiles: directUploadFiles,\n };\n }),\n\n confirmAnnouncementUpload: protectedTeacherProcedure\n .input(confirmAnnouncementUploadSchema)\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 announcement file\n const file = await prisma.file.findFirst({\n where: {\n id: fileId,\n userId: ctx.user.id,\n announcement: {\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 // Comment endpoints\n addComment: protectedClassMemberProcedure\n .input(z.object({\n announcementId: z.string(),\n classId: z.string(),\n content: z.string().min(1, \"Comment cannot be empty\"),\n parentCommentId: z.string().optional(),\n }))\n .mutation(async ({ ctx, input }) => {\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"User must be authenticated\",\n });\n }\n\n const announcement = await findAnnouncementByIdAndClass(input.announcementId, input.classId);\n if (!announcement) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Announcement not found\",\n });\n }\n\n // If replying to a comment, verify parent comment exists and belongs to the same announcement\n if (input.parentCommentId) {\n const parentComment = await prisma.comment.findFirst({\n where: {\n id: input.parentCommentId,\n announcementId: input.announcementId,\n },\n });\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 author: {\n connect: { id: ctx.user.id },\n },\n announcement: {\n connect: { id: input.announcementId },\n },\n ...(input.parentCommentId && {\n parentComment: {\n connect: { id: input.parentCommentId },\n },\n }),\n },\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 });\n\n return { comment };\n }),\n\n updateComment: protectedProcedure\n .input(z.object({\n id: z.string(),\n content: z.string().min(1, \"Comment cannot be empty\"),\n }))\n .mutation(async ({ ctx, input }) => {\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"User must be authenticated\",\n });\n }\n\n const comment = await prisma.comment.findUnique({\n where: { id: input.id },\n });\n\n if (!comment) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Comment not found\",\n });\n }\n\n // Only the author can update their comment\n if (comment.authorId !== ctx.user.id) {\n throw new TRPCError({\n code: \"FORBIDDEN\",\n message: \"Only the comment author can update this comment\",\n });\n }\n\n const updatedComment = await prisma.comment.update({\n where: { id: input.id },\n data: {\n content: input.content,\n },\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 });\n\n return { comment: updatedComment };\n }),\n\n deleteComment: protectedProcedure\n .input(z.object({\n id: z.string(),\n }))\n .mutation(async ({ ctx, input }) => {\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"User must be authenticated\",\n });\n }\n\n const comment = await prisma.comment.findUnique({\n where: { id: input.id },\n include: {\n announcement: {\n include: {\n class: {\n include: {\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: {\n userId: true,\n },\n },\n },\n },\n },\n },\n },\n },\n },\n });\n\n if (!comment) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Comment not found\",\n });\n }\n\n // Only the author, a class teacher, or the class school admin can delete comments\n const userId = ctx.user.id;\n const isAuthor = comment.authorId === userId;\n const isClassTeacher = comment.announcement!.class.teachers.some(\n (teacher) => teacher.id === userId\n );\n const isSchoolAdmin = Boolean(\n comment.announcement!.class.school?.memberships.some(\n (admin) => admin.userId === userId\n ) ||\n comment.announcement!.class.school?.users.some(\n (admin) => admin.id === userId\n )\n );\n\n if (!isAuthor && !isClassTeacher && !isSchoolAdmin) {\n throw new TRPCError({\n code: \"FORBIDDEN\",\n message: \"Only the comment author, class teachers, or school admins can delete comments\",\n });\n }\n\n await prisma.comment.delete({\n where: { id: input.id },\n });\n\n return { success: true };\n }),\n\n getComments: protectedClassMemberProcedure\n .input(z.object({\n announcementId: z.string(),\n classId: z.string(),\n }))\n .query(async ({ ctx, input }) => {\n const announcement = await findAnnouncementByIdAndClass(input.announcementId, input.classId);\n if (!announcement) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Announcement not found\",\n });\n }\n\n // Get all top-level comments (no parent)\n const comments = await prisma.comment.findMany({\n where: {\n announcementId: input.announcementId,\n parentCommentId: null,\n },\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 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: {\n createdAt: 'asc',\n },\n },\n },\n orderBy: [\n { isPinned: 'desc' as const },\n { createdAt: 'asc' as const },\n ],\n });\n\n return { comments };\n }),\n\n // Reaction endpoints\n addReaction: protectedClassMemberProcedure\n .input(z.object({\n announcementId: z.string().optional(),\n commentId: z.string().optional(),\n classId: z.string(),\n type: z.enum(['THUMBSUP', 'CELEBRATE', 'CARE', 'HEART', 'IDEA', 'HAPPY']),\n }))\n .mutation(async ({ ctx, input }) => {\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"User must be authenticated\",\n });\n }\n\n // Exactly one of announcementId or commentId must be provided\n if (!input.announcementId && !input.commentId) {\n throw new TRPCError({\n code: \"BAD_REQUEST\",\n message: \"Either announcementId or commentId must be provided\",\n });\n }\n\n if (input.announcementId && input.commentId) {\n throw new TRPCError({\n code: \"BAD_REQUEST\",\n message: \"Cannot react to both announcement and comment at the same time\",\n });\n }\n\n const userId = ctx.user.id;\n\n if (input.announcementId) {\n const announcement = await findAnnouncementByIdAndClass(input.announcementId, input.classId);\n if (!announcement) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Announcement not found\",\n });\n }\n\n // Upsert reaction: update if exists, create if not\n const reaction = await prisma.reaction.upsert({\n where: {\n userId_announcementId: {\n userId,\n announcementId: input.announcementId,\n },\n },\n update: {\n type: input.type,\n },\n create: {\n type: input.type,\n userId,\n announcementId: input.announcementId,\n },\n include: {\n user: {\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 });\n\n return { reaction };\n } else if (input.commentId) {\n const comment = await findCommentWithAnnouncement(input.commentId);\n if (!comment) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Comment not found\",\n });\n }\n if (comment.announcement!.classId !== input.classId) {\n throw new TRPCError({\n code: \"FORBIDDEN\",\n message: \"Comment does not belong to this class\",\n });\n }\n\n const reaction = await upsertReaction({\n userId,\n commentId: input.commentId,\n type: input.type,\n });\n return { reaction };\n }\n\n throw new TRPCError({\n code: \"INTERNAL_SERVER_ERROR\",\n message: \"Unexpected error\",\n });\n }),\n\n removeReaction: protectedProcedure\n .input(z.object({\n announcementId: z.string().optional(),\n commentId: z.string().optional(),\n }))\n .mutation(async ({ ctx, input }) => {\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"User must be authenticated\",\n });\n }\n\n // Exactly one of announcementId or commentId must be provided\n if (!input.announcementId && !input.commentId) {\n throw new TRPCError({\n code: \"BAD_REQUEST\",\n message: \"Either announcementId or commentId must be provided\",\n });\n }\n\n const userId = ctx.user.id;\n\n if (input.announcementId) {\n const reaction = await prisma.reaction.findUnique({\n where: {\n userId_announcementId: {\n userId,\n announcementId: input.announcementId,\n },\n },\n });\n\n if (!reaction) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Reaction not found\",\n });\n }\n\n await prisma.reaction.delete({\n where: { id: reaction.id },\n });\n\n return { success: true };\n } else if (input.commentId) {\n const reaction = await findReactionByUserAndComment(userId, input.commentId);\n if (!reaction) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Reaction not found\",\n });\n }\n await deleteReactionById(reaction.id);\n return { success: true };\n }\n\n throw new TRPCError({\n code: \"INTERNAL_SERVER_ERROR\",\n message: \"Unexpected error\",\n });\n }),\n\n getReactions: protectedClassMemberProcedure\n .input(z.object({\n announcementId: z.string().optional(),\n commentId: z.string().optional(),\n classId: z.string(),\n }))\n .query(async ({ ctx, input }) => {\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"User must be authenticated\",\n });\n }\n\n // Exactly one of announcementId or commentId must be provided\n if (!input.announcementId && !input.commentId) {\n throw new TRPCError({\n code: \"BAD_REQUEST\",\n message: \"Either announcementId or commentId must be provided\",\n });\n }\n\n const userId = ctx.user.id;\n\n if (input.announcementId) {\n const announcement = await findAnnouncementByIdAndClass(input.announcementId, input.classId);\n if (!announcement) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Announcement not found\",\n });\n }\n\n // Get reaction counts by type\n const reactionCounts = await prisma.reaction.groupBy({\n by: ['type'],\n where: { announcementId: input.announcementId },\n _count: { type: true },\n });\n\n // Get current user's reaction\n const userReaction = await prisma.reaction.findUnique({\n where: {\n userId_announcementId: {\n userId,\n announcementId: input.announcementId,\n },\n },\n });\n\n // Format counts\n const counts = {\n THUMBSUP: 0,\n CELEBRATE: 0,\n CARE: 0,\n HEART: 0,\n IDEA: 0,\n HAPPY: 0,\n };\n\n reactionCounts.forEach((item) => {\n counts[item.type as keyof typeof counts] = item._count.type;\n });\n\n return {\n counts,\n userReaction: userReaction?.type || null,\n total: reactionCounts.reduce((sum, item) => sum + item._count.type, 0),\n };\n } else if (input.commentId) {\n const comment = await findCommentWithAnnouncement(input.commentId);\n if (!comment) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Comment not found\",\n });\n }\n if (comment.announcement!.classId !== input.classId) {\n throw new TRPCError({\n code: \"FORBIDDEN\",\n message: \"Comment does not belong to this class\",\n });\n }\n return getCommentReactions(userId, input.commentId);\n }\n\n throw new TRPCError({\n code: \"INTERNAL_SERVER_ERROR\",\n message: \"Unexpected error\",\n });\n }),\n});\n"],"names":[],"mappings":"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","debug_id":"283f50fa-abd0-5f75-9ffb-39b0634f990f"}
|
|
@@ -999,6 +999,7 @@ export declare const assignmentRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
999
999
|
content: string;
|
|
1000
1000
|
authorId: string;
|
|
1001
1001
|
parentCommentId: string | null;
|
|
1002
|
+
isPinned: boolean;
|
|
1002
1003
|
studentQuestionProgressId: string | null;
|
|
1003
1004
|
})[];
|
|
1004
1005
|
} & {
|
|
@@ -1011,6 +1012,7 @@ export declare const assignmentRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
1011
1012
|
content: string;
|
|
1012
1013
|
authorId: string;
|
|
1013
1014
|
parentCommentId: string | null;
|
|
1015
|
+
isPinned: boolean;
|
|
1014
1016
|
studentQuestionProgressId: string | null;
|
|
1015
1017
|
})[];
|
|
1016
1018
|
};
|
|
@@ -1055,6 +1057,7 @@ export declare const assignmentRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
1055
1057
|
content: string;
|
|
1056
1058
|
authorId: string;
|
|
1057
1059
|
parentCommentId: string | null;
|
|
1060
|
+
isPinned: boolean;
|
|
1058
1061
|
studentQuestionProgressId: string | null;
|
|
1059
1062
|
})[];
|
|
1060
1063
|
} & {
|
|
@@ -1067,6 +1070,7 @@ export declare const assignmentRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
1067
1070
|
content: string;
|
|
1068
1071
|
authorId: string;
|
|
1069
1072
|
parentCommentId: string | null;
|
|
1073
|
+
isPinned: boolean;
|
|
1070
1074
|
studentQuestionProgressId: string | null;
|
|
1071
1075
|
};
|
|
1072
1076
|
};
|
|
@@ -1110,6 +1114,7 @@ export declare const assignmentRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
1110
1114
|
content: string;
|
|
1111
1115
|
authorId: string;
|
|
1112
1116
|
parentCommentId: string | null;
|
|
1117
|
+
isPinned: boolean;
|
|
1113
1118
|
studentQuestionProgressId: string | null;
|
|
1114
1119
|
})[];
|
|
1115
1120
|
} & {
|
|
@@ -1122,6 +1127,7 @@ export declare const assignmentRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
1122
1127
|
content: string;
|
|
1123
1128
|
authorId: string;
|
|
1124
1129
|
parentCommentId: string | null;
|
|
1130
|
+
isPinned: boolean;
|
|
1125
1131
|
studentQuestionProgressId: string | null;
|
|
1126
1132
|
})[];
|
|
1127
1133
|
};
|
|
@@ -1167,6 +1173,7 @@ export declare const assignmentRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
1167
1173
|
content: string;
|
|
1168
1174
|
authorId: string;
|
|
1169
1175
|
parentCommentId: string | null;
|
|
1176
|
+
isPinned: boolean;
|
|
1170
1177
|
studentQuestionProgressId: string | null;
|
|
1171
1178
|
})[];
|
|
1172
1179
|
} & {
|
|
@@ -1179,6 +1186,7 @@ export declare const assignmentRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
1179
1186
|
content: string;
|
|
1180
1187
|
authorId: string;
|
|
1181
1188
|
parentCommentId: string | null;
|
|
1189
|
+
isPinned: boolean;
|
|
1182
1190
|
studentQuestionProgressId: string | null;
|
|
1183
1191
|
};
|
|
1184
1192
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assignment.d.ts","sourceRoot":"/","sources":["routers/assignment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAA2B,KAAK,gBAAgB,EAAgE,MAAM,sBAAsB,CAAC;AAmPpJ,eAAO,MAAM,gBAAgB
|
|
1
|
+
{"version":3,"file":"assignment.d.ts","sourceRoot":"/","sources":["routers/assignment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAA2B,KAAK,gBAAgB,EAAgE,MAAM,sBAAsB,CAAC;AAmPpJ,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyuB3B,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
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]="e990115c-dd02-53f4-a32e-f142a46bc39c")}catch(e){}}();
|
|
3
3
|
import { z } from "zod";
|
|
4
4
|
import { createTRPCRouter, protectedProcedure, protectedClassMemberProcedure, protectedTeacherProcedure } from "../trpc.js";
|
|
5
5
|
import { TRPCError } from "@trpc/server";
|
|
@@ -282,7 +282,7 @@ export const assignmentRouter = createTRPCRouter({
|
|
|
282
282
|
parentCommentId: null,
|
|
283
283
|
},
|
|
284
284
|
include: commentInclude,
|
|
285
|
-
orderBy: { createdAt: "asc" },
|
|
285
|
+
orderBy: [{ isPinned: "desc" }, { createdAt: "asc" }],
|
|
286
286
|
});
|
|
287
287
|
return { comments };
|
|
288
288
|
}),
|
|
@@ -381,7 +381,7 @@ export const assignmentRouter = createTRPCRouter({
|
|
|
381
381
|
parentCommentId: null,
|
|
382
382
|
},
|
|
383
383
|
include: commentInclude,
|
|
384
|
-
orderBy: { createdAt: "asc" },
|
|
384
|
+
orderBy: [{ isPinned: "desc" }, { createdAt: "asc" }],
|
|
385
385
|
});
|
|
386
386
|
return { comments };
|
|
387
387
|
}),
|
|
@@ -803,4 +803,4 @@ export const assignmentRouter = createTRPCRouter({
|
|
|
803
803
|
}),
|
|
804
804
|
});
|
|
805
805
|
//# sourceMappingURL=assignment.js.map
|
|
806
|
-
//# debugId=
|
|
806
|
+
//# debugId=e990115c-dd02-53f4-a32e-f142a46bc39c
|
|
@@ -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: { 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: { 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":";;AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAC5H,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,uBAAuB,EAAyB,mBAAmB,EAAE,oBAAoB,EAAqB,MAAM,sBAAsB,CAAC;AAEpJ,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EACL,6BAA6B,EAC7B,8BAA8B,GAC/B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,sBAAsB,EACtB,yBAAyB,EACzB,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,EACtB,+BAA+B,EAC/B,6BAA6B,EAC7B,+BAA+B,EAC/B,+BAA+B,EAC/B,sBAAsB,EACtB,sBAAsB,EACtB,2BAA2B,EAC3B,2BAA2B,EAC3B,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,SAAS,gBAAgB,CAAC,OAKzB;IACC,OAAO,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;AACxE,CAAC;AAED,iFAAiF;AACjF,+BAA+B;AAE/B,sDAAsD;AACtD,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,0CAA0C;CAC3C,CAAC,CAAC;AAEH,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACzB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IACxB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,QAAQ,EAAE,EAAE,yBAAyB;IACtE,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC/C,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACpC,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACnC,sBAAsB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC9C,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACvC,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC5C,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACnC,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC1C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC9B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE;IACvH,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACxC,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAClC,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC1C,CAAC,CAAC;AAEH,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,QAAQ,EAAE,EAAE,yBAAyB;IACtE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACpC,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACnC,sBAAsB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC9C,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACvC,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC5C,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACnC,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC1C,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC/C,kBAAkB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAClD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC9B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC3C,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE;IACvH,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CACnC,CAAC,CAAC;AAEH,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;CACpB,CAAC,CAAC;AAEH,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;CACpB,CAAC,CAAC;AAEH,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IACxB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IACxB,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC9B,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,QAAQ,EAAE,EAAE,yBAAyB;IAC/E,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACvC,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC/C,kBAAkB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CACnD,CAAC,CAAC;AAEH,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IACxB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IACxB,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC9B,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC/C,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,QAAQ,EAAE,EAAE,yBAAyB;IAC/E,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC/C,kBAAkB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAClD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QAC7B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;QACtB,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE;QAC3B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;QAClB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;KACrB,CAAC,CAAC,CAAC,QAAQ,EAAE;CACf,CAAC,CAAC;AAEH,8CAA8C;AAC9C,MAAM,6BAA6B,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IACxB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC;CACjC,CAAC,CAAC;AAEH,MAAM,6BAA6B,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IACxB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC;CACjC,CAAC,CAAC;AAEH,MAAM,6BAA6B,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE;IAC1B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAC;AAEH,MAAM,6BAA6B,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE;IAC1B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAC;AAEH,MAAM,6BAA6B,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IACxB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC;CACjC,CAAC,CAAC;AAEH,MAAM,6BAA6B,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE;IAC1B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAC;AAEH,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;CACrC,CAAC,CAAC;AAEH,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IACxB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,yBAAyB,CAAC;IACrD,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACvC,CAAC,CAAC;AAEH,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IACxB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;CACpB,CAAC,CAAC;AAEH,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IACxB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IACxB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,yBAAyB,CAAC;IACrD,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACvC,CAAC,CAAC;AAEH,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IACxB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;CACzB,CAAC,CAAC;AAEH,MAAM,cAAc,GAAG;IACrB,MAAM,EAAE;QACN,MAAM,EAAE;YACN,EAAE,EAAE,IAAI;YACR,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE;gBACP,MAAM,EAAE;oBACN,WAAW,EAAE,IAAI;oBACjB,cAAc,EAAE,IAAI;oBACpB,uBAAuB,EAAE,IAAI;iBAC9B;aACF;SACF;KACF;IACD,OAAO,EAAE;QACP,OAAO,EAAE;YACP,MAAM,EAAE;gBACN,MAAM,EAAE;oBACN,EAAE,EAAE,IAAI;oBACR,QAAQ,EAAE,IAAI;oBACd,OAAO,EAAE;wBACP,MAAM,EAAE;4BACN,WAAW,EAAE,IAAI;4BACjB,cAAc,EAAE,IAAI;4BACpB,uBAAuB,EAAE,IAAI;yBAC9B;qBACF;iBACF;aACF;SACF;QACD,OAAO,EAAE,EAAE,SAAS,EAAE,KAAc,EAAE;KACvC;CACO,CAAC;AAEX,MAAM,CAAC,MAAM,gBAAgB,GAAG,gBAAgB,CAAC;IAC/C,OAAO,EAAE,yBAAyB;SAC/B,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QACd,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QACrD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAChC,CAAC,CAAC;SACF,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAC3B,uBAAuB,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE;QACpC,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;KACzB,CAAC,CACH;IAEH,MAAM,EAAE,6BAA6B;SAClC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;SACnC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACnD,IAAI,EAAE,yBAAyB;SAC5B,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QACd,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;QACd,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;KAClD,CAAC,CAAC;SACF,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAC3B,oBAAoB,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE;QACjC,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,eAAe,EAAE,CAAC,KAAK,CAAC,eAAe,IAAI,IAAI,CAAC,IAAI,IAAI;KACzD,CAAC,CACH;IAEH,MAAM,EAAE,yBAAyB;SAC9B,KAAK,CAAC,sBAAsB,CAAC;SAC7B,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAE5E,mBAAmB,EAAE,yBAAyB;SAC3C,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;KACzB,CAAC,CACH;SACA,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAC3B,yBAAyB,CACvB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,KAAK,EACX,GAAG,CAAC,IAAK,CAAC,EAAE,CACb,CACF;IAEH,MAAM,EAAE,yBAAyB;SAC9B,KAAK,CAAC,sBAAsB,CAAC;SAC7B,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAE5E,MAAM,EAAE,kBAAkB;SACvB,KAAK,CAAC,sBAAsB,CAAC;SAC7B,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAC3B,sBAAsB,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,CAC9D;IAEH,GAAG,EAAE,6BAA6B;SAC/B,KAAK,CAAC,mBAAmB,CAAC;SAC1B,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAE/D,aAAa,EAAE,6BAA6B;SACzC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;SAClE,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CACxB,aAAa,CAAC,KAAK,CAAC,YAAY,EAAE,GAAG,CAAC,IAAK,CAAC,EAAE,CAAC,CAChD;IAEH,iBAAiB,EAAE,6BAA6B;SAC7C,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;SAClE,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CACxB,iBAAiB,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,IAAK,CAAC,EAAE,CAAC,CACnE;IAEH,gBAAgB,EAAE,6BAA6B;SAC5C,KAAK,CAAC,gBAAgB,CAAC;SACvB,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAC3B,sBAAsB,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE;QACnC,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;KAC7C,CAAC,CACH;IAEH,cAAc,EAAE,yBAAyB;SACtC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;SAClE,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,YAAY,EAAE,GAAG,CAAC,IAAK,CAAC,EAAE,CAAC,CAAC;IAE9E,WAAW,EAAE,6BAA6B;SACvC,KAAK,CAAC,wBAAwB,CAAC;SAC/B,KAAK,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QACzB,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC;YACnD,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,YAAY,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE;YACzD,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE;SACrB,CAAC,CAAC;QACH,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,SAAS,CAAC;gBAClB,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,sBAAsB;aAChC,CAAC,CAAC;QACL,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC7C,KAAK,EAAE;gBACL,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,YAAY,EAAE,IAAI;gBAClB,eAAe,EAAE,IAAI;aACtB;YACD,OAAO,EAAE,cAAc;YACvB,OAAO,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;SAC9B,CAAC,CAAC;QAEH,OAAO,EAAE,QAAQ,EAAE,CAAC;IACtB,CAAC,CAAC;IAEJ,UAAU,EAAE,6BAA6B;SACtC,KAAK,CAAC,uBAAuB,CAAC;SAC9B,QAAQ,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE;QACjC,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC;YACnD,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,YAAY,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE;YACzD,MAAM,EAAE;gBACN,EAAE,EAAE,IAAI;gBACR,KAAK,EAAE,IAAI;gBACX,KAAK,EAAE;oBACL,MAAM,EAAE;wBACN,EAAE,EAAE,IAAI;wBACR,IAAI,EAAE,IAAI;wBACV,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;wBAClC,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;qBACnC;iBACF;aACF;SACF,CAAC,CAAC;QACH,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,SAAS,CAAC;gBAClB,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,sBAAsB;aAChC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;YAC1B,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;gBACnD,KAAK,EAAE;oBACL,EAAE,EAAE,KAAK,CAAC,eAAe;oBACzB,YAAY,EAAE,KAAK,CAAC,YAAY;oBAChC,YAAY,EAAE,IAAI;iBACnB;gBACD,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE;aACrB,CAAC,CAAC;YACH,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,MAAM,IAAI,SAAS,CAAC;oBAClB,IAAI,EAAE,WAAW;oBACjB,OAAO,EAAE,0BAA0B;iBACpC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;YAC1C,IAAI,EAAE;gBACJ,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,QAAQ,EAAE,GAAG,CAAC,IAAK,CAAC,EAAE;gBACtB,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,GAAG,CAAC,KAAK,CAAC,eAAe,IAAI,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,CAAC;aACzE;YACD,OAAO,EAAE,cAAc;SACxB,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAC5B,IAAI,GAAG,CAAC;YACN,GAAG,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7C,GAAG,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9C,CAAC,CACH,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;QAElC,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,cAAc,CAAC;gBACb,WAAW;gBACX,KAAK,EAAE,kBAAkB,UAAU,CAAC,KAAK,EAAE;gBAC3C,OAAO,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,iBAAiB,UAAU,CAAC,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC,OAAO,gCAAgC,UAAU,CAAC,KAAK,CAAC,EAAE,gBAAgB,UAAU,CAAC,EAAE,GAAG;aACpL,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBACjB,MAAM,CAAC,KAAK,CAAC,kDAAkD,EAAE,KAAK,CAAC,CAAC;YAC1E,CAAC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,CAAC;IACrB,CAAC,CAAC;IAEJ,qBAAqB,EAAE,6BAA6B;SACjD,KAAK,CAAC,wBAAwB,CAAC;SAC/B,KAAK,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE;QAC9B,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC;YACnD,KAAK,EAAE;gBACL,EAAE,EAAE,KAAK,CAAC,YAAY;gBACtB,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,UAAU,EAAE;oBACV,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,KAAK,EAAE,6BAA6B,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,CAAC;iBACnD;gBACD,EAAE,EAAE;oBACF,EAAE,SAAS,EAAE,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE;oBAC3B,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,8BAA8B,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,CAAC,EAAE,EAAE;iBACxE;aACF;YACD,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE;SACrB,CAAC,CAAC;QACH,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,SAAS,CAAC;gBAClB,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,sBAAsB;aAChC,CAAC,CAAC;QACL,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC7C,KAAK,EAAE;gBACL,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,eAAe,EAAE,IAAI;aACtB;YACD,OAAO,EAAE,cAAc;YACvB,OAAO,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;SAC9B,CAAC,CAAC;QAEH,OAAO,EAAE,QAAQ,EAAE,CAAC;IACtB,CAAC,CAAC;IAEJ,oBAAoB,EAAE,6BAA6B;SAChD,KAAK,CAAC,uBAAuB,CAAC;SAC9B,QAAQ,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE;QACjC,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC;YACnD,KAAK,EAAE;gBACL,EAAE,EAAE,KAAK,CAAC,YAAY;gBACtB,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,UAAU,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE;gBACtC,EAAE,EAAE;oBACF,EAAE,SAAS,EAAE,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE;oBAC3B,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,8BAA8B,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,CAAC,EAAE,EAAE;iBACxE;aACF;YACD,MAAM,EAAE;gBACN,EAAE,EAAE,IAAI;gBACR,SAAS,EAAE,IAAI;gBACf,UAAU,EAAE;oBACV,MAAM,EAAE;wBACN,EAAE,EAAE,IAAI;wBACR,KAAK,EAAE,IAAI;wBACX,KAAK,EAAE;4BACL,MAAM,EAAE;gCACN,EAAE,EAAE,IAAI;gCACR,IAAI,EAAE,IAAI;gCACV,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;6BACnC;yBACF;qBACF;iBACF;aACF;SACF,CAAC,CAAC;QACH,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,SAAS,CAAC;gBAClB,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,sBAAsB;aAChC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;YAC1B,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;gBACnD,KAAK,EAAE;oBACL,EAAE,EAAE,KAAK,CAAC,eAAe;oBACzB,YAAY,EAAE,KAAK,CAAC,YAAY;iBACjC;gBACD,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE;aACrB,CAAC,CAAC;YACH,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,MAAM,IAAI,SAAS,CAAC;oBAClB,IAAI,EAAE,WAAW;oBACjB,OAAO,EAAE,0BAA0B;iBACpC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;YAC1C,IAAI,EAAE;gBACJ,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,QAAQ,EAAE,GAAG,CAAC,IAAK,CAAC,EAAE;gBACtB,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,GAAG,CAAC,KAAK,CAAC,eAAe,IAAI,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,CAAC;aACzE;YACD,OAAO,EAAE,cAAc;SACxB,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAC5B,IAAI,GAAG,CAAC;YACN,UAAU,CAAC,SAAS;YACpB,GAAG,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzD,CAAC,CACH,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;QAElC,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,cAAc,CAAC;gBACb,WAAW;gBACX,KAAK,EAAE,0BAA0B,UAAU,CAAC,UAAU,CAAC,KAAK,EAAE;gBAC9D,OAAO,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,iCAAiC,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC,OAAO,gCAAgC,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,gBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,gBAAgB,UAAU,CAAC,EAAE,GAAG;aAClQ,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBACjB,MAAM,CAAC,KAAK,CAAC,kDAAkD,EAAE,KAAK,CAAC,CAAC;YAC1E,CAAC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,CAAC;IACrB,CAAC,CAAC;IAEJ,yBAAyB,EAAE,yBAAyB;SACjD,KAAK,CAAC,sBAAsB,CAAC;SAC7B,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAC3B,+BAA+B,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE;QAC5C,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;QAC5C,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,QAAQ,EAAE,KAAK,CAAC,QAAQ;KACzB,CAAC,CACH;IAEH,aAAa,EAAE,yBAAyB;SACrC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;SAClE,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAC3B,6BAA6B,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,CAC/E;IAEH,WAAW,EAAE,yBAAyB;SACnC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;SAC7C,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAC3B,+BAA+B,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,KAAK,CAAC,YAAY,CAAC,CAClE;IAEH,kBAAkB,EAAE,yBAAyB;SAC1C,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;SAC7C,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CACxB,+BAA+B,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,KAAK,CAAC,YAAY,CAAC,CAClE;IAEH,QAAQ,EAAE,kBAAkB;SACzB,KAAK,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;IAC7B,gBAAgB,EAAE,yBAAyB;SACxC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QACd,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;QACxB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KACpC,CAAC,CAAC;SACF,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAC3B,sBAAsB,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,YAAY,CAAC,CAC7E;IACH,gBAAgB,EAAE,yBAAyB;SACxC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;SAC7C,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAC3B,sBAAsB,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,KAAK,CAAC,YAAY,CAAC,CACzD;IACH,qBAAqB,EAAE,yBAAyB;SAC7C,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QACd,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;QACxB,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KACzC,CAAC,CAAC;SACF,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAC3B,2BAA2B,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,iBAAiB,CAAC,CACvF;IACH,qBAAqB,EAAE,yBAAyB;SAC7C,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;SAClE,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAC3B,2BAA2B,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,KAAK,CAAC,YAAY,CAAC,CAC9D;IAEH,8BAA8B;IAC9B,uBAAuB,EAAE,yBAAyB;SAC/C,KAAK,CAAC,6BAA6B,CAAC;SACpC,QAAQ,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE;QACjC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;QAE/C,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,IAAI,SAAS,CAAC;gBAClB,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,uCAAuC;aACjD,CAAC,CAAC;QACL,CAAC;QAED,wCAAwC;QACxC,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC;YAC7C,KAAK,EAAE;gBACL,EAAE,EAAE,OAAO;gBACX,QAAQ,EAAE;oBACR,IAAI,EAAE;wBACJ,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE;qBAChB;iBACF;aACF;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,SAAS,CAAC;gBAClB,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,0CAA0C;aACpD,CAAC,CAAC;QACL,CAAC;QAED,oDAAoD;QACpD,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC;YACnD,KAAK,EAAE;gBACL,EAAE,EAAE,YAAY;gBAChB,OAAO,EAAE,OAAO;aACjB;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,SAAS,CAAC;gBAClB,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,sBAAsB;aAChC,CAAC,CAAC;QACL,CAAC;QAED,6BAA6B;QAC7B,MAAM,iBAAiB,GAAG,MAAM,uBAAuB,CACrD,KAAK,EACL,GAAG,CAAC,IAAI,CAAC,EAAE,EACX,SAAS,EAAE,wBAAwB;QACnC,YAAY,CACb,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,iBAAiB;SAC/B,CAAC;IACJ,CAAC,CAAC;IAEJ,uBAAuB,EAAE,6BAA6B;SACnD,KAAK,CAAC,6BAA6B,CAAC;SACpC,QAAQ,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE;QACjC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;QAE/C,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,IAAI,SAAS,CAAC;gBAClB,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,uCAAuC;aACjD,CAAC,CAAC;QACL,CAAC;QAED,+CAA+C;QAC/C,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC;YACnD,KAAK,EAAE;gBACL,EAAE,EAAE,YAAY;gBAChB,UAAU,EAAE;oBACV,OAAO,EAAE,OAAO;iBACjB;aACF;YACD,OAAO,EAAE;gBACP,UAAU,EAAE;oBACV,OAAO,EAAE;wBACP,KAAK,EAAE;4BACL,OAAO,EAAE;gCACP,QAAQ,EAAE,IAAI;gCACd,QAAQ,EAAE,IAAI;gCACd,MAAM,EAAE;oCACN,OAAO,EAAE;wCACP,KAAK,EAAE;4CACL,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE;yCACrB;wCACD,WAAW,EAAE;4CACX,KAAK,EAAE;gDACL,IAAI,EAAE,OAAO;gDACb,MAAM,EAAE,QAAQ;6CACjB;4CACD,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;yCACzB;qCACF;iCACF;6BACF;yBACF;qBACF;iBACF;aACF;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,SAAS,CAAC;gBAClB,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,sBAAsB;aAChC,CAAC,CAAC;QACL,CAAC;QAED,iFAAiF;QACjF,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,KAAK,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACvD,MAAM,SAAS,GAAG,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACpG,MAAM,aAAa,GAAG,OAAO,CAC3B,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;YAC1F,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CACrF,CAAC;QAEF,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,IAAI,CAAC,aAAa,EAAE,CAAC;YAC/C,MAAM,IAAI,SAAS,CAAC;gBAClB,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,8DAA8D;aACxE,CAAC,CAAC;QACL,CAAC;QAED,6BAA6B;QAC7B,MAAM,iBAAiB,GAAG,MAAM,uBAAuB,CACrD,KAAK,EACL,GAAG,CAAC,IAAI,CAAC,EAAE,EACX,SAAS,EAAE,wBAAwB;QACnC,SAAS,EAAE,mBAAmB;QAC9B,YAAY,CACb,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,iBAAiB;SAC/B,CAAC;IACJ,CAAC,CAAC;IAEJ,uBAAuB,EAAE,yBAAyB;SAC/C,KAAK,CAAC,6BAA6B,CAAC;SACpC,QAAQ,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE;QACjC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,GAAG,KAAK,CAAC;QAEtD,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,IAAI,SAAS,CAAC;gBAClB,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,uBAAuB;aACjC,CAAC,CAAC;QACL,CAAC;QAED,wDAAwD;QACxD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;YACvC,KAAK,EAAE;gBACL,EAAE,EAAE,MAAM;gBACV,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE;gBACnB,UAAU,EAAE;oBACV,KAAK,EAAE,IAAI;iBACZ;aACF;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,SAAS,CAAC;gBAClB,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,6CAA6C;aACvD,CAAC,CAAC;QACL,CAAC;QAED,MAAM,mBAAmB,CAAC,MAAM,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC;QAE/D,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,eAAe;SAC3E,CAAC;IACJ,CAAC,CAAC;IAEJ,uBAAuB,EAAE,6BAA6B;SACnD,KAAK,CAAC,6BAA6B,CAAC;SACpC,QAAQ,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE;QACjC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,GAAG,KAAK,CAAC;QAEtD,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,IAAI,SAAS,CAAC;gBAClB,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,uBAAuB;aACjC,CAAC,CAAC;QACL,CAAC;QAED,uDAAuD;QACvD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;YACvC,KAAK,EAAE;gBACL,EAAE,EAAE,MAAM;gBACV,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE;gBACnB,UAAU,EAAE;oBACV,KAAK,EAAE,IAAI;iBACZ;aACF;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,SAAS,CAAC;gBAClB,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,6CAA6C;aACvD,CAAC,CAAC;QACL,CAAC;QAED,MAAM,mBAAmB,CAAC,MAAM,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC;QAE/D,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,eAAe;SAC3E,CAAC;IACJ,CAAC,CAAC;IAEJ,uBAAuB,EAAE,yBAAyB;SAC/C,KAAK,CAAC,6BAA6B,CAAC;SACpC,QAAQ,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE;QACjC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;QAE/C,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,IAAI,SAAS,CAAC;gBAClB,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,uCAAuC;aACjD,CAAC,CAAC;QACL,CAAC;QAED,8DAA8D;QAC9D,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC;YACnD,KAAK,EAAE;gBACL,EAAE,EAAE,YAAY;gBAChB,UAAU,EAAE;oBACV,OAAO,EAAE,OAAO;oBAChB,KAAK,EAAE;wBACL,QAAQ,EAAE;4BACR,IAAI,EAAE;gCACJ,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE;6BAChB;yBACF;qBACF;iBACF;aACF;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,SAAS,CAAC;gBAClB,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,6DAA6D;aACvE,CAAC,CAAC;QACL,CAAC;QAED,6CAA6C;QAC7C,kGAAkG;QAClG,sEAAsE;QACtE,MAAM,iBAAiB,GAAG,MAAM,uBAAuB,CACrD,KAAK,EACL,GAAG,CAAC,IAAI,CAAC,EAAE,EACX,SAAS,EAAE,wBAAwB;QACnC,SAAS,EAAE,mBAAmB;QAC9B,SAAS,CAAE,2EAA2E;SACvF,CAAC;QAEF,mFAAmF;QACnF,MAAM,OAAO,CAAC,GAAG,CACf,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAC3B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;YACjB,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE;YACtB,IAAI,EAAE;gBACJ,YAAY,EAAE,YAAY,EAAE,sBAAsB;aACnD;SACF,CAAC,CACH,CACF,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,iBAAiB;SAC/B,CAAC;IACJ,CAAC,CAAC;IAEJ,uBAAuB,EAAE,yBAAyB;SAC/C,KAAK,CAAC,6BAA6B,CAAC;SACpC,QAAQ,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE;QACjC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,GAAG,KAAK,CAAC;QAEtD,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,IAAI,SAAS,CAAC;gBAClB,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,uBAAuB;aACjC,CAAC,CAAC;QACL,CAAC;QAED,wDAAwD;QACxD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;YACvC,KAAK,EAAE;gBACL,EAAE,EAAE,MAAM;gBACV,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE;gBACnB,YAAY,EAAE;oBACZ,GAAG,EAAE,IAAI;iBACV;aACF;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,SAAS,CAAC;gBAClB,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,6CAA6C;aACvD,CAAC,CAAC;QACL,CAAC;QAED,MAAM,mBAAmB,CAAC,MAAM,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC;QAE/D,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,0CAA0C,CAAC,CAAC,CAAC,0BAA0B;SACjG,CAAC;IACJ,CAAC,CAAC;IAEJ,oBAAoB,EAAE,kBAAkB;SACrC,KAAK,CAAC,0BAA0B,CAAC;SACjC,QAAQ,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE;QACjC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;QAEnC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,IAAI,SAAS,CAAC;gBAClB,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,uBAAuB;aACjC,CAAC,CAAC;QACL,CAAC;QAED,8BAA8B;QAC9B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;YACvC,KAAK,EAAE;gBACL,EAAE,EAAE,MAAM;gBACV,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE;aACpB;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,SAAS,CAAC;gBAClB,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,6CAA6C;aACvD,CAAC,CAAC;QACL,CAAC;QAED,MAAM,oBAAoB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAE7C,OAAO;YACL,OAAO,EAAE,IAAI;YACb,QAAQ;SACT,CAAC;IACJ,CAAC,CAAC;CACL,CAAC,CAAC","debug_id":"606c66ff-93fe-5eb7-8f2a-86e925dc0ce9"}
|
|
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"}
|