@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.
- package/.github/workflows/npm.yml +28 -0
- package/dist/models/assignment.d.ts +32 -0
- package/dist/models/assignment.d.ts.map +1 -1
- package/dist/models/assignment.js +111 -2
- package/dist/models/assignment.js.map +1 -1
- package/dist/models/worksheet.d.ts +98 -76
- package/dist/models/worksheet.d.ts.map +1 -1
- package/dist/models/worksheet.js +38 -5
- package/dist/models/worksheet.js.map +1 -1
- package/dist/routers/_app.d.ts +140 -0
- package/dist/routers/_app.d.ts.map +1 -1
- package/dist/routers/assignment.d.ts +35 -0
- package/dist/routers/assignment.d.ts.map +1 -1
- package/dist/routers/assignment.js +10 -3
- package/dist/routers/assignment.js.map +1 -1
- package/dist/routers/class.d.ts +19 -0
- package/dist/routers/class.d.ts.map +1 -1
- package/dist/routers/worksheet.d.ts +16 -0
- package/dist/routers/worksheet.d.ts.map +1 -1
- package/dist/routers/worksheet.js +10 -3
- package/dist/routers/worksheet.js.map +1 -1
- package/dist/services/assignment.d.ts +30 -0
- package/dist/services/assignment.d.ts.map +1 -1
- package/dist/services/assignment.js +37 -3
- package/dist/services/assignment.js.map +1 -1
- package/dist/services/class.d.ts +19 -0
- package/dist/services/class.d.ts.map +1 -1
- package/dist/services/class.js +37 -19
- package/dist/services/class.js.map +1 -1
- package/dist/services/worksheet.d.ts +11 -0
- package/dist/services/worksheet.d.ts.map +1 -1
- package/dist/services/worksheet.js +37 -3
- package/dist/services/worksheet.js.map +1 -1
- package/package.json +1 -1
- package/prisma/migrations/20260504071500_school_memberships/migration.sql +1 -1
- package/src/models/assignment.ts +132 -0
- package/src/models/worksheet.ts +54 -0
- package/src/routers/assignment.ts +19 -0
- package/src/routers/worksheet.ts +18 -0
- package/src/services/assignment.ts +47 -1
- package/src/services/class.ts +41 -17
- package/src/services/worksheet.ts +46 -0
- package/dist/lib/notificationHandler.d.ts +0 -25
- package/dist/lib/notificationHandler.d.ts.map +0 -1
- package/dist/lib/notificationHandler.js +0 -32
- package/dist/lib/notificationHandler.js.map +0 -1
- package/dist/server/pipelines/aiLabChat.d.ts +0 -21
- package/dist/server/pipelines/aiLabChat.d.ts.map +0 -1
- package/dist/server/pipelines/aiLabChat.js +0 -456
- package/dist/server/pipelines/aiLabChat.js.map +0 -1
- package/dist/server/pipelines/aiNewtonChat.d.ts +0 -30
- package/dist/server/pipelines/aiNewtonChat.d.ts.map +0 -1
- package/dist/server/pipelines/aiNewtonChat.js +0 -285
- package/dist/server/pipelines/aiNewtonChat.js.map +0 -1
- package/dist/server/pipelines/gradeWorksheet.d.ts +0 -30
- package/dist/server/pipelines/gradeWorksheet.d.ts.map +0 -1
- package/dist/server/pipelines/gradeWorksheet.js +0 -248
- 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":"
|
|
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]="
|
|
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=
|
|
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"}
|