@studious-lms/server 1.4.7 → 1.4.9

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 (58) hide show
  1. package/.github/workflows/npm.yml +28 -0
  2. package/dist/models/assignment.d.ts +32 -0
  3. package/dist/models/assignment.d.ts.map +1 -1
  4. package/dist/models/assignment.js +111 -2
  5. package/dist/models/assignment.js.map +1 -1
  6. package/dist/models/worksheet.d.ts +98 -76
  7. package/dist/models/worksheet.d.ts.map +1 -1
  8. package/dist/models/worksheet.js +38 -5
  9. package/dist/models/worksheet.js.map +1 -1
  10. package/dist/routers/_app.d.ts +140 -0
  11. package/dist/routers/_app.d.ts.map +1 -1
  12. package/dist/routers/assignment.d.ts +35 -0
  13. package/dist/routers/assignment.d.ts.map +1 -1
  14. package/dist/routers/assignment.js +10 -3
  15. package/dist/routers/assignment.js.map +1 -1
  16. package/dist/routers/class.d.ts +19 -0
  17. package/dist/routers/class.d.ts.map +1 -1
  18. package/dist/routers/worksheet.d.ts +16 -0
  19. package/dist/routers/worksheet.d.ts.map +1 -1
  20. package/dist/routers/worksheet.js +10 -3
  21. package/dist/routers/worksheet.js.map +1 -1
  22. package/dist/services/assignment.d.ts +30 -0
  23. package/dist/services/assignment.d.ts.map +1 -1
  24. package/dist/services/assignment.js +37 -3
  25. package/dist/services/assignment.js.map +1 -1
  26. package/dist/services/class.d.ts +19 -0
  27. package/dist/services/class.d.ts.map +1 -1
  28. package/dist/services/class.js +37 -19
  29. package/dist/services/class.js.map +1 -1
  30. package/dist/services/worksheet.d.ts +11 -0
  31. package/dist/services/worksheet.d.ts.map +1 -1
  32. package/dist/services/worksheet.js +37 -3
  33. package/dist/services/worksheet.js.map +1 -1
  34. package/package.json +1 -1
  35. package/prisma/migrations/20260504071500_school_memberships/migration.sql +1 -1
  36. package/src/models/assignment.ts +132 -0
  37. package/src/models/worksheet.ts +54 -0
  38. package/src/routers/assignment.ts +19 -0
  39. package/src/routers/worksheet.ts +18 -0
  40. package/src/services/assignment.ts +47 -1
  41. package/src/services/class.ts +41 -17
  42. package/src/services/worksheet.ts +46 -0
  43. package/dist/lib/notificationHandler.d.ts +0 -25
  44. package/dist/lib/notificationHandler.d.ts.map +0 -1
  45. package/dist/lib/notificationHandler.js +0 -32
  46. package/dist/lib/notificationHandler.js.map +0 -1
  47. package/dist/server/pipelines/aiLabChat.d.ts +0 -21
  48. package/dist/server/pipelines/aiLabChat.d.ts.map +0 -1
  49. package/dist/server/pipelines/aiLabChat.js +0 -456
  50. package/dist/server/pipelines/aiLabChat.js.map +0 -1
  51. package/dist/server/pipelines/aiNewtonChat.d.ts +0 -30
  52. package/dist/server/pipelines/aiNewtonChat.d.ts.map +0 -1
  53. package/dist/server/pipelines/aiNewtonChat.js +0 -285
  54. package/dist/server/pipelines/aiNewtonChat.js.map +0 -1
  55. package/dist/server/pipelines/gradeWorksheet.d.ts +0 -30
  56. package/dist/server/pipelines/gradeWorksheet.d.ts.map +0 -1
  57. package/dist/server/pipelines/gradeWorksheet.js +0 -248
  58. package/dist/server/pipelines/gradeWorksheet.js.map +0 -1
