@studious-lms/server 1.25.0 → 1.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/models/marketplace.d.ts +35 -0
  2. package/dist/models/marketplace.d.ts.map +1 -1
  3. package/dist/models/marketplace.js +9 -2
  4. package/dist/models/marketplace.js.map +1 -1
  5. package/dist/models/module.d.ts +228 -0
  6. package/dist/models/module.d.ts.map +1 -0
  7. package/dist/models/module.js +69 -0
  8. package/dist/models/module.js.map +1 -0
  9. package/dist/pipelines/gradeWorksheet.d.ts.map +1 -1
  10. package/dist/pipelines/gradeWorksheet.js +4 -2
  11. package/dist/pipelines/gradeWorksheet.js.map +1 -1
  12. package/dist/routers/_app.d.ts +760 -0
  13. package/dist/routers/_app.d.ts.map +1 -1
  14. package/dist/routers/_app.js +4 -2
  15. package/dist/routers/_app.js.map +1 -1
  16. package/dist/routers/marketplace.d.ts +41 -0
  17. package/dist/routers/marketplace.d.ts.map +1 -1
  18. package/dist/routers/marketplace.js +13 -3
  19. package/dist/routers/marketplace.js.map +1 -1
  20. package/dist/routers/module.d.ts +345 -0
  21. package/dist/routers/module.d.ts.map +1 -0
  22. package/dist/routers/module.js +82 -0
  23. package/dist/routers/module.js.map +1 -0
  24. package/dist/services/assignment.d.ts.map +1 -1
  25. package/dist/services/assignment.js +8 -3
  26. package/dist/services/assignment.js.map +1 -1
  27. package/dist/services/marketplace.d.ts +36 -0
  28. package/dist/services/marketplace.d.ts.map +1 -1
  29. package/dist/services/marketplace.js +30 -3
  30. package/dist/services/marketplace.js.map +1 -1
  31. package/dist/services/module.d.ts +288 -0
  32. package/dist/services/module.d.ts.map +1 -0
  33. package/dist/services/module.js +518 -0
  34. package/dist/services/module.js.map +1 -0
  35. package/dist/services/school.d.ts.map +1 -1
  36. package/dist/services/school.js +17 -5
  37. package/dist/services/school.js.map +1 -1
  38. package/package.json +1 -1
  39. package/prisma/migrations/20260708013000_add_modules/migration.sql +100 -0
  40. package/prisma/schema.prisma +93 -0
  41. package/src/models/marketplace.ts +16 -0
  42. package/src/models/module.ts +77 -0
  43. package/src/pipelines/gradeWorksheet.ts +6 -0
  44. package/src/routers/_app.ts +2 -0
  45. package/src/routers/marketplace.ts +16 -0
  46. package/src/routers/module.ts +118 -0
  47. package/src/services/assignment.ts +12 -1
  48. package/src/services/marketplace.ts +39 -0
  49. package/src/services/module.ts +683 -0
  50. package/src/services/school.ts +15 -3
