@studious-lms/server 1.2.41 → 1.2.42

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.
Files changed (144) hide show
  1. package/TODO.md +2 -0
  2. package/dist/exportType.d.ts.map +1 -1
  3. package/dist/exportType.js +4 -0
  4. package/dist/exportType.js.map +1 -0
  5. package/dist/index.d.ts +1 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +32 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/instrument.d.ts +2 -0
  10. package/dist/instrument.d.ts.map +1 -0
  11. package/dist/instrument.js +11 -0
  12. package/dist/instrument.js.map +1 -0
  13. package/dist/lib/fileUpload.d.ts.map +1 -1
  14. package/dist/lib/fileUpload.js +4 -0
  15. package/dist/lib/fileUpload.js.map +1 -0
  16. package/dist/lib/googleCloudStorage.d.ts.map +1 -1
  17. package/dist/lib/googleCloudStorage.js +4 -0
  18. package/dist/lib/googleCloudStorage.js.map +1 -0
  19. package/dist/lib/jsonConversion.d.ts.map +1 -1
  20. package/dist/lib/jsonConversion.js +4 -0
  21. package/dist/lib/jsonConversion.js.map +1 -0
  22. package/dist/lib/jsonStyles.d.ts.map +1 -1
  23. package/dist/lib/jsonStyles.js +4 -0
  24. package/dist/lib/jsonStyles.js.map +1 -0
  25. package/dist/lib/notificationHandler.d.ts.map +1 -1
  26. package/dist/lib/notificationHandler.js +4 -0
  27. package/dist/lib/notificationHandler.js.map +1 -0
  28. package/dist/lib/prisma.d.ts.map +1 -1
  29. package/dist/lib/prisma.js +4 -0
  30. package/dist/lib/prisma.js.map +1 -0
  31. package/dist/lib/pusher.d.ts.map +1 -1
  32. package/dist/lib/pusher.js +4 -0
  33. package/dist/lib/pusher.js.map +1 -0
  34. package/dist/lib/thumbnailGenerator.d.ts.map +1 -1
  35. package/dist/lib/thumbnailGenerator.js +4 -0
  36. package/dist/lib/thumbnailGenerator.js.map +1 -0
  37. package/dist/middleware/auth.d.ts.map +1 -1
  38. package/dist/middleware/auth.js +4 -0
  39. package/dist/middleware/auth.js.map +1 -0
  40. package/dist/middleware/logging.d.ts.map +1 -1
  41. package/dist/middleware/logging.js +4 -0
  42. package/dist/middleware/logging.js.map +1 -0
  43. package/dist/routers/_app.d.ts +0 -60
  44. package/dist/routers/_app.d.ts.map +1 -1
  45. package/dist/routers/_app.js +4 -0
  46. package/dist/routers/_app.js.map +1 -0
  47. package/dist/routers/agenda.d.ts.map +1 -1
  48. package/dist/routers/agenda.js +4 -0
  49. package/dist/routers/agenda.js.map +1 -0
  50. package/dist/routers/announcement.d.ts.map +1 -1
  51. package/dist/routers/announcement.js +4 -0
  52. package/dist/routers/announcement.js.map +1 -0
  53. package/dist/routers/assignment.d.ts.map +1 -1
  54. package/dist/routers/assignment.js +4 -0
  55. package/dist/routers/assignment.js.map +1 -0
  56. package/dist/routers/attendance.d.ts.map +1 -1
  57. package/dist/routers/attendance.js +4 -0
  58. package/dist/routers/attendance.js.map +1 -0
  59. package/dist/routers/auth.d.ts.map +1 -1
  60. package/dist/routers/auth.js +4 -0
  61. package/dist/routers/auth.js.map +1 -0
  62. package/dist/routers/class.d.ts.map +1 -1
  63. package/dist/routers/class.js +4 -0
  64. package/dist/routers/class.js.map +1 -0
  65. package/dist/routers/comment.d.ts +0 -36
  66. package/dist/routers/comment.d.ts.map +1 -1
  67. package/dist/routers/comment.js +4 -21
  68. package/dist/routers/comment.js.map +1 -0
  69. package/dist/routers/conversation.d.ts.map +1 -1
  70. package/dist/routers/conversation.js +4 -0
  71. package/dist/routers/conversation.js.map +1 -0
  72. package/dist/routers/event.d.ts.map +1 -1
  73. package/dist/routers/event.js +4 -0
  74. package/dist/routers/event.js.map +1 -0
  75. package/dist/routers/file.d.ts.map +1 -1
  76. package/dist/routers/file.js +4 -0
  77. package/dist/routers/file.js.map +1 -0
  78. package/dist/routers/folder.d.ts.map +1 -1
  79. package/dist/routers/folder.js +4 -0
  80. package/dist/routers/folder.js.map +1 -0
  81. package/dist/routers/labChat.d.ts.map +1 -1
  82. package/dist/routers/labChat.js +4 -0
  83. package/dist/routers/labChat.js.map +1 -0
  84. package/dist/routers/marketing.d.ts.map +1 -1
  85. package/dist/routers/marketing.js +4 -0
  86. package/dist/routers/marketing.js.map +1 -0
  87. package/dist/routers/message.d.ts.map +1 -1
  88. package/dist/routers/message.js +4 -0
  89. package/dist/routers/message.js.map +1 -0
  90. package/dist/routers/notifications.d.ts.map +1 -1
  91. package/dist/routers/notifications.js +4 -0
  92. package/dist/routers/notifications.js.map +1 -0
  93. package/dist/routers/school.js +2 -0
  94. package/dist/routers/section.d.ts.map +1 -1
  95. package/dist/routers/section.js +4 -0
  96. package/dist/routers/section.js.map +1 -0
  97. package/dist/routers/user.d.ts.map +1 -1
  98. package/dist/routers/user.js +4 -0
  99. package/dist/routers/user.js.map +1 -0
  100. package/dist/routers/worksheet.d.ts +0 -15
  101. package/dist/routers/worksheet.d.ts.map +1 -1
  102. package/dist/routers/worksheet.js +16 -1
  103. package/dist/routers/worksheet.js.map +1 -0
  104. package/dist/seedDatabase.d.ts.map +1 -1
  105. package/dist/seedDatabase.js +4 -0
  106. package/dist/seedDatabase.js.map +1 -0
  107. package/dist/socket/handlers.d.ts.map +1 -1
  108. package/dist/socket/handlers.js +4 -0
  109. package/dist/socket/handlers.js.map +1 -0
  110. package/dist/trpc.d.ts.map +1 -1
  111. package/dist/trpc.js +4 -0
  112. package/dist/trpc.js.map +1 -0
  113. package/dist/types/trpc.d.ts.map +1 -1
  114. package/dist/types/trpc.js +4 -0
  115. package/dist/types/trpc.js.map +1 -0
  116. package/dist/utils/aiUser.d.ts.map +1 -1
  117. package/dist/utils/aiUser.js +4 -0
  118. package/dist/utils/aiUser.js.map +1 -0
  119. package/dist/utils/email.d.ts.map +1 -1
  120. package/dist/utils/email.js +4 -0
  121. package/dist/utils/email.js.map +1 -0
  122. package/dist/utils/generateInviteCode.d.ts.map +1 -1
  123. package/dist/utils/generateInviteCode.js +4 -0
  124. package/dist/utils/generateInviteCode.js.map +1 -0
  125. package/dist/utils/inference.d.ts.map +1 -1
  126. package/dist/utils/inference.js +4 -3
  127. package/dist/utils/inference.js.map +1 -0
  128. package/dist/utils/logger.d.ts.map +1 -1
  129. package/dist/utils/logger.js +4 -0
  130. package/dist/utils/logger.js.map +1 -0
  131. package/dist/utils/prismaErrorHandler.d.ts.map +1 -1
  132. package/dist/utils/prismaErrorHandler.js +4 -0
  133. package/dist/utils/prismaErrorHandler.js.map +1 -0
  134. package/dist/utils/prismaWrapper.d.ts.map +1 -1
  135. package/dist/utils/prismaWrapper.js +4 -0
  136. package/dist/utils/prismaWrapper.js.map +1 -0
  137. package/package.json +8 -3
  138. package/src/index.ts +42 -0
  139. package/src/instrument.ts +8 -0
  140. package/src/routers/comment.ts +0 -21
  141. package/src/routers/worksheet.ts +21 -1
  142. package/src/trpc.ts +2 -0
  143. package/src/utils/inference.ts +0 -4
  144. package/tsconfig.json +9 -2