@@ -0,0 +1,28 @@
1
+ name: Publish Package
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - 'v*'
7
+
8
+ permissions:
9
+ id-token: write # Required for OIDC / npm provenance
10
+ contents: read
11
+
12
+ jobs:
13
+ publish:
14
+ runs-on: ubuntu-latest
15
+ env:
16
+ SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
17
+ steps:
18
+ - uses: actions/checkout@v6
19
+
20
+ - uses: actions/setup-node@v6
21
+ with:
22
+ node-version: '24'
23
+ registry-url: 'https://registry.npmjs.org'
24
+ package-manager-cache: false # never use caching in release builds
25
+
26
+ - run: npm ci
27
+ - run: npm run build --if-present
28
+ - run: npm publish --access public
@@ -946,6 +946,38 @@ export declare function findAssignmentWithClassForTeacher(assignmentId: string,
946
946
  };
947
947
  };
948
948
  }>;
949
+ /**
950
+ * Clone an assignment into another class with a new title: copies settings, duplicates linked
951
+ * worksheets into the target class, clones attachment file records (same storage path),
952
+ * creates empty submissions for all students in the target class, and does not copy the
953
+ * calendar event link or per-student “assigned to” overrides.
954
+ */
955
+ export declare function duplicateAssignment(sourceAssignmentId: string, targetClassId: string, title: string, duplicatingUserId: string): Promise<{
956
+ type: import(".prisma/client").$Enums.AssignmentType;
957
+ id: string;
958
+ createdAt: Date | null;
959
+ modifiedAt: Date | null;
960
+ classId: string;
961
+ title: string;
962
+ instructions: string;
963
+ dueDate: Date;
964
+ teacherId: string;
965
+ acceptFiles: boolean;
966
+ acceptExtendedResponse: boolean;
967
+ acceptWorksheet: boolean;
968
+ gradeWithAI: boolean;
969
+ aiPolicyLevel: number;
970
+ sectionId: string | null;
971
+ graded: boolean;
972
+ maxGrade: number | null;
973
+ weight: number;
974
+ inProgress: boolean;
975
+ template: boolean;
976
+ eventId: string | null;
977
+ markSchemeId: string | null;
978
+ order: number | null;
979
+ gradingBoundaryId: string | null;
980
+ } | null>;
949
981
  /** @returns Submissions for assignment (teacher view). */
950
982
  export declare function findSubmissionsByAssignmentForTeacher(assignmentId: string, teacherId: string): import(".prisma/client").Prisma.PrismaPromise<({
951
983
  assignment: {
@@ -1 +1 @@
1
- {"version":3,"file":"assignment.d.ts","sourceRoot":"/","sources":["models/assignment.ts"],"names":[],"mappings":"AA8CA,iCAAiC;AACjC,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAI5C;AAED,qDAAqD;AACrD,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAKnD;AAED,uDAAuD;AACvD,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmBpE;AAED,sCAAsC;AACtC,wBAAgB,uBAAuB;;;;;;;;;;;KAetC;AAED,qDAAqD;AACrD,wBAAgB,oCAAoC,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiB3F;AAED,kDAAkD;AAClD,wBAAgB,gCAAgC,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuBrG;AAED,iEAAiE;AACjE,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwB3E;AAED,2BAA2B;AAC3B,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoBvE;AAED,qCAAqC;AACrC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM;;;KAKpD;AAED,+DAA+D;AAC/D,wBAAgB,iCAAiC,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAQxF;AAED,0DAA0D;AAC1D,wBAAgB,qCAAqC,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAgC5F;AAED,oDAAoD;AACpD,wBAAgB,8BAA8B,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoBrF;AAED,yEAAyE;AACzE,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM;;;;;;;;KAiBrF;AAiBD,kCAAkC;AAClC,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAM5E;AAED,oCAAoC;AACpC,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAM7D"}
1
+ {"version":3,"file":"assignment.d.ts","sourceRoot":"/","sources":["models/assignment.ts"],"names":[],"mappings":"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"}
@@ -2,8 +2,9 @@
2
2
  * Assignment model – assignments, submissions, attachments.
3
3
  */
4
4
 
5
- !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]="42061a1a-7f8e-55c4-a836-0e727f41fe0d")}catch(e){}}();
5
+ !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]="d97b0aba-efb0-533e-b942-06f6eb24b6d0")}catch(e){}}();
6
6
  import { prisma } from "../lib/prisma.js";
7
+ import { duplicateWorksheetWithClient } from "./worksheet.js";
7
8
  import { classMemberOrSchoolAdminWhere, classTeacherOrSchoolAdminWhere, schoolAdminForClassWhere, } from "./access.js";
