@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
@@ -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]="7dd48cd3-b996-5dc5-bd2d-c8e1531645d1")}catch(e){}}();
1
3
  import { z } from 'zod';
2
4
  import { createTRPCRouter, protectedProcedure } from '../trpc.js';
3
5
  import { prisma } from '../lib/prisma.js';
@@ -902,3 +904,5 @@ WHEN CREATING COURSE MATERIALS (docs field):
902
904
  throw error; // Re-throw to see the full error in the calling function
903
905
  }
904
906
  }
907
+ //# sourceMappingURL=labChat.js.map
908
+ //# debugId=7dd48cd3-b996-5dc5-bd2d-c8e1531645d1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labChat.js","sources":["routers/labChat.ts"],"sourceRoot":"/","sourcesContent":["import { z } from 'zod';\nimport { createTRPCRouter, protectedProcedure } from '../trpc.js';\nimport { prisma } from '../lib/prisma.js';\nimport { pusher } from '../lib/pusher.js';\nimport { TRPCError } from '@trpc/server';\nimport { \n inferenceClient,\n sendAIMessage,\n type LabChatContext \n} from '../utils/inference.js';\nimport { logger } from '../utils/logger.js';\nimport { isAIUser } from '../utils/aiUser.js';\nimport { bucket } from '../lib/googleCloudStorage.js';\nimport { createPdf } from \"../lib/jsonConversion.js\"\nimport OpenAI from 'openai';\nimport { v4 as uuidv4 } from \"uuid\";\n\nexport const labChatRouter = createTRPCRouter({\n create: protectedProcedure\n .input(\n z.object({\n classId: z.string(),\n title: z.string().min(1).max(200),\n context: z.string(), // JSON string for LLM context\n })\n )\n .mutation(async ({ input, ctx }) => {\n const userId = ctx.user!.id;\n const { classId, title, context } = input;\n\n // Verify user is a teacher in the class\n const classWithTeachers = await prisma.class.findFirst({\n where: {\n id: classId,\n teachers: {\n some: {\n id: userId,\n },\n },\n },\n include: {\n students: {\n select: {\n id: true,\n username: true,\n profile: {\n select: {\n displayName: true,\n profilePicture: true,\n },\n },\n },\n },\n teachers: {\n select: {\n id: true,\n username: true,\n profile: {\n select: {\n displayName: true,\n profilePicture: true,\n },\n },\n },\n },\n },\n });\n\n if (!classWithTeachers) {\n throw new TRPCError({\n code: 'FORBIDDEN',\n message: 'Not a teacher in this class',\n });\n }\n\n // Validate context is valid JSON\n try {\n JSON.parse(context);\n } catch (error) {\n throw new TRPCError({\n code: 'BAD_REQUEST',\n message: 'Context must be valid JSON',\n });\n }\n\n // Create lab chat with associated conversation\n const result = await prisma.$transaction(async (tx) => {\n // Create conversation for the lab chat\n const conversation = await tx.conversation.create({\n data: {\n type: 'GROUP',\n name: `Lab: ${title}`,\n displayInChat: false, // Lab chats don't show in regular chat list\n },\n });\n\n // Add only teachers to the conversation (this is for course material creation)\n const teacherMembers = classWithTeachers.teachers.map(t => ({ \n userId: t.id, \n role: 'ADMIN' as const \n }));\n\n await tx.conversationMember.createMany({\n data: teacherMembers.map(member => ({\n userId: member.userId,\n conversationId: conversation.id,\n role: member.role,\n })),\n });\n\n // Create the lab chat\n const labChat = await tx.labChat.create({\n data: {\n title,\n context,\n classId,\n conversationId: conversation.id,\n createdById: userId,\n },\n include: {\n conversation: {\n include: {\n members: {\n include: {\n user: {\n select: {\n id: true,\n username: true,\n profile: {\n select: {\n displayName: true,\n profilePicture: true,\n },\n },\n },\n },\n },\n },\n },\n },\n createdBy: {\n select: {\n id: true,\n username: true,\n profile: {\n select: {\n displayName: true,\n },\n },\n },\n },\n class: {\n select: {\n id: true,\n name: true,\n subject: true,\n section: true,\n },\n },\n },\n });\n\n return labChat;\n });\n\n // Generate AI introduction message in parallel (don't await - fire and forget)\n generateAndSendLabIntroduction(result.id, result.conversationId, context, classWithTeachers.subject || 'Lab').catch(error => {\n logger.error('Failed to generate AI introduction:', { error, labChatId: result.id });\n });\n\n // Broadcast lab chat creation to class members\n try {\n await pusher.trigger(`class-${classId}`, 'lab-chat-created', {\n id: result.id,\n title: result.title,\n classId: result.classId,\n conversationId: result.conversationId,\n createdBy: result.createdBy,\n createdAt: result.createdAt,\n });\n } catch (error) {\n console.error('Failed to broadcast lab chat creation:', error);\n // Don't fail the request if Pusher fails\n }\n\n return result;\n }),\n\n get: protectedProcedure\n .input(z.object({ labChatId: z.string() }))\n .query(async ({ input, ctx }) => {\n const userId = ctx.user!.id;\n const { labChatId } = input;\n\n // First, try to find the lab chat if user is already a member\n let labChat = await prisma.labChat.findFirst({\n where: {\n id: labChatId,\n conversation: {\n members: {\n some: {\n userId,\n },\n },\n },\n },\n include: {\n conversation: {\n include: {\n members: {\n include: {\n user: {\n select: {\n id: true,\n username: true,\n profile: {\n select: {\n displayName: true,\n profilePicture: true,\n },\n },\n },\n },\n },\n },\n },\n },\n createdBy: {\n select: {\n id: true,\n username: true,\n profile: {\n select: {\n displayName: true,\n },\n },\n },\n },\n class: {\n select: {\n id: true,\n name: true,\n subject: true,\n section: true,\n },\n },\n },\n });\n\n // If not found, check if user is a teacher in the class\n if (!labChat) {\n const labChatForTeacher = await prisma.labChat.findFirst({\n where: {\n id: labChatId,\n class: {\n teachers: {\n some: {\n id: userId,\n },\n },\n },\n },\n include: {\n conversation: {\n select: {\n id: true,\n },\n },\n },\n });\n\n if (labChatForTeacher) {\n // Add teacher to conversation\n await prisma.conversationMember.create({\n data: {\n userId,\n conversationId: labChatForTeacher.conversation.id,\n role: 'ADMIN',\n },\n });\n\n // Now fetch the full lab chat with the user as a member\n labChat = await prisma.labChat.findFirst({\n where: {\n id: labChatId,\n },\n include: {\n conversation: {\n include: {\n members: {\n include: {\n user: {\n select: {\n id: true,\n username: true,\n profile: {\n select: {\n displayName: true,\n profilePicture: true,\n },\n },\n },\n },\n },\n },\n },\n },\n createdBy: {\n select: {\n id: true,\n username: true,\n profile: {\n select: {\n displayName: true,\n },\n },\n },\n },\n class: {\n select: {\n id: true,\n name: true,\n subject: true,\n section: true,\n },\n },\n },\n });\n }\n }\n\n if (!labChat) {\n throw new TRPCError({\n code: 'NOT_FOUND',\n message: 'Lab chat not found or access denied',\n });\n }\n\n return labChat;\n }),\n\n list: protectedProcedure\n .input(z.object({ classId: z.string() }))\n .query(async ({ input, ctx }) => {\n const userId = ctx.user!.id;\n const { classId } = input;\n\n // Verify user is a member of the class\n const classMembership = await prisma.class.findFirst({\n where: {\n id: classId,\n OR: [\n {\n students: {\n some: {\n id: userId,\n },\n },\n },\n {\n teachers: {\n some: {\n id: userId,\n },\n },\n },\n ],\n },\n });\n\n if (!classMembership) {\n throw new TRPCError({\n code: 'FORBIDDEN',\n message: 'Not a member of this class',\n });\n }\n\n const labChats = await prisma.labChat.findMany({\n where: {\n classId,\n },\n include: {\n createdBy: {\n select: {\n id: true,\n username: true,\n profile: {\n select: {\n displayName: true,\n },\n },\n },\n },\n conversation: {\n include: {\n messages: {\n orderBy: {\n createdAt: 'desc',\n },\n take: 1,\n include: {\n sender: {\n select: {\n id: true,\n username: true,\n profile: {\n select: {\n displayName: true,\n },\n },\n },\n },\n },\n },\n _count: {\n select: {\n messages: true,\n },\n },\n },\n },\n },\n orderBy: {\n createdAt: 'desc',\n },\n });\n\n return labChats.map((labChat) => ({\n id: labChat.id,\n title: labChat.title,\n classId: labChat.classId,\n conversationId: labChat.conversationId,\n createdBy: labChat.createdBy,\n createdAt: labChat.createdAt,\n updatedAt: labChat.updatedAt,\n lastMessage: labChat.conversation.messages[0] || null,\n messageCount: labChat.conversation._count.messages,\n }));\n }),\n\n postToLabChat: protectedProcedure\n .input(\n z.object({\n labChatId: z.string(),\n content: z.string().min(1).max(4000),\n mentionedUserIds: z.array(z.string()).optional(),\n })\n )\n .mutation(async ({ input, ctx }) => {\n const userId = ctx.user!.id;\n const { labChatId, content, mentionedUserIds = [] } = input;\n\n // Get lab chat and verify user is a member\n const labChat = await prisma.labChat.findFirst({\n where: {\n id: labChatId,\n conversation: {\n members: {\n some: {\n userId,\n },\n },\n },\n },\n include: {\n conversation: {\n select: {\n id: true,\n },\n },\n },\n });\n\n if (!labChat) {\n throw new TRPCError({\n code: 'FORBIDDEN',\n message: 'Lab chat not found or access denied',\n });\n }\n\n // Verify mentioned users are members of the conversation\n if (mentionedUserIds.length > 0) {\n const mentionedMemberships = await prisma.conversationMember.findMany({\n where: {\n conversationId: labChat.conversationId,\n userId: { in: mentionedUserIds },\n },\n });\n\n if (mentionedMemberships.length !== mentionedUserIds.length) {\n throw new TRPCError({\n code: 'BAD_REQUEST',\n message: 'Some mentioned users are not members of this lab chat',\n });\n }\n }\n\n // Create message and mentions\n const result = await prisma.$transaction(async (tx) => {\n const message = await tx.message.create({\n data: {\n content,\n senderId: userId,\n conversationId: labChat.conversationId,\n },\n include: {\n sender: {\n select: {\n id: true,\n username: true,\n profile: {\n select: {\n displayName: true,\n profilePicture: true,\n },\n },\n },\n },\n },\n });\n\n // Create mentions\n if (mentionedUserIds.length > 0) {\n await tx.mention.createMany({\n data: mentionedUserIds.map((mentionedUserId) => ({\n messageId: message.id,\n userId: mentionedUserId,\n })),\n });\n }\n\n // Update lab chat timestamp\n await tx.labChat.update({\n where: { id: labChatId },\n data: { updatedAt: new Date() },\n });\n\n return message;\n });\n\n // Broadcast to Pusher channel (same format as regular chat)\n try {\n await pusher.trigger(`conversation-${labChat.conversationId}`, 'new-message', {\n id: result.id,\n content: result.content,\n senderId: result.senderId,\n conversationId: result.conversationId,\n createdAt: result.createdAt,\n sender: result.sender,\n mentionedUserIds,\n });\n } catch (error) {\n console.error('Failed to broadcast lab chat message:', error);\n // Don't fail the request if Pusher fails\n }\n\n // Generate AI response in parallel (don't await - fire and forget)\n if (!isAIUser(userId)) {\n // Run AI response generation in background\n generateAndSendLabResponse(labChatId, content, labChat.conversationId).catch(error => {\n logger.error('Failed to generate AI response:', { error });\n });\n }\n\n return {\n id: result.id,\n content: result.content,\n senderId: result.senderId,\n conversationId: result.conversationId,\n createdAt: result.createdAt,\n sender: result.sender,\n mentionedUserIds,\n };\n }),\n\n delete: protectedProcedure\n .input(z.object({ labChatId: z.string() }))\n .mutation(async ({ input, ctx }) => {\n const userId = ctx.user!.id;\n const { labChatId } = input;\n\n // Verify user is the creator of the lab chat\n const labChat = await prisma.labChat.findFirst({\n where: {\n id: labChatId,\n createdById: userId,\n },\n });\n\n if (!labChat) {\n throw new TRPCError({\n code: 'FORBIDDEN',\n message: 'Lab chat not found or not the creator',\n });\n }\n\n // Delete lab chat and associated conversation\n await prisma.$transaction(async (tx) => {\n // Delete mentions first\n await tx.mention.deleteMany({\n where: {\n message: {\n conversationId: labChat.conversationId,\n },\n },\n });\n\n // Delete messages\n await tx.message.deleteMany({\n where: {\n conversationId: labChat.conversationId,\n },\n });\n\n // Delete conversation members\n await tx.conversationMember.deleteMany({\n where: {\n conversationId: labChat.conversationId,\n },\n });\n\n // Delete lab chat\n await tx.labChat.delete({\n where: { id: labChatId },\n });\n\n // Delete conversation\n await tx.conversation.delete({\n where: { id: labChat.conversationId },\n });\n });\n\n // Broadcast lab chat deletion\n try {\n await pusher.trigger(`class-${labChat.classId}`, 'lab-chat-deleted', {\n labChatId,\n classId: labChat.classId,\n });\n } catch (error) {\n console.error('Failed to broadcast lab chat deletion:', error);\n // Don't fail the request if Pusher fails\n }\n\n return { success: true };\n }),\n});\n\n/**\n * Generate and send AI introduction for lab chat\n * Uses the stored context directly from database\n */\nasync function generateAndSendLabIntroduction(\n labChatId: string,\n conversationId: string,\n contextString: string,\n subject: string\n): Promise<void> {\n try {\n // Enhance the stored context with clarifying question instructions\n const enhancedSystemPrompt = `${contextString}\n\nIMPORTANT INSTRUCTIONS:\n- You are helping teachers create course materials\n- Use the context information provided above (subject, topic, difficulty, objectives, etc.) as your foundation\n- Only ask clarifying questions about details NOT already specified in the context\n- Focus your questions on format preferences, specific requirements, or missing details needed to create the content\n- Only output final course materials when you have sufficient details beyond what's in the context\n- Do not use markdown formatting in your responses - use plain text only\n- When creating content, make it clear and well-structured without markdown`;\n\n const completion = await inferenceClient.chat.completions.create({\n model: 'command-a-03-2025',\n messages: [\n { role: 'system', content: enhancedSystemPrompt },\n { \n role: 'user', \n content: 'Please introduce yourself to the teaching team. Explain that you will help create course materials by first asking clarifying questions based on the context provided, and only output final content when you have enough information.' \n },\n ],\n max_tokens: 300,\n temperature: 0.8,\n });\n\n const response = completion.choices[0]?.message?.content;\n \n if (!response) {\n throw new Error('No response generated from inference API');\n }\n\n // Send AI introduction using centralized sender\n await sendAIMessage(response, conversationId, {\n subject,\n });\n\n logger.info('AI Introduction sent', { labChatId, conversationId });\n\n } catch (error) {\n logger.error('Failed to generate AI introduction:', { error, labChatId });\n \n // Send fallback introduction\n try {\n const fallbackIntro = `Hello teaching team! I'm your AI assistant for course material development. I will help you create educational content by first asking clarifying questions based on the provided context, then outputting final materials when I have sufficient information. I won't use markdown formatting in my responses. What would you like to work on?`;\n \n await sendAIMessage(fallbackIntro, conversationId, {\n subject,\n });\n\n logger.info('Fallback AI introduction sent', { labChatId });\n\n } catch (fallbackError) {\n logger.error('Failed to send fallback AI introduction:', { error: fallbackError, labChatId });\n }\n }\n}\n\n/**\n * Generate and send AI response to teacher message\n * Uses the stored context directly from database\n */\nasync function generateAndSendLabResponse(\n labChatId: string,\n teacherMessage: string,\n conversationId: string\n): Promise<void> {\n try {\n // Get lab context from database\n const fullLabChat = await prisma.labChat.findUnique({\n where: { id: labChatId },\n include: {\n class: {\n select: {\n name: true,\n subject: true,\n },\n },\n },\n });\n\n if (!fullLabChat) {\n throw new Error('Lab chat not found');\n }\n\n // Get recent conversation history\n const recentMessages = await prisma.message.findMany({\n where: {\n conversationId,\n },\n include: {\n sender: {\n select: {\n id: true,\n username: true,\n profile: {\n select: {\n displayName: true,\n },\n },\n },\n },\n },\n orderBy: {\n createdAt: 'desc',\n },\n take: 10, // Last 10 messages for context\n });\n\n // Build conversation history as proper message objects\n // Enhance the stored context with clarifying question instructions\n const enhancedSystemPrompt = `${fullLabChat.context}\n\nIMPORTANT INSTRUCTIONS:\n- Use the context information provided above (subject, topic, difficulty, objectives, etc.) as your foundation\n- Based on the teacher's input and existing context, only ask clarifying questions about details NOT already specified\n- Focus questions on format preferences, specific requirements, quantity, or missing implementation details\n- Only output final course materials when you have sufficient details beyond what's in the context\n- Do not use markdown formatting in your responses - use plain text only\n- When you do create content, make it clear and well-structured without markdown\n- If the request is vague, ask 1-2 specific clarifying questions about missing details only\n- You are primarily a chatbot - only provide files when it is necessary\n\nRESPONSE FORMAT:\n- Always respond with JSON in this format: { \"text\": string, \"docs\": null | array }\n- \"text\": Your conversational response (questions, explanations, etc.) - use plain text, no markdown\n- \"docs\": null for regular conversation, or array of PDF document objects when creating course materials\n\nWHEN CREATING COURSE MATERIALS (docs field):\n- docs: [ { \"title\": string, \"blocks\": [ { \"format\": <int 0-12>, \"content\": string | string[], \"metadata\"?: { fontSize?: number, lineHeight?: number, paragraphSpacing?: number, indentWidth?: number, paddingX?: number, paddingY?: number, font?: 0|1|2|3|4|5, color?: \"#RGB\"|\"#RRGGBB\", background?: \"#RGB\"|\"#RRGGBB\", align?: \"left\"|\"center\"|\"right\" } } ] } ]\n- Each document in the array should have a \"title\" (used for filename) and \"blocks\" (content)\n- You can create multiple documents when it makes sense (e.g., separate worksheets, answer keys, different topics)\n- Use descriptive titles like \"Biology_Cell_Structure_Worksheet\" or \"Chemistry_Lab_Instructions\"\n- Format enum (integers): 0=HEADER_1, 1=HEADER_2, 2=HEADER_3, 3=HEADER_4, 4=HEADER_5, 5=HEADER_6, 6=PARAGRAPH, 7=BULLET, 8=NUMBERED, 9=TABLE, 10=IMAGE, 11=CODE_BLOCK, 12=QUOTE\n- Fonts enum: 0=TIMES_ROMAN, 1=COURIER, 2=HELVETICA, 3=HELVETICA_BOLD, 4=HELVETICA_ITALIC, 5=HELVETICA_BOLD_ITALIC\n- Colors must be hex strings: \"#RGB\" or \"#RRGGBB\".\n- Headings (0-5): content is a single string; you may set metadata.align.\n- Paragraphs (6) and Quotes (12): content is a single string.\n- Bullets (7) and Numbered (8): content is an array of strings (one item per list entry). DO NOT include bullet symbols (*) or numbers (1. 2. 3.) in the content - the format will automatically add these.\n- Code blocks (11): prefer content as an array of lines; preserve indentation via leading tabs/spaces. If using a single string, include \\n between lines.\n- Table (9) and Image (10) are not supported by the renderer now; do not emit them.\n- Use metadata sparingly; omit fields you don't need. For code blocks you may set metadata.paddingX, paddingY, background, and font (1 for Courier).\n- Wrap text naturally; do not insert manual line breaks except where semantically required (lists, code).\n- The JSON must be valid and ready for PDF rendering by the server.`;\n\n const messages: OpenAI.Chat.Completions.ChatCompletionMessageParam[] = [\n { role: 'system', content: enhancedSystemPrompt },\n ];\n\n // Add recent conversation history\n recentMessages.reverse().forEach(msg => {\n const role = isAIUser(msg.senderId) ? 'assistant' : 'user';\n const senderName = msg.sender?.profile?.displayName || msg.sender?.username || 'Teacher';\n const content = isAIUser(msg.senderId) ? msg.content : `${senderName}: ${msg.content}`;\n \n messages.push({\n role: role as 'user' | 'assistant',\n content,\n });\n });\n\n // Add the new teacher message\n const senderName = 'Teacher'; // We could get this from the actual sender if needed\n messages.push({\n role: 'user',\n content: `${senderName}: ${teacherMessage}`,\n });\n\n\n const completion = await inferenceClient.chat.completions.create({\n model: 'command-a-03-2025',\n messages,\n temperature: 0.7,\n response_format: {\n type: \"json_object\",\n // @ts-expect-error\n schema: {\n type: \"object\",\n properties: {\n text: { type: \"string\" },\n docs: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n title: { type: \"string\" },\n blocks: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n format: { type: \"integer\", minimum: 0, maximum: 12 },\n content: {\n oneOf: [\n { type: \"string\" },\n { type: \"array\", items: { type: \"string\" } }\n ]\n },\n metadata: {\n type: \"object\",\n properties: {\n fontSize: { type: \"number\", minimum: 6 },\n lineHeight: { type: \"number\", minimum: 0.6 },\n paragraphSpacing: { type: \"number\", minimum: 0 },\n indentWidth: { type: \"number\", minimum: 0 },\n paddingX: { type: \"number\", minimum: 0 },\n paddingY: { type: \"number\", minimum: 0 },\n font: { type: \"integer\", minimum: 0, maximum: 5 },\n color: { type: \"string\", pattern: \"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$\" },\n background: { type: \"string\", pattern: \"^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$\" },\n align: { type: \"string\", enum: [\"left\", \"center\", \"right\"] }\n },\n additionalProperties: false\n }\n },\n required: [\"format\", \"content\"],\n additionalProperties: false\n }\n }\n },\n required: [\"title\", \"blocks\"],\n additionalProperties: false\n }\n }\n },\n required: [\"text\"],\n additionalProperties: false\n }\n },\n });\n\n const response = completion.choices[0]?.message?.content;\n \n if (!response) {\n throw new Error('No response generated from inference API');\n }\n\n // Parse the JSON response and generate PDF if docs are provided\n try {\n const jsonData = JSON.parse(response);\n\n\n const attachmentIds: string[] = [];\n // Generate PDFs if docs are provided\n if (jsonData.docs && Array.isArray(jsonData.docs)) {\n \n\n console.log('Generating PDFs', { labChatId, docs: JSON.stringify(jsonData.docs, null, 2) });\n for (let i = 0; i < jsonData.docs.length; i++) {\n const doc = jsonData.docs[i];\n if (!doc.title || !doc.blocks || !Array.isArray(doc.blocks)) {\n logger.error(`Document ${i + 1} is missing title or blocks`);\n continue;\n } \n\n\n try {\n let pdfBytes = await createPdf(doc.blocks); \n if (pdfBytes) {\n // Sanitize filename - remove special characters and limit length\n const sanitizedTitle = doc.title\n .replace(/[^a-zA-Z0-9\\s\\-_]/g, '')\n .replace(/\\s+/g, '_')\n .substring(0, 50);\n \n const filename = `${sanitizedTitle}_${uuidv4().substring(0, 8)}.pdf`;\n const filePath = `class/generated/${fullLabChat.classId}/${filename}`;\n\n logger.info(`PDF ${i + 1} generated successfully`, { labChatId, title: doc.title });\n \n // Upload directly to Google Cloud Storage\n const gcsFile = bucket.file(filePath);\n await gcsFile.save(Buffer.from(pdfBytes), {\n metadata: {\n contentType: 'application/pdf',\n }\n });\n \n logger.info(`PDF ${i + 1} uploaded successfully`, { labChatId, filename });\n\n const file = await prisma.file.create({\n data: {\n name: filename,\n path: filePath,\n type: 'application/pdf',\n size: pdfBytes.length,\n userId: fullLabChat.createdById,\n uploadStatus: 'COMPLETED',\n uploadedAt: new Date(),\n },\n });\n attachmentIds.push(file.id);\n } else {\n logger.error(`PDF ${i + 1} creation returned undefined/null`, { labChatId, title: doc.title });\n }\n } catch (pdfError) {\n logger.error(`PDF creation threw an error for document ${i + 1}:`, { \n error: pdfError instanceof Error ? {\n message: pdfError.message,\n stack: pdfError.stack,\n name: pdfError.name\n } : pdfError, \n labChatId,\n title: doc.title\n });\n }\n }\n }\n\n // Send the text response to the conversation\n await sendAIMessage(jsonData.text || response, conversationId, {\n attachments: {\n connect: attachmentIds.map(id => ({ id })),\n },\n subject: fullLabChat.class?.subject || 'Lab',\n });\n } catch (parseError) {\n logger.error('Failed to parse AI response or generate PDF:', { error: parseError, labChatId });\n // Fallback: send the raw response if parsing fails\n await sendAIMessage(response, conversationId, {\n subject: fullLabChat.class?.subject || 'Lab',\n });\n }\n\n logger.info('AI response sent', { labChatId, conversationId });\n\n } catch (error) {\n console.error('Full error object:', error);\n logger.error('Failed to generate AI response:', { \n error: error instanceof Error ? {\n message: error.message,\n stack: error.stack,\n name: error.name\n } : error,\n labChatId \n });\n throw error; // Re-throw to see the full error in the calling function\n }\n}\n\n"],"names":[],"mappings":"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","debug_id":"7dd48cd3-b996-5dc5-bd2d-c8e1531645d1"}
@@ -1 +1 @@
1
- {"version":3,"file":"marketing.d.ts","sourceRoot":"","sources":["../../src/routers/marketing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgF1B,CAAC"}
1
+ {"version":3,"file":"marketing.d.ts","sourceRoot":"/","sources":["routers/marketing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgF1B,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]="f8392f89-0070-5df6-84dc-c56f596c3c00")}catch(e){}}();
1
3
  import { z } from "zod";
2
4
  import { createTRPCRouter, publicProcedure } from "../trpc.js";
3
5
  import { prisma } from "../lib/prisma.js";
@@ -80,3 +82,5 @@ export const marketingRouter = createTRPCRouter({
80
82
  };
81
83
  }),
82
84
  });