@@ -0,0 +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 { sendNotifications } from \"../lib/notificationHandler.js\";\nimport { logger } from \"../utils/logger.js\";\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 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});\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\n// Helper function to get unified list of sections and assignments for a class\nasync function getUnifiedList(tx: any, classId: string) {\n const [sections, assignments] = await Promise.all([\n tx.section.findMany({\n where: { classId },\n select: { id: true, order: true },\n }),\n tx.assignment.findMany({\n where: { classId },\n select: { id: true, order: true },\n }),\n ]);\n\n // Combine and sort by order\n const unified = [\n ...sections.map((s: any) => ({ id: s.id, order: s.order, type: 'section' as const })),\n ...assignments.map((a: any) => ({ id: a.id, order: a.order, type: 'assignment' as const })),\n ].sort((a, b) => (a.order ?? Number.MAX_SAFE_INTEGER) - (b.order ?? Number.MAX_SAFE_INTEGER));\n\n return unified;\n}\n\n// Helper function to normalize unified list to 1..n\n// Updated to batch updates to prevent timeouts with large lists\nasync function normalizeUnifiedList(tx: any, classId: string, orderedItems: Array<{ id: string; type: 'section' | 'assignment' }>) {\n const BATCH_SIZE = 10; // Process 10 items at a time to avoid overwhelming the transaction\n \n // Group items by type for more efficient updates\n const sections: Array<{ id: string; order: number }> = [];\n const assignments: Array<{ id: string; order: number }> = [];\n \n orderedItems.forEach((item, index) => {\n const orderData = { id: item.id, order: index + 1 };\n if (item.type === 'section') {\n sections.push(orderData);\n } else {\n assignments.push(orderData);\n }\n });\n \n // Process updates in batches\n const processBatch = async (items: Array<{ id: string; order: number }>, type: 'section' | 'assignment') => {\n for (let i = 0; i < items.length; i += BATCH_SIZE) {\n const batch = items.slice(i, i + BATCH_SIZE);\n await Promise.all(\n batch.map(item => {\n if (type === 'section') {\n return tx.section.update({ where: { id: item.id }, data: { order: item.order } });\n } else {\n return tx.assignment.update({ where: { id: item.id }, data: { order: item.order } });\n }\n })\n );\n }\n };\n \n // Process sections and assignments sequentially to avoid transaction overload\n await processBatch(sections, 'section');\n await processBatch(assignments, 'assignment');\n}\n\nexport const assignmentRouter = createTRPCRouter({\n // Reorder an assignment within the unified list (sections + assignments)\n reorder: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n movedId: z.string(),\n // One of: place at start/end of unified list, or relative to targetId (can be section or assignment)\n position: z.enum(['start', 'end', 'before', 'after']),\n targetId: z.string().optional(), // Can be a section ID or assignment ID\n }))\n .mutation(async ({ ctx, input }) => {\n const { classId, movedId, position, targetId } = input;\n\n const moved = await prisma.assignment.findFirst({\n where: { id: movedId, classId },\n select: { id: true, classId: true },\n });\n\n if (!moved) {\n throw new TRPCError({ code: 'NOT_FOUND', message: 'Assignment not found' });\n }\n\n if ((position === 'before' || position === 'after') && !targetId) {\n throw new TRPCError({ code: 'BAD_REQUEST', message: 'targetId required for before/after' });\n }\n\n const result = await prisma.$transaction(async (tx) => {\n const unified = await getUnifiedList(tx, classId);\n\n // Find moved item and target in unified list\n const movedIdx = unified.findIndex(item => item.id === movedId && item.type === 'assignment');\n if (movedIdx === -1) {\n throw new TRPCError({ code: 'NOT_FOUND', message: 'Assignment not found in unified list' });\n }\n\n // Build list without moved item\n const withoutMoved = unified.filter(item => !(item.id === movedId && item.type === 'assignment'));\n\n let next: Array<{ id: string; type: 'section' | 'assignment' }> = [];\n\n if (position === 'start') {\n next = [{ id: movedId, type: 'assignment' }, ...withoutMoved.map(item => ({ id: item.id, type: item.type }))];\n } else if (position === 'end') {\n next = [...withoutMoved.map(item => ({ id: item.id, type: item.type })), { id: movedId, type: 'assignment' }];\n } else {\n const targetIdx = withoutMoved.findIndex(item => item.id === targetId);\n if (targetIdx === -1) {\n throw new TRPCError({ code: 'BAD_REQUEST', message: 'targetId not found in unified list' });\n }\n if (position === 'before') {\n next = [\n ...withoutMoved.slice(0, targetIdx).map(item => ({ id: item.id, type: item.type })),\n { id: movedId, type: 'assignment' },\n ...withoutMoved.slice(targetIdx).map(item => ({ id: item.id, type: item.type })),\n ];\n } else {\n next = [\n ...withoutMoved.slice(0, targetIdx + 1).map(item => ({ id: item.id, type: item.type })),\n { id: movedId, type: 'assignment' },\n ...withoutMoved.slice(targetIdx + 1).map(item => ({ id: item.id, type: item.type })),\n ];\n }\n }\n\n // Normalize to 1..n\n await normalizeUnifiedList(tx, classId, next);\n\n return tx.assignment.findUnique({ where: { id: movedId } });\n }, {\n maxWait: 10000, // 10 seconds max wait time\n timeout: 30000, // 30 seconds timeout for reordering operations\n });\n\n return result;\n }),\n order: protectedTeacherProcedure\n .input(z.object({\n id: z.string(),\n classId: z.string(),\n order: z.number(),\n }))\n .mutation(async ({ ctx, input }) => {\n // Deprecated: prefer `reorder`. For backward-compatibility, set the order then normalize unified list.\n const { id, order } = input;\n\n const current = await prisma.assignment.findUnique({\n where: { id },\n select: { id: true, classId: true },\n });\n\n if (!current) {\n throw new TRPCError({ code: 'NOT_FOUND', message: 'Assignment not found' });\n }\n\n const updated = await prisma.$transaction(async (tx) => {\n await tx.assignment.update({ where: { id }, data: { order } });\n\n // Normalize entire unified list\n const unified = await getUnifiedList(tx, current.classId);\n await normalizeUnifiedList(tx, current.classId, unified.map(item => ({ id: item.id, type: item.type })));\n\n return tx.assignment.findUnique({ where: { id } });\n }, {\n maxWait: 10000, // 10 seconds max wait time\n timeout: 30000, // 30 seconds timeout for reordering operations\n });\n\n return updated;\n }),\n\n move: protectedTeacherProcedure\n .input(z.object({\n id: z.string(),\n classId: z.string(),\n targetSectionId: z.string().nullable().optional(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { id } = input;\n const targetSectionId = (input.targetSectionId ?? null) || null; // normalize empty string to null\n\n const moved = await prisma.assignment.findUnique({\n where: { id },\n select: { id: true, classId: true, sectionId: true },\n });\n\n if (!moved) {\n throw new TRPCError({ code: 'NOT_FOUND', message: 'Assignment not found' });\n }\n\n const updated = await prisma.$transaction(async (tx) => {\n // Update sectionId first\n await tx.assignment.update({ where: { id }, data: { sectionId: targetSectionId } });\n\n // The unified list ordering remains the same, just the assignment's sectionId changed\n // No need to reorder since we're keeping the same position in the unified list\n // If frontend wants to change position, they should call reorder after move\n\n return tx.assignment.findUnique({ where: { id } });\n }, {\n maxWait: 5000, // 5 seconds max wait time\n timeout: 10000, // 10 seconds timeout\n });\n\n return updated;\n }),\n\n create: protectedProcedure\n .input(createAssignmentSchema)\n .mutation(async ({ ctx, input }) => {\n const { classId, title, instructions, dueDate, files, existingFileIds, aiPolicyLevel, acceptFiles, acceptExtendedResponse, acceptWorksheet, worksheetIds, gradeWithAI, studentIds, maxGrade, graded, weight, sectionId, type, markSchemeId, gradingBoundaryId, inProgress } = input;\n\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"User must be authenticated\",\n });\n }\n\n // Pre-fetch data needed for the transaction (outside transaction scope)\n const [classData, rubricData] = await Promise.all([\n prisma.class.findUnique({\n where: { id: classId },\n include: {\n students: {\n select: { id: true }\n }\n }\n }),\n markSchemeId ? prisma.markScheme.findUnique({\n where: { id: markSchemeId },\n select: {\n structured: true,\n }\n }) : null\n ]);\n\n if (!classData) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Class not found\",\n });\n }\n\n // Calculate max grade outside transaction\n let computedMaxGrade = maxGrade;\n if (markSchemeId && rubricData) {\n const parsedRubric = JSON.parse(rubricData.structured || \"{}\");\n computedMaxGrade = parsedRubric.criteria.reduce((acc: number, criterion: any) => {\n const maxPoints = Math.max(...criterion.levels.map((level: any) => level.points));\n return acc + maxPoints;\n }, 0);\n }\n\n console.log(studentIds);\n\n // Prepare submission data outside transaction\n const submissionData = studentIds && studentIds.length > 0 \n ? studentIds.map((studentId) => ({\n student: { connect: { id: studentId } }\n }))\n : classData.students.map((student) => ({\n student: { connect: { id: student.id } }\n }));\n\n const teacherId = ctx.user.id;\n\n // Minimal transaction - only for critical operations\n const assignment = await prisma.$transaction(async (tx) => {\n // Create assignment with order 0 (will be at top)\n const created = await tx.assignment.create({\n data: {\n title,\n instructions,\n dueDate: new Date(dueDate),\n maxGrade: markSchemeId ? computedMaxGrade : maxGrade,\n graded,\n weight,\n type,\n ...(aiPolicyLevel && { aiPolicyLevel }),\n acceptFiles,\n acceptExtendedResponse,\n acceptWorksheet,\n ...(worksheetIds && {\n worksheets: {\n connect: worksheetIds.map(id => ({ id }))\n }\n }),\n gradeWithAI,\n ...(studentIds && {\n assignedTo: {\n connect: studentIds.map(id => ({ id }))\n }\n }),\n order: 0, // Set to 0 to place at top\n inProgress: inProgress || false,\n class: {\n connect: { id: classId }\n },\n ...(sectionId && {\n section: {\n connect: { id: sectionId }\n }\n }),\n ...(markSchemeId && {\n markScheme: {\n connect: { id: markSchemeId }\n }\n }),\n ...(gradingBoundaryId && {\n gradingBoundary: {\n connect: { id: gradingBoundaryId }\n }\n }),\n submissions: {\n create: submissionData\n },\n teacher: {\n connect: { id: teacherId }\n }\n },\n select: {\n id: true,\n title: true,\n instructions: true,\n dueDate: true,\n maxGrade: true,\n graded: true,\n weight: true,\n type: true,\n attachments: {\n select: {\n id: true,\n name: true,\n type: true,\n }\n },\n section: {\n select: {\n id: true,\n name: true\n }\n },\n teacher: {\n select: {\n id: true,\n username: true\n }\n },\n class: {\n select: {\n id: true,\n name: true\n }\n }\n }\n });\n\n // Optimized reordering - only increment existing items by 1\n // This is much faster than reordering everything\n await tx.assignment.updateMany({\n where: {\n classId: classId,\n id: { not: created.id },\n },\n data: {\n order: { increment: 1 }\n }\n });\n \n await tx.section.updateMany({\n where: {\n classId: classId,\n },\n data: {\n order: { increment: 1 }\n }\n });\n\n // Update the created assignment to have order 1\n await tx.assignment.update({\n where: { id: created.id },\n data: { order: 1 }\n });\n\n return created;\n }, {\n maxWait: 10000, // Increased to 10 seconds max wait time\n timeout: 20000, // Increased to 20 seconds timeout for safety\n });\n\n // Handle file operations outside transaction\n const fileOperations: Promise<any>[] = [];\n\n // Process direct upload files\n if (files && files.length > 0) {\n fileOperations.push(\n createDirectUploadFiles(files, ctx.user.id, undefined, assignment.id)\n .then(uploadedFiles => {\n if (uploadedFiles.length > 0) {\n return prisma.assignment.update({\n where: { id: assignment.id },\n data: {\n attachments: {\n create: uploadedFiles.map(file => ({\n name: file.name,\n type: file.type,\n size: file.size,\n path: file.path,\n }))\n }\n }\n });\n }\n })\n );\n }\n\n // Connect existing files\n if (existingFileIds && existingFileIds.length > 0) {\n fileOperations.push(\n prisma.assignment.update({\n where: { id: assignment.id },\n data: {\n attachments: {\n connect: existingFileIds.map(fileId => ({ id: fileId }))\n }\n }\n })\n );\n }\n\n // Execute file operations in parallel\n await Promise.all(fileOperations);\n \n // Send notifications asynchronously (non-blocking)\n sendNotifications(classData.students.map(student => student.id), {\n title: `🔔 New assignment for ${classData.name}`,\n content:\n `The assignment \"${title}\" has been created in ${classData.name}.\\n\n Due date: ${new Date(dueDate).toLocaleDateString()}.\n [Link to assignment](/class/${classId}/assignments/${assignment.id})`\n }).catch(error => {\n logger.error('Failed to send assignment notifications:', error);\n });\n\n return assignment;\n }),\n update: protectedProcedure\n .input(updateAssignmentSchema)\n .mutation(async ({ ctx, input }) => {\n const { id, title, instructions, dueDate, files, existingFileIds, worksheetIds, aiPolicyLevel, maxGrade, graded, weight, sectionId, type, inProgress, acceptFiles, acceptExtendedResponse, acceptWorksheet, gradeWithAI, studentIds } = input;\n\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"User must be authenticated\",\n });\n }\n\n // Pre-fetch all necessary data outside transaction\n const [assignment, classData] = await Promise.all([\n prisma.assignment.findFirst({\n where: {\n id,\n teacherId: ctx.user.id,\n },\n include: {\n attachments: {\n select: {\n id: true,\n name: true,\n type: true,\n path: true,\n size: true,\n uploadStatus: true,\n thumbnail: {\n select: {\n path: true\n }\n }\n },\n },\n class: {\n select: {\n id: true,\n name: true\n }\n },\n markScheme: true,\n },\n }),\n prisma.class.findFirst({\n where: { \n assignments: { \n some: { id } \n } \n },\n include: {\n students: {\n select: { id: true }\n }\n }\n })\n ]);\n\n if (!assignment) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Assignment not found\",\n });\n }\n\n // Prepare submission data outside transaction if needed\n const submissionData = studentIds && studentIds.length > 0 \n ? studentIds.map((studentId) => ({\n student: { connect: { id: studentId } }\n }))\n : classData?.students.map((student) => ({\n student: { connect: { id: student.id } }\n }));\n\n // Handle file deletion operations outside transaction\n const fileDeletionPromises: Promise<void>[] = [];\n if (input.removedAttachments && input.removedAttachments.length > 0) {\n const filesToDelete = assignment.attachments.filter((file) =>\n input.removedAttachments!.includes(file.id)\n );\n\n filesToDelete.forEach((file) => {\n if (file.uploadStatus === 'COMPLETED') {\n fileDeletionPromises.push(\n deleteFile(file.path).catch(error => {\n console.warn(`Failed to delete file ${file.path}:`, error);\n })\n );\n if (file.thumbnail?.path) {\n fileDeletionPromises.push(\n deleteFile(file.thumbnail.path).catch(error => {\n console.warn(`Failed to delete thumbnail ${file.thumbnail!.path}:`, error);\n })\n );\n }\n }\n });\n }\n\n // Execute file deletions in parallel\n await Promise.all(fileDeletionPromises);\n\n // Prepare file upload operations\n let uploadedFiles: UploadedFile[] = [];\n if (files && files.length > 0) {\n uploadedFiles = await createDirectUploadFiles(files, ctx.user.id, undefined, input.id);\n }\n\n // Minimal transaction for database update\n const updatedAssignment = await prisma.$transaction(async (tx) => {\n return tx.assignment.update({\n where: { id },\n data: {\n ...(title && { title }),\n ...(instructions && { instructions }),\n ...(dueDate && { dueDate: new Date(dueDate) }),\n ...(maxGrade && { maxGrade }),\n ...(graded !== undefined && { graded }),\n ...(weight && { weight }),\n ...(type && { type }),\n ...(inProgress !== undefined && { inProgress }),\n ...(acceptFiles !== undefined && { acceptFiles }),\n ...(acceptExtendedResponse !== undefined && { acceptExtendedResponse }),\n ...(acceptWorksheet !== undefined && { acceptWorksheet }),\n ...(gradeWithAI !== undefined && { gradeWithAI }),\n ...(studentIds && {\n assignedTo: {\n set: [], // Clear existing\n connect: studentIds.map(id => ({ id }))\n }\n }),\n ...(submissionData && {\n submissions: {\n deleteMany: {}, // Clear existing submissions\n create: submissionData\n }\n }),\n ...(aiPolicyLevel !== undefined && { aiPolicyLevel }),\n ...(sectionId !== undefined && {\n section: sectionId ? {\n connect: { id: sectionId }\n } : {\n disconnect: true\n }\n }),\n ...(worksheetIds && {\n worksheets: {\n set: [], // Clear existing\n connect: worksheetIds.map(id => ({ id }))\n }\n }),\n ...(uploadedFiles.length > 0 && {\n attachments: {\n create: uploadedFiles.map(file => ({\n name: file.name,\n type: file.type,\n size: file.size,\n path: file.path,\n ...(file.thumbnailId && {\n thumbnail: {\n connect: { id: file.thumbnailId }\n }\n })\n }))\n }\n }),\n ...(existingFileIds && existingFileIds.length > 0 && {\n attachments: {\n connect: existingFileIds.map(fileId => ({ id: fileId }))\n }\n }),\n ...(input.removedAttachments && input.removedAttachments.length > 0 && {\n attachments: {\n deleteMany: {\n id: { in: input.removedAttachments }\n }\n }\n }),\n },\n select: {\n id: true,\n title: true,\n instructions: true,\n dueDate: true,\n maxGrade: true,\n graded: true,\n weight: true,\n type: true,\n createdAt: true,\n markSchemeId: true,\n submissions: {\n select: {\n student: {\n select: {\n id: true,\n username: true\n }\n }\n }\n },\n attachments: {\n select: {\n id: true,\n name: true,\n type: true,\n thumbnail: true,\n size: true,\n path: true,\n uploadedAt: true,\n thumbnailId: true,\n }\n },\n section: true,\n teacher: true,\n class: true\n }\n });\n }, {\n maxWait: 5000, // 5 seconds max wait time\n timeout: 10000, // 10 seconds timeout\n });\n\n // Handle rubric max grade calculation outside transaction\n if (updatedAssignment.markSchemeId) {\n prisma.markScheme.findUnique({\n where: { id: updatedAssignment.markSchemeId },\n select: {\n structured: true,\n }\n }).then(rubric => {\n if (rubric) {\n const parsedRubric = JSON.parse(rubric.structured || \"{}\");\n const computedMaxGrade = parsedRubric.criteria?.reduce((acc: number, criterion: any) => {\n const maxPoints = Math.max(...criterion.levels.map((level: any) => level.points));\n return acc + maxPoints;\n }, 0) || 0;\n\n return prisma.assignment.update({\n where: { id },\n data: {\n maxGrade: computedMaxGrade,\n }\n });\n }\n }).catch(error => {\n logger.error('Failed to update max grade from rubric:', error);\n });\n }\n\n return updatedAssignment;\n }),\n\n delete: protectedProcedure\n .input(deleteAssignmentSchema)\n .mutation(async ({ ctx, input }) => {\n const { id, classId } = input;\n\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"User must be authenticated\",\n });\n }\n\n // Get the assignment with all related files\n const assignment = await prisma.assignment.findFirst({\n where: {\n id,\n teacherId: ctx.user.id,\n },\n include: {\n attachments: {\n include: {\n thumbnail: true\n }\n },\n submissions: {\n include: {\n attachments: {\n include: {\n thumbnail: true\n }\n },\n annotations: {\n include: {\n thumbnail: true\n }\n }\n }\n }\n }\n });\n\n if (!assignment) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Assignment not found\",\n });\n }\n\n // Delete all files from storage\n const filesToDelete = [\n ...assignment.attachments,\n ...assignment.submissions.flatMap(sub => [...sub.attachments, ...sub.annotations])\n ];\n\n // Delete files from storage (only if they were actually uploaded)\n await Promise.all(filesToDelete.map(async (file) => {\n try {\n // Only delete from GCS if the file was successfully uploaded\n if (file.uploadStatus === 'COMPLETED') {\n // Delete the main file\n await deleteFile(file.path);\n\n // Delete thumbnail if it exists\n if (file.thumbnail) {\n await deleteFile(file.thumbnail.path);\n }\n }\n } catch (error) {\n console.warn(`Failed to delete file ${file.path}:`, error);\n }\n }));\n\n // Delete the assignment (this will cascade delete all related records)\n await prisma.assignment.delete({\n where: { id },\n });\n\n return {\n id,\n };\n }),\n\n get: protectedProcedure\n .input(getAssignmentSchema)\n .query(async ({ ctx, input }) => {\n const { id, classId } = input;\n\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"User must be authenticated\",\n });\n }\n\n const assignment = await prisma.assignment.findUnique({\n where: {\n id,\n // classId,\n },\n include: {\n submissions: {\n select: {\n student: {\n select: {\n id: true,\n username: true\n }\n }\n }\n },\n attachments: {\n select: {\n id: true,\n name: true,\n type: true,\n size: true,\n path: true,\n uploadedAt: true,\n thumbnailId: true,\n }\n },\n section: {\n select: {\n id: true,\n name: true,\n }\n },\n teacher: {\n select: {\n id: true,\n username: true\n }\n },\n worksheets: {\n select: {\n id: true,\n name: true,\n }\n },\n class: {\n select: {\n id: true,\n name: true\n }\n },\n eventAttached: {\n select: {\n id: true,\n name: true,\n startTime: true,\n endTime: true,\n location: true,\n remarks: true,\n }\n },\n markScheme: {\n select: {\n id: true,\n structured: true,\n }\n },\n gradingBoundary: {\n select: {\n id: true,\n structured: true,\n }\n }\n }\n });\n\n if (!assignment) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Assignment not found\",\n });\n }\n\n const sections = await prisma.section.findMany({\n where: {\n classId: assignment.classId,\n },\n select: {\n id: true,\n name: true,\n },\n });\n\n return { ...assignment, sections };\n }),\n\n getSubmission: protectedClassMemberProcedure\n .input(z.object({\n assignmentId: z.string(),\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 const { assignmentId } = input;\n\n const submission = await prisma.submission.findFirst({\n where: {\n assignmentId,\n studentId: ctx.user.id,\n },\n include: {\n attachments: true,\n student: {\n select: {\n id: true,\n username: true,\n profile: true,\n },\n },\n assignment: {\n include: {\n class: true,\n markScheme: {\n select: {\n id: true,\n structured: true,\n }\n },\n worksheets: {\n select: {\n id: true,\n name: true,\n }\n },\n gradingBoundary: {\n select: {\n id: true,\n structured: true,\n }\n }\n },\n },\n annotations: true,\n },\n });\n\n if (!submission) {\n // Create a new submission if it doesn't exist\n return await prisma.submission.create({\n data: {\n assignment: {\n connect: { id: assignmentId },\n },\n student: {\n connect: { id: ctx.user.id },\n },\n },\n include: {\n attachments: true,\n annotations: true,\n student: {\n select: {\n id: true,\n username: true,\n },\n },\n assignment: {\n include: {\n class: true,\n markScheme: {\n select: {\n id: true,\n structured: true,\n }\n },\n gradingBoundary: {\n select: {\n id: true,\n structured: true,\n }\n }\n },\n },\n },\n });\n }\n\n return {\n ...submission,\n late: submission.assignment.dueDate < new Date(),\n };\n }),\n\n getSubmissionById: protectedTeacherProcedure\n .input(z.object({\n submissionId: z.string(),\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 const { submissionId, classId } = input;\n\n const submission = await prisma.submission.findFirst({\n where: {\n id: submissionId,\n assignment: {\n classId,\n class: {\n teachers: {\n some: {\n id: ctx.user.id\n }\n }\n }\n },\n },\n include: {\n attachments: true,\n annotations: true,\n student: {\n select: {\n id: true,\n username: true,\n profile: true,\n },\n },\n assignment: {\n include: {\n class: true,\n markScheme: {\n select: {\n id: true,\n structured: true,\n }\n },\n gradingBoundary: {\n select: {\n id: true,\n structured: true,\n }\n },\n worksheets: {\n select: {\n id: true,\n name: true,\n }\n }\n },\n },\n },\n });\n\n if (!submission) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Submission not found\",\n });\n }\n\n return {\n ...submission,\n late: submission.assignment.dueDate < new Date(),\n };\n }),\n\n updateSubmission: protectedClassMemberProcedure\n .input(submissionSchema)\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 { submissionId, submit, newAttachments, existingFileIds, removedAttachments, extendedResponse } = input;\n\n const submission = await prisma.submission.findFirst({\n where: {\n id: submissionId,\n OR: [\n {\n student: {\n id: ctx.user.id,\n },\n },\n {\n assignment: {\n class: {\n teachers: {\n some: {\n id: ctx.user.id,\n },\n },\n },\n },\n },\n ],\n },\n include: {\n attachments: {\n include: {\n thumbnail: true\n }\n },\n assignment: {\n include: {\n class: true,\n markScheme: {\n select: {\n id: true,\n structured: true,\n }\n },\n gradingBoundary: {\n select: {\n id: true,\n structured: true,\n }\n }\n },\n },\n },\n });\n\n if (!submission) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Submission not found\",\n });\n }\n\n if (submit !== undefined) {\n // Toggle submission status\n return await prisma.submission.update({\n where: { id: submission.id },\n data: {\n submitted: !submission.submitted,\n submittedAt: new Date(),\n },\n include: {\n attachments: true,\n student: {\n select: {\n id: true,\n username: true,\n },\n },\n assignment: {\n include: {\n class: true,\n markScheme: {\n select: {\n id: true,\n structured: true,\n }\n },\n gradingBoundary: {\n select: {\n id: true,\n structured: true,\n }\n }\n },\n },\n },\n });\n }\n\n let uploadedFiles: UploadedFile[] = [];\n if (newAttachments && newAttachments.length > 0) {\n // Store files in a class and assignment specific directory\n uploadedFiles = await createDirectUploadFiles(newAttachments, ctx.user.id, undefined, undefined, submission.id);\n }\n\n // Update submission with new file attachments\n if (uploadedFiles.length > 0) {\n await prisma.submission.update({\n where: { id: submission.id },\n data: {\n attachments: {\n create: uploadedFiles.map(file => ({\n name: file.name,\n type: file.type,\n size: file.size,\n path: file.path,\n ...(file.thumbnailId && {\n thumbnail: {\n connect: { id: file.thumbnailId }\n }\n })\n }))\n }\n }\n });\n }\n\n // Connect existing files if provided\n if (existingFileIds && existingFileIds.length > 0) {\n await prisma.submission.update({\n where: { id: submission.id },\n data: {\n attachments: {\n connect: existingFileIds.map(fileId => ({ id: fileId }))\n }\n }\n });\n }\n\n // Delete removed attachments if any\n if (removedAttachments && removedAttachments.length > 0) {\n const filesToDelete = submission.attachments.filter((file) =>\n removedAttachments.includes(file.id)\n );\n\n // Delete files from storage (only if they were actually uploaded)\n await Promise.all(filesToDelete.map(async (file) => {\n try {\n // Only delete from GCS if the file was successfully uploaded\n if (file.uploadStatus === 'COMPLETED') {\n // Delete the main file\n await deleteFile(file.path);\n\n // Delete thumbnail if it exists\n if (file.thumbnail?.path) {\n await deleteFile(file.thumbnail.path);\n }\n }\n } catch (error) {\n console.warn(`Failed to delete file ${file.path}:`, error);\n }\n }));\n }\n\n // Update submission with attachments\n return await prisma.submission.update({\n where: { id: submission.id },\n data: {\n ...(removedAttachments && removedAttachments.length > 0 && {\n attachments: {\n deleteMany: {\n id: { in: removedAttachments },\n },\n },\n }),\n ...(extendedResponse !== undefined && { extendedResponse }),\n },\n include: {\n attachments: {\n include: {\n thumbnail: true\n }\n },\n student: {\n select: {\n id: true,\n username: true,\n },\n },\n assignment: {\n include: {\n class: true,\n markScheme: {\n select: {\n id: true,\n structured: true,\n }\n },\n gradingBoundary: {\n select: {\n id: true,\n structured: true,\n }\n }\n },\n },\n },\n });\n }),\n\n getSubmissions: protectedTeacherProcedure\n .input(z.object({\n assignmentId: z.string(),\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 const { assignmentId } = input;\n\n const submissions = await prisma.submission.findMany({\n where: {\n assignment: {\n id: assignmentId,\n class: {\n teachers: {\n some: { id: ctx.user.id },\n },\n },\n },\n },\n include: {\n attachments: {\n include: {\n thumbnail: true\n }\n },\n student: {\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 assignment: {\n include: {\n class: true,\n markScheme: {\n select: {\n id: true,\n structured: true,\n }\n },\n gradingBoundary: {\n select: {\n id: true,\n structured: true,\n }\n }\n },\n },\n },\n });\n\n return submissions.map(submission => ({\n ...submission,\n late: submission.assignment.dueDate < new Date(),\n }));\n }),\n\n updateSubmissionAsTeacher: protectedTeacherProcedure\n .input(updateSubmissionSchema)\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 { submissionId, return: returnSubmission, gradeReceived, newAttachments, existingFileIds, removedAttachments, rubricGrades, feedback } = input;\n\n const submission = await prisma.submission.findFirst({\n where: {\n id: submissionId,\n assignment: {\n class: {\n teachers: {\n some: { id: ctx.user.id },\n },\n },\n },\n },\n include: {\n attachments: {\n include: {\n thumbnail: true\n }\n },\n annotations: {\n include: {\n thumbnail: true\n }\n },\n assignment: {\n include: {\n class: true,\n markScheme: {\n select: {\n id: true,\n structured: true,\n }\n },\n gradingBoundary: {\n select: {\n id: true,\n structured: true,\n }\n }\n },\n },\n },\n });\n\n if (!submission) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Submission not found\",\n });\n }\n\n if (returnSubmission !== undefined) {\n // Toggle return status\n return await prisma.submission.update({\n where: { id: submissionId },\n data: {\n returned: !submission.returned,\n },\n include: {\n attachments: true,\n student: {\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 assignment: {\n include: {\n class: true,\n markScheme: {\n select: {\n id: true,\n structured: true,\n }\n },\n gradingBoundary: {\n select: {\n id: true,\n structured: true,\n }\n }\n },\n },\n },\n });\n }\n\n // NOTE: Teacher annotation files are now handled via direct upload endpoints\n // Use getAnnotationUploadUrls and confirmAnnotationUpload endpoints instead\n // The newAttachments field is deprecated for annotations\n if (newAttachments && newAttachments.length > 0) {\n throw new TRPCError({\n code: \"BAD_REQUEST\",\n message: \"Direct file upload is deprecated. Use getAnnotationUploadUrls endpoint instead.\",\n });\n }\n\n // Connect existing files if provided\n if (existingFileIds && existingFileIds.length > 0) {\n await prisma.submission.update({\n where: { id: submission.id },\n data: {\n annotations: {\n connect: existingFileIds.map(fileId => ({ id: fileId }))\n }\n }\n });\n }\n\n // Delete removed attachments if any\n if (removedAttachments && removedAttachments.length > 0) {\n const filesToDelete = submission.annotations.filter((file) =>\n removedAttachments.includes(file.id)\n );\n\n // Delete files from storage (only if they were actually uploaded)\n await Promise.all(filesToDelete.map(async (file) => {\n try {\n // Only delete from GCS if the file was successfully uploaded\n if (file.uploadStatus === 'COMPLETED') {\n // Delete the main file\n await deleteFile(file.path);\n\n // Delete thumbnail if it exists\n if (file.thumbnail?.path) {\n await deleteFile(file.thumbnail.path);\n }\n }\n } catch (error) {\n console.warn(`Failed to delete file ${file.path}:`, error);\n }\n }));\n }\n\n // Update submission with grade and attachments\n return await prisma.submission.update({\n where: { id: submissionId },\n data: {\n ...(gradeReceived !== undefined && { gradeReceived }),\n ...(rubricGrades && { rubricState: JSON.stringify(rubricGrades) }),\n ...(feedback && { teacherComments: feedback }),\n ...(removedAttachments && removedAttachments.length > 0 && {\n annotations: {\n deleteMany: {\n id: { in: removedAttachments },\n },\n },\n }),\n ...(returnSubmission as unknown as boolean && { returned: returnSubmission }),\n },\n include: {\n attachments: {\n include: {\n thumbnail: true\n }\n },\n annotations: {\n include: {\n thumbnail: true\n }\n },\n student: {\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 assignment: {\n include: {\n class: true,\n markScheme: {\n select: {\n id: true,\n structured: true,\n }\n },\n gradingBoundary: {\n select: {\n id: true,\n structured: true,\n }\n }\n },\n },\n },\n });\n }),\n\n attachToEvent: protectedTeacherProcedure\n .input(z.object({\n assignmentId: z.string(),\n eventId: 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 { assignmentId, eventId } = input;\n\n // Check if assignment exists and user is a teacher of the class\n const assignment = await prisma.assignment.findFirst({\n where: {\n id: assignmentId,\n class: {\n teachers: {\n some: { id: ctx.user.id },\n },\n },\n },\n include: {\n class: true,\n },\n });\n\n if (!assignment) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Assignment not found or you are not authorized\",\n });\n }\n\n // Check if event exists and belongs to the same class\n const event = await prisma.event.findFirst({\n where: {\n id: eventId,\n classId: assignment.classId,\n },\n });\n\n if (!event) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Event not found or does not belong to the same class\",\n });\n }\n\n // Attach assignment to event\n const updatedAssignment = await prisma.assignment.update({\n where: { id: assignmentId },\n data: {\n eventAttached: {\n connect: { id: eventId }\n }\n },\n include: {\n attachments: {\n select: {\n id: true,\n name: true,\n type: true,\n }\n },\n section: {\n select: {\n id: true,\n name: true\n }\n },\n teacher: {\n select: {\n id: true,\n username: true\n }\n },\n eventAttached: {\n select: {\n id: true,\n name: true,\n startTime: true,\n endTime: true,\n }\n }\n }\n });\n\n return { assignment: updatedAssignment };\n }),\n\n detachEvent: protectedTeacherProcedure\n .input(z.object({\n assignmentId: 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 { assignmentId } = input;\n\n // Check if assignment exists and user is a teacher of the class\n const assignment = await prisma.assignment.findFirst({\n where: {\n id: assignmentId,\n class: {\n teachers: {\n some: { id: ctx.user.id },\n },\n },\n },\n });\n\n if (!assignment) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Assignment not found or you are not authorized\",\n });\n }\n\n // Detach assignment from event\n const updatedAssignment = await prisma.assignment.update({\n where: { id: assignmentId },\n data: {\n eventAttached: {\n disconnect: true\n }\n },\n include: {\n attachments: {\n select: {\n id: true,\n name: true,\n type: true,\n }\n },\n section: {\n select: {\n id: true,\n name: true\n }\n },\n teacher: {\n select: {\n id: true,\n username: true\n }\n },\n eventAttached: {\n select: {\n id: true,\n name: true,\n startTime: true,\n endTime: true,\n }\n }\n }\n });\n\n return { assignment: updatedAssignment };\n }),\n\n getAvailableEvents: protectedTeacherProcedure\n .input(z.object({\n assignmentId: 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 const { assignmentId } = input;\n\n // Get the assignment to find the class\n const assignment = await prisma.assignment.findFirst({\n where: {\n id: assignmentId,\n class: {\n teachers: {\n some: { id: ctx.user.id },\n },\n },\n },\n select: { classId: true }\n });\n\n if (!assignment) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Assignment not found or you are not authorized\",\n });\n }\n\n // Get all events for the class that don't already have this assignment attached\n const events = await prisma.event.findMany({\n where: {\n classId: assignment.classId,\n assignmentsAttached: {\n none: {\n id: assignmentId\n }\n }\n },\n select: {\n id: true,\n name: true,\n startTime: true,\n endTime: true,\n location: true,\n remarks: true,\n },\n orderBy: {\n startTime: 'asc'\n }\n });\n\n return { events };\n }),\n\n dueToday: protectedProcedure\n .query(async ({ ctx }) => {\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"User must be authenticated\",\n });\n }\n\n const assignments = await prisma.assignment.findMany({\n where: {\n dueDate: {\n equals: new Date(),\n },\n },\n select: {\n id: true,\n title: true,\n dueDate: true,\n type: true,\n graded: true,\n maxGrade: true,\n class: {\n select: {\n id: true,\n name: true,\n }\n }\n }\n });\n\n return assignments.map(assignment => ({\n ...assignment,\n dueDate: assignment.dueDate.toISOString(),\n }));\n }),\n attachMarkScheme: protectedTeacherProcedure\n .input(z.object({\n assignmentId: z.string(),\n markSchemeId: z.string().nullable(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { assignmentId, markSchemeId } = input;\n\n const assignment = await prisma.assignment.findFirst({\n where: {\n id: assignmentId,\n },\n });\n\n if (!assignment) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Assignment not found\",\n });\n }\n\n // If markSchemeId is provided, verify it exists\n if (markSchemeId) {\n const markScheme = await prisma.markScheme.findFirst({\n where: {\n id: markSchemeId,\n },\n });\n\n if (!markScheme) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Mark scheme not found\",\n });\n }\n }\n\n const updatedAssignment = await prisma.assignment.update({\n where: { id: assignmentId },\n data: {\n markScheme: markSchemeId ? {\n connect: { id: markSchemeId },\n } : {\n disconnect: true,\n },\n },\n include: {\n attachments: true,\n section: true,\n teacher: true,\n eventAttached: true,\n markScheme: true,\n },\n });\n\n return updatedAssignment;\n }),\n detachMarkScheme: protectedTeacherProcedure\n .input(z.object({\n assignmentId: z.string(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { assignmentId } = input;\n\n const assignment = await prisma.assignment.findFirst({\n where: {\n id: assignmentId,\n },\n });\n\n if (!assignment) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Assignment not found\",\n });\n }\n\n const updatedAssignment = await prisma.assignment.update({\n where: { id: assignmentId },\n data: {\n markScheme: {\n disconnect: true,\n },\n },\n include: {\n attachments: true,\n section: true,\n teacher: true,\n eventAttached: true,\n markScheme: true,\n },\n });\n\n return updatedAssignment;\n }),\n attachGradingBoundary: protectedTeacherProcedure\n .input(z.object({\n assignmentId: z.string(),\n gradingBoundaryId: z.string().nullable(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { assignmentId, gradingBoundaryId } = input;\n\n const assignment = await prisma.assignment.findFirst({\n where: {\n id: assignmentId,\n },\n });\n\n if (!assignment) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Assignment not found\",\n });\n }\n\n // If gradingBoundaryId is provided, verify it exists\n if (gradingBoundaryId) {\n const gradingBoundary = await prisma.gradingBoundary.findFirst({\n where: {\n id: gradingBoundaryId,\n },\n });\n\n if (!gradingBoundary) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Grading boundary not found\",\n });\n }\n }\n\n const updatedAssignment = await prisma.assignment.update({\n where: { id: assignmentId },\n data: {\n gradingBoundary: gradingBoundaryId ? {\n connect: { id: gradingBoundaryId },\n } : {\n disconnect: true,\n },\n },\n include: {\n attachments: true,\n section: true,\n teacher: true,\n eventAttached: true,\n gradingBoundary: true,\n },\n });\n\n return updatedAssignment;\n }),\n detachGradingBoundary: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n assignmentId: z.string(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { assignmentId } = input;\n\n const assignment = await prisma.assignment.findFirst({\n where: {\n id: assignmentId,\n },\n });\n\n if (!assignment) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Assignment not found\",\n });\n }\n\n const updatedAssignment = await prisma.assignment.update({\n where: { id: assignmentId },\n data: {\n gradingBoundary: {\n disconnect: true,\n },\n },\n include: {\n attachments: true,\n section: true,\n teacher: true,\n eventAttached: true,\n gradingBoundary: true,\n },\n });\n\n return updatedAssignment;\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 },\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\n if (!isStudent && !isTeacher) {\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\n"],"names":[],"mappings":"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","debug_id":"30094775-041d-5db4-bce9-b3ae2b873b73"}
@@ -1 +1 @@
1
- {"version":3,"file":"attendance.d.ts","sourceRoot":"","sources":["../../src/routers/attendance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAYxB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+S3B,CAAC"}
1
+ {"version":3,"file":"attendance.d.ts","sourceRoot":"/","sources":["routers/attendance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAYxB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+S3B,CAAC"}
@@ -1,3 +1,5 @@
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]="ce2d9e44-026e-5dd6-b4dd-ee6d4ff41a9e")}catch(e){}}();
1
3
  import { z } from "zod";
