@studious-lms/server 1.2.44 → 1.2.46

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 (234) hide show
  1. package/.env.example +45 -0
  2. package/.env.test.example +37 -0
  3. package/README.md +34 -7
  4. package/coverage/base.css +224 -0
  5. package/coverage/block-navigation.js +87 -0
  6. package/coverage/clover.xml +12110 -0
  7. package/coverage/coverage-final.json +44 -0
  8. package/coverage/favicon.png +0 -0
  9. package/coverage/index.html +221 -0
  10. package/coverage/prettify.css +1 -0
  11. package/coverage/prettify.js +2 -0
  12. package/coverage/server/index.html +116 -0
  13. package/coverage/server/src/exportType.ts.html +109 -0
  14. package/coverage/server/src/index.html +161 -0
  15. package/coverage/server/src/index.ts.html +1702 -0
  16. package/coverage/server/src/instrument.ts.html +130 -0
  17. package/coverage/server/src/lib/config/env.ts.html +448 -0
  18. package/coverage/server/src/lib/config/index.html +116 -0
  19. package/coverage/server/src/lib/fileUpload.ts.html +1138 -0
  20. package/coverage/server/src/lib/googleCloudStorage.ts.html +334 -0
  21. package/coverage/server/src/lib/index.html +206 -0
  22. package/coverage/server/src/lib/jsonConversion.ts.html +2323 -0
  23. package/coverage/server/src/lib/jsonStyles.ts.html +193 -0
  24. package/coverage/server/src/lib/notificationHandler.ts.html +193 -0
  25. package/coverage/server/src/lib/pusher.ts.html +121 -0
  26. package/coverage/server/src/lib/thumbnailGenerator.ts.html +592 -0
  27. package/coverage/server/src/middleware/auth.ts.html +646 -0
  28. package/coverage/server/src/middleware/index.html +146 -0
  29. package/coverage/server/src/middleware/logging.ts.html +244 -0
  30. package/coverage/server/src/middleware/security.ts.html +271 -0
  31. package/coverage/server/src/routers/_app.ts.html +232 -0
  32. package/coverage/server/src/routers/agenda.ts.html +319 -0
  33. package/coverage/server/src/routers/announcement.ts.html +3481 -0
  34. package/coverage/server/src/routers/assignment.ts.html +7633 -0
  35. package/coverage/server/src/routers/attendance.ts.html +1030 -0
  36. package/coverage/server/src/routers/auth.ts.html +1081 -0
  37. package/coverage/server/src/routers/class.ts.html +3535 -0
  38. package/coverage/server/src/routers/comment.ts.html +991 -0
  39. package/coverage/server/src/routers/conversation.ts.html +982 -0
  40. package/coverage/server/src/routers/event.ts.html +1609 -0
  41. package/coverage/server/src/routers/file.ts.html +1144 -0
  42. package/coverage/server/src/routers/folder.ts.html +2797 -0
  43. package/coverage/server/src/routers/index.html +386 -0
  44. package/coverage/server/src/routers/labChat.ts.html +3073 -0
  45. package/coverage/server/src/routers/marketing.ts.html +340 -0
  46. package/coverage/server/src/routers/message.ts.html +1912 -0
  47. package/coverage/server/src/routers/notifications.ts.html +364 -0
  48. package/coverage/server/src/routers/section.ts.html +1120 -0
  49. package/coverage/server/src/routers/user.ts.html +862 -0
  50. package/coverage/server/src/routers/worksheet.ts.html +1729 -0
  51. package/coverage/server/src/trpc.ts.html +397 -0
  52. package/coverage/server/src/types/index.html +116 -0
  53. package/coverage/server/src/types/trpc.ts.html +127 -0
  54. package/coverage/server/src/utils/aiUser.ts.html +280 -0
  55. package/coverage/server/src/utils/email.ts.html +121 -0
  56. package/coverage/server/src/utils/generateInviteCode.ts.html +106 -0
  57. package/coverage/server/src/utils/index.html +206 -0
  58. package/coverage/server/src/utils/inference.ts.html +709 -0
  59. package/coverage/server/src/utils/logger.ts.html +664 -0
  60. package/coverage/server/src/utils/prismaErrorHandler.ts.html +907 -0
  61. package/coverage/server/src/utils/prismaWrapper.ts.html +355 -0
  62. package/coverage/server/vitest.config.ts.html +196 -0
  63. package/coverage/sort-arrow-sprite.png +0 -0
  64. package/coverage/sorter.js +210 -0
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +83 -52
  67. package/dist/index.js.map +1 -1
  68. package/dist/instrument.js +15 -8
  69. package/dist/instrument.js.map +1 -1
  70. package/dist/lib/config/env.d.ts +169 -0
  71. package/dist/lib/config/env.d.ts.map +1 -0
  72. package/dist/lib/config/env.js +115 -0
  73. package/dist/lib/config/env.js.map +1 -0
  74. package/dist/lib/fileUpload.d.ts.map +1 -1
  75. package/dist/lib/fileUpload.js +5 -4
  76. package/dist/lib/fileUpload.js.map +1 -1
  77. package/dist/lib/googleCloudStorage.d.ts.map +1 -1
  78. package/dist/lib/googleCloudStorage.js +7 -8
  79. package/dist/lib/googleCloudStorage.js.map +1 -1
  80. package/dist/lib/jsonConversion.d.ts.map +1 -1
  81. package/dist/lib/jsonConversion.js +14 -16
  82. package/dist/lib/jsonConversion.js.map +1 -1
  83. package/dist/lib/notificationHandler.d.ts +2 -2
  84. package/dist/lib/prisma.d.ts +2 -2
  85. package/dist/lib/prisma.d.ts.map +1 -1
  86. package/dist/lib/prisma.js +22 -3
  87. package/dist/lib/prisma.js.map +1 -1
  88. package/dist/lib/pusher.d.ts.map +1 -1
  89. package/dist/lib/pusher.js +8 -7
  90. package/dist/lib/pusher.js.map +1 -1
  91. package/dist/middleware/auth.d.ts.map +1 -1
  92. package/dist/middleware/auth.js +6 -5
  93. package/dist/middleware/auth.js.map +1 -1
  94. package/dist/middleware/security.d.ts +5 -0
  95. package/dist/middleware/security.d.ts.map +1 -0
  96. package/dist/middleware/security.js +77 -0
  97. package/dist/middleware/security.js.map +1 -0
  98. package/dist/routers/_app.d.ts +304 -98
  99. package/dist/routers/_app.d.ts.map +1 -1
  100. package/dist/routers/_app.js +4 -2
  101. package/dist/routers/_app.js.map +1 -1
  102. package/dist/routers/agenda.d.ts.map +1 -1
  103. package/dist/routers/agenda.js +12 -9
  104. package/dist/routers/agenda.js.map +1 -1
  105. package/dist/routers/announcement.d.ts +8 -0
  106. package/dist/routers/announcement.d.ts.map +1 -1
  107. package/dist/routers/announcement.js +6 -4
  108. package/dist/routers/announcement.js.map +1 -1
  109. package/dist/routers/assignment.d.ts +7 -4
  110. package/dist/routers/assignment.d.ts.map +1 -1
  111. package/dist/routers/assignment.js +35 -18
  112. package/dist/routers/assignment.js.map +1 -1
  113. package/dist/routers/attendance.d.ts +1 -0
  114. package/dist/routers/attendance.d.ts.map +1 -1
  115. package/dist/routers/attendance.js +4 -4
  116. package/dist/routers/attendance.js.map +1 -1
  117. package/dist/routers/auth.d.ts +20 -0
  118. package/dist/routers/auth.d.ts.map +1 -1
  119. package/dist/routers/auth.js +132 -15
  120. package/dist/routers/auth.js.map +1 -1
  121. package/dist/routers/class.d.ts +10 -0
  122. package/dist/routers/class.d.ts.map +1 -1
  123. package/dist/routers/class.js +49 -5
  124. package/dist/routers/class.js.map +1 -1
  125. package/dist/routers/comment.d.ts +7 -0
  126. package/dist/routers/comment.d.ts.map +1 -1
  127. package/dist/routers/comment.js +9 -2
  128. package/dist/routers/comment.js.map +1 -1
  129. package/dist/routers/conversation.d.ts +1 -0
  130. package/dist/routers/conversation.d.ts.map +1 -1
  131. package/dist/routers/conversation.js +46 -31
  132. package/dist/routers/conversation.js.map +1 -1
  133. package/dist/routers/file.d.ts.map +1 -1
  134. package/dist/routers/file.js +30 -7
  135. package/dist/routers/file.js.map +1 -1
  136. package/dist/routers/labChat.d.ts +1 -0
  137. package/dist/routers/labChat.d.ts.map +1 -1
  138. package/dist/routers/labChat.js +2 -3
  139. package/dist/routers/labChat.js.map +1 -1
  140. package/dist/routers/marketing.d.ts +1 -1
  141. package/dist/routers/newtonChat.d.ts +55 -0
  142. package/dist/routers/newtonChat.d.ts.map +1 -0
  143. package/dist/routers/newtonChat.js +438 -0
  144. package/dist/routers/newtonChat.js.map +1 -0
  145. package/dist/routers/notifications.d.ts +4 -4
  146. package/dist/routers/section.d.ts +9 -4
  147. package/dist/routers/section.d.ts.map +1 -1
  148. package/dist/routers/section.js +8 -8
  149. package/dist/routers/section.js.map +1 -1
  150. package/dist/routers/user.d.ts.map +1 -1
  151. package/dist/routers/user.js +5 -4
  152. package/dist/routers/user.js.map +1 -1
  153. package/dist/routers/worksheet.d.ts +30 -36
  154. package/dist/routers/worksheet.d.ts.map +1 -1
  155. package/dist/routers/worksheet.js +11 -33
  156. package/dist/routers/worksheet.js.map +1 -1
  157. package/dist/seedDatabase.d.ts +1 -1
  158. package/dist/seedDatabase.js +275 -284
  159. package/dist/seedDatabase.js.map +1 -1
  160. package/dist/server/pipelines/aiLabChat.d.ts +10 -0
  161. package/dist/server/pipelines/aiLabChat.d.ts.map +1 -0
  162. package/dist/server/pipelines/aiLabChat.js +83 -0
  163. package/dist/server/pipelines/aiLabChat.js.map +1 -0
  164. package/dist/server/pipelines/gradeWorksheet.d.ts +2 -0
  165. package/dist/server/pipelines/gradeWorksheet.d.ts.map +1 -0
  166. package/dist/server/pipelines/gradeWorksheet.js +138 -0
  167. package/dist/server/pipelines/gradeWorksheet.js.map +1 -0
  168. package/dist/trpc.d.ts.map +1 -1
  169. package/dist/trpc.js +2 -2
  170. package/dist/trpc.js.map +1 -1
  171. package/dist/utils/email.d.ts +9 -1
  172. package/dist/utils/email.d.ts.map +1 -1
  173. package/dist/utils/email.js +20 -5
  174. package/dist/utils/email.js.map +1 -1
  175. package/dist/utils/inference.d.ts +3 -0
  176. package/dist/utils/inference.d.ts.map +1 -1
  177. package/dist/utils/inference.js +41 -7
  178. package/dist/utils/inference.js.map +1 -1
  179. package/dist/utils/logger.d.ts.map +1 -1
  180. package/dist/utils/logger.js +3 -3
  181. package/dist/utils/logger.js.map +1 -1
  182. package/docker-compose.yml +14 -0
  183. package/package.json +13 -4
  184. package/prisma/schema.prisma +32 -5
  185. package/scripts/test-pre-push.ts +14 -0
  186. package/src/index.ts +98 -54
  187. package/src/instrument.ts +13 -6
  188. package/src/lib/config/env.ts +126 -0
  189. package/src/lib/fileUpload.ts +3 -2
  190. package/src/lib/googleCloudStorage.ts +6 -6
  191. package/src/lib/jsonConversion.ts +12 -14
  192. package/src/lib/prisma.ts +23 -2
  193. package/src/lib/pusher.ts +6 -5
  194. package/src/middleware/auth.ts +4 -3
  195. package/src/middleware/security.ts +80 -0
  196. package/src/routers/_app.ts +2 -0
  197. package/src/routers/agenda.ts +10 -7
  198. package/src/routers/announcement.ts +4 -2
  199. package/src/routers/assignment.ts +58 -40
  200. package/src/routers/attendance.ts +2 -2
  201. package/src/routers/auth.ts +143 -14
  202. package/src/routers/class.ts +52 -3
  203. package/src/routers/comment.ts +7 -0
  204. package/src/routers/conversation.ts +49 -29
  205. package/src/routers/file.ts +29 -5
  206. package/src/routers/labChat.ts +0 -1
  207. package/src/routers/newtonChat.ts +520 -0
  208. package/src/routers/section.ts +6 -6
  209. package/src/routers/user.ts +3 -2
  210. package/src/routers/worksheet.ts +9 -37
  211. package/src/seedDatabase.ts +290 -283
  212. package/src/server/pipelines/aiLabChat.ts +92 -0
  213. package/src/server/pipelines/gradeWorksheet.ts +152 -0
  214. package/src/trpc.ts +2 -0
  215. package/src/utils/email.ts +30 -3
  216. package/src/utils/inference.ts +50 -5
  217. package/src/utils/logger.ts +2 -1
  218. package/tests/announcement.test.ts +164 -0
  219. package/tests/assignment.test.ts +296 -0
  220. package/tests/attendance.test.ts +168 -0
  221. package/tests/auth.test.ts +33 -10
  222. package/tests/class.test.ts +34 -9
  223. package/tests/event.test.ts +228 -0
  224. package/tests/section.test.ts +216 -0
  225. package/tests/setup.ts +70 -16
  226. package/tests/user.test.ts +158 -0
  227. package/vitest.config.ts +26 -0
  228. package/API_SPECIFICATION.md +0 -1597
  229. package/BASE64_REMOVAL_SUMMARY.md +0 -164
  230. package/CHAT_API_SPEC.md +0 -579
  231. package/LAB_CHAT_API_SPEC.md +0 -518
  232. package/dist/routers/school.d.ts +0 -208
  233. package/dist/routers/school.d.ts.map +0 -1
  234. package/dist/routers/school.js +0 -483