85
+ //# sourceMappingURL=marketing.js.map
86
+ //# debugId=f8392f89-0070-5df6-84dc-c56f596c3c00
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketing.js","sources":["routers/marketing.ts"],"sourceRoot":"/","sourcesContent":["import { z } from \"zod\";\nimport { createTRPCRouter, publicProcedure } from \"../trpc.js\";\nimport { prisma } from \"../lib/prisma.js\";\nimport { v4 } from \"uuid\";\n\nexport const marketingRouter = createTRPCRouter({\n createSchoolDevelopementProgram: publicProcedure\n .input(z.object({\n name: z.string(),\n type: z.string(),\n address: z.string(),\n city: z.string(),\n country: z.string(),\n numberOfStudents: z.number(),\n numberOfTeachers: z.number(),\n website: z.string().optional(),\n contactName: z.string().optional(),\n contactRole: z.string().optional(),\n contactEmail: z.string().optional(),\n contactPhone: z.string().optional(),\n eligibilityInformation: z.string().optional(),\n whyHelp: z.string().optional(),\n additionalInformation: z.string().optional(),\n }))\n .mutation(async ({ ctx, input }) => {\n const { name, type, address, city, country, numberOfStudents, numberOfTeachers, website, contactName, contactRole, contactEmail, contactPhone, eligibilityInformation, whyHelp, additionalInformation } = input;\n\n const date = new Date();\n \n const id = name.slice(0, 3).toUpperCase() + '-' + date.getFullYear() + '-' + v4().slice(0, 4).toUpperCase();\n const schoolDevelopementProgram = await prisma.schoolDevelopementProgram.create({\n data: {\n id,\n name,\n type,\n address,\n city,\n country,\n numberOfStudents,\n numberOfTeachers,\n website,\n contactName,\n contactRole,\n contactEmail,\n contactPhone,\n eligibilityInformation,\n whyHelp,\n additionalInformation,\n },\n });\n\n return {\n id: schoolDevelopementProgram.id,\n };\n }),\n searchSchoolDevelopementPrograms: publicProcedure\n .input(z.object({\n id: z.string(),\n }))\n .query(async ({ input }) => {\n const { id } = input;\n const schoolDevelopementProgram = await prisma.schoolDevelopementProgram.findUnique({\n where: {\n id,\n },\n });\n return schoolDevelopementProgram;\n }),\n earlyAccessRequest: publicProcedure\n .input(z.object({\n email: z.string(),\n institutionSize: z.string(),\n }))\n .mutation(async ({ input }) => {\n const { email, institutionSize } = input;\n const earlyAccessRequest = await prisma.earlyAccessRequest.create({\n data: {\n email,\n institutionSize,\n },\n });\n return {\n id: earlyAccessRequest.id,\n };\n }),\n});"],"names":[],"mappings":"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","debug_id":"f8392f89-0070-5df6-84dc-c56f596c3c00"}
@@ -1 +1 @@
1
- {"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../src/routers/message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAylBxB,CAAC"}
1
+ {"version":3,"file":"message.d.ts","sourceRoot":"/","sources":["routers/message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAylBxB,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]="e87ffb37-b6d4-561f-b90e-225fc519823a")}catch(e){}}();
1
3
  import { z } from 'zod';
2
4
  import { createTRPCRouter, protectedProcedure } from '../trpc.js';
3
5
  import { prisma } from '../lib/prisma.js';
@@ -542,3 +544,5 @@ export const messageRouter = createTRPCRouter({
542
544
  };
543
545
  }),
544
546
  });