2
4
  import { createTRPCRouter, protectedProcedure } from "../trpc.js";
3
5
  import { TRPCError } from "@trpc/server";
@@ -296,3 +298,5 @@ export const attendanceRouter = createTRPCRouter({
296
298
  return attendance;
297
299
  }),
298
300
  });
301
+ //# sourceMappingURL=attendance.js.map
302
+ //# debugId=ce2d9e44-026e-5dd6-b4dd-ee6d4ff41a9e
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attendance.js","sources":["routers/attendance.ts"],"sourceRoot":"/","sourcesContent":["import { z } from \"zod\";\nimport { createTRPCRouter, protectedProcedure } from \"../trpc.js\";\nimport { TRPCError } from \"@trpc/server\";\nimport { prisma } from \"../lib/prisma.js\";\n\nconst attendanceSchema = z.object({\n eventId: z.string().optional(),\n present: z.array(z.object({ id: z.string(), username: z.string() })),\n late: z.array(z.object({ id: z.string(), username: z.string() })),\n absent: z.array(z.object({ id: z.string(), username: z.string() })),\n});\n\nexport const attendanceRouter = createTRPCRouter({\n get: protectedProcedure\n .input(z.object({\n classId: z.string(),\n eventId: z.string().optional(),\n }))\n .query(async ({ ctx, input }) => {\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"You must be logged in to view attendance\",\n });\n }\n\n // Check if user is a teacher or student of the class\n const classData = await prisma.class.findUnique({\n where: {\n id: input.classId,\n OR: [\n {\n teachers: {\n some: {\n id: ctx.user.id,\n },\n },\n },\n {\n students: {\n some: {\n id: ctx.user.id,\n },\n },\n },\n ],\n },\n select: {\n students: {\n select: {\n id: true,\n username: true,\n profile: {\n select: {\n displayName: true,\n profilePicture: true,\n profilePictureThumbnail: true,\n bio: true,\n location: true,\n website: true,\n },\n },\n },\n },\n },\n });\n\n if (!classData) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"You are not authorized to view this class's attendance\",\n });\n }\n\n // check each event has an attendance, if not create one\n const events = await prisma.event.findMany({\n where: {\n classId: input.classId,\n },\n });\n \n for (const event of events) {\n const attendance = await prisma.attendance.findFirst({\n where: {\n eventId: event.id,\n },\n });\n \n if (!attendance) {\n await prisma.attendance.create({\n data: {\n event: {\n connect: {\n id: event.id,\n },\n },\n class: {\n connect: {\n id: input.classId,\n },\n },\n present: {\n connect: classData.students.map(student => ({ id: student.id })),\n },\n },\n });\n }\n }\n\n\n const attendance = await prisma.attendance.findMany({\n where: {\n classId: input.classId,\n ...(input.eventId ? { eventId: input.eventId } : {}),\n },\n include: {\n event: {\n select: {\n id: true,\n name: true,\n startTime: true,\n endTime: true,\n location: true,\n color: true,\n },\n },\n present: {\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 late: {\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 absent: {\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 date: \"desc\",\n },\n });\n\n return attendance;\n }),\n\n update: protectedProcedure\n .input(z.object({\n classId: z.string(),\n eventId: z.string().optional(),\n attendance: attendanceSchema,\n }))\n .mutation(async ({ ctx, input }) => {\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"You must be logged in to update attendance\",\n });\n }\n\n // Check if user is a teacher of the class\n const classData = await prisma.class.findUnique({\n where: {\n id: input.classId,\n teachers: {\n some: {\n id: ctx.user.id,\n },\n },\n },\n });\n\n if (!classData) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"You are not authorized to update this class's attendance\",\n });\n }\n\n // Check if attendance record exists\n const existingAttendance = await prisma.attendance.findFirst({\n where: {\n classId: input.classId,\n eventId: input.eventId,\n },\n });\n\n if (!existingAttendance) {\n // Create new attendance record\n const attendance = await prisma.attendance.create({\n data: {\n classId: input.classId,\n eventId: input.eventId,\n date: new Date(),\n present: {\n connect: input.attendance.present.map(student => ({ id: student.id })),\n },\n late: {\n connect: input.attendance.late.map(student => ({ id: student.id })),\n },\n absent: {\n connect: input.attendance.absent.map(student => ({ id: student.id })),\n },\n },\n include: {\n event: {\n select: {\n id: true,\n name: true,\n startTime: true,\n endTime: true,\n location: true,\n },\n },\n present: {\n select: {\n id: true,\n username: true,\n },\n },\n late: {\n select: {\n id: true,\n username: true,\n },\n },\n absent: {\n select: {\n id: true,\n username: true,\n },\n },\n },\n });\n\n return attendance;\n }\n\n // Update existing attendance record\n const attendance = await prisma.attendance.update({\n where: {\n id: existingAttendance.id,\n },\n data: {\n present: {\n set: input.attendance.present.map(student => ({ id: student.id })),\n },\n late: {\n set: input.attendance.late.map(student => ({ id: student.id })),\n },\n absent: {\n set: input.attendance.absent.map(student => ({ id: student.id })),\n },\n },\n include: {\n event: {\n select: {\n id: true,\n name: true,\n startTime: true,\n endTime: true,\n location: true,\n },\n },\n present: {\n select: {\n id: true,\n username: true,\n },\n },\n late: {\n select: {\n id: true,\n username: true,\n },\n },\n absent: {\n select: {\n id: true,\n username: true,\n },\n },\n },\n });\n\n return attendance;\n }),\n}); "],"names":[],"mappings":";;AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACpE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACjE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;CACpE,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,gBAAgB,CAAC;IAC/C,GAAG,EAAE,kBAAkB;SACpB,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QACd,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC/B,CAAC,CAAC;SACF,KAAK,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE;QAC9B,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,IAAI,SAAS,CAAC;gBAClB,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,0CAA0C;aACpD,CAAC,CAAC;QACL,CAAC;QAED,qDAAqD;QACrD,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;YAC9C,KAAK,EAAE;gBACL,EAAE,EAAE,KAAK,CAAC,OAAO;gBACjB,EAAE,EAAE;oBACF;wBACE,QAAQ,EAAE;4BACR,IAAI,EAAE;gCACJ,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE;6BAChB;yBACF;qBACF;oBACD;wBACE,QAAQ,EAAE;4BACR,IAAI,EAAE;gCACJ,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE;6BAChB;yBACF;qBACF;iBACF;aACF;YACD,MAAM,EAAE;gBACN,QAAQ,EAAE;oBACR,MAAM,EAAE;wBACN,EAAE,EAAE,IAAI;wBACR,QAAQ,EAAE,IAAI;wBACd,OAAO,EAAE;4BACP,MAAM,EAAE;gCACN,WAAW,EAAE,IAAI;gCACjB,cAAc,EAAE,IAAI;gCACpB,uBAAuB,EAAE,IAAI;gCAC7B,GAAG,EAAE,IAAI;gCACT,QAAQ,EAAE,IAAI;gCACd,OAAO,EAAE,IAAI;6BACd;yBACF;qBACF;iBACF;aACF;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,SAAS,CAAC;gBAClB,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,wDAAwD;aAClE,CAAC,CAAC;QACL,CAAC;QAED,wDAAwD;QACxD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;YACzC,KAAK,EAAE;gBACL,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB;SACF,CAAC,CAAC;QAEH,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC;gBACnD,KAAK,EAAE;oBACL,OAAO,EAAE,KAAK,CAAC,EAAE;iBAClB;aACF,CAAC,CAAC;YAEH,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC;oBAC7B,IAAI,EAAE;wBACJ,KAAK,EAAE;4BACL,OAAO,EAAE;gCACP,EAAE,EAAE,KAAK,CAAC,EAAE;6BACb;yBACF;wBACD,KAAK,EAAE;4BACL,OAAO,EAAE;gCACP,EAAE,EAAE,KAAK,CAAC,OAAO;6BAClB;yBACF;wBACD,OAAO,EAAE;4BACP,OAAO,EAAE,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;yBACjE;qBACF;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAGD,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC;YAClD,KAAK,EAAE;gBACL,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACrD;YACD,OAAO,EAAE;gBACP,KAAK,EAAE;oBACL,MAAM,EAAE;wBACN,EAAE,EAAE,IAAI;wBACR,IAAI,EAAE,IAAI;wBACV,SAAS,EAAE,IAAI;wBACf,OAAO,EAAE,IAAI;wBACb,QAAQ,EAAE,IAAI;wBACd,KAAK,EAAE,IAAI;qBACZ;iBACF;gBACD,OAAO,EAAE;oBACP,MAAM,EAAE;wBACN,EAAE,EAAE,IAAI;wBACR,QAAQ,EAAE,IAAI;wBACd,OAAO,EAAE;4BACP,MAAM,EAAE;gCACN,WAAW,EAAE,IAAI;gCACjB,cAAc,EAAE,IAAI;gCACpB,uBAAuB,EAAE,IAAI;6BAC9B;yBACF;qBACF;iBACF;gBACD,IAAI,EAAE;oBACJ,MAAM,EAAE;wBACN,EAAE,EAAE,IAAI;wBACR,QAAQ,EAAE,IAAI;wBACd,OAAO,EAAE;4BACP,MAAM,EAAE;gCACN,WAAW,EAAE,IAAI;gCACjB,cAAc,EAAE,IAAI;gCACpB,uBAAuB,EAAE,IAAI;6BAC9B;yBACF;qBACF;iBACF;gBACD,MAAM,EAAE;oBACN,MAAM,EAAE;wBACN,EAAE,EAAE,IAAI;wBACR,QAAQ,EAAE,IAAI;wBACd,OAAO,EAAE;4BACP,MAAM,EAAE;gCACN,WAAW,EAAE,IAAI;gCACjB,cAAc,EAAE,IAAI;gCACpB,uBAAuB,EAAE,IAAI;6BAC9B;yBACF;qBACF;iBACF;aACF;YACD,OAAO,EAAE;gBACP,IAAI,EAAE,MAAM;aACb;SACF,CAAC,CAAC;QAEH,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC;IAEJ,MAAM,EAAE,kBAAkB;SACvB,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QACd,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC9B,UAAU,EAAE,gBAAgB;KAC7B,CAAC,CAAC;SACF,QAAQ,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE;QACjC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,IAAI,SAAS,CAAC;gBAClB,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,4CAA4C;aACtD,CAAC,CAAC;QACL,CAAC;QAED,0CAA0C;QAC1C,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;YAC9C,KAAK,EAAE;gBACL,EAAE,EAAE,KAAK,CAAC,OAAO;gBACjB,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,cAAc;gBACpB,OAAO,EAAE,0DAA0D;aACpE,CAAC,CAAC;QACL,CAAC;QAED,oCAAoC;QACpC,MAAM,kBAAkB,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC;YAC3D,KAAK,EAAE;gBACL,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACxB,+BAA+B;YAC/B,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC;gBAChD,IAAI,EAAE;oBACJ,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,IAAI,EAAE,IAAI,IAAI,EAAE;oBAChB,OAAO,EAAE;wBACP,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;qBACvE;oBACD,IAAI,EAAE;wBACJ,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;qBACpE;oBACD,MAAM,EAAE;wBACN,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;qBACtE;iBACF;gBACD,OAAO,EAAE;oBACP,KAAK,EAAE;wBACL,MAAM,EAAE;4BACN,EAAE,EAAE,IAAI;4BACR,IAAI,EAAE,IAAI;4BACV,SAAS,EAAE,IAAI;4BACf,OAAO,EAAE,IAAI;4BACb,QAAQ,EAAE,IAAI;yBACf;qBACF;oBACD,OAAO,EAAE;wBACP,MAAM,EAAE;4BACN,EAAE,EAAE,IAAI;4BACR,QAAQ,EAAE,IAAI;yBACf;qBACF;oBACD,IAAI,EAAE;wBACJ,MAAM,EAAE;4BACN,EAAE,EAAE,IAAI;4BACR,QAAQ,EAAE,IAAI;yBACf;qBACF;oBACD,MAAM,EAAE;wBACN,MAAM,EAAE;4BACN,EAAE,EAAE,IAAI;4BACR,QAAQ,EAAE,IAAI;yBACf;qBACF;iBACF;aACF,CAAC,CAAC;YAEH,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,oCAAoC;QACpC,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC;YAChD,KAAK,EAAE;gBACL,EAAE,EAAE,kBAAkB,CAAC,EAAE;aAC1B;YACD,IAAI,EAAE;gBACJ,OAAO,EAAE;oBACP,GAAG,EAAE,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;iBACnE;gBACD,IAAI,EAAE;oBACJ,GAAG,EAAE,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;iBAChE;gBACD,MAAM,EAAE;oBACN,GAAG,EAAE,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;iBAClE;aACF;YACD,OAAO,EAAE;gBACP,KAAK,EAAE;oBACL,MAAM,EAAE;wBACN,EAAE,EAAE,IAAI;wBACR,IAAI,EAAE,IAAI;wBACV,SAAS,EAAE,IAAI;wBACf,OAAO,EAAE,IAAI;wBACb,QAAQ,EAAE,IAAI;qBACf;iBACF;gBACD,OAAO,EAAE;oBACP,MAAM,EAAE;wBACN,EAAE,EAAE,IAAI;wBACR,QAAQ,EAAE,IAAI;qBACf;iBACF;gBACD,IAAI,EAAE;oBACJ,MAAM,EAAE;wBACN,EAAE,EAAE,IAAI;wBACR,QAAQ,EAAE,IAAI;qBACf;iBACF;gBACD,MAAM,EAAE;oBACN,MAAM,EAAE;wBACN,EAAE,EAAE,IAAI;wBACR,QAAQ,EAAE,IAAI;qBACf;iBACF;aACF;SACF,CAAC,CAAC;QAEH,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC;CACL,CAAC,CAAC","debug_id":"ce2d9e44-026e-5dd6-b4dd-ee6d4ff41a9e"}
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/routers/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAwBxB,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkTrB,CAAC"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"/","sources":["routers/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAwBxB,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkTrB,CAAC"}
@@ -1,3 +1,5 @@
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]="7c7b7319-88a0-5018-a81e-1b898acd6080")}catch(e){}}();
1
3
  import { z } from "zod";