8
9
  const assignmentGetInclude = {
9
10
  submissions: {
@@ -200,6 +201,114 @@ export function findAssignmentWithClassForTeacher(assignmentId, teacherId) {
200
201
  include: { class: true },
201
202
  });
202
203
  }
204
+ /**
205
+ * Clone an assignment into another class with a new title: copies settings, duplicates linked
206
+ * worksheets into the target class, clones attachment file records (same storage path),
207
+ * creates empty submissions for all students in the target class, and does not copy the
208
+ * calendar event link or per-student “assigned to” overrides.
209
+ */
210
+ export async function duplicateAssignment(sourceAssignmentId, targetClassId, title, duplicatingUserId) {
211
+ return prisma.$transaction(async (tx) => {
212
+ const source = await tx.assignment.findUnique({
213
+ where: { id: sourceAssignmentId },
214
+ include: {
215
+ worksheets: { select: { id: true, name: true } },
216
+ attachments: {
217
+ select: { name: true, type: true, size: true, path: true },
218
+ },
219
+ section: { select: { id: true, name: true } },
220
+ },
221
+ });
222
+ if (!source) {
223
+ return null;
224
+ }
225
+ let targetSectionId;
226
+ if (source.sectionId && source.section) {
227
+ const match = await tx.section.findFirst({
228
+ where: { classId: targetClassId, name: source.section.name },
229
+ select: { id: true },
230
+ });
231
+ targetSectionId = match?.id;
232
+ }
233
+ const newWorksheetIds = [];
234
+ for (const ws of source.worksheets) {
235
+ const dup = await duplicateWorksheetWithClient(tx, ws.id, targetClassId, ws.name);
236
+ if (dup) {
237
+ newWorksheetIds.push(dup.id);
238
+ }
239
+ }
240
+ const classData = await tx.class.findUnique({
241
+ where: { id: targetClassId },
242
+ include: { students: { select: { id: true } } },
243
+ });
244
+ if (!classData) {
245
+ return null;
246
+ }
247
+ const submissionData = classData.students.map((s) => ({
248
+ student: { connect: { id: s.id } },
249
+ }));
250
+ const created = await tx.assignment.create({
251
+ data: {
252
+ title,
253
+ instructions: source.instructions,
254
+ dueDate: source.dueDate,
255
+ teacher: { connect: { id: duplicatingUserId } },
256
+ class: { connect: { id: targetClassId } },
257
+ acceptFiles: source.acceptFiles,
258
+ acceptExtendedResponse: source.acceptExtendedResponse,
259
+ acceptWorksheet: source.acceptWorksheet,
260
+ gradeWithAI: source.gradeWithAI,
261
+ aiPolicyLevel: source.aiPolicyLevel,
262
+ graded: source.graded,
263
+ maxGrade: source.maxGrade,
264
+ weight: source.weight,
265
+ type: source.type,
266
+ inProgress: source.inProgress,
267
+ template: source.template,
268
+ ...(source.markSchemeId && {
269
+ markScheme: { connect: { id: source.markSchemeId } },
270
+ }),
271
+ ...(source.gradingBoundaryId && {
272
+ gradingBoundary: { connect: { id: source.gradingBoundaryId } },
273
+ }),
274
+ ...(targetSectionId && {
275
+ section: { connect: { id: targetSectionId } },
276
+ }),
277
+ ...(newWorksheetIds.length > 0 && {
278
+ worksheets: { connect: newWorksheetIds.map((id) => ({ id })) },
279
+ }),
280
+ submissions: { create: submissionData },
281
+ order: 0,
282
+ },
283
+ });
284
+ await tx.assignment.updateMany({
285
+ where: { classId: targetClassId, id: { not: created.id } },
286
+ data: { order: { increment: 1 } },
287
+ });
288
+ await tx.section.updateMany({
289
+ where: { classId: targetClassId },
290
+ data: { order: { increment: 1 } },
291
+ });
292
+ await tx.assignment.update({
293
+ where: { id: created.id },
294
+ data: { order: 1 },
295
+ });
296
+ for (const file of source.attachments) {
297
+ await tx.file.create({
298
+ data: {
299
+ name: file.name,
300
+ type: file.type,
301
+ size: file.size ?? 0,
302
+ path: file.path,
303
+ uploadStatus: "COMPLETED",
304
+ user: { connect: { id: duplicatingUserId } },
305
+ assignment: { connect: { id: created.id } },
306
+ },
307
+ });
308
+ }
309
+ return created;
310
+ }, { maxWait: 10000, timeout: 60000 });
311
+ }
203
312
  /** @returns Submissions for assignment (teacher view). */