547
+ //# sourceMappingURL=message.js.map
548
+ //# debugId=e87ffb37-b6d4-561f-b90e-225fc519823a
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.js","sources":["routers/message.ts"],"sourceRoot":"/","sourcesContent":["import { z } from 'zod';\nimport { createTRPCRouter, protectedProcedure } from '../trpc.js';\nimport { prisma } from '../lib/prisma.js';\nimport { pusher } from '../lib/pusher.js';\nimport { TRPCError } from '@trpc/server';\nimport { logger } from '../utils/logger.js';\n\nexport const messageRouter = createTRPCRouter({\n list: protectedProcedure\n .input(\n z.object({\n conversationId: z.string(),\n cursor: z.string().optional(),\n limit: z.number().min(1).max(100).default(50),\n })\n )\n .query(async ({ input, ctx }) => {\n const userId = ctx.user!.id;\n const { conversationId, cursor, limit } = input;\n\n // Verify user is a member of the conversation\n const membership = await prisma.conversationMember.findFirst({\n where: {\n conversationId,\n userId,\n },\n });\n\n if (!membership) {\n throw new TRPCError({\n code: 'FORBIDDEN',\n message: 'Not a member of this conversation',\n });\n }\n\n const messages = await prisma.message.findMany({\n where: {\n conversationId,\n ...(cursor && {\n createdAt: {\n lt: new Date(cursor),\n },\n }),\n },\n include: {\n attachments: {\n select: {\n id: true,\n name: true,\n type: true,\n },\n },\n sender: {\n select: {\n id: true,\n username: true,\n profile: {\n select: {\n displayName: true,\n profilePicture: true,\n },\n },\n },\n },\n mentions: {\n include: {\n user: {\n select: {\n id: true,\n username: true,\n profile: {\n select: {\n displayName: true,\n },\n },\n },\n },\n },\n },\n },\n orderBy: {\n createdAt: 'desc',\n },\n take: limit + 1,\n });\n\n let nextCursor: string | undefined = undefined;\n if (messages.length > limit) {\n const nextItem = messages.pop();\n nextCursor = nextItem!.createdAt.toISOString();\n }\n\n return {\n messages: messages.reverse().map((message) => ({\n id: message.id,\n content: message.content,\n senderId: message.senderId,\n conversationId: message.conversationId,\n createdAt: message.createdAt,\n sender: message.sender,\n attachments: message.attachments.map((attachment) => ({\n id: attachment.id,\n name: attachment.name,\n type: attachment.type,\n })),\n mentions: message.mentions.map((mention) => ({\n user: mention.user,\n })),\n mentionsMe: message.mentions.some((mention) => mention.userId === userId),\n })),\n nextCursor,\n };\n }),\n\n send: protectedProcedure\n .input(\n z.object({\n conversationId: z.string(),\n content: z.string().min(1).max(4000),\n mentionedUserIds: z.array(z.string()).optional(),\n })\n )\n .mutation(async ({ input, ctx }) => {\n const userId = ctx.user!.id;\n const { conversationId, content, mentionedUserIds = [] } = input;\n\n // Verify user is a member of the conversation\n const membership = await prisma.conversationMember.findFirst({\n where: {\n conversationId,\n userId,\n },\n });\n\n if (!membership) {\n throw new TRPCError({\n code: 'FORBIDDEN',\n message: 'Not a member of this conversation',\n });\n }\n\n // Verify mentioned users are members of the conversation\n if (mentionedUserIds.length > 0) {\n const mentionedMemberships = await prisma.conversationMember.findMany({\n where: {\n conversationId,\n userId: { in: mentionedUserIds },\n },\n });\n\n if (mentionedMemberships.length !== mentionedUserIds.length) {\n throw new TRPCError({\n code: 'BAD_REQUEST',\n message: 'Some mentioned users are not members of this conversation',\n });\n }\n }\n\n // Create message, mentions, and update conversation timestamp\n const result = await prisma.$transaction(async (tx) => {\n const message = await tx.message.create({\n data: {\n content,\n senderId: userId,\n conversationId,\n },\n include: {\n sender: {\n select: {\n id: true,\n username: true,\n profile: {\n select: {\n displayName: true,\n profilePicture: true,\n },\n },\n },\n },\n },\n });\n\n // Create mentions\n if (mentionedUserIds.length > 0) {\n await tx.mention.createMany({\n data: mentionedUserIds.map((mentionedUserId) => ({\n messageId: message.id,\n userId: mentionedUserId,\n })),\n });\n }\n\n // Update conversation timestamp\n await tx.conversation.update({\n where: { id: conversationId },\n data: { updatedAt: new Date() },\n });\n\n return message;\n });\n\n // Broadcast to Pusher channel\n try {\n await pusher.trigger(`conversation-${conversationId}`, 'new-message', {\n id: result.id,\n content: result.content,\n senderId: result.senderId,\n conversationId: result.conversationId,\n createdAt: result.createdAt,\n sender: result.sender,\n mentionedUserIds,\n });\n } catch (error) {\n logger.error('Failed to broadcast message:', {error});\n // Don't fail the request if Pusher fails\n }\n\n return {\n id: result.id,\n content: result.content,\n senderId: result.senderId,\n conversationId: result.conversationId,\n createdAt: result.createdAt,\n sender: result.sender,\n mentionedUserIds,\n };\n }),\n update: protectedProcedure\n .input(\n z.object({\n messageId: z.string(),\n content: z.string().min(1).max(4000),\n mentionedUserIds: z.array(z.string()).optional(),\n })\n )\n .mutation(async ({ input, ctx }) => {\n const userId = ctx.user!.id;\n const { messageId, content, mentionedUserIds = [] } = input;\n\n // Get the existing message and verify user is the sender\n const existingMessage = await prisma.message.findUnique({\n where: { id: messageId },\n include: {\n sender: {\n select: {\n id: true,\n username: true,\n profile: {\n select: {\n displayName: true,\n profilePicture: true,\n },\n },\n },\n },\n },\n });\n\n if (!existingMessage) {\n throw new TRPCError({\n code: 'NOT_FOUND',\n message: 'Message not found',\n });\n }\n\n if (existingMessage.senderId !== userId) {\n throw new TRPCError({\n code: 'FORBIDDEN',\n message: 'Not the sender of this message',\n });\n }\n\n // Verify user is still a member of the conversation\n const membership = await prisma.conversationMember.findFirst({\n where: {\n conversationId: existingMessage.conversationId,\n userId,\n },\n });\n\n if (!membership) {\n throw new TRPCError({\n code: 'FORBIDDEN',\n message: 'Not a member of this conversation',\n });\n }\n\n // Verify mentioned users are members of the conversation\n if (mentionedUserIds.length > 0) {\n const mentionedMemberships = await prisma.conversationMember.findMany({\n where: {\n conversationId: existingMessage.conversationId,\n userId: { in: mentionedUserIds },\n },\n });\n\n if (mentionedMemberships.length !== mentionedUserIds.length) {\n throw new TRPCError({\n code: 'BAD_REQUEST',\n message: 'Some mentioned users are not members of this conversation',\n });\n }\n }\n\n // Update message and mentions in transaction\n const updatedMessage = await prisma.$transaction(async (tx) => {\n // Update the message content\n const message = await tx.message.update({\n where: { id: messageId },\n data: { content },\n include: {\n sender: {\n select: {\n id: true,\n username: true,\n profile: {\n select: {\n displayName: true,\n profilePicture: true,\n },\n },\n },\n },\n },\n });\n\n // Delete existing mentions\n await tx.mention.deleteMany({\n where: { messageId },\n });\n\n // Create new mentions if any\n if (mentionedUserIds.length > 0) {\n await tx.mention.createMany({\n data: mentionedUserIds.map((mentionedUserId) => ({\n messageId,\n userId: mentionedUserId,\n })),\n });\n }\n\n return message;\n });\n\n // Broadcast message update to Pusher\n try {\n await pusher.trigger(`conversation-${existingMessage.conversationId}`, 'message-updated', {\n id: updatedMessage.id,\n content: updatedMessage.content,\n senderId: updatedMessage.senderId,\n conversationId: updatedMessage.conversationId,\n createdAt: updatedMessage.createdAt,\n sender: updatedMessage.sender,\n mentionedUserIds,\n });\n } catch (error) {\n logger.error('Failed to broadcast message update:', {error});\n // Don't fail the request if Pusher fails\n }\n\n return {\n id: updatedMessage.id,\n content: updatedMessage.content,\n senderId: updatedMessage.senderId,\n conversationId: updatedMessage.conversationId,\n createdAt: updatedMessage.createdAt,\n sender: updatedMessage.sender,\n mentionedUserIds,\n };\n }),\n\n delete: protectedProcedure\n .input(\n z.object({\n messageId: z.string(),\n })\n )\n .mutation(async ({ input, ctx }) => {\n const userId = ctx.user!.id;\n const { messageId } = input;\n\n // Get the message and verify user is the sender\n const existingMessage = await prisma.message.findUnique({\n where: { id: messageId },\n include: {\n sender: {\n select: {\n id: true,\n username: true,\n },\n },\n },\n });\n\n if (!existingMessage) {\n throw new TRPCError({\n code: 'NOT_FOUND',\n message: 'Message not found',\n });\n }\n\n if (existingMessage.senderId !== userId) {\n throw new TRPCError({\n code: 'FORBIDDEN',\n message: 'Not the sender of this message',\n });\n }\n\n // Verify user is still a member of the conversation\n const membership = await prisma.conversationMember.findFirst({\n where: {\n conversationId: existingMessage.conversationId,\n userId,\n },\n });\n\n if (!membership) {\n throw new TRPCError({\n code: 'FORBIDDEN',\n message: 'Not a member of this conversation',\n });\n }\n\n // Delete message and all related mentions in transaction\n await prisma.$transaction(async (tx) => {\n // Delete mentions first (due to foreign key constraint)\n await tx.mention.deleteMany({\n where: { messageId },\n });\n\n // Delete the message\n await tx.message.delete({\n where: { id: messageId },\n });\n });\n\n // Broadcast message deletion to Pusher\n try {\n await pusher.trigger(`conversation-${existingMessage.conversationId}`, 'message-deleted', {\n messageId,\n conversationId: existingMessage.conversationId,\n senderId: existingMessage.senderId,\n });\n } catch (error) {\n logger.error('Failed to broadcast message deletion:', {error});\n // Don't fail the request if Pusher fails\n }\n\n return {\n success: true,\n messageId,\n };\n }),\n markAsRead: protectedProcedure\n .input(\n z.object({\n conversationId: z.string(),\n })\n )\n .mutation(async ({ input, ctx }) => {\n const userId = ctx.user!.id;\n const { conversationId } = input;\n\n // Verify user is a member of the conversation and update lastViewedAt\n const membership = await prisma.conversationMember.findFirst({\n where: {\n conversationId,\n userId,\n },\n });\n\n if (!membership) {\n throw new TRPCError({\n code: 'FORBIDDEN',\n message: 'Not a member of this conversation',\n });\n }\n\n // Update the user's lastViewedAt timestamp for this conversation\n await prisma.conversationMember.update({\n where: {\n id: membership.id,\n },\n data: {\n lastViewedAt: new Date(),\n },\n });\n\n // Broadcast that user has viewed the conversation\n try {\n await pusher.trigger(`conversation-${conversationId}`, 'conversation-viewed', {\n userId,\n viewedAt: new Date(),\n });\n } catch (error) {\n logger.error('Failed to broadcast conversation view:', {error});\n // Don't fail the request if Pusher fails\n }\n\n return { success: true };\n }),\n\n markMentionsAsRead: protectedProcedure\n .input(\n z.object({\n conversationId: z.string(),\n })\n )\n .mutation(async ({ input, ctx }) => {\n const userId = ctx.user!.id;\n const { conversationId } = input;\n\n // Verify user is a member of the conversation and update lastViewedMentionAt\n const membership = await prisma.conversationMember.findFirst({\n where: {\n conversationId,\n userId,\n },\n });\n\n if (!membership) {\n throw new TRPCError({\n code: 'FORBIDDEN',\n message: 'Not a member of this conversation',\n });\n }\n\n // Update the user's lastViewedMentionAt timestamp for this conversation\n await prisma.conversationMember.update({\n where: {\n id: membership.id,\n },\n data: {\n lastViewedMentionAt: new Date(),\n },\n });\n\n // Broadcast that user has viewed mentions\n try {\n await pusher.trigger(`conversation-${conversationId}`, 'mentions-viewed', {\n userId,\n viewedAt: new Date(),\n });\n } catch (error) {\n logger.error('Failed to broadcast mentions view:', {error});\n // Don't fail the request if Pusher fails\n }\n\n return { success: true };\n }),\n\n getUnreadCount: protectedProcedure\n .input(z.object({ conversationId: z.string() }))\n .query(async ({ input, ctx }) => {\n const userId = ctx.user!.id;\n const { conversationId } = input;\n\n // Get user's membership with lastViewedAt and lastViewedMentionAt\n const membership = await prisma.conversationMember.findFirst({\n where: {\n conversationId,\n userId,\n },\n });\n\n if (!membership) {\n throw new TRPCError({\n code: 'FORBIDDEN',\n message: 'Not a member of this conversation',\n });\n }\n\n // Count regular unread messages\n const unreadCount = await prisma.message.count({\n where: {\n conversationId,\n senderId: { not: userId },\n ...(membership.lastViewedAt && {\n createdAt: { gt: membership.lastViewedAt }\n }),\n },\n });\n\n // Count unread mentions\n // Use the later of lastViewedAt or lastViewedMentionAt\n // This means if user viewed conversation after mention, mention is considered read\n const mentionCutoffTime = membership.lastViewedMentionAt && membership.lastViewedAt \n ? (membership.lastViewedMentionAt > membership.lastViewedAt ? membership.lastViewedMentionAt : membership.lastViewedAt)\n : (membership.lastViewedMentionAt || membership.lastViewedAt);\n \n const unreadMentionCount = await prisma.mention.count({\n where: {\n userId,\n message: {\n conversationId,\n senderId: { not: userId },\n ...(mentionCutoffTime && {\n createdAt: { gt: mentionCutoffTime }\n }),\n },\n },\n });\n\n return { \n unreadCount, \n unreadMentionCount \n };\n }),\n});\n"],"names":[],"mappings":"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","debug_id":"e87ffb37-b6d4-561f-b90e-225fc519823a"}
@@ -1 +1 @@
1
- {"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../src/routers/notifications.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwF7B,CAAA"}
1
+ {"version":3,"file":"notifications.d.ts","sourceRoot":"/","sources":["routers/notifications.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwF7B,CAAA"}
@@ -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]="eae28f0d-19df-5b28-9d97-4f4b309bd4aa")}catch(e){}}();
1
3
  import { createTRPCRouter, protectedProcedure } from "../trpc.js";
2
4
  import { prisma } from "../lib/prisma.js";
3
5
  import { z } from "zod";
@@ -89,3 +91,5 @@ export const notificationRouter = createTRPCRouter({
89
91
  return notification;
90
92
  }),
91
93
  });