2
4
  import { createTRPCRouter, protectedProcedure, publicProcedure } from "../trpc.js";
3
5
  import { TRPCError } from "@trpc/server";
@@ -276,3 +278,5 @@ export const authRouter = createTRPCRouter({
276
278
  return { success: true };
277
279
  }),
278
280
  });
281
+ //# sourceMappingURL=auth.js.map
282
+ //# debugId=7c7b7319-88a0-5018-a81e-1b898acd6080
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sources":["routers/auth.ts"],"sourceRoot":"/","sourcesContent":["import { z } from \"zod\";\nimport { createTRPCRouter, protectedProcedure, publicProcedure } from \"../trpc.js\";\nimport { TRPCError } from \"@trpc/server\";\nimport { prisma } from \"../lib/prisma.js\";\nimport { v4 as uuidv4 } from 'uuid';\nimport { compare, hash } from \"bcryptjs\";\nimport { transport } from \"../utils/email.js\";\nimport { prismaWrapper } from \"../utils/prismaWrapper.js\";\n\nconst loginSchema = z.object({\n username: z.string(),\n password: z.string(),\n});\n\nconst registerSchema = z.object({\n username: z.string().min(3, \"Username must be at least 3 characters\"),\n email: z.string().email(\"Invalid email address\"),\n password: z.string().min(6, \"Password must be at least 6 characters\"),\n confirmPassword: z.string(),\n}).refine((data) => data.password === data.confirmPassword, {\n message: \"Passwords don't match\",\n path: [\"confirmPassword\"],\n});\n\nexport const authRouter = createTRPCRouter({\n register: publicProcedure\n .input(registerSchema)\n .mutation(async ({ input }) => {\n const { username, email, password } = input;\n\n // Check if username already exists\n const existingUser = await prismaWrapper.findFirst(\n () => prisma.user.findFirst({\n where: { \n OR: [\n { username },\n { email }\n ]\n },\n select: {\n id: true,\n username: true,\n email: true,\n verified: true,\n }\n }),\n 'checking for existing user during registration'\n );\n\n if (existingUser && existingUser.verified) {\n if (existingUser.username === username) {\n throw new TRPCError({\n code: \"CONFLICT\",\n message: \"Username already exists\",\n });\n }\n if (existingUser.email === email) {\n throw new TRPCError({\n code: \"CONFLICT\",\n message: \"Email already exists\",\n });\n }\n } else if (existingUser && !existingUser.verified) {\n await prismaWrapper.deleteMany(\n () => prisma.session.deleteMany({\n where: { userId: existingUser.id },\n }),\n 'deleting existing sessions for unverified user'\n );\n\n await prismaWrapper.delete(\n () => prisma.user.delete({\n where: { id: existingUser.id },\n }),\n 'deleting unverified user'\n );\n }\n\n // Create new user\n const user = await prismaWrapper.create(\n async () => await prisma.user.create({\n data: {\n username,\n email,\n password: await hash(password, 10),\n profile: {},\n verified: true, // temporary\n },\n select: {\n id: true,\n username: true,\n email: true,\n }\n }),\n 'creating new user during registration'\n );\n\n const verificationToken = await prismaWrapper.create(\n () => prisma.session.create({\n data: {\n id: uuidv4(),\n userId: user.id,\n expiresAt: new Date(Date.now() + 1000 * 60 * 60 * 24 * 30),\n },\n }),\n 'creating verification token'\n );\n\n // await transport.sendMail({\n // from: 'noreply@studious.sh',\n // to: user.email,\n // subject: 'Verify your email',\n // text: `Click the link to verify your email: ${process.env.NEXT_PUBLIC_APP_URL}/verify/${verificationToken.id}`,\n // });\n\n console.log(`${process.env.NEXT_PUBLIC_APP_URL}/verify/${verificationToken.id}`)\n\n return {\n user: {\n id: user.id,\n username: user.username,\n },\n };\n }),\n\n login: publicProcedure\n .input(loginSchema)\n .mutation(async ({ input }) => {\n const { username, password } = input;\n\n const user = await prisma.user.findFirst({\n where: { username },\n select: {\n id: true,\n username: true,\n password: true,\n email: true,\n verified: true,\n }\n });\n\n if (!user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"Invalid username or password\",\n });\n }\n\n if (!(await compare(password, user.password))) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"Invalid username or password\",\n });\n }\n\n if (!user.verified) {\n return {\n verified: false,\n user: {\n email: user.email,\n },\n }\n }\n\n // Create a new session\n const session = await prisma.session.create({\n data: {\n id: uuidv4(),\n userId: user.id,\n expiresAt: new Date(Date.now() + 1000 * 60 * 60 * 24 * 30),\n },\n });\n\n return {\n token: session.id,\n user: {\n id: user.id,\n username: user.username,\n },\n };\n }),\n\n logout: protectedProcedure\n .mutation(async ({ ctx }) => {\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"Not authenticated\",\n });\n }\n\n // Delete the current session\n await prisma.session.deleteMany({\n where: { userId: ctx.user.id },\n });\n\n return { success: true };\n }),\n\n\n check: protectedProcedure\n .query(async ({ ctx }) => {\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"Not authenticated\",\n });\n }\n\n const user = await prisma.user.findUnique({\n where: { id: ctx.user.id },\n select: {\n id: true,\n username: true,\n profile: {\n select: {\n displayName: true,\n bio: true,\n location: true,\n website: true,\n profilePicture: true,\n profilePictureThumbnail: true,\n },\n },\n }\n });\n\n if (!user) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"User not found\",\n });\n }\n\n return {user};\n }),\n resendVerificationEmail: publicProcedure\n .input(z.object({\n email: z.string().email(),\n }))\n .mutation(async ({ input }) => {\n const { email } = input;\n\n const user = await prisma.user.findFirst({\n where: { \n email,\n },\n select: {\n id: true,\n email: true,\n role: true,\n profile: {\n select: {\n displayName: true,\n bio: true,\n location: true,\n website: true,\n profilePicture: true,\n },\n },\n },\n });\n\n if (!user) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"User not found\",\n });\n }\n\n await prisma.session.deleteMany({\n where: { userId: user?.id },\n });\n\n const verificationToken = await prisma.session.create({\n data: {\n id: uuidv4(),\n userId: user.id,\n expiresAt: new Date(Date.now() + 1000 * 60 * 60 * 24 * 30),\n },\n });\n \n // await transport.sendMail({\n // from: 'noreply@studious.sh',\n // to: user.email,\n // subject: 'Verify your email',\n // text: `Click the link to verify your email: ${process.env.NEXT_PUBLIC_APP_URL}/verify/${verificationToken.id}`,\n // });\n\n return { success: true };\n }),\n verify: publicProcedure\n .input(z.object({\n token: z.string(),\n }))\n .mutation(async ({ input }) => {\n const { token } = input;\n\n const session = await prisma.session.findUnique({\n where: { id: token },\n });\n\n if (!session) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Session not found\",\n });\n }\n\n if (session.expiresAt && session.expiresAt < new Date()) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"Session expired\",\n });\n }\n\n await prisma.user.update({\n where: { id: session.userId! },\n data: {\n verified: true,\n },\n });\n\n // Clean up the verification token\n await prisma.session.delete({\n where: { id: token },\n });\n\n return { success: true };\n }),\n}); "],"names":[],"mappings":"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","debug_id":"7c7b7319-88a0-5018-a81e-1b898acd6080"}
@@ -1 +1 @@
1
- {"version":3,"file":"class.d.ts","sourceRoot":"","sources":["../../src/routers/class.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwnCtB,CAAC"}
1
+ {"version":3,"file":"class.d.ts","sourceRoot":"/","sources":["routers/class.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwnCtB,CAAC"}
@@ -1,3 +1,5 @@
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]="e1b81886-864f-565b-bfd4-84d4f7de1529")}catch(e){}}();
1
3
  import { z } from "zod";
2
4
  import { createTRPCRouter, protectedProcedure, protectedTeacherProcedure, protectedClassMemberProcedure } from "../trpc.js";
3
5
  import { prisma } from "../lib/prisma.js";
@@ -1062,3 +1064,5 @@ export const classRouter = createTRPCRouter({
1062
1064
  return organizedFiles;
1063
1065
  }),
1064
1066
  });
1067
+ //# sourceMappingURL=class.js.map
1068
+ //# debugId=e1b81886-864f-565b-bfd4-84d4f7de1529