204
313
  export function findSubmissionsByAssignmentForTeacher(assignmentId, teacherId) {
205
314
  return prisma.submission.findMany({
@@ -306,4 +415,4 @@ export function detachAssignmentFromEvent(assignmentId) {
306
415
  });
307
416
  }
308
417
  //# sourceMappingURL=assignment.js.map
309
- //# debugId=42061a1a-7f8e-55c4-a836-0e727f41fe0d
418
+ //# debugId=d97b0aba-efb0-533e-b942-06f6eb24b6d0
@@ -1 +1 @@
1
- {"version":3,"file":"assignment.js","sources":["models/assignment.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Assignment model – assignments, submissions, attachments.\n */\nimport { prisma } from \"../lib/prisma.js\";\nimport {\n classMemberOrSchoolAdminWhere,\n classTeacherOrSchoolAdminWhere,\n schoolAdminForClassWhere,\n} from \"./access.js\";\n\nconst assignmentGetInclude = {\n submissions: {\n select: {\n student: { select: { id: true, username: true } },\n },\n },\n attachments: {\n select: {\n id: true,\n name: true,\n type: true,\n size: true,\n path: true,\n uploadedAt: true,\n thumbnailId: true,\n },\n },\n section: { select: { id: true, name: true } },\n teacher: { select: { id: true, username: true } },\n worksheets: { select: { id: true, name: true } },\n class: { select: { id: true, name: true } },\n eventAttached: {\n select: {\n id: true,\n name: true,\n startTime: true,\n endTime: true,\n location: true,\n remarks: true,\n color: true,\n },\n },\n markScheme: { select: { id: true, structured: true } },\n gradingBoundary: { select: { id: true, structured: true } },\n} as const;\n\n/** @returns Assignment by ID. */\nexport function findAssignmentById(id: string) {\n return prisma.assignment.findUnique({\n where: { id },\n });\n}\n\n/** @returns Assignment with full details for get. */\nexport function findAssignmentWithDetails(id: string) {\n return prisma.assignment.findUnique({\n where: { id },\n include: assignmentGetInclude,\n });\n}\n\n/** @returns Assignment with attachments for delete. */\nexport function findAssignmentForDelete(id: string, teacherId: string) {\n return prisma.assignment.findFirst({\n where: {\n id,\n OR: [\n { teacherId },\n { class: schoolAdminForClassWhere(teacherId) },\n ],\n },\n include: {\n attachments: { include: { thumbnail: true } },\n submissions: {\n include: {\n attachments: { include: { thumbnail: true } },\n annotations: { include: { thumbnail: true } },\n },\n },\n },\n });\n}\n\n/** @returns Assignments due today. */\nexport function findAssignmentsDueToday() {\n return prisma.assignment.findMany({\n where: {\n dueDate: { equals: new Date() },\n },\n select: {\n id: true,\n title: true,\n dueDate: true,\n type: true,\n graded: true,\n maxGrade: true,\n class: { select: { id: true, name: true } },\n },\n });\n}\n\n/** @returns Submission by assignment and student. */\nexport function findSubmissionByAssignmentAndStudent(assignmentId: string, studentId: string) {\n return prisma.submission.findFirst({\n where: { assignmentId, studentId },\n include: {\n attachments: true,\n student: { select: { id: true, username: true, profile: true } },\n assignment: {\n include: {\n class: true,\n markScheme: { select: { id: true, structured: true } },\n worksheets: { select: { id: true, name: true } },\n gradingBoundary: { select: { id: true, structured: true } },\n },\n },\n annotations: true,\n },\n });\n}\n\n/** @returns Submission by ID for class member. */\nexport function findSubmissionByIdForClassMember(submissionId: string, classId: string, userId: string) {\n return prisma.submission.findFirst({\n where: {\n id: submissionId,\n assignment: {\n classId,\n class: classMemberOrSchoolAdminWhere(userId),\n },\n },\n include: {\n attachments: true,\n annotations: true,\n student: { select: { id: true, username: true, profile: true } },\n assignment: {\n include: {\n class: true,\n markScheme: { select: { id: true, structured: true } },\n worksheets: { select: { id: true, name: true } },\n gradingBoundary: { select: { id: true, structured: true } },\n },\n },\n },\n });\n}\n\n/** @returns Submission by ID for update (student or teacher). */\nexport function findSubmissionForUpdate(submissionId: string, userId: string) {\n return prisma.submission.findFirst({\n where: {\n id: submissionId,\n OR: [\n { studentId: userId },\n {\n assignment: {\n class: classTeacherOrSchoolAdminWhere(userId),\n },\n },\n ],\n },\n include: {\n attachments: { include: { thumbnail: true } },\n assignment: {\n include: {\n class: true,\n markScheme: { select: { id: true, structured: true } },\n gradingBoundary: { select: { id: true, structured: true } },\n },\n },\n },\n });\n}\n\n/** Create a submission. */\nexport function createSubmission(assignmentId: string, studentId: string) {\n return prisma.submission.create({\n data: {\n assignment: { connect: { id: assignmentId } },\n student: { connect: { id: studentId } },\n },\n include: {\n attachments: true,\n annotations: true,\n student: { select: { id: true, username: true } },\n assignment: {\n include: {\n class: true,\n markScheme: { select: { id: true, structured: true } },\n worksheets: { select: { id: true, name: true } },\n gradingBoundary: { select: { id: true, structured: true } },\n },\n },\n },\n });\n}\n\n/** @returns Sections for a class. */\nexport function findSectionsByClassId(classId: string) {\n return prisma.section.findMany({\n where: { classId },\n select: { id: true, name: true },\n });\n}\n\n/** @returns Assignment with class for teacher (auth check). */\nexport function findAssignmentWithClassForTeacher(assignmentId: string, teacherId: string) {\n return prisma.assignment.findFirst({\n where: {\n id: assignmentId,\n class: classTeacherOrSchoolAdminWhere(teacherId),\n },\n include: { class: true },\n });\n}\n\n/** @returns Submissions for assignment (teacher view). */\nexport function findSubmissionsByAssignmentForTeacher(assignmentId: string, teacherId: string) {\n return prisma.submission.findMany({\n where: {\n assignment: {\n id: assignmentId,\n class: classTeacherOrSchoolAdminWhere(teacherId),\n },\n },\n include: {\n attachments: { include: { thumbnail: true } },\n student: {\n select: {\n id: true,\n username: true,\n profile: {\n select: {\n displayName: true,\n profilePicture: true,\n profilePictureThumbnail: true,\n },\n },\n },\n },\n assignment: {\n include: {\n class: true,\n markScheme: { select: { id: true, structured: true } },\n gradingBoundary: { select: { id: true, structured: true } },\n },\n },\n },\n });\n}\n\n/** @returns Submission by ID for teacher update. */\nexport function findSubmissionForTeacherUpdate(submissionId: string, teacherId: string) {\n return prisma.submission.findFirst({\n where: {\n id: submissionId,\n assignment: {\n class: classTeacherOrSchoolAdminWhere(teacherId),\n },\n },\n include: {\n attachments: { include: { thumbnail: true } },\n annotations: { include: { thumbnail: true } },\n assignment: {\n include: {\n class: true,\n markScheme: { select: { id: true, structured: true } },\n gradingBoundary: { select: { id: true, structured: true } },\n },\n },\n },\n });\n}\n\n/** @returns Events in class that don't have this assignment attached. */\nexport function findAvailableEventsForAssignment(classId: string, assignmentId: string) {\n return prisma.event.findMany({\n where: {\n classId,\n assignmentsAttached: { none: { id: assignmentId } },\n },\n select: {\n id: true,\n name: true,\n startTime: true,\n endTime: true,\n location: true,\n remarks: true,\n color: true,\n },\n orderBy: { startTime: \"asc\" },\n });\n}\n\nconst assignmentAttachEventInclude = {\n attachments: { select: { id: true, name: true, type: true } },\n section: { select: { id: true, name: true } },\n teacher: { select: { id: true, username: true } },\n eventAttached: {\n select: {\n id: true,\n name: true,\n startTime: true,\n endTime: true,\n color: true,\n },\n },\n};\n\n/** Attach assignment to event. */\nexport function attachAssignmentToEvent(assignmentId: string, eventId: string) {\n return prisma.assignment.update({\n where: { id: assignmentId },\n data: { eventAttached: { connect: { id: eventId } } },\n include: assignmentAttachEventInclude,\n });\n}\n\n/** Detach assignment from event. */\nexport function detachAssignmentFromEvent(assignmentId: string) {\n return prisma.assignment.update({\n where: { id: assignmentId },\n data: { eventAttached: { disconnect: true } },\n include: assignmentAttachEventInclude,\n });\n}\n"],"names":[],"mappings":"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","debug_id":"42061a1a-7f8e-55c4-a836-0e727f41fe0d"}
1
+ {"version":3,"file":"assignment.js","sources":["models/assignment.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Assignment model – assignments, submissions, attachments.\n */\nimport { prisma } from \"../lib/prisma.js\";\nimport { duplicateWorksheetWithClient } from \"./worksheet.js\";\nimport {\n classMemberOrSchoolAdminWhere,\n classTeacherOrSchoolAdminWhere,\n schoolAdminForClassWhere,\n} from \"./access.js\";\n\nconst assignmentGetInclude = {\n submissions: {\n select: {\n student: { select: { id: true, username: true } },\n },\n },\n attachments: {\n select: {\n id: true,\n name: true,\n type: true,\n size: true,\n path: true,\n uploadedAt: true,\n thumbnailId: true,\n },\n },\n section: { select: { id: true, name: true } },\n teacher: { select: { id: true, username: true } },\n worksheets: { select: { id: true, name: true } },\n class: { select: { id: true, name: true } },\n eventAttached: {\n select: {\n id: true,\n name: true,\n startTime: true,\n endTime: true,\n location: true,\n remarks: true,\n color: true,\n },\n },\n markScheme: { select: { id: true, structured: true } },\n gradingBoundary: { select: { id: true, structured: true } },\n} as const;\n\n/** @returns Assignment by ID. */\nexport function findAssignmentById(id: string) {\n return prisma.assignment.findUnique({\n where: { id },\n });\n}\n\n/** @returns Assignment with full details for get. */\nexport function findAssignmentWithDetails(id: string) {\n return prisma.assignment.findUnique({\n where: { id },\n include: assignmentGetInclude,\n });\n}\n\n/** @returns Assignment with attachments for delete. */\nexport function findAssignmentForDelete(id: string, teacherId: string) {\n return prisma.assignment.findFirst({\n where: {\n id,\n OR: [\n { teacherId },\n { class: schoolAdminForClassWhere(teacherId) },\n ],\n },\n include: {\n attachments: { include: { thumbnail: true } },\n submissions: {\n include: {\n attachments: { include: { thumbnail: true } },\n annotations: { include: { thumbnail: true } },\n },\n },\n },\n });\n}\n\n/** @returns Assignments due today. */\nexport function findAssignmentsDueToday() {\n return prisma.assignment.findMany({\n where: {\n dueDate: { equals: new Date() },\n },\n select: {\n id: true,\n title: true,\n dueDate: true,\n type: true,\n graded: true,\n maxGrade: true,\n class: { select: { id: true, name: true } },\n },\n });\n}\n\n/** @returns Submission by assignment and student. */\nexport function findSubmissionByAssignmentAndStudent(assignmentId: string, studentId: string) {\n return prisma.submission.findFirst({\n where: { assignmentId, studentId },\n include: {\n attachments: true,\n student: { select: { id: true, username: true, profile: true } },\n assignment: {\n include: {\n class: true,\n markScheme: { select: { id: true, structured: true } },\n worksheets: { select: { id: true, name: true } },\n gradingBoundary: { select: { id: true, structured: true } },\n },\n },\n annotations: true,\n },\n });\n}\n\n/** @returns Submission by ID for class member. */\nexport function findSubmissionByIdForClassMember(submissionId: string, classId: string, userId: string) {\n return prisma.submission.findFirst({\n where: {\n id: submissionId,\n assignment: {\n classId,\n class: classMemberOrSchoolAdminWhere(userId),\n },\n },\n include: {\n attachments: true,\n annotations: true,\n student: { select: { id: true, username: true, profile: true } },\n assignment: {\n include: {\n class: true,\n markScheme: { select: { id: true, structured: true } },\n worksheets: { select: { id: true, name: true } },\n gradingBoundary: { select: { id: true, structured: true } },\n },\n },\n },\n });\n}\n\n/** @returns Submission by ID for update (student or teacher). */\nexport function findSubmissionForUpdate(submissionId: string, userId: string) {\n return prisma.submission.findFirst({\n where: {\n id: submissionId,\n OR: [\n { studentId: userId },\n {\n assignment: {\n class: classTeacherOrSchoolAdminWhere(userId),\n },\n },\n ],\n },\n include: {\n attachments: { include: { thumbnail: true } },\n assignment: {\n include: {\n class: true,\n markScheme: { select: { id: true, structured: true } },\n gradingBoundary: { select: { id: true, structured: true } },\n },\n },\n },\n });\n}\n\n/** Create a submission. */\nexport function createSubmission(assignmentId: string, studentId: string) {\n return prisma.submission.create({\n data: {\n assignment: { connect: { id: assignmentId } },\n student: { connect: { id: studentId } },\n },\n include: {\n attachments: true,\n annotations: true,\n student: { select: { id: true, username: true } },\n assignment: {\n include: {\n class: true,\n markScheme: { select: { id: true, structured: true } },\n worksheets: { select: { id: true, name: true } },\n gradingBoundary: { select: { id: true, structured: true } },\n },\n },\n },\n });\n}\n\n/** @returns Sections for a class. */\nexport function findSectionsByClassId(classId: string) {\n return prisma.section.findMany({\n where: { classId },\n select: { id: true, name: true },\n });\n}\n\n/** @returns Assignment with class for teacher (auth check). */\nexport function findAssignmentWithClassForTeacher(assignmentId: string, teacherId: string) {\n return prisma.assignment.findFirst({\n where: {\n id: assignmentId,\n class: classTeacherOrSchoolAdminWhere(teacherId),\n },\n include: { class: true },\n });\n}\n\n/**\n * Clone an assignment into another class with a new title: copies settings, duplicates linked\n * worksheets into the target class, clones attachment file records (same storage path),\n * creates empty submissions for all students in the target class, and does not copy the\n * calendar event link or per-student “assigned to” overrides.\n */\nexport async function duplicateAssignment(\n sourceAssignmentId: string,\n targetClassId: string,\n title: string,\n duplicatingUserId: string\n) {\n return prisma.$transaction(\n async (tx) => {\n const source = await tx.assignment.findUnique({\n where: { id: sourceAssignmentId },\n include: {\n worksheets: { select: { id: true, name: true } },\n attachments: {\n select: { name: true, type: true, size: true, path: true },\n },\n section: { select: { id: true, name: true } },\n },\n });\n\n if (!source) {\n return null;\n }\n\n let targetSectionId: string | undefined;\n if (source.sectionId && source.section) {\n const match = await tx.section.findFirst({\n where: { classId: targetClassId, name: source.section.name },\n select: { id: true },\n });\n targetSectionId = match?.id;\n }\n\n const newWorksheetIds: string[] = [];\n for (const ws of source.worksheets) {\n const dup = await duplicateWorksheetWithClient(\n tx,\n ws.id,\n targetClassId,\n ws.name\n );\n if (dup) {\n newWorksheetIds.push(dup.id);\n }\n }\n\n const classData = await tx.class.findUnique({\n where: { id: targetClassId },\n include: { students: { select: { id: true } } },\n });\n if (!classData) {\n return null;\n }\n\n const submissionData = classData.students.map((s) => ({\n student: { connect: { id: s.id } },\n }));\n\n const created = await tx.assignment.create({\n data: {\n title,\n instructions: source.instructions,\n dueDate: source.dueDate,\n teacher: { connect: { id: duplicatingUserId } },\n class: { connect: { id: targetClassId } },\n acceptFiles: source.acceptFiles,\n acceptExtendedResponse: source.acceptExtendedResponse,\n acceptWorksheet: source.acceptWorksheet,\n gradeWithAI: source.gradeWithAI,\n aiPolicyLevel: source.aiPolicyLevel,\n graded: source.graded,\n maxGrade: source.maxGrade,\n weight: source.weight,\n type: source.type,\n inProgress: source.inProgress,\n template: source.template,\n ...(source.markSchemeId && {\n markScheme: { connect: { id: source.markSchemeId } },\n }),\n ...(source.gradingBoundaryId && {\n gradingBoundary: { connect: { id: source.gradingBoundaryId } },\n }),\n ...(targetSectionId && {\n section: { connect: { id: targetSectionId } },\n }),\n ...(newWorksheetIds.length > 0 && {\n worksheets: { connect: newWorksheetIds.map((id) => ({ id })) },\n }),\n submissions: { create: submissionData },\n order: 0,\n },\n });\n\n await tx.assignment.updateMany({\n where: { classId: targetClassId, id: { not: created.id } },\n data: { order: { increment: 1 } },\n });\n await tx.section.updateMany({\n where: { classId: targetClassId },\n data: { order: { increment: 1 } },\n });\n await tx.assignment.update({\n where: { id: created.id },\n data: { order: 1 },\n });\n\n for (const file of source.attachments) {\n await tx.file.create({\n data: {\n name: file.name,\n type: file.type,\n size: file.size ?? 0,\n path: file.path,\n uploadStatus: \"COMPLETED\",\n user: { connect: { id: duplicatingUserId } },\n assignment: { connect: { id: created.id } },\n },\n });\n }\n\n return created;\n },\n { maxWait: 10000, timeout: 60000 }\n );\n}\n\n/** @returns Submissions for assignment (teacher view). */\nexport function findSubmissionsByAssignmentForTeacher(assignmentId: string, teacherId: string) {\n return prisma.submission.findMany({\n where: {\n assignment: {\n id: assignmentId,\n class: classTeacherOrSchoolAdminWhere(teacherId),\n },\n },\n include: {\n attachments: { include: { thumbnail: true } },\n student: {\n select: {\n id: true,\n username: true,\n profile: {\n select: {\n displayName: true,\n profilePicture: true,\n profilePictureThumbnail: true,\n },\n },\n },\n },\n assignment: {\n include: {\n class: true,\n markScheme: { select: { id: true, structured: true } },\n gradingBoundary: { select: { id: true, structured: true } },\n },\n },\n },\n });\n}\n\n/** @returns Submission by ID for teacher update. */\nexport function findSubmissionForTeacherUpdate(submissionId: string, teacherId: string) {\n return prisma.submission.findFirst({\n where: {\n id: submissionId,\n assignment: {\n class: classTeacherOrSchoolAdminWhere(teacherId),\n },\n },\n include: {\n attachments: { include: { thumbnail: true } },\n annotations: { include: { thumbnail: true } },\n assignment: {\n include: {\n class: true,\n markScheme: { select: { id: true, structured: true } },\n gradingBoundary: { select: { id: true, structured: true } },\n },\n },\n },\n });\n}\n\n/** @returns Events in class that don't have this assignment attached. */\nexport function findAvailableEventsForAssignment(classId: string, assignmentId: string) {\n return prisma.event.findMany({\n where: {\n classId,\n assignmentsAttached: { none: { id: assignmentId } },\n },\n select: {\n id: true,\n name: true,\n startTime: true,\n endTime: true,\n location: true,\n remarks: true,\n color: true,\n },\n orderBy: { startTime: \"asc\" },\n });\n}\n\nconst assignmentAttachEventInclude = {\n attachments: { select: { id: true, name: true, type: true } },\n section: { select: { id: true, name: true } },\n teacher: { select: { id: true, username: true } },\n eventAttached: {\n select: {\n id: true,\n name: true,\n startTime: true,\n endTime: true,\n color: true,\n },\n },\n};\n\n/** Attach assignment to event. */\nexport function attachAssignmentToEvent(assignmentId: string, eventId: string) {\n return prisma.assignment.update({\n where: { id: assignmentId },\n data: { eventAttached: { connect: { id: eventId } } },\n include: assignmentAttachEventInclude,\n });\n}\n\n/** Detach assignment from event. */\nexport function detachAssignmentFromEvent(assignmentId: string) {\n return prisma.assignment.update({\n where: { id: assignmentId },\n data: { eventAttached: { disconnect: true } },\n include: assignmentAttachEventInclude,\n });\n}\n"],"names":[],"mappings":"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","debug_id":"d97b0aba-efb0-533e-b942-06f6eb24b6d0"}