94
+ //# sourceMappingURL=notifications.js.map
95
+ //# debugId=eae28f0d-19df-5b28-9d97-4f4b309bd4aa
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.js","sources":["routers/notifications.ts"],"sourceRoot":"/","sourcesContent":["import { createTRPCRouter, protectedProcedure } from \"../trpc.js\";\nimport { prisma } from \"../lib/prisma.js\";\nimport { z } from \"zod\";\n\nexport const notificationRouter = createTRPCRouter({\n list: protectedProcedure.query(async ({ ctx }) => {\n const notifications = await prisma.notification.findMany({\n where: {\n receiverId: ctx.user!.id,\n },\n orderBy: {\n createdAt: \"desc\",\n },\n include: {\n sender: {\n select: {\n username: true,\n },\n },\n receiver: {\n select: {\n username: true,\n },\n },\n },\n });\n\n return notifications;\n }),\n get: protectedProcedure.input(z.object({\n id: z.string(),\n })).query(async ({ ctx, input }) => {\n const { id } = input;\n const notification = await prisma.notification.findUnique({\n where: {\n id,\n },\n include: {\n sender: {\n select: {\n username: true,\n },\n },\n receiver: {\n select: {\n username: true,\n },\n },\n },\n });\n return notification;\n }),\n sendTo: protectedProcedure.input(z.object({\n receiverId: z.string(),\n title: z.string(),\n content: z.string(),\n })).mutation(async ({ ctx, input }) => {\n const { receiverId, title, content } = input;\n const notification = await prisma.notification.create({\n data: {\n receiverId,\n title,\n content,\n },\n });\n return notification;\n }),\n sendToMultiple: protectedProcedure.input(z.object({\n receiverIds: z.array(z.string()),\n title: z.string(),\n content: z.string(),\n })).mutation(async ({ ctx, input }) => {\n const { receiverIds, title, content } = input;\n const notifications = await prisma.notification.createMany({\n data: receiverIds.map(receiverId => ({\n receiverId,\n title,\n content,\n })),\n });\n return notifications;\n }),\n markAsRead: protectedProcedure.input(z.object({\n id: z.string(),\n })).mutation(async ({ ctx, input }) => {\n const { id } = input;\n const notification = await prisma.notification.update({\n where: { id },\n data: { read: true },\n });\n return notification;\n }),\n})\n"],"names":[],"mappings":"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","debug_id":"eae28f0d-19df-5b28-9d97-4f4b309bd4aa"}
@@ -479,3 +479,5 @@ export const schoolRouter = createTRPCRouter({
479
479
  return results;
480
480
  })