@@ -1 +1 @@
1
- {"version":3,"file":"class.js","sources":["routers/class.ts"],"sourceRoot":"/","sourcesContent":["import { z } from \"zod\";\nimport { createTRPCRouter, protectedProcedure, protectedTeacherProcedure, protectedClassMemberProcedure } from \"../trpc.js\";\nimport { prisma } from \"../lib/prisma.js\";\nimport { TRPCError } from \"@trpc/server\";\nimport { generateInviteCode } from \"../utils/generateInviteCode.js\";\n\nexport const classRouter = createTRPCRouter({\n getAll: protectedProcedure\n \n .query(async ({ ctx }) => {\n const [teacherClasses, studentClasses] = await Promise.all([\n prisma.class.findMany({\n where: {\n teachers: {\n some: {\n id: ctx.user?.id,\n },\n },\n },\n include: {\n assignments: {\n where: {\n dueDate: {\n lte: new Date(new Date().setHours(23, 59, 59, 999)),\n },\n template: false,\n },\n select: {\n id: true,\n title: true,\n type: true,\n dueDate: true,\n },\n },\n },\n }),\n prisma.class.findMany({\n where: {\n students: {\n some: {\n id: ctx.user?.id,\n },\n },\n },\n include: {\n assignments: {\n where: {\n dueDate: { \n lte: new Date(new Date().setHours(23, 59, 59, 999)),\n },\n template: false,\n },\n select: {\n id: true,\n title: true,\n type: true,\n dueDate: true,\n },\n },\n },\n }),\n ]);\n\n return {\n teacherInClass: teacherClasses.map(cls => ({\n id: cls.id,\n name: cls.name,\n section: cls.section,\n subject: cls.subject,\n dueToday: cls.assignments,\n assignments: cls.assignments,\n color: cls.color,\n })),\n studentInClass: studentClasses.map(cls => ({\n id: cls.id,\n name: cls.name,\n section: cls.section,\n subject: cls.subject,\n dueToday: cls.assignments,\n assignments: cls.assignments,\n color: cls.color,\n })),\n };\n }),\n get: protectedProcedure\n .input(z.object({\n classId: z.string(),\n }))\n .query(async ({ ctx, input }) => {\n const { classId } = input;\n\n const isTeacher = await prisma.class.findFirst({\n where: {\n id: classId,\n teachers: {\n some: { id: ctx.user?.id },\n },\n },\n });\n\n const classData = await prisma.class.findUnique({\n where: {\n id: classId,\n },\n include: {\n teachers: {\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 students: {\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 announcements: {\n orderBy: {\n createdAt: 'desc',\n },\n select: {\n id: true,\n remarks: true,\n createdAt: true,\n modifiedAt: true,\n teacher: {\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 assignments: {\n ...(!isTeacher && {\n where: {OR: [\n {\n assignedTo: {\n some: {\n id: ctx.user?.id,\n },\n },\n },\n {\n assignedTo: {\n none: {},\n },\n },\n ],}\n }),\n select: {\n type: true,\n id: true,\n title: true,\n dueDate: true,\n createdAt: true,\n weight: true,\n order: true,\n graded: true,\n maxGrade: true,\n instructions: true,\n inProgress: true,\n template: false,\n section: {\n select: {\n id: true,\n name: 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 submissions: {\n ...(!isTeacher && {\n where: {\n studentId: ctx.user?.id,\n },\n }),\n select: {\n studentId: true,\n id: true,\n submitted: true,\n gradeReceived: true,\n rubricState: true,\n teacherComments: true,\n returned: true,\n submittedAt: true,\n },\n },\n },\n },\n },\n });\n\n\n if (!classData) {\n throw new Error('Class not found');\n }\n \n const formattedClassData = {\n ...classData,\n assignments: classData.assignments.map(assignment => ({\n ...assignment,\n late: assignment.dueDate < new Date(),\n submitted: assignment.submissions.find(submission => submission.studentId === ctx.user?.id)?.submitted,\n returned: assignment.submissions.find(submission => submission.studentId === ctx.user?.id)?.returned,\n })),\n }\n\n const sections = await prisma.section.findMany({\n where: {\n classId: classId,\n },\n });\n\n return {\n class: {\n ...formattedClassData,\n sections,\n },\n };\n }),\n update: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n name: z.string().optional(),\n section: z.string().optional(),\n subject: z.string().optional(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { classId, ...updateData } = input;\n \n const updatedClass = await prisma.class.update({\n where: {\n id: classId,\n },\n data: updateData,\n select: {\n id: true,\n name: true,\n section: true,\n subject: true,\n }\n });\n\n return {\n updatedClass,\n }\n }),\n create: protectedProcedure\n .input(z.object({\n students: z.array(z.string()).optional(),\n teachers: z.array(z.string()).optional(),\n name: z.string(),\n section: z.string(),\n subject: z.string(),\n color: z.string().optional(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { students, teachers, name, section, subject, color } = input;\n \n if (teachers && teachers.length > 0 && students && students.length > 0) {\n const newClass = await prisma.class.create({\n data: {\n name,\n section,\n subject,\n color,\n teachers: {\n connect: teachers.map(teacher => ({ id: teacher })),\n },\n students: {\n connect: students.map(student => ({ id: student })),\n },\n },\n include: {\n teachers: true,\n students: true,\n },\n });\n return newClass;\n }\n\n const newClass = await prisma.class.create({\n data: {\n name,\n section,\n subject,\n color,\n teachers: {\n connect: {\n id: ctx.user?.id,\n },\n },\n },\n });\n \n return newClass;\n }),\n delete: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n id: z.string(),\n }))\n .mutation(async ({ ctx, input }) => {\n // Verify user is the teacher of this class\n const classToDelete = await prisma.class.findFirst({\n where: {\n id: input.id,\n },\n });\n\n if (!classToDelete) {\n throw new Error(\"Class not found or you don't have permission to delete it\");\n }\n\n await prisma.class.delete({\n where: {\n id: input.id,\n },\n });\n\n return {\n deletedClass: {\n id: input.id,\n }\n }\n }),\n addStudent: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n studentId: z.string(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { classId, studentId } = input;\n\n const student = await prisma.user.findUnique({\n where: {\n id: studentId,\n },\n });\n\n if (!student) {\n throw new Error(\"Student not found\");\n }\n\n const updatedClass = await prisma.class.update({\n where: {\n id: classId,\n },\n data: {\n students: {\n connect: {\n id: studentId,\n },\n },\n },\n select: {\n id: true,\n name: true,\n section: true,\n subject: true,\n }\n });\n\n return {\n updatedClass,\n newStudent: student,\n }\n }),\n changeRole: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n userId: z.string(),\n type: z.enum(['teacher', 'student']),\n }))\n .mutation(async ({ ctx, input }) => {\n const { classId, userId, type } = input;\n\n const user = await prisma.user.findUnique({\n where: { id: userId },\n select: {\n id: true,\n username: true,\n },\n });\n\n if (!user) {\n throw new Error(\"User not found\");\n }\n\n const updatedClass = await prisma.class.update({\n where: { id: classId },\n data: {\n [type === 'teacher' ? 'teachers' : 'students']: {\n connect: { id: userId },\n },\n [type === 'teacher' ? 'students' : 'teachers']: {\n disconnect: { id: userId },\n },\n },\n });\n\n return {\n updatedClass,\n user: {\n ...user,\n type,\n },\n };\n }),\n removeMember: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n userId: z.string(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { classId, userId } = input;\n\n const updatedClass = await prisma.class.update({\n where: { id: classId },\n data: {\n teachers: {\n disconnect: { id: userId },\n },\n students: {\n disconnect: { id: userId },\n },\n },\n });\n\n return {\n updatedClass,\n removedUserId: userId,\n };\n }),\n join: protectedProcedure\n .input(z.object({\n classCode: z.string(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { classCode } = input;\n\n const session = await prisma.session.findFirst({\n where: {\n id: classCode,\n },\n });\n\n if (!session || !session.classId) {\n throw new Error(\"Class not found\");\n }\n\n if (session.expiresAt && session.expiresAt < new Date()) {\n throw new Error(\"Session expired\");\n }\n\n const updatedClass = await prisma.class.update({\n where: { id: session.classId },\n data: {\n students: {\n connect: { id: ctx.user?.id },\n },\n },\n select: {\n id: true,\n name: true,\n section: true,\n subject: true,\n },\n });\n\n return {\n joinedClass: updatedClass,\n }\n }),\n getInviteCode: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n }))\n .query(async ({ ctx, input }) => {\n const { classId } = input;\n\n const session = await prisma.session.findFirst({\n where: {\n classId,\n },\n });\n\n if ((session?.expiresAt && session.expiresAt < new Date()) || !session) {\n const newSession = await prisma.session.create({\n data: {\n id: generateInviteCode(),\n classId,\n expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000), // 24 hours from now\n }\n });\n return {\n code: newSession.id,\n }\n }\n\n return {\n code: session?.id,\n };\n }),\n createInviteCode: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { classId } = input;\n\n await prisma.session.deleteMany({\n where: {\n classId,\n },\n });\n\n // Create a new session for the invite code\n const session = await prisma.session.create({\n data: {\n id: generateInviteCode(),\n classId,\n expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000), // 24 hours from now\n }\n });\n\n return {\n code: session.id,\n };\n }),\n getGrades: protectedClassMemberProcedure\n .input(z.object({\n classId: z.string(),\n userId: z.string(),\n }))\n .query(async ({ ctx, input }) => {\n const { classId, userId } = input;\n\n const isTeacher = await prisma.class.findFirst({\n where: {\n id: classId,\n teachers: {\n some: { id: ctx.user?.id }\n }\n }\n });\n // If student, only allow viewing their own grades\n if (ctx.user?.id !== userId && !isTeacher) {\n throw new TRPCError({\n code: 'UNAUTHORIZED',\n message: 'You can only view your own grades',\n });\n }\n\n const grades = await prisma.submission.findMany({\n where: {\n studentId: userId,\n assignment: {\n classId: classId,\n graded: true\n }\n },\n include: {\n assignment: {\n select: {\n id: true,\n title: true,\n maxGrade: true,\n weight: true,\n markSchemeId: true,\n markScheme: {\n select: {\n structured: true,\n }\n },\n gradingBoundaryId: true,\n gradingBoundary: {\n select: {\n structured: true,\n }\n },\n }\n },\n }\n });\n\n return {\n grades,\n };\n }),\n updateGrade: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n assignmentId: z.string(),\n submissionId: z.string(),\n gradeReceived: z.number().nullable(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { classId, assignmentId, submissionId, gradeReceived } = input;\n\n // Update the grade\n const updatedSubmission = await prisma.submission.update({\n where: {\n id: submissionId,\n assignmentId: assignmentId,\n },\n data: {\n gradeReceived,\n },\n include: {\n assignment: {\n select: {\n id: true,\n title: true,\n maxGrade: true,\n weight: true,\n }\n }\n }\n });\n\n return updatedSubmission;\n }),\n getEvents: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n }))\n .query(async ({ ctx, input }) => {\n const { classId } = input;\n\n const events = await prisma.event.findMany({\n where: {\n class: {\n id: classId,\n }\n },\n select: {\n name: true,\n startTime: true,\n endTime: true,\n }\n });\n\n return events;\n }),\n listMarkSchemes: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n }))\n .query(async ({ ctx, input }) => {\n const { classId } = input;\n\n const markSchemes = await prisma.markScheme.findMany({\n where: {\n class: {\n id: classId,\n },\n },\n });\n\n return markSchemes;\n }),\n createMarkScheme: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n structure: z.string(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { classId, structure } = input;\n\n const validatedStructure = structure.replace(/\\\\n/g, '\\n');\n\n const markScheme = await prisma.markScheme.create({\n data: {\n class: {\n connect: {\n id: classId,\n },\n },\n structured: validatedStructure,\n },\n });\n\n return markScheme;\n }),\n updateMarkScheme: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n markSchemeId: z.string(),\n structure: z.string(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { classId, markSchemeId, structure } = input;\n\n const validatedStructure = structure.replace(/\\\\n/g, '\\n');\n\n const markScheme = await prisma.markScheme.update({\n where: { id: markSchemeId },\n data: {\n class: {\n connect: {\n id: classId,\n },\n },\n structured: validatedStructure,\n },\n });\n\n return markScheme;\n }),\n deleteMarkScheme: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n markSchemeId: z.string(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { classId, markSchemeId } = input;\n\n const markScheme = await prisma.markScheme.delete({\n where: { id: markSchemeId },\n });\n\n return markScheme;\n }),\n listGradingBoundaries: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n }))\n .query(async ({ ctx, input }) => {\n const { classId } = input;\n\n const gradingBoundaries = await prisma.gradingBoundary.findMany({\n where: {\n class: {\n id: classId,\n },\n },\n });\n\n return gradingBoundaries;\n }),\n createGradingBoundary: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n structure: z.string(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { classId, structure } = input;\n\n const validatedStructure = structure.replace(/\\\\n/g, '\\n');\n\n const gradingBoundary = await prisma.gradingBoundary.create({\n data: {\n class: {\n connect: {\n id: classId,\n },\n },\n structured: validatedStructure,\n },\n });\n\n return gradingBoundary;\n }),\n updateGradingBoundary: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n gradingBoundaryId: z.string(),\n structure: z.string(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { classId, gradingBoundaryId, structure } = input;\n\n const validatedStructure = structure.replace(/\\\\n/g, '\\n');\n\n const gradingBoundary = await prisma.gradingBoundary.update({\n where: { id: gradingBoundaryId },\n data: {\n class: {\n connect: {\n id: classId,\n },\n },\n structured: validatedStructure,\n },\n });\n\n return gradingBoundary;\n }),\n deleteGradingBoundary: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n gradingBoundaryId: z.string(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { classId, gradingBoundaryId } = input;\n\n const gradingBoundary = await prisma.gradingBoundary.delete({\n where: { id: gradingBoundaryId },\n });\n\n return gradingBoundary;\n }),\n getSyllabus: protectedClassMemberProcedure\n .input(z.object({\n classId: z.string(),\n }))\n .query(async ({input}) => {\n const {classId} = input;\n\n const syllabus = (await prisma.class.findUnique({\n where: {\n id: classId,\n },\n }))?.syllabus;\n\n const markSchemes = await prisma.markScheme.findMany({\n where: {\n classId,\n }\n });\n\n const gradingBoundaries = await prisma.gradingBoundary.findMany({\n where: {\n classId,\n }\n });\n\n return {syllabus, gradingBoundaries, markSchemes};\n }),\n updateSyllabus: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n contents: z.string(),\n }))\n .mutation(async ({ input }) => {\n const { contents, classId } = input;\n\n if (!contents) throw new TRPCError({\n code: 'BAD_REQUEST',\n message: \"Missing key contents\",\n });\n\n const updated = await prisma.class.update({\n where: {\n id: classId\n },\n data: {\n syllabus: contents,\n }\n });\n\n return updated;\n }),\n // Lab Management Endpoints (Assignment-based)\n listLabDrafts: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n }))\n .query(async ({ ctx, input }) => {\n const { classId } = input;\n\n const labDrafts = await prisma.assignment.findMany({\n where: {\n classId: classId,\n teacherId: ctx.user?.id,\n inProgress: true,\n },\n orderBy: {\n modifiedAt: 'desc',\n },\n });\n\n return labDrafts;\n }),\n createLabDraft: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n title: z.string(),\n type: z.enum(['LAB', 'HOMEWORK', 'QUIZ', 'TEST', 'PROJECT', 'ESSAY', 'DISCUSSION', 'PRESENTATION', 'OTHER']),\n instructions: z.string(),\n dueDate: z.date().optional(),\n maxGrade: z.number().optional(),\n weight: z.number().optional(),\n graded: z.boolean().optional(),\n sectionId: z.string().optional(),\n markSchemeId: z.string().optional(),\n gradingBoundaryId: z.string().optional(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { classId, ...draftData } = input;\n\n const labDraft = await prisma.assignment.create({\n data: {\n classId: classId,\n teacherId: ctx.user?.id!,\n inProgress: true,\n graded: draftData.graded ?? false,\n maxGrade: draftData.maxGrade ?? 0,\n weight: draftData.weight ?? 1,\n dueDate: draftData.dueDate || new Date(Date.now() + 7 * 24 * 60 * 60 * 1000), // Default 1 week from now\n title: draftData.title,\n instructions: draftData.instructions,\n type: draftData.type,\n ...(draftData.sectionId && { sectionId: draftData.sectionId }),\n ...(draftData.markSchemeId && { markSchemeId: draftData.markSchemeId }),\n ...(draftData.gradingBoundaryId && { gradingBoundaryId: draftData.gradingBoundaryId }),\n },\n });\n\n return labDraft;\n }),\n updateLabDraft: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n draftId: z.string(),\n title: z.string().optional(),\n instructions: z.string().optional(),\n dueDate: z.date().optional(),\n maxGrade: z.number().optional(),\n weight: z.number().optional(),\n graded: z.boolean().optional(),\n sectionId: z.string().optional(),\n markSchemeId: z.string().optional(),\n gradingBoundaryId: z.string().optional(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { classId, draftId, ...updateData } = input;\n\n const labDraft = await prisma.assignment.update({\n where: {\n id: draftId,\n classId: classId,\n teacherId: ctx.user?.id!,\n inProgress: true,\n },\n data: {\n ...(updateData.title && { title: updateData.title }),\n ...(updateData.instructions && { instructions: updateData.instructions }),\n ...(updateData.dueDate && { dueDate: updateData.dueDate }),\n ...(updateData.maxGrade !== undefined && { maxGrade: updateData.maxGrade }),\n ...(updateData.weight !== undefined && { weight: updateData.weight }),\n ...(updateData.graded !== undefined && { graded: updateData.graded }),\n ...(updateData.sectionId !== undefined && { sectionId: updateData.sectionId }),\n ...(updateData.markSchemeId !== undefined && { markSchemeId: updateData.markSchemeId }),\n ...(updateData.gradingBoundaryId !== undefined && { gradingBoundaryId: updateData.gradingBoundaryId }),\n modifiedAt: new Date(),\n },\n });\n\n return labDraft;\n }),\n deleteLabDraft: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n draftId: z.string(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { classId, draftId } = input;\n\n const labDraft = await prisma.assignment.delete({\n where: {\n id: draftId,\n classId: classId,\n teacherId: ctx.user?.id!,\n inProgress: true,\n },\n });\n\n return labDraft;\n }),\n publishLabDraft: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n draftId: z.string(),\n dueDate: z.date().optional(),\n maxGrade: z.number().optional(),\n weight: z.number().optional(),\n graded: z.boolean().optional(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { classId, draftId, ...publishData } = input;\n\n // Get the lab draft\n const labDraft = await prisma.assignment.findUnique({\n where: {\n id: draftId,\n classId: classId,\n teacherId: ctx.user?.id!,\n inProgress: true,\n },\n });\n\n if (!labDraft) {\n throw new TRPCError({\n code: 'NOT_FOUND',\n message: 'Lab draft not found',\n });\n }\n\n // Publish the draft by updating it to not be in progress\n const publishedAssignment = await prisma.assignment.update({\n where: { id: draftId },\n data: {\n inProgress: false,\n dueDate: publishData.dueDate || labDraft.dueDate,\n maxGrade: publishData.maxGrade || labDraft.maxGrade || 100,\n weight: publishData.weight || labDraft.weight || 1,\n graded: publishData.graded !== undefined ? publishData.graded : true,\n modifiedAt: new Date(),\n },\n });\n\n return publishedAssignment;\n }),\n getFiles: protectedClassMemberProcedure\n .input(z.object({\n classId: z.string(),\n }))\n .query(async ({ ctx, input }) => {\n const { classId } = input;\n\n // Get all assignments with their files and submissions\n const assignments = await prisma.assignment.findMany({\n where: {\n classId: classId,\n },\n include: {\n attachments: {\n select: {\n id: true,\n name: true,\n type: true,\n size: true,\n path: true,\n thumbnailId: true,\n uploadedAt: true,\n user: {\n select: {\n id: true,\n username: true,\n },\n },\n },\n },\n submissions: {\n include: {\n attachments: {\n select: {\n id: true,\n name: true,\n type: true,\n size: true,\n path: true,\n thumbnailId: true,\n uploadedAt: true,\n user: {\n select: {\n id: true,\n username: true,\n },\n },\n },\n },\n annotations: {\n select: {\n id: true,\n name: true,\n type: true,\n size: true,\n path: true,\n thumbnailId: true,\n uploadedAt: true,\n user: {\n select: {\n id: true,\n username: true,\n },\n },\n },\n },\n student: {\n select: {\n id: true,\n username: true,\n },\n },\n },\n },\n teacher: {\n select: {\n id: true,\n username: true,\n },\n },\n },\n orderBy: {\n createdAt: 'desc',\n },\n });\n\n // Organize files by assignment structure\n const organizedFiles = assignments.map(assignment => ({\n id: assignment.id,\n title: assignment.title,\n teacher: assignment.teacher,\n teacherAttachments: assignment.attachments,\n students: assignment.submissions.map(submission => ({\n id: submission.student.id,\n username: submission.student.username,\n attachments: submission.attachments,\n annotations: submission.annotations,\n })),\n }));\n\n return organizedFiles;\n }),\n});"],"names":[],"mappings":"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","debug_id":"e1b81886-864f-565b-bfd4-84d4f7de1529"}
1
+ {"version":3,"file":"class.js","sources":["routers/class.ts"],"sourceRoot":"/","sourcesContent":["import { z } from \"zod\";\nimport { createTRPCRouter, protectedProcedure, protectedTeacherProcedure, protectedClassMemberProcedure } from \"../trpc.js\";\nimport { prisma } from \"../lib/prisma.js\";\nimport { TRPCError } from \"@trpc/server\";\nimport { generateInviteCode } from \"../utils/generateInviteCode.js\";\n\nexport const classRouter = createTRPCRouter({\n getAll: protectedProcedure\n \n .query(async ({ ctx }) => {\n const [teacherClasses, studentClasses] = await Promise.all([\n prisma.class.findMany({\n where: {\n teachers: {\n some: {\n id: ctx.user?.id,\n },\n },\n },\n include: {\n assignments: {\n where: {\n dueDate: {\n lte: new Date(new Date().setHours(23, 59, 59, 999)),\n },\n template: false,\n },\n select: {\n id: true,\n title: true,\n type: true,\n dueDate: true,\n },\n },\n },\n }),\n prisma.class.findMany({\n where: {\n students: {\n some: {\n id: ctx.user?.id,\n },\n },\n },\n include: {\n assignments: {\n where: {\n dueDate: { \n lte: new Date(new Date().setHours(23, 59, 59, 999)),\n },\n template: false,\n },\n select: {\n id: true,\n title: true,\n type: true,\n dueDate: true,\n },\n },\n },\n }),\n ]);\n\n return {\n teacherInClass: teacherClasses.map(cls => ({\n id: cls.id,\n name: cls.name,\n section: cls.section,\n subject: cls.subject,\n dueToday: cls.assignments,\n assignments: cls.assignments,\n color: cls.color,\n })),\n studentInClass: studentClasses.map(cls => ({\n id: cls.id,\n name: cls.name,\n section: cls.section,\n subject: cls.subject,\n dueToday: cls.assignments,\n assignments: cls.assignments,\n color: cls.color,\n })),\n };\n }),\n get: protectedProcedure\n .input(z.object({\n classId: z.string(),\n }))\n .query(async ({ ctx, input }) => {\n const { classId } = input;\n\n const isTeacher = await prisma.class.findFirst({\n where: {\n id: classId,\n teachers: {\n some: { id: ctx.user?.id },\n },\n },\n });\n\n const classData = await prisma.class.findUnique({\n where: {\n id: classId,\n },\n include: {\n teachers: {\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 students: {\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 announcements: {\n orderBy: {\n createdAt: 'desc',\n },\n select: {\n id: true,\n remarks: true,\n createdAt: true,\n modifiedAt: true,\n teacher: {\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 assignments: {\n ...(!isTeacher && {\n where: {OR: [\n {\n assignedTo: {\n some: {\n id: ctx.user?.id,\n },\n },\n },\n {\n assignedTo: {\n none: {},\n },\n },\n ],}\n }),\n select: {\n type: true,\n id: true,\n title: true,\n dueDate: true,\n createdAt: true,\n weight: true,\n order: true,\n graded: true,\n maxGrade: true,\n instructions: true,\n inProgress: true,\n template: false,\n section: {\n select: {\n id: true,\n name: 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 submissions: {\n ...(!isTeacher && {\n where: {\n studentId: ctx.user?.id,\n },\n }),\n select: {\n studentId: true,\n id: true,\n submitted: true,\n gradeReceived: true,\n rubricState: true,\n teacherComments: true,\n returned: true,\n submittedAt: true,\n },\n },\n },\n },\n },\n });\n\n\n if (!classData) {\n throw new Error('Class not found');\n }\n \n const formattedClassData = {\n ...classData,\n assignments: classData.assignments.map(assignment => ({\n ...assignment,\n late: assignment.dueDate < new Date(),\n submitted: assignment.submissions.find(submission => submission.studentId === ctx.user?.id)?.submitted,\n returned: assignment.submissions.find(submission => submission.studentId === ctx.user?.id)?.returned,\n })),\n }\n\n const sections = await prisma.section.findMany({\n where: {\n classId: classId,\n },\n });\n\n return {\n class: {\n ...formattedClassData,\n sections,\n },\n };\n }),\n update: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n name: z.string().optional(),\n section: z.string().optional(),\n subject: z.string().optional(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { classId, ...updateData } = input;\n \n const updatedClass = await prisma.class.update({\n where: {\n id: classId,\n },\n data: updateData,\n select: {\n id: true,\n name: true,\n section: true,\n subject: true,\n }\n });\n\n return {\n updatedClass,\n }\n }),\n create: protectedProcedure\n .input(z.object({\n students: z.array(z.string()).optional(),\n teachers: z.array(z.string()).optional(),\n name: z.string(),\n section: z.string(),\n subject: z.string(),\n color: z.string().optional(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { students, teachers, name, section, subject, color } = input;\n \n if (teachers && teachers.length > 0 && students && students.length > 0) {\n const newClass = await prisma.class.create({\n data: {\n name,\n section,\n subject,\n color,\n teachers: {\n connect: teachers.map(teacher => ({ id: teacher })),\n },\n students: {\n connect: students.map(student => ({ id: student })),\n },\n },\n include: {\n teachers: true,\n students: true,\n },\n });\n return newClass;\n }\n\n const newClass = await prisma.class.create({\n data: {\n name,\n section,\n subject,\n color,\n teachers: {\n connect: {\n id: ctx.user?.id,\n },\n },\n },\n });\n \n return newClass;\n }),\n delete: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n id: z.string(),\n }))\n .mutation(async ({ ctx, input }) => {\n // Verify user is the teacher of this class\n const classToDelete = await prisma.class.findFirst({\n where: {\n id: input.id,\n },\n });\n\n if (!classToDelete) {\n throw new Error(\"Class not found or you don't have permission to delete it\");\n }\n\n await prisma.class.delete({\n where: {\n id: input.id,\n },\n });\n\n return {\n deletedClass: {\n id: input.id,\n }\n }\n }),\n addStudent: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n studentId: z.string(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { classId, studentId } = input;\n\n const student = await prisma.user.findUnique({\n where: {\n id: studentId,\n },\n });\n\n if (!student) {\n throw new Error(\"Student not found\");\n }\n\n const updatedClass = await prisma.class.update({\n where: {\n id: classId,\n },\n data: {\n students: {\n connect: {\n id: studentId,\n },\n },\n },\n select: {\n id: true,\n name: true,\n section: true,\n subject: true,\n }\n });\n\n return {\n updatedClass,\n newStudent: student,\n }\n }),\n changeRole: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n userId: z.string(),\n type: z.enum(['teacher', 'student']),\n }))\n .mutation(async ({ ctx, input }) => {\n const { classId, userId, type } = input;\n\n const user = await prisma.user.findUnique({\n where: { id: userId },\n select: {\n id: true,\n username: true,\n },\n });\n\n if (!user) {\n throw new Error(\"User not found\");\n }\n\n const updatedClass = await prisma.class.update({\n where: { id: classId },\n data: {\n [type === 'teacher' ? 'teachers' : 'students']: {\n connect: { id: userId },\n },\n [type === 'teacher' ? 'students' : 'teachers']: {\n disconnect: { id: userId },\n },\n },\n });\n\n return {\n updatedClass,\n user: {\n ...user,\n type,\n },\n };\n }),\n removeMember: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n userId: z.string(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { classId, userId } = input;\n\n const updatedClass = await prisma.class.update({\n where: { id: classId },\n data: {\n teachers: {\n disconnect: { id: userId },\n },\n students: {\n disconnect: { id: userId },\n },\n },\n });\n\n return {\n updatedClass,\n removedUserId: userId,\n };\n }),\n leaveClass: protectedProcedure\n .input(z.object({\n classId: z.string(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { classId } = input;\n const userId = ctx.user?.id;\n\n if (!userId) {\n throw new TRPCError({\n code: 'UNAUTHORIZED',\n message: 'User not authenticated',\n });\n }\n\n const classData = await prisma.class.findFirst({\n where: {\n id: classId,\n students: {\n some: { id: userId },\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 student in this class',\n });\n }\n\n await prisma.class.update({\n where: { id: classId },\n data: {\n students: {\n disconnect: { id: userId },\n },\n },\n });\n\n return {\n success: true,\n leftClassId: classId,\n };\n }),\n join: protectedProcedure\n .input(z.object({\n classCode: z.string(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { classCode } = input;\n\n // Case-insensitive search for invite code\n const session = await prisma.session.findFirst({\n where: {\n id: {\n equals: classCode,\n mode: 'insensitive',\n },\n },\n });\n\n if (!session || !session.classId) {\n throw new Error(\"Class not found\");\n }\n\n if (session.expiresAt && session.expiresAt < new Date()) {\n throw new Error(\"Session expired\");\n }\n\n const updatedClass = await prisma.class.update({\n where: { id: session.classId },\n data: {\n students: {\n connect: { id: ctx.user?.id },\n },\n },\n select: {\n id: true,\n name: true,\n section: true,\n subject: true,\n },\n });\n\n return {\n joinedClass: updatedClass,\n }\n }),\n getInviteCode: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n }))\n .query(async ({ ctx, input }) => {\n const { classId } = input;\n\n const session = await prisma.session.findFirst({\n where: {\n classId,\n },\n });\n\n if ((session?.expiresAt && session.expiresAt < new Date()) || !session) {\n const newSession = await prisma.session.create({\n data: {\n id: generateInviteCode(),\n classId,\n expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000), // 24 hours from now\n }\n });\n return {\n code: newSession.id,\n }\n }\n\n return {\n code: session?.id,\n };\n }),\n createInviteCode: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { classId } = input;\n\n await prisma.session.deleteMany({\n where: {\n classId,\n },\n });\n\n // Create a new session for the invite code\n const session = await prisma.session.create({\n data: {\n id: generateInviteCode(),\n classId,\n expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000), // 24 hours from now\n }\n });\n\n return {\n code: session.id,\n };\n }),\n getGrades: protectedClassMemberProcedure\n .input(z.object({\n classId: z.string(),\n userId: z.string(),\n }))\n .query(async ({ ctx, input }) => {\n const { classId, userId } = input;\n\n const isTeacher = await prisma.class.findFirst({\n where: {\n id: classId,\n teachers: {\n some: { id: ctx.user?.id }\n }\n }\n });\n // If student, only allow viewing their own grades\n if (ctx.user?.id !== userId && !isTeacher) {\n throw new TRPCError({\n code: 'UNAUTHORIZED',\n message: 'You can only view your own grades',\n });\n }\n\n const grades = await prisma.submission.findMany({\n where: {\n studentId: userId,\n assignment: {\n classId: classId,\n graded: true\n }\n },\n include: {\n assignment: {\n select: {\n id: true,\n title: true,\n maxGrade: true,\n weight: true,\n markSchemeId: true,\n markScheme: {\n select: {\n structured: true,\n }\n },\n gradingBoundaryId: true,\n gradingBoundary: {\n select: {\n structured: true,\n }\n },\n }\n },\n }\n });\n\n return {\n grades,\n };\n }),\n updateGrade: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n assignmentId: z.string(),\n submissionId: z.string(),\n gradeReceived: z.number().nullable(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { classId, assignmentId, submissionId, gradeReceived } = input;\n\n // Update the grade\n const updatedSubmission = await prisma.submission.update({\n where: {\n id: submissionId,\n assignmentId: assignmentId,\n },\n data: {\n gradeReceived,\n },\n include: {\n assignment: {\n select: {\n id: true,\n title: true,\n maxGrade: true,\n weight: true,\n }\n }\n }\n });\n\n return updatedSubmission;\n }),\n getEvents: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n }))\n .query(async ({ ctx, input }) => {\n const { classId } = input;\n\n const events = await prisma.event.findMany({\n where: {\n class: {\n id: classId,\n }\n },\n select: {\n name: true,\n startTime: true,\n endTime: true,\n }\n });\n\n return events;\n }),\n listMarkSchemes: protectedClassMemberProcedure\n .input(z.object({\n classId: z.string(),\n }))\n .query(async ({ ctx, input }) => {\n const { classId } = input;\n\n const markSchemes = await prisma.markScheme.findMany({\n where: {\n class: {\n id: classId,\n },\n },\n });\n\n return markSchemes;\n }),\n createMarkScheme: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n structure: z.string(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { classId, structure } = input;\n\n const validatedStructure = structure.replace(/\\\\n/g, '\\n');\n\n const markScheme = await prisma.markScheme.create({\n data: {\n class: {\n connect: {\n id: classId,\n },\n },\n structured: validatedStructure,\n },\n });\n\n return markScheme;\n }),\n updateMarkScheme: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n markSchemeId: z.string(),\n structure: z.string(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { classId, markSchemeId, structure } = input;\n\n const validatedStructure = structure.replace(/\\\\n/g, '\\n');\n\n const markScheme = await prisma.markScheme.update({\n where: { id: markSchemeId },\n data: {\n class: {\n connect: {\n id: classId,\n },\n },\n structured: validatedStructure,\n },\n });\n\n return markScheme;\n }),\n deleteMarkScheme: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n markSchemeId: z.string(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { classId, markSchemeId } = input;\n\n const markScheme = await prisma.markScheme.delete({\n where: { id: markSchemeId },\n });\n\n return markScheme;\n }),\n listGradingBoundaries: protectedClassMemberProcedure\n .input(z.object({\n classId: z.string(),\n }))\n .query(async ({ ctx, input }) => {\n const { classId } = input;\n\n const gradingBoundaries = await prisma.gradingBoundary.findMany({\n where: {\n class: {\n id: classId,\n },\n },\n });\n\n return gradingBoundaries;\n }),\n createGradingBoundary: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n structure: z.string(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { classId, structure } = input;\n\n const validatedStructure = structure.replace(/\\\\n/g, '\\n');\n\n const gradingBoundary = await prisma.gradingBoundary.create({\n data: {\n class: {\n connect: {\n id: classId,\n },\n },\n structured: validatedStructure,\n },\n });\n\n return gradingBoundary;\n }),\n updateGradingBoundary: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n gradingBoundaryId: z.string(),\n structure: z.string(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { classId, gradingBoundaryId, structure } = input;\n\n const validatedStructure = structure.replace(/\\\\n/g, '\\n');\n\n const gradingBoundary = await prisma.gradingBoundary.update({\n where: { id: gradingBoundaryId },\n data: {\n class: {\n connect: {\n id: classId,\n },\n },\n structured: validatedStructure,\n },\n });\n\n return gradingBoundary;\n }),\n deleteGradingBoundary: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n gradingBoundaryId: z.string(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { classId, gradingBoundaryId } = input;\n\n const gradingBoundary = await prisma.gradingBoundary.delete({\n where: { id: gradingBoundaryId },\n });\n\n return gradingBoundary;\n }),\n getSyllabus: protectedClassMemberProcedure\n .input(z.object({\n classId: z.string(),\n }))\n .query(async ({input}) => {\n const {classId} = input;\n\n const syllabus = (await prisma.class.findUnique({\n where: {\n id: classId,\n },\n }))?.syllabus;\n\n const markSchemes = await prisma.markScheme.findMany({\n where: {\n classId,\n }\n });\n\n const gradingBoundaries = await prisma.gradingBoundary.findMany({\n where: {\n classId,\n }\n });\n\n return {syllabus, gradingBoundaries, markSchemes};\n }),\n updateSyllabus: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n contents: z.string(),\n }))\n .mutation(async ({ input }) => {\n const { contents, classId } = input;\n\n if (!contents) throw new TRPCError({\n code: 'BAD_REQUEST',\n message: \"Missing key contents\",\n });\n\n const updated = await prisma.class.update({\n where: {\n id: classId\n },\n data: {\n syllabus: contents,\n }\n });\n\n return updated;\n }),\n // Lab Management Endpoints (Assignment-based)\n listLabDrafts: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n }))\n .query(async ({ ctx, input }) => {\n const { classId } = input;\n\n const labDrafts = await prisma.assignment.findMany({\n where: {\n classId: classId,\n teacherId: ctx.user?.id,\n inProgress: true,\n },\n orderBy: {\n modifiedAt: 'desc',\n },\n });\n\n return labDrafts;\n }),\n createLabDraft: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n title: z.string(),\n type: z.enum(['LAB', 'HOMEWORK', 'QUIZ', 'TEST', 'PROJECT', 'ESSAY', 'DISCUSSION', 'PRESENTATION', 'OTHER']),\n instructions: z.string(),\n dueDate: z.date().optional(),\n maxGrade: z.number().optional(),\n weight: z.number().optional(),\n graded: z.boolean().optional(),\n sectionId: z.string().optional(),\n markSchemeId: z.string().optional(),\n gradingBoundaryId: z.string().optional(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { classId, ...draftData } = input;\n\n const labDraft = await prisma.assignment.create({\n data: {\n classId: classId,\n teacherId: ctx.user?.id!,\n inProgress: true,\n graded: draftData.graded ?? false,\n maxGrade: draftData.maxGrade ?? 0,\n weight: draftData.weight ?? 1,\n dueDate: draftData.dueDate || new Date(Date.now() + 7 * 24 * 60 * 60 * 1000), // Default 1 week from now\n title: draftData.title,\n instructions: draftData.instructions,\n type: draftData.type,\n ...(draftData.sectionId && { sectionId: draftData.sectionId }),\n ...(draftData.markSchemeId && { markSchemeId: draftData.markSchemeId }),\n ...(draftData.gradingBoundaryId && { gradingBoundaryId: draftData.gradingBoundaryId }),\n },\n });\n\n return labDraft;\n }),\n updateLabDraft: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n draftId: z.string(),\n title: z.string().optional(),\n instructions: z.string().optional(),\n dueDate: z.date().optional(),\n maxGrade: z.number().optional(),\n weight: z.number().optional(),\n graded: z.boolean().optional(),\n sectionId: z.string().optional(),\n markSchemeId: z.string().optional(),\n gradingBoundaryId: z.string().optional(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { classId, draftId, ...updateData } = input;\n\n const labDraft = await prisma.assignment.update({\n where: {\n id: draftId,\n classId: classId,\n teacherId: ctx.user?.id!,\n inProgress: true,\n },\n data: {\n ...(updateData.title && { title: updateData.title }),\n ...(updateData.instructions && { instructions: updateData.instructions }),\n ...(updateData.dueDate && { dueDate: updateData.dueDate }),\n ...(updateData.maxGrade !== undefined && { maxGrade: updateData.maxGrade }),\n ...(updateData.weight !== undefined && { weight: updateData.weight }),\n ...(updateData.graded !== undefined && { graded: updateData.graded }),\n ...(updateData.sectionId !== undefined && { sectionId: updateData.sectionId }),\n ...(updateData.markSchemeId !== undefined && { markSchemeId: updateData.markSchemeId }),\n ...(updateData.gradingBoundaryId !== undefined && { gradingBoundaryId: updateData.gradingBoundaryId }),\n modifiedAt: new Date(),\n },\n });\n\n return labDraft;\n }),\n deleteLabDraft: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n draftId: z.string(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { classId, draftId } = input;\n\n const labDraft = await prisma.assignment.delete({\n where: {\n id: draftId,\n classId: classId,\n teacherId: ctx.user?.id!,\n inProgress: true,\n },\n });\n\n return labDraft;\n }),\n publishLabDraft: protectedTeacherProcedure\n .input(z.object({\n classId: z.string(),\n draftId: z.string(),\n dueDate: z.date().optional(),\n maxGrade: z.number().optional(),\n weight: z.number().optional(),\n graded: z.boolean().optional(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { classId, draftId, ...publishData } = input;\n\n // Get the lab draft\n const labDraft = await prisma.assignment.findUnique({\n where: {\n id: draftId,\n classId: classId,\n teacherId: ctx.user?.id!,\n inProgress: true,\n },\n });\n\n if (!labDraft) {\n throw new TRPCError({\n code: 'NOT_FOUND',\n message: 'Lab draft not found',\n });\n }\n\n // Publish the draft by updating it to not be in progress\n const publishedAssignment = await prisma.assignment.update({\n where: { id: draftId },\n data: {\n inProgress: false,\n dueDate: publishData.dueDate || labDraft.dueDate,\n maxGrade: publishData.maxGrade || labDraft.maxGrade || 100,\n weight: publishData.weight || labDraft.weight || 1,\n graded: publishData.graded !== undefined ? publishData.graded : true,\n modifiedAt: new Date(),\n },\n });\n\n return publishedAssignment;\n }),\n getFiles: protectedClassMemberProcedure\n .input(z.object({\n classId: z.string(),\n }))\n .query(async ({ ctx, input }) => {\n const { classId } = input;\n\n // Get all assignments with their files and submissions\n const assignments = await prisma.assignment.findMany({\n where: {\n classId: classId,\n },\n include: {\n attachments: {\n select: {\n id: true,\n name: true,\n type: true,\n size: true,\n path: true,\n thumbnailId: true,\n uploadedAt: true,\n user: {\n select: {\n id: true,\n username: true,\n },\n },\n },\n },\n submissions: {\n include: {\n attachments: {\n select: {\n id: true,\n name: true,\n type: true,\n size: true,\n path: true,\n thumbnailId: true,\n uploadedAt: true,\n user: {\n select: {\n id: true,\n username: true,\n },\n },\n },\n },\n annotations: {\n select: {\n id: true,\n name: true,\n type: true,\n size: true,\n path: true,\n thumbnailId: true,\n uploadedAt: true,\n user: {\n select: {\n id: true,\n username: true,\n },\n },\n },\n },\n student: {\n select: {\n id: true,\n username: true,\n },\n },\n },\n },\n teacher: {\n select: {\n id: true,\n username: true,\n },\n },\n },\n orderBy: {\n createdAt: 'desc',\n },\n });\n\n // Organize files by assignment structure\n const organizedFiles = assignments.map(assignment => ({\n id: assignment.id,\n title: assignment.title,\n teacher: assignment.teacher,\n teacherAttachments: assignment.attachments,\n students: assignment.submissions.map(submission => ({\n id: submission.student.id,\n username: submission.student.username,\n attachments: submission.attachments,\n annotations: submission.annotations,\n })),\n }));\n\n return organizedFiles;\n }),\n});"],"names":[],"mappings":"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","debug_id":"90bd2ed8-f6aa-5bb5-b0f5-4d2643587610"}
@@ -94,8 +94,14 @@ export declare const commentRouter: import("@trpc/server").TRPCBuiltRouter<{
94
94
  author: {
95
95
  id: string;
96
96
  username: string;
97
+ profile: {
98
+ displayName: string | null;
99
+ profilePicture: string | null;
100
+ profilePictureThumbnail: string | null;
101
+ } | null;
97
102
  };
98
103
  } & {
104
+ status: import(".prisma/client").$Enums.GenerationStatus | null;
99
105
  id: string;
100
106
  content: string;
101
107
  createdAt: Date;
@@ -113,6 +119,7 @@ export declare const commentRouter: import("@trpc/server").TRPCBuiltRouter<{
113
119
  parentCommentId: string;
114
120
  };
115
121
  output: {
122
+ status: import(".prisma/client").$Enums.GenerationStatus | null;
116
123
  id: string;
117
124
  content: string;
118
125
  createdAt: Date;
@@ -1 +1 @@
1
- {"version":3,"file":"comment.d.ts","sourceRoot":"/","sources":["routers/comment.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoCzB,CAAC;AAEF,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4PxB,CAAC"}
1
+ {"version":3,"file":"comment.d.ts","sourceRoot":"/","sources":["routers/comment.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoCzB,CAAC;AAEF,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmQxB,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]="1130e004-af99-533a-acec-d4188967559d")}catch(e){}}();
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]="d03138fb-c066-50f2-b192-9eb9b9e92ced")}catch(e){}}();
3
3
  import { createTRPCRouter, protectedProcedure } from "../trpc.js";
4
4
  import { z } from "zod";
5
5
  import { prisma } from "../lib/prisma.js";
@@ -74,6 +74,13 @@ export const commentRouter = createTRPCRouter({
74
74
  select: {
75
75
  id: true,
76
76
  username: true,
77
+ profile: {
78
+ select: {
79
+ displayName: true,
80
+ profilePicture: true,
81
+ profilePictureThumbnail: true,
82
+ },
83
+ },
77
84
  },
78
85
  },
79
86
  }
@@ -268,4 +275,4 @@ export const commentRouter = createTRPCRouter({
268
275
  }),
269
276
  });