@@ -1 +1 @@
1
- {"version":3,"file":"marketplace.js","sources":["services/marketplace.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Marketplace service — publish / search / import for shareable markschemes,\n * worksheets, and files. Exercise/poll types are out of scope for B1 v1.\n */\nimport { TRPCError } from \"@trpc/server\";\nimport type {\n MarketplaceListingType,\n MarketplaceVisibility,\n Prisma,\n WorksheetQuestionType,\n} from \"@prisma/client\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { prisma } from \"../lib/prisma.js\";\nimport { copyFile } from \"../lib/googleCloudStorage.js\";\nimport { classTeacherOrSchoolAdminWhere } from \"../models/access.js\";\nimport { findOrCreateScopeRoot } from \"../models/cloudStorage.js\";\nimport {\n createMarketplaceListing,\n deleteMarketplaceListing,\n findMarketplaceListingById,\n incrementMarketplaceReportCount,\n searchMarketplaceListings,\n setMarketplaceListingHidden,\n} from \"../models/marketplace.js\";\nimport {\n findActiveSchoolAdminMembership,\n findSchoolMembership,\n listUserSchoolMemberships,\n} from \"../models/school.js\";\nimport { duplicateWorksheetWithClient } from \"../models/worksheet.js\";\n\ntype MarkSchemePayload = {\n kind: \"MARKSCHEME\";\n name: string | null;\n structured: string;\n};\n\ntype WorksheetQuestionPayload = {\n type: WorksheetQuestionType;\n question: string;\n answer: string;\n options: Prisma.JsonValue;\n markScheme: Prisma.JsonValue;\n points: number;\n order: number | null;\n};\n\ntype WorksheetPayload = {\n kind: \"WORKSHEET\";\n name: string;\n questions: WorksheetQuestionPayload[];\n};\n\ntype FilePayload = {\n kind: \"FILE\";\n name: string;\n type: string;\n size: number | null;\n path: string;\n};\n\ntype ListingPayload = MarkSchemePayload | WorksheetPayload | FilePayload;\n\nfunction normalizeTags(tags?: string[]) {\n if (!tags?.length) return [];\n const seen = new Set<string>();\n const out: string[] = [];\n for (const raw of tags) {\n const tag = raw.trim().replace(/\\s+/g, \" \").slice(0, 40);\n if (!tag) continue;\n const key = tag.toLowerCase();\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(tag);\n if (out.length >= 12) break;\n }\n return out;\n}\n\nasync function requireActiveSchoolMember(schoolId: string, userId: string) {\n const membership = await findSchoolMembership(schoolId, userId);\n if (!membership || membership.status !== \"ACTIVE\") {\n throw new TRPCError({\n code: \"FORBIDDEN\",\n message: \"You are not a member of this school\",\n });\n }\n return membership;\n}\n\nasync function assertCanTeachClass(classId: string, userId: string) {\n const cls = await prisma.class.findFirst({\n where: { id: classId, ...classTeacherOrSchoolAdminWhere(userId) },\n select: { id: true, schoolId: true, departmentId: true },\n });\n if (!cls) {\n throw new TRPCError({\n code: \"FORBIDDEN\",\n message: \"You don't have permission to use this class\",\n });\n }\n return cls;\n}\n\nasync function assertCanAccessListing(\n listing: NonNullable<Awaited<ReturnType<typeof findMarketplaceListingById>>>,\n userId: string\n) {\n if (listing.authorId === userId) return;\n if (listing.isHidden) {\n throw new TRPCError({ code: \"NOT_FOUND\", message: \"Listing not found\" });\n }\n if (listing.visibility === \"PUBLIC\") return;\n if (!listing.schoolId) {\n throw new TRPCError({ code: \"FORBIDDEN\", message: \"Listing is not available\" });\n }\n await requireActiveSchoolMember(listing.schoolId, userId);\n}\n\nfunction asPayload(raw: Prisma.JsonValue): ListingPayload {\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) {\n throw new TRPCError({\n code: \"INTERNAL_SERVER_ERROR\",\n message: \"Listing payload is invalid\",\n });\n }\n const kind = (raw as { kind?: string }).kind;\n if (kind === \"MARKSCHEME\" || kind === \"WORKSHEET\" || kind === \"FILE\") {\n return raw as ListingPayload;\n }\n throw new TRPCError({\n code: \"INTERNAL_SERVER_ERROR\",\n message: \"Listing payload is invalid\",\n });\n}\n\nexport async function listMarketplace(\n userId: string,\n input: {\n type?: MarketplaceListingType;\n search?: string;\n tags?: string[];\n schoolId?: string;\n cursor?: string;\n limit?: number;\n }\n) {\n const memberships = await listUserSchoolMemberships(userId);\n if (\n input.schoolId &&\n !memberships.some((m) => m.schoolId === input.schoolId)\n ) {\n return { items: [], nextCursor: undefined };\n }\n const schoolIds = input.schoolId\n ? [input.schoolId]\n : memberships.map((m) => m.schoolId);\n\n return searchMarketplaceListings({\n schoolIds,\n scopeSchoolId: input.schoolId,\n type: input.type,\n search: input.search,\n tags: input.tags,\n cursor: input.cursor,\n limit: input.limit ?? 20,\n authorId: userId,\n });\n}\n\nexport async function getMarketplaceListing(userId: string, listingId: string) {\n const listing = await findMarketplaceListingById(listingId);\n if (!listing) {\n throw new TRPCError({ code: \"NOT_FOUND\", message: \"Listing not found\" });\n }\n await assertCanAccessListing(listing, userId);\n return listing;\n}\n\nexport async function publishMarkSchemeListing(\n userId: string,\n input: {\n markSchemeId: string;\n title: string;\n description?: string;\n visibility: MarketplaceVisibility;\n schoolId?: string;\n tags?: string[];\n }\n) {\n const markScheme = await prisma.markScheme.findUnique({\n where: { id: input.markSchemeId },\n select: {\n id: true,\n name: true,\n structured: true,\n classId: true,\n departmentId: true,\n class: { select: { schoolId: true } },\n department: { select: { schoolId: true } },\n },\n });\n if (!markScheme) {\n throw new TRPCError({ code: \"NOT_FOUND\", message: \"Mark scheme not found\" });\n }\n\n let schoolId =\n input.schoolId ??\n markScheme.class?.schoolId ??\n markScheme.department?.schoolId ??\n null;\n\n if (markScheme.classId) {\n await assertCanTeachClass(markScheme.classId, userId);\n } else if (markScheme.departmentId && schoolId) {\n const admin = await findActiveSchoolAdminMembership(schoolId, userId);\n if (!admin) {\n throw new TRPCError({\n code: \"FORBIDDEN\",\n message: \"Only school admins can publish department mark schemes\",\n });\n }\n } else {\n throw new TRPCError({\n code: \"BAD_REQUEST\",\n message: \"Mark scheme is not scoped to a class or department\",\n });\n }\n\n if (input.visibility === \"SCHOOL\") {\n if (!schoolId) {\n throw new TRPCError({\n code: \"BAD_REQUEST\",\n message: \"schoolId is required for SCHOOL visibility\",\n });\n }\n await requireActiveSchoolMember(schoolId, userId);\n } else if (schoolId) {\n await requireActiveSchoolMember(schoolId, userId);\n }\n\n const payload: MarkSchemePayload = {\n kind: \"MARKSCHEME\",\n name: markScheme.name,\n structured: markScheme.structured,\n };\n\n return createMarketplaceListing({\n type: \"MARKSCHEME\",\n title: input.title.trim(),\n description: input.description?.trim() || null,\n authorId: userId,\n schoolId,\n visibility: input.visibility,\n markSchemeId: markScheme.id,\n payload,\n tags: normalizeTags(input.tags),\n });\n}\n\nexport async function publishWorksheetListing(\n userId: string,\n input: {\n worksheetId: string;\n title: string;\n description?: string;\n visibility: MarketplaceVisibility;\n schoolId?: string;\n tags?: string[];\n }\n) {\n const worksheet = await prisma.worksheet.findFirst({\n where: {\n id: input.worksheetId,\n class: classTeacherOrSchoolAdminWhere(userId),\n },\n include: {\n questions: { orderBy: { order: \"asc\" } },\n class: { select: { schoolId: true } },\n },\n });\n if (!worksheet) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Worksheet not found or you don't have permission to publish it\",\n });\n }\n\n const schoolId = input.schoolId ?? worksheet.class?.schoolId ?? null;\n if (input.visibility === \"SCHOOL\") {\n if (!schoolId) {\n throw new TRPCError({\n code: \"BAD_REQUEST\",\n message: \"schoolId is required for SCHOOL visibility\",\n });\n }\n await requireActiveSchoolMember(schoolId, userId);\n } else if (schoolId) {\n await requireActiveSchoolMember(schoolId, userId);\n }\n\n const payload: WorksheetPayload = {\n kind: \"WORKSHEET\",\n name: worksheet.name,\n questions: worksheet.questions.map((q) => ({\n type: q.type,\n question: q.question,\n answer: q.answer,\n options: q.options ?? {},\n markScheme: q.markScheme ?? {},\n points: q.points,\n order: q.order,\n })),\n };\n\n return createMarketplaceListing({\n type: \"WORKSHEET\",\n title: input.title.trim(),\n description: input.description?.trim() || null,\n authorId: userId,\n schoolId,\n visibility: input.visibility,\n worksheetId: worksheet.id,\n payload,\n tags: normalizeTags(input.tags),\n });\n}\n\nexport async function publishFileListing(\n userId: string,\n input: {\n fileId: string;\n title: string;\n description?: string;\n visibility: MarketplaceVisibility;\n schoolId?: string;\n tags?: string[];\n }\n) {\n const file = await prisma.file.findUnique({\n where: { id: input.fileId },\n select: {\n id: true,\n name: true,\n type: true,\n size: true,\n path: true,\n userId: true,\n folderId: true,\n uploadStatus: true,\n folder: {\n select: {\n classId: true,\n schoolStorageId: true,\n personalOwnerId: true,\n class: { select: { schoolId: true } },\n },\n },\n },\n });\n if (!file || file.uploadStatus === \"FAILED\" || file.uploadStatus === \"CANCELLED\") {\n throw new TRPCError({ code: \"NOT_FOUND\", message: \"File not found\" });\n }\n\n const isOwner = file.userId === userId;\n const isPersonal = file.folder?.personalOwnerId === userId;\n let canPublish = isOwner || isPersonal;\n let schoolId = input.schoolId ?? file.folder?.schoolStorageId ?? file.folder?.class?.schoolId ?? null;\n\n if (!canPublish && file.folder?.classId) {\n await assertCanTeachClass(file.folder.classId, userId);\n canPublish = true;\n }\n if (!canPublish && file.folder?.schoolStorageId) {\n const admin = await findActiveSchoolAdminMembership(\n file.folder.schoolStorageId,\n userId\n );\n if (!admin) {\n throw new TRPCError({\n code: \"FORBIDDEN\",\n message: \"You don't have permission to publish this file\",\n });\n }\n canPublish = true;\n schoolId = schoolId ?? file.folder.schoolStorageId;\n }\n if (!canPublish) {\n throw new TRPCError({\n code: \"FORBIDDEN\",\n message: \"You don't have permission to publish this file\",\n });\n }\n\n if (input.visibility === \"SCHOOL\") {\n if (!schoolId) {\n throw new TRPCError({\n code: \"BAD_REQUEST\",\n message: \"schoolId is required for SCHOOL visibility\",\n });\n }\n await requireActiveSchoolMember(schoolId, userId);\n } else if (schoolId) {\n await requireActiveSchoolMember(schoolId, userId);\n }\n\n const payload: FilePayload = {\n kind: \"FILE\",\n name: file.name,\n type: file.type,\n size: file.size,\n path: file.path,\n };\n\n return createMarketplaceListing({\n type: \"FILE\",\n title: input.title.trim(),\n description: input.description?.trim() || null,\n authorId: userId,\n schoolId,\n visibility: input.visibility,\n fileId: file.id,\n payload,\n tags: normalizeTags(input.tags),\n });\n}\n\n/**\n * Import a listing into the caller's workspace:\n * - MARKSCHEME → class mark scheme (or department template when departmentId given)\n * - WORKSHEET → class worksheet copy\n * - FILE → personal / class / school folder copy (GCS object copied)\n */\nexport async function importMarketplaceListing(\n userId: string,\n input: {\n listingId: string;\n classId?: string;\n departmentId?: string;\n folderId?: string;\n name?: string;\n }\n) {\n const listing = await findMarketplaceListingById(input.listingId);\n if (!listing) {\n throw new TRPCError({ code: \"NOT_FOUND\", message: \"Listing not found\" });\n }\n await assertCanAccessListing(listing, userId);\n\n const payload = asPayload(listing.payload);\n const name = input.name?.trim();\n\n if (listing.type === \"MARKSCHEME\") {\n if (payload.kind !== \"MARKSCHEME\") {\n throw new TRPCError({\n code: \"INTERNAL_SERVER_ERROR\",\n message: \"Mark scheme payload mismatch\",\n });\n }\n if (input.departmentId) {\n const department = await prisma.department.findUnique({\n where: { id: input.departmentId },\n select: { id: true, schoolId: true },\n });\n if (!department) {\n throw new TRPCError({ code: \"NOT_FOUND\", message: \"Department not found\" });\n }\n const admin = await findActiveSchoolAdminMembership(\n department.schoolId,\n userId\n );\n if (!admin) {\n throw new TRPCError({\n code: \"FORBIDDEN\",\n message: \"Only school admins can import into a department\",\n });\n }\n return {\n type: \"MARKSCHEME\" as const,\n markScheme: await prisma.markScheme.create({\n data: {\n department: { connect: { id: department.id } },\n name: name || payload.name || listing.title,\n structured: payload.structured,\n },\n select: { id: true, name: true, departmentId: true, classId: true },\n }),\n };\n }\n if (!input.classId) {\n throw new TRPCError({\n code: \"BAD_REQUEST\",\n message: \"classId is required to import a mark scheme\",\n });\n }\n await assertCanTeachClass(input.classId, userId);\n return {\n type: \"MARKSCHEME\" as const,\n markScheme: await prisma.markScheme.create({\n data: {\n class: { connect: { id: input.classId } },\n name: name || payload.name || listing.title,\n structured: payload.structured,\n },\n select: { id: true, name: true, departmentId: true, classId: true },\n }),\n };\n }\n\n if (listing.type === \"WORKSHEET\") {\n if (payload.kind !== \"WORKSHEET\") {\n throw new TRPCError({\n code: \"INTERNAL_SERVER_ERROR\",\n message: \"Worksheet payload mismatch\",\n });\n }\n if (!input.classId) {\n throw new TRPCError({\n code: \"BAD_REQUEST\",\n message: \"classId is required to import a worksheet\",\n });\n }\n await assertCanTeachClass(input.classId, userId);\n\n // Prefer live source clone when still available; otherwise rebuild from snapshot.\n if (listing.worksheetId) {\n const created = await prisma.$transaction((tx) =>\n duplicateWorksheetWithClient(\n tx,\n listing.worksheetId!,\n input.classId!,\n name || payload.name || listing.title\n )\n );\n if (created) {\n return { type: \"WORKSHEET\" as const, worksheet: created };\n }\n }\n\n const created = await prisma.worksheet.create({\n data: {\n classId: input.classId,\n name: name || payload.name || listing.title,\n questions: {\n create: payload.questions.map((q) => ({\n type: q.type,\n question: q.question,\n answer: q.answer,\n options: (q.options as Prisma.InputJsonValue) ?? {},\n markScheme: (q.markScheme as Prisma.InputJsonValue) ?? {},\n points: q.points,\n order: q.order,\n })),\n },\n },\n select: { id: true, name: true, classId: true },\n });\n return { type: \"WORKSHEET\" as const, worksheet: created };\n }\n\n if (listing.type === \"FILE\") {\n if (payload.kind !== \"FILE\") {\n throw new TRPCError({\n code: \"INTERNAL_SERVER_ERROR\",\n message: \"File payload mismatch\",\n });\n }\n\n let targetFolderId = input.folderId;\n if (!targetFolderId) {\n if (input.classId) {\n await assertCanTeachClass(input.classId, userId);\n const root = await findOrCreateScopeRoot({\n kind: \"CLASS\",\n classId: input.classId,\n });\n targetFolderId = root.id;\n } else {\n const root = await findOrCreateScopeRoot({\n kind: \"PERSONAL\",\n userId,\n });\n targetFolderId = root.id;\n }\n } else {\n const folder = await prisma.folder.findUnique({\n where: { id: targetFolderId },\n select: {\n id: true,\n classId: true,\n schoolStorageId: true,\n personalOwnerId: true,\n },\n });\n if (!folder) {\n throw new TRPCError({ code: \"NOT_FOUND\", message: \"Folder not found\" });\n }\n if (folder.personalOwnerId && folder.personalOwnerId !== userId) {\n throw new TRPCError({\n code: \"FORBIDDEN\",\n message: \"You don't have permission to import into this folder\",\n });\n }\n if (folder.classId) {\n await assertCanTeachClass(folder.classId, userId);\n }\n if (folder.schoolStorageId) {\n const admin = await findActiveSchoolAdminMembership(\n folder.schoolStorageId,\n userId\n );\n if (!admin) {\n throw new TRPCError({\n code: \"FORBIDDEN\",\n message: \"Only school admins can import into school storage\",\n });\n }\n }\n }\n\n const ext = payload.name.includes(\".\")\n ? payload.name.slice(payload.name.lastIndexOf(\".\"))\n : \"\";\n const newPath = `marketplace/${uuidv4()}${ext}`;\n await copyFile(payload.path, newPath);\n\n const created = await prisma.file.create({\n data: {\n name: name || payload.name || listing.title,\n type: payload.type,\n size: payload.size ?? undefined,\n path: newPath,\n userId,\n folderId: targetFolderId,\n uploadStatus: \"COMPLETED\",\n uploadedAt: new Date(),\n },\n select: { id: true, name: true, folderId: true, path: true, type: true },\n });\n return { type: \"FILE\" as const, file: created };\n }\n\n throw new TRPCError({\n code: \"BAD_REQUEST\",\n message: \"Unsupported listing type\",\n });\n}\n\nexport async function reportMarketplaceListing(\n userId: string,\n listingId: string\n) {\n const listing = await findMarketplaceListingById(listingId);\n if (!listing) {\n throw new TRPCError({ code: \"NOT_FOUND\", message: \"Listing not found\" });\n }\n await assertCanAccessListing(listing, userId);\n // C10 light stub — increment only; no reporter dedupe table yet.\n return incrementMarketplaceReportCount(listingId);\n}\n\nexport async function hideMarketplaceListing(\n userId: string,\n listingId: string,\n isHidden: boolean\n) {\n const listing = await findMarketplaceListingById(listingId);\n if (!listing) {\n throw new TRPCError({ code: \"NOT_FOUND\", message: \"Listing not found\" });\n }\n const isAuthor = listing.authorId === userId;\n const isSchoolAdmin =\n listing.schoolId != null &&\n Boolean(await findActiveSchoolAdminMembership(listing.schoolId, userId));\n if (!isAuthor && !isSchoolAdmin) {\n throw new TRPCError({\n code: \"FORBIDDEN\",\n message: \"Only the author or a school admin can hide this listing\",\n });\n }\n return setMarketplaceListingHidden(listingId, isHidden);\n}\n\nexport async function unpublishMarketplaceListing(\n userId: string,\n listingId: string\n) {\n const listing = await findMarketplaceListingById(listingId);\n if (!listing) {\n throw new TRPCError({ code: \"NOT_FOUND\", message: \"Listing not found\" });\n }\n if (listing.authorId !== userId) {\n const isSchoolAdmin =\n listing.schoolId != null &&\n Boolean(await findActiveSchoolAdminMembership(listing.schoolId, userId));\n if (!isSchoolAdmin) {\n throw new TRPCError({\n code: \"FORBIDDEN\",\n message: \"Only the author or a school admin can unpublish this listing\",\n });\n }\n await setMarketplaceListingHidden(listingId, true);\n return { success: true as const, deleted: false };\n }\n const result = await deleteMarketplaceListing(listingId, userId);\n return { success: true as const, deleted: result.count > 0 };\n}\n\n/** Publishable sources for the current user (for the publish dialog). */\nexport async function listPublishableSources(\n userId: string,\n input: { classId?: string; schoolId?: string }\n) {\n const classFilter = input.classId\n ? { id: input.classId, ...classTeacherOrSchoolAdminWhere(userId) }\n : classTeacherOrSchoolAdminWhere(userId);\n\n const [markSchemes, worksheets, files] = await Promise.all([\n prisma.markScheme.findMany({\n where: {\n OR: [\n { class: classFilter },\n ...(input.schoolId\n ? [\n {\n department: {\n schoolId: input.schoolId,\n school: {\n memberships: {\n some: {\n userId,\n role: \"ADMIN\" as const,\n status: \"ACTIVE\" as const,\n },\n },\n },\n },\n },\n ]\n : []),\n ],\n },\n select: {\n id: true,\n name: true,\n classId: true,\n departmentId: true,\n class: { select: { name: true } },\n department: { select: { name: true } },\n },\n take: 50,\n orderBy: { id: \"desc\" },\n }),\n prisma.worksheet.findMany({\n where: { class: classFilter },\n select: {\n id: true,\n name: true,\n classId: true,\n class: { select: { name: true } },\n _count: { select: { questions: true } },\n },\n take: 50,\n orderBy: { updatedAt: \"desc\" },\n }),\n prisma.file.findMany({\n where: {\n uploadStatus: \"COMPLETED\",\n OR: [\n { userId },\n { folder: { personalOwnerId: userId } },\n ...(input.classId\n ? [{ folder: { classId: input.classId, class: classFilter } }]\n : [{ folder: { class: classFilter } }]),\n ],\n },\n select: {\n id: true,\n name: true,\n type: true,\n size: true,\n folderId: true,\n },\n take: 50,\n orderBy: { uploadedAt: \"desc\" },\n }),\n ]);\n\n return { markSchemes, worksheets, files };\n}\n"],"names":[],"mappings":"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","debug_id":"b0ba201b-83d8-5de3-a820-a6105cef2863"}
1
+ {"version":3,"file":"marketplace.js","sources":["services/marketplace.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Marketplace service — publish / search / import for shareable markschemes,\n * worksheets, and files. Exercise/poll types are out of scope for B1 v1.\n */\nimport { TRPCError } from \"@trpc/server\";\nimport type {\n MarketplaceListingType,\n MarketplaceVisibility,\n Prisma,\n WorksheetQuestionType,\n} from \"@prisma/client\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { prisma } from \"../lib/prisma.js\";\nimport { copyFile } from \"../lib/googleCloudStorage.js\";\nimport { classTeacherOrSchoolAdminWhere } from \"../models/access.js\";\nimport { findOrCreateScopeRoot } from \"../models/cloudStorage.js\";\nimport {\n createMarketplaceListing,\n deleteMarketplaceListing,\n findMarketplaceListingById,\n incrementMarketplaceReportCount,\n searchMarketplaceListings,\n setMarketplaceListingHidden,\n updateMarketplaceListing,\n} from \"../models/marketplace.js\";\nimport {\n findActiveSchoolAdminMembership,\n findSchoolMembership,\n listUserSchoolMemberships,\n} from \"../models/school.js\";\nimport { duplicateWorksheetWithClient } from \"../models/worksheet.js\";\n\ntype MarkSchemePayload = {\n kind: \"MARKSCHEME\";\n name: string | null;\n structured: string;\n};\n\ntype WorksheetQuestionPayload = {\n type: WorksheetQuestionType;\n question: string;\n answer: string;\n options: Prisma.JsonValue;\n markScheme: Prisma.JsonValue;\n points: number;\n order: number | null;\n};\n\ntype WorksheetPayload = {\n kind: \"WORKSHEET\";\n name: string;\n questions: WorksheetQuestionPayload[];\n};\n\ntype FilePayload = {\n kind: \"FILE\";\n name: string;\n type: string;\n size: number | null;\n path: string;\n};\n\ntype ListingPayload = MarkSchemePayload | WorksheetPayload | FilePayload;\n\nfunction normalizeTags(tags?: string[]) {\n if (!tags?.length) return [];\n const seen = new Set<string>();\n const out: string[] = [];\n for (const raw of tags) {\n const tag = raw.trim().replace(/\\s+/g, \" \").slice(0, 40);\n if (!tag) continue;\n const key = tag.toLowerCase();\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(tag);\n if (out.length >= 12) break;\n }\n return out;\n}\n\nasync function requireActiveSchoolMember(schoolId: string, userId: string) {\n const membership = await findSchoolMembership(schoolId, userId);\n if (!membership || membership.status !== \"ACTIVE\") {\n throw new TRPCError({\n code: \"FORBIDDEN\",\n message: \"You are not a member of this school\",\n });\n }\n return membership;\n}\n\nasync function assertCanTeachClass(classId: string, userId: string) {\n const cls = await prisma.class.findFirst({\n where: { id: classId, ...classTeacherOrSchoolAdminWhere(userId) },\n select: { id: true, schoolId: true, departmentId: true },\n });\n if (!cls) {\n throw new TRPCError({\n code: \"FORBIDDEN\",\n message: \"You don't have permission to use this class\",\n });\n }\n return cls;\n}\n\nasync function assertCanAccessListing(\n listing: NonNullable<Awaited<ReturnType<typeof findMarketplaceListingById>>>,\n userId: string\n) {\n if (listing.authorId === userId) return;\n if (listing.isHidden) {\n throw new TRPCError({ code: \"NOT_FOUND\", message: \"Listing not found\" });\n }\n if (listing.visibility === \"PUBLIC\") return;\n if (!listing.schoolId) {\n throw new TRPCError({ code: \"FORBIDDEN\", message: \"Listing is not available\" });\n }\n await requireActiveSchoolMember(listing.schoolId, userId);\n}\n\nfunction asPayload(raw: Prisma.JsonValue): ListingPayload {\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) {\n throw new TRPCError({\n code: \"INTERNAL_SERVER_ERROR\",\n message: \"Listing payload is invalid\",\n });\n }\n const kind = (raw as { kind?: string }).kind;\n if (kind === \"MARKSCHEME\" || kind === \"WORKSHEET\" || kind === \"FILE\") {\n return raw as ListingPayload;\n }\n throw new TRPCError({\n code: \"INTERNAL_SERVER_ERROR\",\n message: \"Listing payload is invalid\",\n });\n}\n\nexport async function listMarketplace(\n userId: string,\n input: {\n type?: MarketplaceListingType;\n search?: string;\n tags?: string[];\n schoolId?: string;\n cursor?: string;\n limit?: number;\n }\n) {\n const memberships = await listUserSchoolMemberships(userId);\n if (\n input.schoolId &&\n !memberships.some((m) => m.schoolId === input.schoolId)\n ) {\n return { items: [], nextCursor: undefined };\n }\n const schoolIds = input.schoolId\n ? [input.schoolId]\n : memberships.map((m) => m.schoolId);\n\n return searchMarketplaceListings({\n schoolIds,\n scopeSchoolId: input.schoolId,\n type: input.type,\n search: input.search,\n tags: input.tags,\n cursor: input.cursor,\n limit: input.limit ?? 20,\n authorId: userId,\n });\n}\n\nexport async function getMarketplaceListing(userId: string, listingId: string) {\n const listing = await findMarketplaceListingById(listingId);\n if (!listing) {\n throw new TRPCError({ code: \"NOT_FOUND\", message: \"Listing not found\" });\n }\n await assertCanAccessListing(listing, userId);\n return listing;\n}\n\nexport async function publishMarkSchemeListing(\n userId: string,\n input: {\n markSchemeId: string;\n title: string;\n description?: string;\n visibility: MarketplaceVisibility;\n schoolId?: string;\n tags?: string[];\n }\n) {\n const markScheme = await prisma.markScheme.findUnique({\n where: { id: input.markSchemeId },\n select: {\n id: true,\n name: true,\n structured: true,\n classId: true,\n departmentId: true,\n class: { select: { schoolId: true } },\n department: { select: { schoolId: true } },\n },\n });\n if (!markScheme) {\n throw new TRPCError({ code: \"NOT_FOUND\", message: \"Mark scheme not found\" });\n }\n\n let schoolId =\n input.schoolId ??\n markScheme.class?.schoolId ??\n markScheme.department?.schoolId ??\n null;\n\n if (markScheme.classId) {\n await assertCanTeachClass(markScheme.classId, userId);\n } else if (markScheme.departmentId && schoolId) {\n const admin = await findActiveSchoolAdminMembership(schoolId, userId);\n if (!admin) {\n throw new TRPCError({\n code: \"FORBIDDEN\",\n message: \"Only school admins can publish department mark schemes\",\n });\n }\n } else {\n throw new TRPCError({\n code: \"BAD_REQUEST\",\n message: \"Mark scheme is not scoped to a class or department\",\n });\n }\n\n if (input.visibility === \"SCHOOL\") {\n if (!schoolId) {\n throw new TRPCError({\n code: \"BAD_REQUEST\",\n message: \"schoolId is required for SCHOOL visibility\",\n });\n }\n await requireActiveSchoolMember(schoolId, userId);\n } else if (schoolId) {\n await requireActiveSchoolMember(schoolId, userId);\n }\n\n const payload: MarkSchemePayload = {\n kind: \"MARKSCHEME\",\n name: markScheme.name,\n structured: markScheme.structured,\n };\n\n return createMarketplaceListing({\n type: \"MARKSCHEME\",\n title: input.title.trim(),\n description: input.description?.trim() || null,\n authorId: userId,\n schoolId,\n visibility: input.visibility,\n markSchemeId: markScheme.id,\n payload,\n tags: normalizeTags(input.tags),\n });\n}\n\nexport async function publishWorksheetListing(\n userId: string,\n input: {\n worksheetId: string;\n title: string;\n description?: string;\n visibility: MarketplaceVisibility;\n schoolId?: string;\n tags?: string[];\n }\n) {\n const worksheet = await prisma.worksheet.findFirst({\n where: {\n id: input.worksheetId,\n class: classTeacherOrSchoolAdminWhere(userId),\n },\n include: {\n questions: { orderBy: { order: \"asc\" } },\n class: { select: { schoolId: true } },\n },\n });\n if (!worksheet) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Worksheet not found or you don't have permission to publish it\",\n });\n }\n\n const schoolId = input.schoolId ?? worksheet.class?.schoolId ?? null;\n if (input.visibility === \"SCHOOL\") {\n if (!schoolId) {\n throw new TRPCError({\n code: \"BAD_REQUEST\",\n message: \"schoolId is required for SCHOOL visibility\",\n });\n }\n await requireActiveSchoolMember(schoolId, userId);\n } else if (schoolId) {\n await requireActiveSchoolMember(schoolId, userId);\n }\n\n const payload: WorksheetPayload = {\n kind: \"WORKSHEET\",\n name: worksheet.name,\n questions: worksheet.questions.map((q) => ({\n type: q.type,\n question: q.question,\n answer: q.answer,\n options: q.options ?? {},\n markScheme: q.markScheme ?? {},\n points: q.points,\n order: q.order,\n })),\n };\n\n return createMarketplaceListing({\n type: \"WORKSHEET\",\n title: input.title.trim(),\n description: input.description?.trim() || null,\n authorId: userId,\n schoolId,\n visibility: input.visibility,\n worksheetId: worksheet.id,\n payload,\n tags: normalizeTags(input.tags),\n });\n}\n\nexport async function publishFileListing(\n userId: string,\n input: {\n fileId: string;\n title: string;\n description?: string;\n visibility: MarketplaceVisibility;\n schoolId?: string;\n tags?: string[];\n }\n) {\n const file = await prisma.file.findUnique({\n where: { id: input.fileId },\n select: {\n id: true,\n name: true,\n type: true,\n size: true,\n path: true,\n userId: true,\n folderId: true,\n uploadStatus: true,\n folder: {\n select: {\n classId: true,\n schoolStorageId: true,\n personalOwnerId: true,\n class: { select: { schoolId: true } },\n },\n },\n },\n });\n if (!file || file.uploadStatus === \"FAILED\" || file.uploadStatus === \"CANCELLED\") {\n throw new TRPCError({ code: \"NOT_FOUND\", message: \"File not found\" });\n }\n\n const isOwner = file.userId === userId;\n const isPersonal = file.folder?.personalOwnerId === userId;\n let canPublish = isOwner || isPersonal;\n let schoolId = input.schoolId ?? file.folder?.schoolStorageId ?? file.folder?.class?.schoolId ?? null;\n\n if (!canPublish && file.folder?.classId) {\n await assertCanTeachClass(file.folder.classId, userId);\n canPublish = true;\n }\n if (!canPublish && file.folder?.schoolStorageId) {\n const admin = await findActiveSchoolAdminMembership(\n file.folder.schoolStorageId,\n userId\n );\n if (!admin) {\n throw new TRPCError({\n code: \"FORBIDDEN\",\n message: \"You don't have permission to publish this file\",\n });\n }\n canPublish = true;\n schoolId = schoolId ?? file.folder.schoolStorageId;\n }\n if (!canPublish) {\n throw new TRPCError({\n code: \"FORBIDDEN\",\n message: \"You don't have permission to publish this file\",\n });\n }\n\n if (input.visibility === \"SCHOOL\") {\n if (!schoolId) {\n throw new TRPCError({\n code: \"BAD_REQUEST\",\n message: \"schoolId is required for SCHOOL visibility\",\n });\n }\n await requireActiveSchoolMember(schoolId, userId);\n } else if (schoolId) {\n await requireActiveSchoolMember(schoolId, userId);\n }\n\n const payload: FilePayload = {\n kind: \"FILE\",\n name: file.name,\n type: file.type,\n size: file.size,\n path: file.path,\n };\n\n return createMarketplaceListing({\n type: \"FILE\",\n title: input.title.trim(),\n description: input.description?.trim() || null,\n authorId: userId,\n schoolId,\n visibility: input.visibility,\n fileId: file.id,\n payload,\n tags: normalizeTags(input.tags),\n });\n}\n\n/**\n * Import a listing into the caller's workspace:\n * - MARKSCHEME → class mark scheme (or department template when departmentId given)\n * - WORKSHEET → class worksheet copy\n * - FILE → personal / class / school folder copy (GCS object copied)\n */\nexport async function importMarketplaceListing(\n userId: string,\n input: {\n listingId: string;\n classId?: string;\n departmentId?: string;\n folderId?: string;\n name?: string;\n }\n) {\n const listing = await findMarketplaceListingById(input.listingId);\n if (!listing) {\n throw new TRPCError({ code: \"NOT_FOUND\", message: \"Listing not found\" });\n }\n await assertCanAccessListing(listing, userId);\n\n const payload = asPayload(listing.payload);\n const name = input.name?.trim();\n\n if (listing.type === \"MARKSCHEME\") {\n if (payload.kind !== \"MARKSCHEME\") {\n throw new TRPCError({\n code: \"INTERNAL_SERVER_ERROR\",\n message: \"Mark scheme payload mismatch\",\n });\n }\n if (input.departmentId) {\n const department = await prisma.department.findUnique({\n where: { id: input.departmentId },\n select: { id: true, schoolId: true },\n });\n if (!department) {\n throw new TRPCError({ code: \"NOT_FOUND\", message: \"Department not found\" });\n }\n const admin = await findActiveSchoolAdminMembership(\n department.schoolId,\n userId\n );\n if (!admin) {\n throw new TRPCError({\n code: \"FORBIDDEN\",\n message: \"Only school admins can import into a department\",\n });\n }\n return {\n type: \"MARKSCHEME\" as const,\n markScheme: await prisma.markScheme.create({\n data: {\n department: { connect: { id: department.id } },\n name: name || payload.name || listing.title,\n structured: payload.structured,\n },\n select: { id: true, name: true, departmentId: true, classId: true },\n }),\n };\n }\n if (!input.classId) {\n throw new TRPCError({\n code: \"BAD_REQUEST\",\n message: \"classId is required to import a mark scheme\",\n });\n }\n await assertCanTeachClass(input.classId, userId);\n return {\n type: \"MARKSCHEME\" as const,\n markScheme: await prisma.markScheme.create({\n data: {\n class: { connect: { id: input.classId } },\n name: name || payload.name || listing.title,\n structured: payload.structured,\n },\n select: { id: true, name: true, departmentId: true, classId: true },\n }),\n };\n }\n\n if (listing.type === \"WORKSHEET\") {\n if (payload.kind !== \"WORKSHEET\") {\n throw new TRPCError({\n code: \"INTERNAL_SERVER_ERROR\",\n message: \"Worksheet payload mismatch\",\n });\n }\n if (!input.classId) {\n throw new TRPCError({\n code: \"BAD_REQUEST\",\n message: \"classId is required to import a worksheet\",\n });\n }\n await assertCanTeachClass(input.classId, userId);\n\n // Prefer live source clone when still available; otherwise rebuild from snapshot.\n if (listing.worksheetId) {\n const created = await prisma.$transaction((tx) =>\n duplicateWorksheetWithClient(\n tx,\n listing.worksheetId!,\n input.classId!,\n name || payload.name || listing.title\n )\n );\n if (created) {\n return { type: \"WORKSHEET\" as const, worksheet: created };\n }\n }\n\n const created = await prisma.worksheet.create({\n data: {\n classId: input.classId,\n name: name || payload.name || listing.title,\n questions: {\n create: payload.questions.map((q) => ({\n type: q.type,\n question: q.question,\n answer: q.answer,\n options: (q.options as Prisma.InputJsonValue) ?? {},\n markScheme: (q.markScheme as Prisma.InputJsonValue) ?? {},\n points: q.points,\n order: q.order,\n })),\n },\n },\n select: { id: true, name: true, classId: true },\n });\n return { type: \"WORKSHEET\" as const, worksheet: created };\n }\n\n if (listing.type === \"FILE\") {\n if (payload.kind !== \"FILE\") {\n throw new TRPCError({\n code: \"INTERNAL_SERVER_ERROR\",\n message: \"File payload mismatch\",\n });\n }\n\n let targetFolderId = input.folderId;\n if (!targetFolderId) {\n if (input.classId) {\n await assertCanTeachClass(input.classId, userId);\n const root = await findOrCreateScopeRoot({\n kind: \"CLASS\",\n classId: input.classId,\n });\n targetFolderId = root.id;\n } else {\n const root = await findOrCreateScopeRoot({\n kind: \"PERSONAL\",\n userId,\n });\n targetFolderId = root.id;\n }\n } else {\n const folder = await prisma.folder.findUnique({\n where: { id: targetFolderId },\n select: {\n id: true,\n classId: true,\n schoolStorageId: true,\n personalOwnerId: true,\n },\n });\n if (!folder) {\n throw new TRPCError({ code: \"NOT_FOUND\", message: \"Folder not found\" });\n }\n if (folder.personalOwnerId && folder.personalOwnerId !== userId) {\n throw new TRPCError({\n code: \"FORBIDDEN\",\n message: \"You don't have permission to import into this folder\",\n });\n }\n if (folder.classId) {\n await assertCanTeachClass(folder.classId, userId);\n }\n if (folder.schoolStorageId) {\n const admin = await findActiveSchoolAdminMembership(\n folder.schoolStorageId,\n userId\n );\n if (!admin) {\n throw new TRPCError({\n code: \"FORBIDDEN\",\n message: \"Only school admins can import into school storage\",\n });\n }\n }\n }\n\n const ext = payload.name.includes(\".\")\n ? payload.name.slice(payload.name.lastIndexOf(\".\"))\n : \"\";\n const newPath = `marketplace/${uuidv4()}${ext}`;\n await copyFile(payload.path, newPath);\n\n const created = await prisma.file.create({\n data: {\n name: name || payload.name || listing.title,\n type: payload.type,\n size: payload.size ?? undefined,\n path: newPath,\n userId,\n folderId: targetFolderId,\n uploadStatus: \"COMPLETED\",\n uploadedAt: new Date(),\n },\n select: { id: true, name: true, folderId: true, path: true, type: true },\n });\n return { type: \"FILE\" as const, file: created };\n }\n\n throw new TRPCError({\n code: \"BAD_REQUEST\",\n message: \"Unsupported listing type\",\n });\n}\n\nexport async function reportMarketplaceListing(\n userId: string,\n listingId: string\n) {\n const listing = await findMarketplaceListingById(listingId);\n if (!listing) {\n throw new TRPCError({ code: \"NOT_FOUND\", message: \"Listing not found\" });\n }\n await assertCanAccessListing(listing, userId);\n // C10 light stub — increment only; no reporter dedupe table yet.\n return incrementMarketplaceReportCount(listingId);\n}\n\nexport async function updateMarketplaceListingDetails(\n userId: string,\n input: {\n listingId: string;\n title?: string;\n description?: string | null;\n visibility?: \"SCHOOL\" | \"PUBLIC\";\n tags?: string[];\n }\n) {\n const listing = await findMarketplaceListingById(input.listingId);\n if (!listing) {\n throw new TRPCError({ code: \"NOT_FOUND\", message: \"Listing not found\" });\n }\n const isAuthor = listing.authorId === userId;\n const isSchoolAdmin =\n listing.schoolId != null &&\n Boolean(await findActiveSchoolAdminMembership(listing.schoolId, userId));\n if (!isAuthor && !isSchoolAdmin) {\n throw new TRPCError({\n code: \"FORBIDDEN\",\n message: \"Only the author or a school admin can edit this listing\",\n });\n }\n if (input.visibility === \"SCHOOL\" && listing.schoolId == null) {\n throw new TRPCError({\n code: \"BAD_REQUEST\",\n message: \"Listing has no school; it cannot use school visibility\",\n });\n }\n return updateMarketplaceListing(input.listingId, {\n title: input.title,\n description: input.description,\n visibility: input.visibility,\n tags: input.tags ? normalizeTags(input.tags) : undefined,\n });\n}\n\nexport async function hideMarketplaceListing(\n userId: string,\n listingId: string,\n isHidden: boolean\n) {\n const listing = await findMarketplaceListingById(listingId);\n if (!listing) {\n throw new TRPCError({ code: \"NOT_FOUND\", message: \"Listing not found\" });\n }\n const isAuthor = listing.authorId === userId;\n const isSchoolAdmin =\n listing.schoolId != null &&\n Boolean(await findActiveSchoolAdminMembership(listing.schoolId, userId));\n if (!isAuthor && !isSchoolAdmin) {\n throw new TRPCError({\n code: \"FORBIDDEN\",\n message: \"Only the author or a school admin can hide this listing\",\n });\n }\n return setMarketplaceListingHidden(listingId, isHidden);\n}\n\nexport async function unpublishMarketplaceListing(\n userId: string,\n listingId: string\n) {\n const listing = await findMarketplaceListingById(listingId);\n if (!listing) {\n throw new TRPCError({ code: \"NOT_FOUND\", message: \"Listing not found\" });\n }\n if (listing.authorId !== userId) {\n const isSchoolAdmin =\n listing.schoolId != null &&\n Boolean(await findActiveSchoolAdminMembership(listing.schoolId, userId));\n if (!isSchoolAdmin) {\n throw new TRPCError({\n code: \"FORBIDDEN\",\n message: \"Only the author or a school admin can unpublish this listing\",\n });\n }\n await setMarketplaceListingHidden(listingId, true);\n return { success: true as const, deleted: false };\n }\n const result = await deleteMarketplaceListing(listingId, userId);\n return { success: true as const, deleted: result.count > 0 };\n}\n\n/** Publishable sources for the current user (for the publish dialog). */\nexport async function listPublishableSources(\n userId: string,\n input: { classId?: string; schoolId?: string }\n) {\n const classFilter = input.classId\n ? { id: input.classId, ...classTeacherOrSchoolAdminWhere(userId) }\n : classTeacherOrSchoolAdminWhere(userId);\n\n const [markSchemes, worksheets, files] = await Promise.all([\n prisma.markScheme.findMany({\n where: {\n OR: [\n { class: classFilter },\n ...(input.schoolId\n ? [\n {\n department: {\n schoolId: input.schoolId,\n school: {\n memberships: {\n some: {\n userId,\n role: \"ADMIN\" as const,\n status: \"ACTIVE\" as const,\n },\n },\n },\n },\n },\n ]\n : []),\n ],\n },\n select: {\n id: true,\n name: true,\n classId: true,\n departmentId: true,\n class: { select: { name: true } },\n department: { select: { name: true } },\n },\n take: 50,\n orderBy: { id: \"desc\" },\n }),\n prisma.worksheet.findMany({\n where: { class: classFilter },\n select: {\n id: true,\n name: true,\n classId: true,\n class: { select: { name: true } },\n _count: { select: { questions: true } },\n },\n take: 50,\n orderBy: { updatedAt: \"desc\" },\n }),\n prisma.file.findMany({\n where: {\n uploadStatus: \"COMPLETED\",\n OR: [\n { userId },\n { folder: { personalOwnerId: userId } },\n ...(input.classId\n ? [{ folder: { classId: input.classId, class: classFilter } }]\n : [{ folder: { class: classFilter } }]),\n ],\n },\n select: {\n id: true,\n name: true,\n type: true,\n size: true,\n folderId: true,\n },\n take: 50,\n orderBy: { uploadedAt: \"desc\" },\n }),\n ]);\n\n return { markSchemes, worksheets, files };\n}\n"],"names":[],"mappings":"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","debug_id":"89284a2e-a306-525a-955c-e752537ee131"}
@@ -0,0 +1,288 @@
1
+ import { CourseModuleItemType as ModuleItemType, ModuleItemRequirementType } from "@prisma/client";
2
+ export declare function listModulesRecord(userId: string, classId: string): Promise<({
3
+ items: {
4
+ id: string;
5
+ title: string | null;
6
+ position: number;
7
+ moduleId: string;
8
+ indent: number;
9
+ itemType: import(".prisma/client").$Enums.CourseModuleItemType;
10
+ itemId: string | null;
11
+ externalUrl: string | null;
12
+ requirementType: import(".prisma/client").$Enums.ModuleItemRequirementType | null;
13
+ requiredScore: number | null;
14
+ }[];
15
+ prerequisites: {
16
+ prerequisiteId: string;
17
+ }[];
18
+ } & {
19
+ id: string;
20
+ createdAt: Date;
21
+ updatedAt: Date;
22
+ classId: string;
23
+ title: string;
24
+ position: number;
25
+ published: boolean;
26
+ unlockAt: Date | null;
27
+ requireSequential: boolean;
28
+ })[]>;
29
+ export declare function createModuleRecord(userId: string, input: {
30
+ classId: string;
31
+ title: string;
32
+ unlockAt?: Date | null;
33
+ requireSequential?: boolean;
34
+ }): Promise<{
35
+ items: {
36
+ id: string;
37
+ title: string | null;
38
+ position: number;
39
+ moduleId: string;
40
+ indent: number;
41
+ itemType: import(".prisma/client").$Enums.CourseModuleItemType;
42
+ itemId: string | null;
43
+ externalUrl: string | null;
44
+ requirementType: import(".prisma/client").$Enums.ModuleItemRequirementType | null;
45
+ requiredScore: number | null;
46
+ }[];
47
+ prerequisites: {
48
+ prerequisiteId: string;
49
+ }[];
50
+ } & {
51
+ id: string;
52
+ createdAt: Date;
53
+ updatedAt: Date;
54
+ classId: string;
55
+ title: string;
56
+ position: number;
57
+ published: boolean;
58
+ unlockAt: Date | null;
59
+ requireSequential: boolean;
60
+ }>;
61
+ export declare function updateModuleRecord(userId: string, input: {
62
+ id: string;
63
+ classId: string;
64
+ title?: string;
65
+ unlockAt?: Date | null;
66
+ requireSequential?: boolean;
67
+ published?: boolean;
68
+ prerequisiteIds?: string[];
69
+ }): Promise<{
70
+ items: {
71
+ id: string;
72
+ title: string | null;
73
+ position: number;
74
+ moduleId: string;
75
+ indent: number;
76
+ itemType: import(".prisma/client").$Enums.CourseModuleItemType;
77
+ itemId: string | null;
78
+ externalUrl: string | null;
79
+ requirementType: import(".prisma/client").$Enums.ModuleItemRequirementType | null;
80
+ requiredScore: number | null;
81
+ }[];
82
+ prerequisites: {
83
+ prerequisiteId: string;
84
+ }[];
85
+ } & {
86
+ id: string;
87
+ createdAt: Date;
88
+ updatedAt: Date;
89
+ classId: string;
90
+ title: string;
91
+ position: number;
92
+ published: boolean;
93
+ unlockAt: Date | null;
94
+ requireSequential: boolean;
95
+ }>;
96
+ export declare function deleteModuleRecord(userId: string, input: {
97
+ id: string;
98
+ classId: string;
99
+ }): Promise<{
100
+ id: string;
101
+ }>;
102
+ export declare function reorderModulesRecord(userId: string, input: {
103
+ classId: string;
104
+ orderedIds: string[];
105
+ }): Promise<({
106
+ items: {
107
+ id: string;
108
+ title: string | null;
109
+ position: number;
110
+ moduleId: string;
111
+ indent: number;
112
+ itemType: import(".prisma/client").$Enums.CourseModuleItemType;
113
+ itemId: string | null;
114
+ externalUrl: string | null;
115
+ requirementType: import(".prisma/client").$Enums.ModuleItemRequirementType | null;
116
+ requiredScore: number | null;
117
+ }[];
118
+ prerequisites: {
119
+ prerequisiteId: string;
120
+ }[];
121
+ } & {
122
+ id: string;
123
+ createdAt: Date;
124
+ updatedAt: Date;
125
+ classId: string;
126
+ title: string;
127
+ position: number;
128
+ published: boolean;
129
+ unlockAt: Date | null;
130
+ requireSequential: boolean;
131
+ })[]>;
132
+ export declare function createModuleItemRecord(userId: string, input: {
133
+ classId: string;
134
+ moduleId: string;
135
+ itemType: ModuleItemType;
136
+ itemId?: string;
137
+ externalUrl?: string;
138
+ title?: string;
139
+ indent?: number;
140
+ requirementType?: ModuleItemRequirementType;
141
+ requiredScore?: number;
142
+ }): Promise<{
143
+ id: string;
144
+ title: string | null;
145
+ position: number;
146
+ moduleId: string;
147
+ indent: number;
148
+ itemType: import(".prisma/client").$Enums.CourseModuleItemType;
149
+ itemId: string | null;
150
+ externalUrl: string | null;
151
+ requirementType: import(".prisma/client").$Enums.ModuleItemRequirementType | null;
152
+ requiredScore: number | null;
153
+ }>;
154
+ export declare function updateModuleItemRecord(userId: string, input: {
155
+ classId: string;
156
+ id: string;
157
+ title?: string | null;
158
+ externalUrl?: string;
159
+ indent?: number;
160
+ requirementType?: ModuleItemRequirementType | null;
161
+ requiredScore?: number | null;
162
+ }): Promise<{
163
+ id: string;
164
+ title: string | null;
165
+ position: number;
166
+ moduleId: string;
167
+ indent: number;
168
+ itemType: import(".prisma/client").$Enums.CourseModuleItemType;
169
+ itemId: string | null;
170
+ externalUrl: string | null;
171
+ requirementType: import(".prisma/client").$Enums.ModuleItemRequirementType | null;
172
+ requiredScore: number | null;
173
+ }>;
174
+ export declare function deleteModuleItemRecord(userId: string, input: {
175
+ classId: string;
176
+ id: string;
177
+ }): Promise<{
178
+ id: string;
179
+ }>;
180
+ /**
181
+ * Reorder items, supporting drag-and-drop across modules. `items` is the full
182
+ * new ordering: for every affected module, its items in display order.
183
+ */
184
+ export declare function reorderModuleItemsRecord(userId: string, input: {
185
+ classId: string;
186
+ items: {
187
+ id: string;
188
+ moduleId: string;
189
+ }[];
190
+ }): Promise<({
191
+ items: {
192
+ id: string;
193
+ title: string | null;
194
+ position: number;
195
+ moduleId: string;
196
+ indent: number;
197
+ itemType: import(".prisma/client").$Enums.CourseModuleItemType;
198
+ itemId: string | null;
199
+ externalUrl: string | null;
200
+ requirementType: import(".prisma/client").$Enums.ModuleItemRequirementType | null;
201
+ requiredScore: number | null;
202
+ }[];
203
+ prerequisites: {
204
+ prerequisiteId: string;
205
+ }[];
206
+ } & {
207
+ id: string;
208
+ createdAt: Date;
209
+ updatedAt: Date;
210
+ classId: string;
211
+ title: string;
212
+ position: number;
213
+ published: boolean;
214
+ unlockAt: Date | null;
215
+ requireSequential: boolean;
216
+ })[]>;
217
+ /**
218
+ * Compute the full module state for a student: lock status, per-item
219
+ * completion/accessibility and per-module progress percentages.
220
+ */
221
+ export declare function getStudentModulesState(classId: string, studentId: string): Promise<{
222
+ modules: {
223
+ items: {
224
+ completed: boolean;
225
+ accessible: boolean;
226
+ worksheetAssignmentId: string | null;
227
+ id: string;
228
+ title: string | null;
229
+ position: number;
230
+ moduleId: string;
231
+ indent: number;
232
+ itemType: import(".prisma/client").$Enums.CourseModuleItemType;
233
+ itemId: string | null;
234
+ externalUrl: string | null;
235
+ requirementType: import(".prisma/client").$Enums.ModuleItemRequirementType | null;
236
+ requiredScore: number | null;
237
+ }[];
238
+ locked: boolean;
239
+ lockedByPrerequisite: boolean;
240
+ lockedByDate: boolean;
241
+ completed: boolean;
242
+ requiredCount: number;
243
+ completedRequiredCount: number;
244
+ percentComplete: number;
245
+ prerequisites: {
246
+ prerequisiteId: string;
247
+ }[];
248
+ id: string;
249
+ createdAt: Date;
250
+ updatedAt: Date;
251
+ classId: string;
252
+ title: string;
253
+ position: number;
254
+ published: boolean;
255
+ unlockAt: Date | null;
256
+ requireSequential: boolean;
257
+ }[];
258
+ continueItemId: null;
259
+ continueModuleId: null;
260
+ }>;
261
+ /**
262
+ * Mark a module item as viewed by a student. Completes VIEW requirements;
263
+ * for other requirement types this only records that a progress row exists.
264
+ */
265
+ export declare function markItemViewedRecord(studentId: string, input: {
266
+ classId: string;
267
+ itemId: string;
268
+ }): Promise<{
269
+ status: import(".prisma/client").$Enums.ModuleItemProgressStatus;
270
+ id: string;
271
+ createdAt: Date;
272
+ updatedAt: Date;
273
+ moduleItemId: string;
274
+ studentId: string;
275
+ completedAt: Date | null;
276
+ }>;
277
+ /**
278
+ * Update module progress for a student's assignment after a submission event
279
+ * (submitted or returned/graded). Safe to call from any flow; never throws.
280
+ */
281
+ export declare function syncAssignmentModuleProgress(studentId: string, assignmentId: string): Promise<void>;
282
+ /**
283
+ * Update module progress for a student's worksheet after grading completes.
284
+ * SUBMIT requirements complete immediately; SCORE_AT_LEAST compares the sum
285
+ * of earned points across the worksheet response. Never throws.
286
+ */
287
+ export declare function syncWorksheetModuleProgress(studentId: string, worksheetId: string): Promise<void>;
288
+ //# sourceMappingURL=module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"/","sources":["services/module.ts"],"names":[],"mappings":"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"}