481
481
  });
482
+ !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]="59e27bf6-b975-511e-91ff-8378ed0fc1e4")}catch(e){}}();
483
+ //# debugId=59e27bf6-b975-511e-91ff-8378ed0fc1e4
@@ -1 +1 @@
1
- {"version":3,"file":"section.d.ts","sourceRoot":"","sources":["../../src/routers/section.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAuBxB,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkUxB,CAAC"}
1
+ {"version":3,"file":"section.d.ts","sourceRoot":"/","sources":["routers/section.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAuBxB,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkUxB,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]="ac1474d5-7092-5f48-9b93-aa7c2055bdb3")}catch(e){}}();
1
3
  import { z } from "zod";
2
4
  import { createTRPCRouter, protectedProcedure } from "../trpc.js";
3
5
  import { TRPCError } from "@trpc/server";
@@ -300,3 +302,5 @@ export const sectionRouter = createTRPCRouter({
300
302
  return { id: input.id };
301
303
  }),
302
304
  });
305
+ //# sourceMappingURL=section.js.map
306
+ //# debugId=ac1474d5-7092-5f48-9b93-aa7c2055bdb3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"section.js","sources":["routers/section.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 createSectionSchema = z.object({\n classId: z.string(),\n name: z.string(),\n color: z.string().optional(),\n});\n\nconst updateSectionSchema = z.object({\n id: z.string(),\n classId: z.string(),\n name: z.string(),\n color: z.string().optional(),\n});\n\nconst deleteSectionSchema = z.object({\n id: z.string(),\n classId: z.string(),\n});\n\nexport const sectionRouter = createTRPCRouter({\n create: protectedProcedure\n .input(createSectionSchema)\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 // Verify user is a teacher of the class\n const classData = await prisma.class.findFirst({\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: \"NOT_FOUND\",\n message: \"Class not found or you are not a teacher\",\n });\n }\n\n const section = await prisma.section.create({\n data: {\n name: input.name,\n order: 0,\n class: {\n connect: { id: input.classId },\n },\n ...(input.color && {\n color: input.color,\n }),\n },\n });\n\n // Insert new section at top of unified list (sections + assignments) and normalize\n const [sections, assignments] = await Promise.all([\n prisma.section.findMany({\n where: { classId: input.classId },\n select: { id: true, order: true },\n }),\n prisma.assignment.findMany({\n where: { classId: input.classId },\n select: { id: true, order: true },\n }),\n ]);\n\n const unified = [\n ...sections.map(s => ({ id: s.id, order: s.order, type: 'section' as const })),\n ...assignments.map(a => ({ 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 const withoutNew = unified.filter(item => !(item.id === section.id && item.type === 'section'));\n const reindexed = [{ id: section.id, type: 'section' as const }, ...withoutNew.map(item => ({ id: item.id, type: item.type }))];\n\n await Promise.all(\n reindexed.map((item, index) => {\n if (item.type === 'section') {\n return prisma.section.update({ where: { id: item.id }, data: { order: index + 1 } });\n } else {\n return prisma.assignment.update({ where: { id: item.id }, data: { order: index + 1 } });\n }\n })\n );\n\n return section;\n }),\n\n reorder: protectedProcedure\n .input(z.object({\n classId: z.string(),\n movedId: z.string(), // Section ID\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 if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"User must be authenticated\",\n });\n }\n\n const { classId, movedId, position, targetId } = input;\n\n const moved = await prisma.section.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: 'Section 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 [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 const unified = [\n ...sections.map(s => ({ id: s.id, order: s.order, type: 'section' as const })),\n ...assignments.map(a => ({ 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 const movedIdx = unified.findIndex(item => item.id === movedId && item.type === 'section');\n if (movedIdx === -1) {\n throw new TRPCError({ code: 'NOT_FOUND', message: 'Section not found in unified list' });\n }\n\n const withoutMoved = unified.filter(item => !(item.id === movedId && item.type === 'section'));\n\n let next: Array<{ id: string; type: 'section' | 'assignment' }> = [];\n\n if (position === 'start') {\n next = [{ id: movedId, type: 'section' }, ...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: 'section' }];\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: 'section' },\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: 'section' },\n ...withoutMoved.slice(targetIdx + 1).map(item => ({ id: item.id, type: item.type })),\n ];\n }\n }\n\n // Normalize to 1..n\n await Promise.all(\n next.map((item, index) => {\n if (item.type === 'section') {\n return tx.section.update({ where: { id: item.id }, data: { order: index + 1 } });\n } else {\n return tx.assignment.update({ where: { id: item.id }, data: { order: index + 1 } });\n }\n })\n );\n\n return tx.section.findUnique({ where: { id: movedId } });\n });\n\n return result;\n }),\n\n update: protectedProcedure\n .input(updateSectionSchema)\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 // Verify user is a teacher of the class\n const classData = await prisma.class.findFirst({\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: \"NOT_FOUND\",\n message: \"Class not found or you are not a teacher\",\n });\n }\n\n const section = await prisma.section.update({\n where: { id: input.id },\n data: {\n name: input.name,\n ...(input.color && {\n color: input.color,\n }),\n },\n });\n\n return section;\n }),\n\n reOrder: protectedProcedure\n .input(z.object({\n id: z.string(),\n classId: z.string(),\n order: z.number(),\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 // Verify user is a teacher of the class\n const classData = await prisma.class.findFirst({\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: \"NOT_FOUND\",\n message: \"Class not found or you are not a teacher\",\n });\n }\n\n // Update order and normalize unified list\n await prisma.$transaction(async (tx) => {\n await tx.section.update({\n where: { id: input.id },\n data: { order: input.order },\n });\n\n // Normalize entire unified list\n const [sections, assignments] = await Promise.all([\n tx.section.findMany({\n where: { classId: input.classId },\n select: { id: true, order: true },\n }),\n tx.assignment.findMany({\n where: { classId: input.classId },\n select: { id: true, order: true },\n }),\n ]);\n\n const unified = [\n ...sections.map(s => ({ id: s.id, order: s.order, type: 'section' as const })),\n ...assignments.map(a => ({ 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 await Promise.all(\n unified.map((item, index) => {\n if (item.type === 'section') {\n return tx.section.update({ where: { id: item.id }, data: { order: index + 1 } });\n } else {\n return tx.assignment.update({ where: { id: item.id }, data: { order: index + 1 } });\n }\n })\n );\n });\n\n return { id: input.id };\n }),\n\n delete: protectedProcedure\n .input(deleteSectionSchema)\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 // Verify user is a teacher of the class\n const classData = await prisma.class.findFirst({\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: \"NOT_FOUND\",\n message: \"Class not found or you are not a teacher\",\n });\n }\n\n await prisma.section.delete({\n where: { id: input.id },\n });\n\n return { id: input.id };\n }),\n}); "],"names":[],"mappings":"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","debug_id":"ac1474d5-7092-5f48-9b93-aa7c2055bdb3"}
@@ -1 +1 @@
1
- {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../src/routers/user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA2DxB,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuMrB,CAAC"}
1
+ {"version":3,"file":"user.d.ts","sourceRoot":"/","sources":["routers/user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA2DxB,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuMrB,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]="9fd79d80-c720-5d04-af6a-a66a555d5f74")}catch(e){}}();
1
3
  import { z } from "zod";
2
4
  import { createTRPCRouter, protectedProcedure } from "../trpc.js";
3
5
  import { TRPCError } from "@trpc/server";
@@ -230,3 +232,5 @@ export const userRouter = createTRPCRouter({
230
232
  }
231
233
  }),
232
234
  });
235
+ //# sourceMappingURL=user.js.map
236
+ //# debugId=9fd79d80-c720-5d04-af6a-a66a555d5f74
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.js","sources":["routers/user.ts"],"sourceRoot":"/","sourcesContent":["import { z } from \"zod\";\nimport { createTRPCRouter, protectedProcedure } from \"../trpc.js\";\nimport { TRPCError } from \"@trpc/server\";\nimport { prisma } from \"../lib/prisma.js\";\nimport { createDirectUploadFiles, type DirectUploadFile } from \"../lib/fileUpload.js\";\nimport { getSignedUrl } from \"../lib/googleCloudStorage.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { bucket } from \"../lib/googleCloudStorage.js\";\n\n// Helper function to convert file path to backend proxy URL\nfunction getFileUrl(filePath: string | null): string | null {\n if (!filePath) return null;\n \n // If it's already a full URL (DiceBear or external), return as is\n if (filePath.startsWith('http')) {\n return filePath;\n }\n \n // Convert GCS path to full backend proxy URL\n const backendUrl = process.env.BACKEND_URL || 'http://localhost:3001';\n return `${backendUrl}/api/files/${encodeURIComponent(filePath)}`;\n}\n\n// For direct file uploads (file already uploaded to GCS)\nconst fileUploadSchema = z.object({\n filePath: z.string().min(1, \"File path is required\"),\n fileName: z.string().min(1, \"File name is required\"),\n fileType: z.string().regex(/^image\\/(jpeg|jpg|png|gif|webp)$/i, \"Only image files (JPEG, PNG, GIF, WebP) are allowed\"),\n fileSize: z.number().max(5 * 1024 * 1024, \"File size must be less than 5MB\"),\n});\n\n// For DiceBear avatar URL\nconst dicebearSchema = z.object({\n url: z.string().url(\"Invalid DiceBear avatar URL\"),\n});\n\nconst profileSchema = z.object({\n displayName: z.string().nullable().optional().transform(val => val === null ? undefined : val),\n bio: z.string().nullable().optional().transform(val => val === null ? undefined : val),\n location: z.string().nullable().optional().transform(val => val === null ? undefined : val),\n website: z.union([\n z.string().url(),\n z.literal(\"\"),\n z.null().transform(() => undefined)\n ]).optional(),\n});\n\nconst updateProfileSchema = z.object({\n profile: profileSchema.optional(),\n // Support both custom file upload and DiceBear avatar\n profilePicture: fileUploadSchema.optional(),\n dicebearAvatar: dicebearSchema.optional(),\n});\n\nconst getUploadUrlSchema = z.object({\n fileName: z.string().min(1, \"File name is required\"),\n fileType: z.string().regex(/^image\\/(jpeg|jpg|png|gif|webp)$/i, \"Only image files are allowed\"),\n});\n\nexport const userRouter = createTRPCRouter({\n getProfile: 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 user = await prisma.user.findUnique({\n where: { id: ctx.user.id },\n select: {\n id: true,\n username: true,\n },\n });\n\n if (!user) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"User not found\",\n });\n }\n\n // Get user profile separately\n const userProfile = await prisma.userProfile.findUnique({\n where: { userId: ctx.user.id },\n });\n\n return {\n id: user.id,\n username: user.username,\n profile: userProfile ? {\n displayName: (userProfile as any).displayName || null,\n bio: (userProfile as any).bio || null,\n location: (userProfile as any).location || null,\n website: (userProfile as any).website || null,\n profilePicture: getFileUrl((userProfile as any).profilePicture),\n profilePictureThumbnail: getFileUrl((userProfile as any).profilePictureThumbnail),\n } : {\n displayName: null,\n bio: null,\n location: null,\n website: null,\n profilePicture: null,\n profilePictureThumbnail: null,\n },\n };\n }),\n\n updateProfile: protectedProcedure\n .input(updateProfileSchema)\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 // Get current profile to clean up old profile picture\n const currentProfile = await prisma.userProfile.findUnique({\n where: { userId: ctx.user.id },\n });\n\n let profilePictureUrl: string | null = null;\n let profilePictureThumbnail: string | null = null;\n\n // Handle custom profile picture (already uploaded to GCS)\n if (input.profilePicture) {\n try {\n // File is already uploaded to GCS, just use the path\n profilePictureUrl = input.profilePicture.filePath;\n \n // Generate thumbnail for the uploaded file\n // TODO: Implement thumbnail generation for direct uploads\n profilePictureThumbnail = null;\n\n // Clean up old profile picture if it exists\n if ((currentProfile as any)?.profilePicture) {\n // TODO: Implement file deletion logic here\n // await deleteFile((currentProfile as any).profilePicture);\n }\n } catch (error) {\n logger.error('Profile picture processing failed', { \n userId: ctx.user.id, \n error: error instanceof Error ? error.message : 'Unknown error' \n });\n throw new TRPCError({\n code: \"INTERNAL_SERVER_ERROR\",\n message: \"Failed to process profile picture. Please try again.\",\n });\n }\n }\n\n // Handle DiceBear avatar URL\n if (input.dicebearAvatar) {\n profilePictureUrl = input.dicebearAvatar.url;\n // No thumbnail for DiceBear avatars since they're SVG URLs\n profilePictureThumbnail = null;\n }\n\n // Prepare update data\n const updateData: any = {};\n if (input.profile) {\n if (input.profile.displayName !== undefined && input.profile.displayName !== null) {\n updateData.displayName = input.profile.displayName;\n }\n if (input.profile.bio !== undefined && input.profile.bio !== null) {\n updateData.bio = input.profile.bio;\n }\n if (input.profile.location !== undefined && input.profile.location !== null) {\n updateData.location = input.profile.location;\n }\n if (input.profile.website !== undefined && input.profile.website !== null) {\n updateData.website = input.profile.website;\n }\n }\n if (profilePictureUrl !== null) updateData.profilePicture = profilePictureUrl;\n if (profilePictureThumbnail !== null) updateData.profilePictureThumbnail = profilePictureThumbnail;\n\n // Upsert user profile with structured data\n const updatedProfile = await prisma.userProfile.upsert({\n where: { userId: ctx.user.id },\n create: {\n userId: ctx.user.id,\n ...updateData,\n },\n update: {\n ...updateData,\n updatedAt: new Date(),\n },\n });\n\n // Get username for response\n const user = await prisma.user.findUnique({\n where: { id: ctx.user.id },\n select: { username: true },\n });\n\n return {\n id: ctx.user.id,\n username: user?.username || '',\n profile: {\n displayName: (updatedProfile as any).displayName || null,\n bio: (updatedProfile as any).bio || null,\n location: (updatedProfile as any).location || null,\n website: (updatedProfile as any).website || null,\n profilePicture: getFileUrl((updatedProfile as any).profilePicture),\n profilePictureThumbnail: getFileUrl((updatedProfile as any).profilePictureThumbnail),\n },\n };\n }),\n\n getUploadUrl: protectedProcedure\n .input(getUploadUrlSchema)\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 try {\n // Generate unique filename\n const fileExtension = input.fileName.split('.').pop();\n const uniqueFilename = `${ctx.user.id}-${Date.now()}.${fileExtension}`;\n const filePath = `users/${ctx.user.id}/profile/${uniqueFilename}`;\n\n // Generate backend proxy upload URL instead of direct GCS signed URL\n const backendUrl = process.env.BACKEND_URL || 'http://localhost:3001';\n const uploadUrl = `${backendUrl}/api/upload/${encodeURIComponent(filePath)}`;\n\n logger.info('Generated upload URL', {\n userId: ctx.user.id,\n filePath,\n fileName: uniqueFilename,\n fileType: input.fileType,\n uploadUrl\n });\n\n return {\n uploadUrl,\n filePath,\n fileName: uniqueFilename,\n };\n } catch (error) {\n logger.error('Failed to generate upload URL', { \n userId: ctx.user.id, \n error: error instanceof Error ? error.message : 'Unknown error' \n });\n throw new TRPCError({\n code: \"INTERNAL_SERVER_ERROR\",\n message: \"Failed to generate upload URL\",\n });\n }\n }),\n}); "],"names":[],"mappings":"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","debug_id":"9fd79d80-c720-5d04-af6a-a66a555d5f74"}
@@ -226,21 +226,6 @@ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
226
226
  profilePictureThumbnail: string | null;