270
277
  //# sourceMappingURL=comment.js.map
271
- //# debugId=1130e004-af99-533a-acec-d4188967559d
278
+ //# debugId=d03138fb-c066-50f2-b192-9eb9b9e92ced
@@ -1 +1 @@
1
- {"version":3,"file":"comment.js","sources":["routers/comment.ts"],"sourceRoot":"/","sourcesContent":["import { createTRPCRouter, protectedProcedure } from \"../trpc.js\";\nimport { z } from \"zod\";\nimport { prisma } from \"../lib/prisma.js\";\nimport { TRPCError } from \"@trpc/server\";\n\nexport const commentSelect = {\n id: true,\n content: true,\n createdAt: true,\n modifiedAt: true,\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 reactions: {\n select: {\n type: true,\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\nexport const commentRouter = createTRPCRouter({\n get: protectedProcedure\n .input(z.object({\n id: z.string(),\n }))\n .query(async ({ ctx, input }) => {\n const comment = await prisma.comment.findUnique({\n where: { id: input.id },\n select: {\n ...commentSelect,\n }\n });\n if (!comment) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Comment not found\",\n });\n }\n\n return comment;\n }),\n getReplies: protectedProcedure\n .input(z.object({\n commentId: z.string(),\n }))\n .query(async ({ ctx, input }) => {\n const replies = await prisma.comment.findMany({\n where: { parentCommentId: input.commentId\n },\n include: {\n author: {\n select: {\n id: true,\n username: true,\n },\n },\n }\n });\n return replies;\n }),\n replyToComment: protectedProcedure\n .input(z.object({\n parentCommentId: z.string(),\n content: z.string(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { parentCommentId, content } = input;\n\n const newComment = await prisma.comment.create({\n data: {\n parentCommentId,\n content,\n authorId: ctx.user!.id,\n },\n });\n\n return newComment;\n }), \n addReaction: protectedProcedure\n .input(z.object({\n id: 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 const comment = await prisma.comment.findUnique({\n where: { id: input.id },\n });\n\n const userId = ctx.user.id;\n\n // Verify the announcement or comment exists and belongs to the class\n if (comment) {\n const announcement = await prisma.announcement.findFirst({\n where: {\n id: input.id,\n },\n });\n\n // Upsert reaction: update if exists, create if not\n const reaction = await prisma.reaction.upsert({\n where: {\n userId_commentId: {\n userId,\n commentId: input.id,\n },\n },\n update: {\n type: input.type,\n },\n create: {\n type: input.type,\n userId,\n commentId: input.id,\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 }\n\n throw new TRPCError({\n code: \"INTERNAL_SERVER_ERROR\",\n message: \"Unexpected error\",\n });\n }),\n\nremoveReaction: protectedProcedure\n .input(z.object({\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.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 const reaction = await prisma.reaction.findUnique({\n where: {\n userId_commentId: {\n userId,\n commentId: input.commentId,\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\n }),\n\ngetReactions: protectedProcedure\n .input(z.object({\n commentId: z.string().optional(),\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.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 // Verify comment exists\n const comment = await prisma.comment.findUnique({\n where: { id: input.commentId },\n include: {\n announcement: {\n select: {\n classId: true,\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 // Get reaction counts by type\n const reactionCounts = await prisma.reaction.groupBy({\n by: ['type'],\n where: { commentId: input.commentId },\n _count: { type: true },\n });\n\n // Get current user's reaction\n const userReaction = await prisma.reaction.findUnique({\n where: {\n userId_commentId: {\n userId,\n commentId: input.commentId,\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 }),\n});"],"names":[],"mappings":"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","debug_id":"1130e004-af99-533a-acec-d4188967559d"}
1
+ {"version":3,"file":"comment.js","sources":["routers/comment.ts"],"sourceRoot":"/","sourcesContent":["import { createTRPCRouter, protectedProcedure } from \"../trpc.js\";\nimport { z } from \"zod\";\nimport { prisma } from \"../lib/prisma.js\";\nimport { TRPCError } from \"@trpc/server\";\n\nexport const commentSelect = {\n id: true,\n content: true,\n createdAt: true,\n modifiedAt: true,\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 reactions: {\n select: {\n type: true,\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\nexport const commentRouter = createTRPCRouter({\n get: protectedProcedure\n .input(z.object({\n id: z.string(),\n }))\n .query(async ({ ctx, input }) => {\n const comment = await prisma.comment.findUnique({\n where: { id: input.id },\n select: {\n ...commentSelect,\n }\n });\n if (!comment) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Comment not found\",\n });\n }\n\n return comment;\n }),\n getReplies: protectedProcedure\n .input(z.object({\n commentId: z.string(),\n }))\n .query(async ({ ctx, input }) => {\n const replies = await prisma.comment.findMany({\n where: { parentCommentId: input.commentId\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 return replies;\n }),\n replyToComment: protectedProcedure\n .input(z.object({\n parentCommentId: z.string(),\n content: z.string(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { parentCommentId, content } = input;\n\n const newComment = await prisma.comment.create({\n data: {\n parentCommentId,\n content,\n authorId: ctx.user!.id,\n },\n });\n\n return newComment;\n }), \n addReaction: protectedProcedure\n .input(z.object({\n id: 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 const comment = await prisma.comment.findUnique({\n where: { id: input.id },\n });\n\n const userId = ctx.user.id;\n\n // Verify the announcement or comment exists and belongs to the class\n if (comment) {\n const announcement = await prisma.announcement.findFirst({\n where: {\n id: input.id,\n },\n });\n\n // Upsert reaction: update if exists, create if not\n const reaction = await prisma.reaction.upsert({\n where: {\n userId_commentId: {\n userId,\n commentId: input.id,\n },\n },\n update: {\n type: input.type,\n },\n create: {\n type: input.type,\n userId,\n commentId: input.id,\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 }\n\n throw new TRPCError({\n code: \"INTERNAL_SERVER_ERROR\",\n message: \"Unexpected error\",\n });\n }),\n\nremoveReaction: protectedProcedure\n .input(z.object({\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.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 const reaction = await prisma.reaction.findUnique({\n where: {\n userId_commentId: {\n userId,\n commentId: input.commentId,\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\n }),\n\ngetReactions: protectedProcedure\n .input(z.object({\n commentId: z.string().optional(),\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.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 // Verify comment exists\n const comment = await prisma.comment.findUnique({\n where: { id: input.commentId },\n include: {\n announcement: {\n select: {\n classId: true,\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 // Get reaction counts by type\n const reactionCounts = await prisma.reaction.groupBy({\n by: ['type'],\n where: { commentId: input.commentId },\n _count: { type: true },\n });\n\n // Get current user's reaction\n const userReaction = await prisma.reaction.findUnique({\n where: {\n userId_commentId: {\n userId,\n commentId: input.commentId,\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 }),\n});"],"names":[],"mappings":"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","debug_id":"d03138fb-c066-50f2-b192-9eb9b9e92ced"}
@@ -55,6 +55,7 @@ export declare const conversationRouter: import("@trpc/server").TRPCBuiltRouter<
55
55
  } | null;