227
227
  } | null;
228
228
  };
229
- replies: {
230
- id: string;
231
- content: string;
232
- createdAt: Date;
233
- modifiedAt: Date | null;
234
- author: {
235
- id: string;
236
- username: string;
237
- profile: {
238
- displayName: string | null;
239
- profilePicture: string | null;
240
- profilePictureThumbnail: string | null;
241
- } | null;
242
- };
243
- }[];
244
229
  }[];
245
230
  } & {
246
231
  id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"worksheet.d.ts","sourceRoot":"","sources":["../../src/routers/worksheet.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBA8KA,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwVhC,CAAC"}
1
+ {"version":3,"file":"worksheet.d.ts","sourceRoot":"/","sources":["routers/worksheet.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAWxB,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBA8KA,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsWhC,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]="9a2e945c-6bab-57f8-bce9-7647b58bea32")}catch(e){}}();
1
3
  import { TRPCError } from "@trpc/server";
2
4
  import { createTRPCRouter, protectedProcedure } from "../trpc.js";
3
5
  import { z } from "zod";
@@ -290,13 +292,22 @@ export const worksheetRouter = createTRPCRouter({
290
292
  if (!worksheetResponse) {
291
293
  throw new TRPCError({ code: 'NOT_FOUND', message: 'Worksheet response not found' });
292
294
  }
295
+ const question = await prisma.worksheetQuestion.findUnique({
296
+ where: { id: questionId },
297
+ });
298
+ const isMarkableByAlgo = question?.type === 'MULTIPLE_CHOICE' || question?.type === 'TRUE_FALSE';
299
+ const marksAwardedIfCorrect = question?.points || 0;
300
+ const correctAnswer = isMarkableByAlgo ? (question?.type === 'MULTIPLE_CHOICE' ? (question?.options).find((option) => option.isCorrect)?.id : question?.answer.toString()) : null;
293
301
  // Check if a response already exists for this question
294
302
  const existingResponse = worksheetResponse.responses[0];
295
303
  if (existingResponse) {
296
304
  // Update existing response
297
305
  await prisma.studentQuestionProgress.update({
298
306
  where: { id: existingResponse.id },
299
- data: { response },
307
+ data: { response,
308
+ ...(isMarkableByAlgo && { isCorrect: response === correctAnswer }),
309
+ ...(isMarkableByAlgo && { points: response === correctAnswer ? marksAwardedIfCorrect : 0 }),
310
+ },
300
311
  });
301
312
  }
302
313
  else {
@@ -307,6 +318,8 @@ export const worksheetRouter = createTRPCRouter({
307
318
  questionId,
308
319
  response,
309
320
  studentWorksheetResponseId: worksheetResponseId,
321
+ ...(isMarkableByAlgo && { isCorrect: response === correctAnswer }),
322
+ ...(isMarkableByAlgo && { points: response === correctAnswer ? marksAwardedIfCorrect : 0 }),
310
323
  },
311
324
  });
312
325
  }
@@ -454,3 +467,5 @@ export const worksheetRouter = createTRPCRouter({
454
467
  return newComment;
455
468
  }),
456
469
  });
470
+ //# sourceMappingURL=worksheet.js.map
471
+ //# debugId=9a2e945c-6bab-57f8-bce9-7647b58bea32