56
56
  };
57
57
  } & {
58
+ status: import(".prisma/client").$Enums.GenerationStatus | null;
58
59
  id: string;
59
60
  content: string;
60
61
  createdAt: Date;
@@ -1 +1 @@
1
- {"version":3,"file":"conversation.d.ts","sourceRoot":"/","sources":["routers/conversation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqS7B,CAAC"}
1
+ {"version":3,"file":"conversation.d.ts","sourceRoot":"/","sources":["routers/conversation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyT7B,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]="7484364a-2b0f-5c90-8987-fd0fa062e9c8")}catch(e){}}();
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]="0653a9bb-09de-561c-b1dc-9cea19f1c8b2")}catch(e){}}();
3
3
  import { z } from 'zod';
4
4
  import { createTRPCRouter, protectedProcedure } from '../trpc.js';
5
5
  import { prisma } from '../lib/prisma.js';
@@ -134,49 +134,63 @@ export const conversationRouter = createTRPCRouter({
134
134
  }
135
135
  // For DMs, check if conversation already exists
136
136
  if (type === 'DM') {
137
- const existingDM = await prisma.conversation.findFirst({
137
+ // Get the target user's ID from their username
138
+ const targetUser = await prisma.user.findFirst({
139
+ where: { username: memberIds[0] },
140
+ select: { id: true, username: true },
141
+ });
142
+ if (!targetUser) {
143
+ throw new TRPCError({
144
+ code: 'BAD_REQUEST',
145
+ message: `User "${memberIds[0]}" not found`,
146
+ });
147
+ }
148
+ // Find all DM conversations where current user is a member
149
+ const existingDMs = await prisma.conversation.findMany({
138
150
  where: {
139
151
  type: 'DM',
140
152
  members: {
141
- every: {
142
- userId: {
143
- in: [userId, memberIds[0]],
144
- },
145
- },
146
- },
147
- AND: {
148
- members: {
149
- some: {
150
- userId,
151
- },
153
+ some: {
154
+ userId,
152
155
  },
153
156
  },
154
157
  },
155
158
  include: {
156
159
  members: {
157
- include: {
158
- user: {
159
- select: {
160
- id: true,
161
- username: true,
162
- profile: {
163
- select: {
164
- displayName: true,
165
- profilePicture: true,
166
- },
167
- },
168
- },
169
- },
160
+ select: {
161
+ userId: true,
170
162
  },
171
163
  },
172
164
  },
173
165
  });
166
+ // Check if any of these conversations has exactly 2 members (current user + target user)
167
+ const existingDM = existingDMs.find(conv => {
168
+ const memberUserIds = conv.members.map(m => m.userId);
169
+ return memberUserIds.length === 2 &&
170
+ memberUserIds.includes(userId) &&
171
+ memberUserIds.includes(targetUser.id);
172
+ });
174
173
  if (existingDM) {
175
- return existingDM;
174
+ // Conversation already exists, throw error with friendly message
175
+ throw new TRPCError({
176
+ code: 'BAD_REQUEST',
177
+ message: `A conversation with ${targetUser.username} already exists`,
178
+ });
176
179
  }
177
180
  }
178
181
  // Verify all members exist
179
- const members = await prisma.user.findMany({
182
+ const membersWithIds = await prisma.user.findMany({
183
+ where: {
184
+ id: {
185
+ in: memberIds,
186
+ },
187
+ },
188
+ select: {
189
+ id: true,
190
+ username: true,
191
+ },
192
+ });
193
+ const membersWithUsernames = await prisma.user.findMany({
180
194
  where: {
181
195
  username: {
182
196
  in: memberIds,
@@ -187,6 +201,7 @@ export const conversationRouter = createTRPCRouter({
187
201
  username: true,
188
202
  },
189
203
  });
204
+ const members = [...membersWithIds, ...membersWithUsernames];
190
205
  if (members.length !== memberIds.length) {
191
206
  throw new TRPCError({
192
207
  code: 'BAD_REQUEST',
@@ -204,8 +219,8 @@ export const conversationRouter = createTRPCRouter({
204
219
  userId,
205
220
  role: type === 'GROUP' ? 'ADMIN' : 'MEMBER',
206
221
  },
207
- ...memberIds.map((memberId) => ({
208
- userId: members.find((member) => member.username === memberId).id,
222
+ ...members.map((member) => ({
223
+ userId: member.id,
209
224
  role: 'MEMBER',
210
225
  })),
211
226
  ],
@@ -275,4 +290,4 @@ export const conversationRouter = createTRPCRouter({
275
290
  }),
276
291
  });
277
292
  //# sourceMappingURL=conversation.js.map
278
- //# debugId=7484364a-2b0f-5c90-8987-fd0fa062e9c8
293
+ //# debugId=0653a9bb-09de-561c-b1dc-9cea19f1c8b2