@studious-lms/server 1.4.5 → 1.4.7
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/dist/lib/config/cors.d.ts.map +1 -1
- package/dist/lib/config/cors.js +8 -3
- package/dist/lib/config/cors.js.map +1 -1
- package/dist/models/access.d.ts +112 -0
- package/dist/models/access.d.ts.map +1 -0
- package/dist/models/access.js +49 -0
- package/dist/models/access.js.map +1 -0
- package/dist/models/announcement.d.ts +17 -2
- package/dist/models/announcement.d.ts.map +1 -1
- package/dist/models/announcement.js +21 -4
- package/dist/models/announcement.js.map +1 -1
- package/dist/models/assignment.d.ts +37 -37
- package/dist/models/assignment.d.ts.map +1 -1
- package/dist/models/assignment.js +15 -15
- package/dist/models/assignment.js.map +1 -1
- package/dist/models/attendance.d.ts +1 -1
- package/dist/models/attendance.d.ts.map +1 -1
- package/dist/models/attendance.js +6 -5
- package/dist/models/attendance.js.map +1 -1
- package/dist/models/auth.d.ts +5 -5
- package/dist/models/auth.d.ts.map +1 -1
- package/dist/models/auth.js +7 -11
- package/dist/models/auth.js.map +1 -1
- package/dist/models/class.d.ts +26 -26
- package/dist/models/class.d.ts.map +1 -1
- package/dist/models/class.js +7 -11
- package/dist/models/class.js.map +1 -1
- package/dist/models/comment.d.ts +233 -6
- package/dist/models/comment.d.ts.map +1 -1
- package/dist/models/comment.js +133 -3
- package/dist/models/comment.js.map +1 -1
- package/dist/models/conversation.d.ts +7 -7
- package/dist/models/event.d.ts +52 -3
- package/dist/models/event.d.ts.map +1 -1
- package/dist/models/event.js +56 -6
- package/dist/models/event.js.map +1 -1
- package/dist/models/file.d.ts +178 -103
- package/dist/models/file.d.ts.map +1 -1
- package/dist/models/file.js +54 -14
- package/dist/models/file.js.map +1 -1
- package/dist/models/folder.d.ts +22 -22
- package/dist/models/folder.d.ts.map +1 -1
- package/dist/models/folder.js +5 -4
- package/dist/models/folder.js.map +1 -1
- package/dist/models/labChat.d.ts +20 -20
- package/dist/models/labChat.d.ts.map +1 -1
- package/dist/models/labChat.js +8 -10
- package/dist/models/labChat.js.map +1 -1
- package/dist/models/marketing.d.ts +1 -1
- package/dist/models/message.d.ts +6 -6
- package/dist/models/newtonChat.d.ts +5 -5
- package/dist/models/school.d.ts +361 -0
- package/dist/models/school.d.ts.map +1 -0
- package/dist/models/school.js +314 -0
- package/dist/models/school.js.map +1 -0
- package/dist/models/section.d.ts +1 -1
- package/dist/models/section.d.ts.map +1 -1
- package/dist/models/section.js +5 -4
- package/dist/models/section.js.map +1 -1
- package/dist/models/user.d.ts +4 -4
- package/dist/models/worksheet.d.ts +67 -65
- package/dist/models/worksheet.d.ts.map +1 -1
- package/dist/models/worksheet.js +6 -14
- package/dist/models/worksheet.js.map +1 -1
- package/dist/pipelines/aiLabChat.d.ts.map +1 -1
- package/dist/pipelines/aiLabChat.js +4 -3
- package/dist/pipelines/aiLabChat.js.map +1 -1
- package/dist/pipelines/gradeWorksheet.d.ts +2 -2
- package/dist/pipelines/pdfToWorksheet.d.ts +1 -1
- package/dist/routers/_app.d.ts +2462 -1104
- package/dist/routers/_app.d.ts.map +1 -1
- package/dist/routers/_app.js +4 -2
- package/dist/routers/_app.js.map +1 -1
- package/dist/routers/announcement.d.ts +13 -5
- package/dist/routers/announcement.d.ts.map +1 -1
- package/dist/routers/announcement.js +25 -5
- package/dist/routers/announcement.js.map +1 -1
- package/dist/routers/assignment.d.ts +266 -36
- package/dist/routers/assignment.d.ts.map +1 -1
- package/dist/routers/assignment.js +221 -3
- package/dist/routers/assignment.js.map +1 -1
- package/dist/routers/class.d.ts +21 -20
- package/dist/routers/class.d.ts.map +1 -1
- package/dist/routers/class.js +3 -2
- package/dist/routers/class.js.map +1 -1
- package/dist/routers/comment.d.ts +40 -3
- package/dist/routers/comment.d.ts.map +1 -1
- package/dist/routers/comment.js +14 -5
- package/dist/routers/comment.js.map +1 -1
- package/dist/routers/conversation.d.ts +6 -6
- package/dist/routers/event.d.ts +21 -2
- package/dist/routers/event.d.ts.map +1 -1
- package/dist/routers/file.d.ts +2 -2
- package/dist/routers/folder.d.ts +24 -24
- package/dist/routers/labChat.d.ts +7 -7
- package/dist/routers/school.d.ts +384 -0
- package/dist/routers/school.d.ts.map +1 -0
- package/dist/routers/school.js +79 -0
- package/dist/routers/school.js.map +1 -0
- package/dist/routers/search.d.ts +1 -1
- package/dist/routers/worksheet.d.ts +23 -21
- package/dist/routers/worksheet.d.ts.map +1 -1
- package/dist/services/announcement.d.ts.map +1 -1
- package/dist/services/announcement.js +10 -6
- package/dist/services/announcement.js.map +1 -1
- package/dist/services/assignment.d.ts +36 -36
- package/dist/services/class.d.ts +20 -19
- package/dist/services/class.d.ts.map +1 -1
- package/dist/services/class.js +22 -3
- package/dist/services/class.js.map +1 -1
- package/dist/services/comment.d.ts +31 -5
- package/dist/services/comment.d.ts.map +1 -1
- package/dist/services/comment.js +102 -19
- package/dist/services/comment.js.map +1 -1
- package/dist/services/conversation.d.ts +6 -6
- package/dist/services/event.d.ts +21 -2
- package/dist/services/event.d.ts.map +1 -1
- package/dist/services/event.js +11 -7
- package/dist/services/event.js.map +1 -1
- package/dist/services/file.d.ts +2 -2
- package/dist/services/file.d.ts.map +1 -1
- package/dist/services/file.js +17 -8
- package/dist/services/file.js.map +1 -1
- package/dist/services/folder.d.ts +24 -24
- package/dist/services/labChat.d.ts +7 -7
- package/dist/services/school.d.ts +299 -0
- package/dist/services/school.d.ts.map +1 -0
- package/dist/services/school.js +225 -0
- package/dist/services/school.js.map +1 -0
- package/dist/services/worksheet.d.ts +23 -21
- package/dist/services/worksheet.d.ts.map +1 -1
- package/package.json +1 -1
- package/prisma/migrations/20260502230500_assignment_submission_comments/migration.sql +60 -0
- package/prisma/migrations/20260504071500_school_memberships/migration.sql +81 -0
- package/prisma/schema.prisma +75 -2
- package/src/lib/config/cors.ts +8 -1
- package/src/models/access.ts +48 -0
- package/src/models/announcement.ts +19 -2
- package/src/models/assignment.ts +17 -13
- package/src/models/attendance.ts +4 -3
- package/src/models/auth.ts +8 -9
- package/src/models/class.ts +8 -9
- package/src/models/comment.ts +137 -1
- package/src/models/event.ts +54 -4
- package/src/models/file.ts +53 -12
- package/src/models/folder.ts +3 -2
- package/src/models/labChat.ts +9 -8
- package/src/models/school.ts +361 -0
- package/src/models/section.ts +3 -2
- package/src/models/worksheet.ts +7 -12
- package/src/pipelines/aiLabChat.ts +2 -1
- package/src/routers/_app.ts +2 -0
- package/src/routers/announcement.ts +30 -4
- package/src/routers/assignment.ts +243 -2
- package/src/routers/class.ts +1 -0
- package/src/routers/comment.ts +19 -2
- package/src/routers/school.ts +122 -0
- package/src/services/announcement.ts +12 -4
- package/src/services/class.ts +25 -2
- package/src/services/comment.ts +122 -18
- package/src/services/event.ts +23 -6
- package/src/services/file.ts +20 -6
- package/src/services/school.ts +308 -0
- package/tests/lib/cors.test.ts +13 -1
- package/tests/routers/assignment.test.ts +68 -2
- package/tests/routers/comment.test.ts +42 -1
- package/vercel.json +8 -0
|
@@ -35,9 +35,9 @@ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
35
35
|
options: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
36
36
|
id: string;
|
|
37
37
|
createdAt: Date;
|
|
38
|
+
updatedAt: Date;
|
|
38
39
|
order: number | null;
|
|
39
40
|
points: number;
|
|
40
|
-
updatedAt: Date;
|
|
41
41
|
worksheetId: string;
|
|
42
42
|
markScheme: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
43
43
|
question: string;
|
|
@@ -47,8 +47,8 @@ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
47
47
|
name: string;
|
|
48
48
|
id: string;
|
|
49
49
|
createdAt: Date;
|
|
50
|
-
classId: string;
|
|
51
50
|
updatedAt: Date;
|
|
51
|
+
classId: string;
|
|
52
52
|
};
|
|
53
53
|
meta: object;
|
|
54
54
|
}>;
|
|
@@ -74,8 +74,8 @@ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
74
74
|
name: string;
|
|
75
75
|
id: string;
|
|
76
76
|
createdAt: Date;
|
|
77
|
-
classId: string;
|
|
78
77
|
updatedAt: Date;
|
|
78
|
+
classId: string;
|
|
79
79
|
}[];
|
|
80
80
|
meta: object;
|
|
81
81
|
}>;
|
|
@@ -88,8 +88,8 @@ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
88
88
|
name: string;
|
|
89
89
|
id: string;
|
|
90
90
|
createdAt: Date;
|
|
91
|
-
classId: string;
|
|
92
91
|
updatedAt: Date;
|
|
92
|
+
classId: string;
|
|
93
93
|
};
|
|
94
94
|
meta: object;
|
|
95
95
|
}>;
|
|
@@ -101,8 +101,8 @@ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
101
101
|
name: string;
|
|
102
102
|
id: string;
|
|
103
103
|
createdAt: Date;
|
|
104
|
-
classId: string;
|
|
105
104
|
updatedAt: Date;
|
|
105
|
+
classId: string;
|
|
106
106
|
};
|
|
107
107
|
meta: object;
|
|
108
108
|
}>;
|
|
@@ -116,8 +116,8 @@ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
116
116
|
name: string;
|
|
117
117
|
id: string;
|
|
118
118
|
createdAt: Date;
|
|
119
|
-
classId: string;
|
|
120
119
|
updatedAt: Date;
|
|
120
|
+
classId: string;
|
|
121
121
|
};
|
|
122
122
|
meta: object;
|
|
123
123
|
}>;
|
|
@@ -131,8 +131,8 @@ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
131
131
|
name: string;
|
|
132
132
|
id: string;
|
|
133
133
|
createdAt: Date;
|
|
134
|
-
classId: string;
|
|
135
134
|
updatedAt: Date;
|
|
135
|
+
classId: string;
|
|
136
136
|
};
|
|
137
137
|
meta: object;
|
|
138
138
|
}>;
|
|
@@ -176,8 +176,8 @@ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
176
176
|
name: string;
|
|
177
177
|
id: string;
|
|
178
178
|
createdAt: Date;
|
|
179
|
-
classId: string;
|
|
180
179
|
updatedAt: Date;
|
|
180
|
+
classId: string;
|
|
181
181
|
};
|
|
182
182
|
meta: object;
|
|
183
183
|
}>;
|
|
@@ -196,9 +196,9 @@ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
196
196
|
options: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
197
197
|
id: string;
|
|
198
198
|
createdAt: Date;
|
|
199
|
+
updatedAt: Date;
|
|
199
200
|
order: number | null;
|
|
200
201
|
points: number;
|
|
201
|
-
updatedAt: Date;
|
|
202
202
|
worksheetId: string;
|
|
203
203
|
markScheme: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
204
204
|
question: string;
|
|
@@ -234,9 +234,9 @@ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
234
234
|
options: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
235
235
|
id: string;
|
|
236
236
|
createdAt: Date;
|
|
237
|
+
updatedAt: Date;
|
|
237
238
|
order: number | null;
|
|
238
239
|
points: number;
|
|
239
|
-
updatedAt: Date;
|
|
240
240
|
worksheetId: string;
|
|
241
241
|
markScheme: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
242
242
|
question: string;
|
|
@@ -254,9 +254,9 @@ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
254
254
|
options: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
255
255
|
id: string;
|
|
256
256
|
createdAt: Date;
|
|
257
|
+
updatedAt: Date;
|
|
257
258
|
order: number | null;
|
|
258
259
|
points: number;
|
|
259
|
-
updatedAt: Date;
|
|
260
260
|
worksheetId: string;
|
|
261
261
|
markScheme: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
262
262
|
question: string;
|
|
@@ -278,6 +278,7 @@ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
278
278
|
status: import(".prisma/client").$Enums.GenerationStatus | null;
|
|
279
279
|
id: string;
|
|
280
280
|
createdAt: Date;
|
|
281
|
+
updatedAt: Date | null;
|
|
281
282
|
studentId: string;
|
|
282
283
|
questionId: string;
|
|
283
284
|
response: string;
|
|
@@ -285,17 +286,16 @@ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
285
286
|
markschemeState: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
286
287
|
points: number;
|
|
287
288
|
feedback: string | null;
|
|
288
|
-
updatedAt: Date | null;
|
|
289
289
|
studentWorksheetResponseId: string | null;
|
|
290
290
|
})[];
|
|
291
291
|
} & {
|
|
292
292
|
id: string;
|
|
293
|
-
submissionId: string | null;
|
|
294
293
|
createdAt: Date;
|
|
294
|
+
updatedAt: Date;
|
|
295
|
+
submissionId: string | null;
|
|
295
296
|
studentId: string;
|
|
296
297
|
submittedAt: Date | null;
|
|
297
298
|
submitted: boolean;
|
|
298
|
-
updatedAt: Date;
|
|
299
299
|
worksheetId: string;
|
|
300
300
|
};
|
|
301
301
|
meta: object;
|
|
@@ -311,6 +311,7 @@ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
311
311
|
status: import(".prisma/client").$Enums.GenerationStatus | null;
|
|
312
312
|
id: string;
|
|
313
313
|
createdAt: Date;
|
|
314
|
+
updatedAt: Date | null;
|
|
314
315
|
studentId: string;
|
|
315
316
|
questionId: string;
|
|
316
317
|
response: string;
|
|
@@ -318,17 +319,16 @@ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
318
319
|
markschemeState: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
319
320
|
points: number;
|
|
320
321
|
feedback: string | null;
|
|
321
|
-
updatedAt: Date | null;
|
|
322
322
|
studentWorksheetResponseId: string | null;
|
|
323
323
|
}[];
|
|
324
324
|
} & {
|
|
325
325
|
id: string;
|
|
326
|
-
submissionId: string | null;
|
|
327
326
|
createdAt: Date;
|
|
327
|
+
updatedAt: Date;
|
|
328
|
+
submissionId: string | null;
|
|
328
329
|
studentId: string;
|
|
329
330
|
submittedAt: Date | null;
|
|
330
331
|
submitted: boolean;
|
|
331
|
-
updatedAt: Date;
|
|
332
332
|
worksheetId: string;
|
|
333
333
|
};
|
|
334
334
|
meta: object;
|
|
@@ -342,6 +342,7 @@ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
342
342
|
status: import(".prisma/client").$Enums.GenerationStatus | null;
|
|
343
343
|
id: string;
|
|
344
344
|
createdAt: Date;
|
|
345
|
+
updatedAt: Date | null;
|
|
345
346
|
studentId: string;
|
|
346
347
|
questionId: string;
|
|
347
348
|
response: string;
|
|
@@ -349,7 +350,6 @@ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
349
350
|
markschemeState: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
350
351
|
points: number;
|
|
351
352
|
feedback: string | null;
|
|
352
|
-
updatedAt: Date | null;
|
|
353
353
|
studentWorksheetResponseId: string | null;
|
|
354
354
|
};
|
|
355
355
|
meta: object;
|
|
@@ -363,6 +363,7 @@ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
363
363
|
status: import(".prisma/client").$Enums.GenerationStatus | null;
|
|
364
364
|
id: string;
|
|
365
365
|
createdAt: Date;
|
|
366
|
+
updatedAt: Date | null;
|
|
366
367
|
studentId: string;
|
|
367
368
|
questionId: string;
|
|
368
369
|
response: string;
|
|
@@ -370,7 +371,6 @@ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
370
371
|
markschemeState: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
371
372
|
points: number;
|
|
372
373
|
feedback: string | null;
|
|
373
|
-
updatedAt: Date | null;
|
|
374
374
|
studentWorksheetResponseId: string | null;
|
|
375
375
|
};
|
|
376
376
|
meta: object;
|
|
@@ -390,6 +390,7 @@ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
390
390
|
status: import(".prisma/client").$Enums.GenerationStatus | null;
|
|
391
391
|
id: string;
|
|
392
392
|
createdAt: Date;
|
|
393
|
+
updatedAt: Date | null;
|
|
393
394
|
studentId: string;
|
|
394
395
|
questionId: string;
|
|
395
396
|
response: string;
|
|
@@ -397,7 +398,6 @@ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
397
398
|
markschemeState: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
398
399
|
points: number;
|
|
399
400
|
feedback: string | null;
|
|
400
|
-
updatedAt: Date | null;
|
|
401
401
|
studentWorksheetResponseId: string | null;
|
|
402
402
|
};
|
|
403
403
|
meta: object;
|
|
@@ -410,8 +410,10 @@ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
410
410
|
output: {
|
|
411
411
|
status: import(".prisma/client").$Enums.GenerationStatus | null;
|
|
412
412
|
id: string;
|
|
413
|
-
announcementId: string | null;
|
|
414
413
|
createdAt: Date;
|
|
414
|
+
assignmentId: string | null;
|
|
415
|
+
submissionId: string | null;
|
|
416
|
+
announcementId: string | null;
|
|
415
417
|
modifiedAt: Date | null;
|
|
416
418
|
content: string;
|
|
417
419
|
authorId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worksheet.d.ts","sourceRoot":"/","sources":["routers/worksheet.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAwDxB,eAAO,MAAM,eAAe
|
|
1
|
+
{"version":3,"file":"worksheet.d.ts","sourceRoot":"/","sources":["routers/worksheet.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAwDxB,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiV1B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"announcement.d.ts","sourceRoot":"/","sources":["services/announcement.ts"],"names":[],"mappings":"AAcA,OAAO,EAA2B,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAKtF,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;GAQxD;AAED,wBAAsB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;GAShE;AAED,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE;IACL,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACvD,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;;;;;;;;;;;;;;;;;;;;;;;;;;GAsFF;AAED,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE;IACL,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE;QACJ,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;QACvD,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;QAC3B,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;KAC/B,CAAC;CACH;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"announcement.d.ts","sourceRoot":"/","sources":["services/announcement.ts"],"names":[],"mappings":"AAcA,OAAO,EAA2B,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAKtF,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;GAQxD;AAED,wBAAsB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;GAShE;AAED,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE;IACL,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACvD,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;;;;;;;;;;;;;;;;;;;;;;;;;;GAsFF;AAED,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE;IACL,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE;QACJ,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;QACvD,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;QAC3B,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;KAC/B,CAAC;CACH;;;;;;;;;;;;;;;;;;;;;;;;;;GA2HF;AAED,wBAAsB,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;;GA0BzF"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Announcement service – create, read, update, delete announcements.
|
|
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]="b88341ca-3e8f-5744-9797-90d17a558460")}catch(e){}}();
|
|
6
6
|
import { TRPCError } from "@trpc/server";
|
|
7
7
|
import { findAnnouncementsByClassId, findAnnouncementByIdAndClass, findAnnouncementWithClass, createAnnouncement, updateAnnouncementAttachments, deleteAnnouncement, } from "../models/announcement.js";
|
|
8
8
|
import { prisma } from "../lib/prisma.js";
|
|
@@ -110,10 +110,12 @@ export async function updateAnnouncementRecord(userId, input) {
|
|
|
110
110
|
}
|
|
111
111
|
const isCreator = announcement.teacherId === userId;
|
|
112
112
|
const isClassTeacher = announcement.class.teachers.some((t) => t.id === userId);
|
|
113
|
-
|
|
113
|
+
const isSchoolAdmin = Boolean(announcement.class.school?.memberships.some((admin) => admin.userId === userId) ||
|
|
114
|
+
announcement.class.school?.users.some((admin) => admin.id === userId));
|
|
115
|
+
if (!isCreator && !isClassTeacher && !isSchoolAdmin) {
|
|
114
116
|
throw new TRPCError({
|
|
115
117
|
code: "FORBIDDEN",
|
|
116
|
-
message: "Only the announcement creator
|
|
118
|
+
message: "Only the announcement creator, class teachers, or school admins can update announcements",
|
|
117
119
|
});
|
|
118
120
|
}
|
|
119
121
|
let directUploadFiles = [];
|
|
@@ -210,14 +212,16 @@ export async function deleteAnnouncementRecord(userId, id, classId) {
|
|
|
210
212
|
}
|
|
211
213
|
const isCreator = announcement.teacherId === userId;
|
|
212
214
|
const isClassTeacher = announcement.class.teachers.some((t) => t.id === userId);
|
|
213
|
-
|
|
215
|
+
const isSchoolAdmin = Boolean(announcement.class.school?.memberships.some((admin) => admin.userId === userId) ||
|
|
216
|
+
announcement.class.school?.users.some((admin) => admin.id === userId));
|
|
217
|
+
if (!isCreator && !isClassTeacher && !isSchoolAdmin) {
|
|
214
218
|
throw new TRPCError({
|
|
215
219
|
code: "FORBIDDEN",
|
|
216
|
-
message: "Only the announcement creator
|
|
220
|
+
message: "Only the announcement creator, class teachers, or school admins can delete announcements",
|
|
217
221
|
});
|
|
218
222
|
}
|
|
219
223
|
await deleteAnnouncement(id);
|
|
220
224
|
return { success: true };
|
|
221
225
|
}
|
|
222
226
|
//# sourceMappingURL=announcement.js.map
|
|
223
|
-
//# debugId=
|
|
227
|
+
//# debugId=b88341ca-3e8f-5744-9797-90d17a558460
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"announcement.js","sources":["services/announcement.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Announcement service – create, read, update, delete announcements.\n */\nimport { TRPCError } from \"@trpc/server\";\nimport {\n findAnnouncementsByClassId,\n findAnnouncementByIdAndClass,\n findAnnouncementWithClass,\n createAnnouncement,\n updateAnnouncement,\n updateAnnouncementAttachments,\n deleteAnnouncement,\n} from \"../models/announcement.js\";\nimport { prisma } from \"../lib/prisma.js\";\nimport { createDirectUploadFiles, type DirectUploadFile } from \"../lib/fileUpload.js\";\nimport { deleteFile } from \"../lib/googleCloudStorage.js\";\nimport { sendToMultiple } from \"./notification.js\";\nimport { logger } from \"../utils/logger.js\";\n\nexport async function getAllAnnouncements(classId: string) {\n const announcements = await findAnnouncementsByClassId(classId);\n const announcementsWithCounts = announcements.map((a) => ({\n ...a,\n commentCount: a._count.comments,\n _count: undefined,\n }));\n return { announcements: announcementsWithCounts };\n}\n\nexport async function getAnnouncement(id: string, classId: string) {\n const announcement = await findAnnouncementByIdAndClass(id, classId);\n if (!announcement) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Announcement not found\",\n });\n }\n return { announcement };\n}\n\nexport async function createAnnouncementRecord(\n userId: string,\n input: {\n classId: string;\n remarks: string;\n files?: { name: string; type: string; size: number }[];\n existingFileIds?: string[];\n }\n) {\n const { classId, remarks, files, existingFileIds } = input;\n\n const classData = await prisma.class.findUnique({\n where: { id: classId },\n include: { students: { select: { id: true } } },\n });\n\n if (!classData) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Class not found\",\n });\n }\n\n const announcement = await createAnnouncement({\n remarks,\n teacherId: userId,\n classId,\n });\n\n let directUploadFiles: DirectUploadFile[] = [];\n if (files && files.length > 0) {\n directUploadFiles = await createDirectUploadFiles(\n files,\n userId,\n undefined,\n undefined,\n undefined,\n announcement.id\n );\n }\n\n if (existingFileIds && existingFileIds.length > 0) {\n await updateAnnouncementAttachments(announcement.id, {\n connect: existingFileIds.map((fileId) => ({ id: fileId })),\n });\n }\n\n const announcementWithAttachments = await prisma.announcement.findUnique({\n where: { id: announcement.id },\n select: {\n id: true,\n teacher: {\n select: {\n id: true,\n username: true,\n profile: {\n select: {\n displayName: true,\n profilePicture: true,\n profilePictureThumbnail: true,\n },\n },\n },\n },\n remarks: true,\n createdAt: true,\n modifiedAt: true,\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 },\n });\n\n sendToMultiple({\n receiverIds: classData.students.map((s) => s.id),\n title: `🔔 Announcement for ${classData.name}`,\n content: remarks,\n }).catch((error) => {\n logger.error(\"Failed to send announcement notifications:\", error);\n });\n\n return {\n announcement: announcementWithAttachments || announcement,\n uploadFiles: directUploadFiles.length > 0 ? directUploadFiles : undefined,\n };\n}\n\nexport async function updateAnnouncementRecord(\n userId: string,\n input: {\n id: string;\n classId: string;\n data: {\n remarks?: string;\n files?: { name: string; type: string; size: number }[];\n existingFileIds?: string[];\n removedAttachments?: string[];\n };\n }\n) {\n const announcement = await findAnnouncementWithClass(input.id);\n\n if (!announcement) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Announcement not found\",\n });\n }\n\n const isCreator = announcement.teacherId === userId;\n const isClassTeacher = announcement.class.teachers.some((t) => t.id === userId);\n\n if (!isCreator && !isClassTeacher) {\n throw new TRPCError({\n code: \"FORBIDDEN\",\n message: \"Only the announcement creator or class teachers can update announcements\",\n });\n }\n\n let directUploadFiles: DirectUploadFile[] = [];\n if (input.data.files && input.data.files.length > 0) {\n directUploadFiles = await createDirectUploadFiles(\n input.data.files,\n userId,\n undefined,\n undefined,\n undefined,\n input.id\n );\n }\n\n if (input.data.removedAttachments && input.data.removedAttachments.length > 0) {\n const filesToDelete = announcement.attachments.filter((f) =>\n input.data.removedAttachments!.includes(f.id)\n );\n await Promise.all(\n filesToDelete.map(async (file) => {\n try {\n if (file.uploadStatus === \"COMPLETED\") {\n await deleteFile(file.path);\n if (file.thumbnail?.path) {\n await deleteFile(file.thumbnail.path);\n }\n }\n } catch (error) {\n logger.warn(`Failed to delete file ${file.path}:`, {\n error: error instanceof Error ? { name: error.name, message: error.message } : error,\n });\n }\n })\n );\n }\n\n const updateData: { remarks?: string; attachments?: object } = {};\n if (input.data.remarks) updateData.remarks = input.data.remarks;\n\n if (input.data.existingFileIds && input.data.existingFileIds.length > 0) {\n await prisma.announcement.update({\n where: { id: input.id },\n data: {\n attachments: {\n connect: input.data.existingFileIds.map((fileId) => ({ id: fileId })),\n },\n },\n });\n }\n\n if (input.data.removedAttachments && input.data.removedAttachments.length > 0) {\n await prisma.announcement.update({\n where: { id: input.id },\n data: {\n attachments: {\n deleteMany: { id: { in: input.data.removedAttachments } },\n },\n },\n });\n }\n\n const updatedAnnouncement = await prisma.announcement.update({\n where: { id: input.id },\n data: updateData,\n select: {\n id: true,\n teacher: {\n select: {\n id: true,\n username: true,\n profile: {\n select: {\n displayName: true,\n profilePicture: true,\n profilePictureThumbnail: true,\n },\n },\n },\n },\n remarks: true,\n createdAt: true,\n modifiedAt: true,\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 },\n });\n\n return {\n announcement: updatedAnnouncement,\n uploadFiles: directUploadFiles.length > 0 ? directUploadFiles : undefined,\n };\n}\n\nexport async function deleteAnnouncementRecord(userId: string, id: string, classId: string) {\n const announcement = await findAnnouncementWithClass(id);\n\n if (!announcement) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Announcement not found\",\n });\n }\n\n const isCreator = announcement.teacherId === userId;\n const isClassTeacher = announcement.class.teachers.some((t) => t.id === userId);\n\n if (!isCreator && !isClassTeacher) {\n throw new TRPCError({\n code: \"FORBIDDEN\",\n message: \"Only the announcement creator or class teachers can delete announcements\",\n });\n }\n\n await deleteAnnouncement(id);\n return { success: true };\n}\n"],"names":[],"mappings":"AAAA;;GAEG;;;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EACL,0BAA0B,EAC1B,4BAA4B,EAC5B,yBAAyB,EACzB,kBAAkB,EAElB,6BAA6B,EAC7B,kBAAkB,GACnB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,uBAAuB,EAAyB,MAAM,sBAAsB,CAAC;AACtF,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAAe;IACvD,MAAM,aAAa,GAAG,MAAM,0BAA0B,CAAC,OAAO,CAAC,CAAC;IAChE,MAAM,uBAAuB,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACxD,GAAG,CAAC;QACJ,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ;QAC/B,MAAM,EAAE,SAAS;KAClB,CAAC,CAAC,CAAC;IACJ,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,EAAU,EAAE,OAAe;IAC/D,MAAM,YAAY,GAAG,MAAM,4BAA4B,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACrE,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,SAAS,CAAC;YAClB,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,wBAAwB;SAClC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,EAAE,YAAY,EAAE,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,MAAc,EACd,KAKC;IAED,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,KAAK,CAAC;IAE3D,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;QAC9C,KAAK,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE;QACtB,OAAO,EAAE,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;KAChD,CAAC,CAAC;IAEH,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,SAAS,CAAC;YAClB,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,iBAAiB;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,kBAAkB,CAAC;QAC5C,OAAO;QACP,SAAS,EAAE,MAAM;QACjB,OAAO;KACR,CAAC,CAAC;IAEH,IAAI,iBAAiB,GAAuB,EAAE,CAAC;IAC/C,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,iBAAiB,GAAG,MAAM,uBAAuB,CAC/C,KAAK,EACL,MAAM,EACN,SAAS,EACT,SAAS,EACT,SAAS,EACT,YAAY,CAAC,EAAE,CAChB,CAAC;IACJ,CAAC;IAED,IAAI,eAAe,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClD,MAAM,6BAA6B,CAAC,YAAY,CAAC,EAAE,EAAE;YACnD,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;SAC3D,CAAC,CAAC;IACL,CAAC;IAED,MAAM,2BAA2B,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC;QACvE,KAAK,EAAE,EAAE,EAAE,EAAE,YAAY,CAAC,EAAE,EAAE;QAC9B,MAAM,EAAE;YACN,EAAE,EAAE,IAAI;YACR,OAAO,EAAE;gBACP,MAAM,EAAE;oBACN,EAAE,EAAE,IAAI;oBACR,QAAQ,EAAE,IAAI;oBACd,OAAO,EAAE;wBACP,MAAM,EAAE;4BACN,WAAW,EAAE,IAAI;4BACjB,cAAc,EAAE,IAAI;4BACpB,uBAAuB,EAAE,IAAI;yBAC9B;qBACF;iBACF;aACF;YACD,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,IAAI;YACf,UAAU,EAAE,IAAI;YAChB,WAAW,EAAE;gBACX,MAAM,EAAE;oBACN,EAAE,EAAE,IAAI;oBACR,IAAI,EAAE,IAAI;oBACV,IAAI,EAAE,IAAI;oBACV,IAAI,EAAE,IAAI;oBACV,IAAI,EAAE,IAAI;oBACV,UAAU,EAAE,IAAI;oBAChB,WAAW,EAAE,IAAI;iBAClB;aACF;SACF;KACF,CAAC,CAAC;IAEH,cAAc,CAAC;QACb,WAAW,EAAE,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,KAAK,EAAE,uBAAuB,SAAS,CAAC,IAAI,EAAE;QAC9C,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACjB,MAAM,CAAC,KAAK,CAAC,4CAA4C,EAAE,KAAK,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,YAAY,EAAE,2BAA2B,IAAI,YAAY;QACzD,WAAW,EAAE,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS;KAC1E,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,MAAc,EACd,KASC;IAED,MAAM,YAAY,GAAG,MAAM,yBAAyB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAE/D,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,SAAS,CAAC;YAClB,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,wBAAwB;SAClC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,SAAS,GAAG,YAAY,CAAC,SAAS,KAAK,MAAM,CAAC;IACpD,MAAM,cAAc,GAAG,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;IAEhF,IAAI,CAAC,SAAS,IAAI,CAAC,cAAc,EAAE,CAAC;QAClC,MAAM,IAAI,SAAS,CAAC;YAClB,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,0EAA0E;SACpF,CAAC,CAAC;IACL,CAAC;IAED,IAAI,iBAAiB,GAAuB,EAAE,CAAC;IAC/C,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpD,iBAAiB,GAAG,MAAM,uBAAuB,CAC/C,KAAK,CAAC,IAAI,CAAC,KAAK,EAChB,MAAM,EACN,SAAS,EACT,SAAS,EACT,SAAS,EACT,KAAK,CAAC,EAAE,CACT,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,CAAC,kBAAkB,IAAI,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9E,MAAM,aAAa,GAAG,YAAY,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAC1D,KAAK,CAAC,IAAI,CAAC,kBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAC9C,CAAC;QACF,MAAM,OAAO,CAAC,GAAG,CACf,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YAC/B,IAAI,CAAC;gBACH,IAAI,IAAI,CAAC,YAAY,KAAK,WAAW,EAAE,CAAC;oBACtC,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC5B,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC;wBACzB,MAAM,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;oBACxC,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC,yBAAyB,IAAI,CAAC,IAAI,GAAG,EAAE;oBACjD,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK;iBACrF,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAA+C,EAAE,CAAC;IAClE,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO;QAAE,UAAU,CAAC,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;IAEhE,IAAI,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxE,MAAM,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC;YAC/B,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE;YACvB,IAAI,EAAE;gBACJ,WAAW,EAAE;oBACX,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;iBACtE;aACF;SACF,CAAC,CAAC;IACL,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,CAAC,kBAAkB,IAAI,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9E,MAAM,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC;YAC/B,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE;YACvB,IAAI,EAAE;gBACJ,WAAW,EAAE;oBACX,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE;iBAC1D;aACF;SACF,CAAC,CAAC;IACL,CAAC;IAED,MAAM,mBAAmB,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC;QAC3D,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE;QACvB,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE;YACN,EAAE,EAAE,IAAI;YACR,OAAO,EAAE;gBACP,MAAM,EAAE;oBACN,EAAE,EAAE,IAAI;oBACR,QAAQ,EAAE,IAAI;oBACd,OAAO,EAAE;wBACP,MAAM,EAAE;4BACN,WAAW,EAAE,IAAI;4BACjB,cAAc,EAAE,IAAI;4BACpB,uBAAuB,EAAE,IAAI;yBAC9B;qBACF;iBACF;aACF;YACD,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,IAAI;YACf,UAAU,EAAE,IAAI;YAChB,WAAW,EAAE;gBACX,MAAM,EAAE;oBACN,EAAE,EAAE,IAAI;oBACR,IAAI,EAAE,IAAI;oBACV,IAAI,EAAE,IAAI;oBACV,IAAI,EAAE,IAAI;oBACV,IAAI,EAAE,IAAI;oBACV,UAAU,EAAE,IAAI;oBAChB,WAAW,EAAE,IAAI;iBAClB;aACF;SACF;KACF,CAAC,CAAC;IAEH,OAAO;QACL,YAAY,EAAE,mBAAmB;QACjC,WAAW,EAAE,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS;KAC1E,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,MAAc,EAAE,EAAU,EAAE,OAAe;IACxF,MAAM,YAAY,GAAG,MAAM,yBAAyB,CAAC,EAAE,CAAC,CAAC;IAEzD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,SAAS,CAAC;YAClB,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,wBAAwB;SAClC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,SAAS,GAAG,YAAY,CAAC,SAAS,KAAK,MAAM,CAAC;IACpD,MAAM,cAAc,GAAG,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;IAEhF,IAAI,CAAC,SAAS,IAAI,CAAC,cAAc,EAAE,CAAC;QAClC,MAAM,IAAI,SAAS,CAAC;YAClB,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,0EAA0E;SACpF,CAAC,CAAC;IACL,CAAC;IAED,MAAM,kBAAkB,CAAC,EAAE,CAAC,CAAC;IAC7B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC","debug_id":"7b26ed1c-9d02-589d-b486-dc62ee96553c"}
|
|
1
|
+
{"version":3,"file":"announcement.js","sources":["services/announcement.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Announcement service – create, read, update, delete announcements.\n */\nimport { TRPCError } from \"@trpc/server\";\nimport {\n findAnnouncementsByClassId,\n findAnnouncementByIdAndClass,\n findAnnouncementWithClass,\n createAnnouncement,\n updateAnnouncement,\n updateAnnouncementAttachments,\n deleteAnnouncement,\n} from \"../models/announcement.js\";\nimport { prisma } from \"../lib/prisma.js\";\nimport { createDirectUploadFiles, type DirectUploadFile } from \"../lib/fileUpload.js\";\nimport { deleteFile } from \"../lib/googleCloudStorage.js\";\nimport { sendToMultiple } from \"./notification.js\";\nimport { logger } from \"../utils/logger.js\";\n\nexport async function getAllAnnouncements(classId: string) {\n const announcements = await findAnnouncementsByClassId(classId);\n const announcementsWithCounts = announcements.map((a) => ({\n ...a,\n commentCount: a._count.comments,\n _count: undefined,\n }));\n return { announcements: announcementsWithCounts };\n}\n\nexport async function getAnnouncement(id: string, classId: string) {\n const announcement = await findAnnouncementByIdAndClass(id, classId);\n if (!announcement) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Announcement not found\",\n });\n }\n return { announcement };\n}\n\nexport async function createAnnouncementRecord(\n userId: string,\n input: {\n classId: string;\n remarks: string;\n files?: { name: string; type: string; size: number }[];\n existingFileIds?: string[];\n }\n) {\n const { classId, remarks, files, existingFileIds } = input;\n\n const classData = await prisma.class.findUnique({\n where: { id: classId },\n include: { students: { select: { id: true } } },\n });\n\n if (!classData) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Class not found\",\n });\n }\n\n const announcement = await createAnnouncement({\n remarks,\n teacherId: userId,\n classId,\n });\n\n let directUploadFiles: DirectUploadFile[] = [];\n if (files && files.length > 0) {\n directUploadFiles = await createDirectUploadFiles(\n files,\n userId,\n undefined,\n undefined,\n undefined,\n announcement.id\n );\n }\n\n if (existingFileIds && existingFileIds.length > 0) {\n await updateAnnouncementAttachments(announcement.id, {\n connect: existingFileIds.map((fileId) => ({ id: fileId })),\n });\n }\n\n const announcementWithAttachments = await prisma.announcement.findUnique({\n where: { id: announcement.id },\n select: {\n id: true,\n teacher: {\n select: {\n id: true,\n username: true,\n profile: {\n select: {\n displayName: true,\n profilePicture: true,\n profilePictureThumbnail: true,\n },\n },\n },\n },\n remarks: true,\n createdAt: true,\n modifiedAt: true,\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 },\n });\n\n sendToMultiple({\n receiverIds: classData.students.map((s) => s.id),\n title: `🔔 Announcement for ${classData.name}`,\n content: remarks,\n }).catch((error) => {\n logger.error(\"Failed to send announcement notifications:\", error);\n });\n\n return {\n announcement: announcementWithAttachments || announcement,\n uploadFiles: directUploadFiles.length > 0 ? directUploadFiles : undefined,\n };\n}\n\nexport async function updateAnnouncementRecord(\n userId: string,\n input: {\n id: string;\n classId: string;\n data: {\n remarks?: string;\n files?: { name: string; type: string; size: number }[];\n existingFileIds?: string[];\n removedAttachments?: string[];\n };\n }\n) {\n const announcement = await findAnnouncementWithClass(input.id);\n\n if (!announcement) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Announcement not found\",\n });\n }\n\n const isCreator = announcement.teacherId === userId;\n const isClassTeacher = announcement.class.teachers.some((t) => t.id === userId);\n const isSchoolAdmin = Boolean(\n announcement.class.school?.memberships.some((admin) => admin.userId === userId) ||\n announcement.class.school?.users.some((admin) => admin.id === userId)\n );\n\n if (!isCreator && !isClassTeacher && !isSchoolAdmin) {\n throw new TRPCError({\n code: \"FORBIDDEN\",\n message: \"Only the announcement creator, class teachers, or school admins can update announcements\",\n });\n }\n\n let directUploadFiles: DirectUploadFile[] = [];\n if (input.data.files && input.data.files.length > 0) {\n directUploadFiles = await createDirectUploadFiles(\n input.data.files,\n userId,\n undefined,\n undefined,\n undefined,\n input.id\n );\n }\n\n if (input.data.removedAttachments && input.data.removedAttachments.length > 0) {\n const filesToDelete = announcement.attachments.filter((f) =>\n input.data.removedAttachments!.includes(f.id)\n );\n await Promise.all(\n filesToDelete.map(async (file) => {\n try {\n if (file.uploadStatus === \"COMPLETED\") {\n await deleteFile(file.path);\n if (file.thumbnail?.path) {\n await deleteFile(file.thumbnail.path);\n }\n }\n } catch (error) {\n logger.warn(`Failed to delete file ${file.path}:`, {\n error: error instanceof Error ? { name: error.name, message: error.message } : error,\n });\n }\n })\n );\n }\n\n const updateData: { remarks?: string; attachments?: object } = {};\n if (input.data.remarks) updateData.remarks = input.data.remarks;\n\n if (input.data.existingFileIds && input.data.existingFileIds.length > 0) {\n await prisma.announcement.update({\n where: { id: input.id },\n data: {\n attachments: {\n connect: input.data.existingFileIds.map((fileId) => ({ id: fileId })),\n },\n },\n });\n }\n\n if (input.data.removedAttachments && input.data.removedAttachments.length > 0) {\n await prisma.announcement.update({\n where: { id: input.id },\n data: {\n attachments: {\n deleteMany: { id: { in: input.data.removedAttachments } },\n },\n },\n });\n }\n\n const updatedAnnouncement = await prisma.announcement.update({\n where: { id: input.id },\n data: updateData,\n select: {\n id: true,\n teacher: {\n select: {\n id: true,\n username: true,\n profile: {\n select: {\n displayName: true,\n profilePicture: true,\n profilePictureThumbnail: true,\n },\n },\n },\n },\n remarks: true,\n createdAt: true,\n modifiedAt: true,\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 },\n });\n\n return {\n announcement: updatedAnnouncement,\n uploadFiles: directUploadFiles.length > 0 ? directUploadFiles : undefined,\n };\n}\n\nexport async function deleteAnnouncementRecord(userId: string, id: string, classId: string) {\n const announcement = await findAnnouncementWithClass(id);\n\n if (!announcement) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"Announcement not found\",\n });\n }\n\n const isCreator = announcement.teacherId === userId;\n const isClassTeacher = announcement.class.teachers.some((t) => t.id === userId);\n const isSchoolAdmin = Boolean(\n announcement.class.school?.memberships.some((admin) => admin.userId === userId) ||\n announcement.class.school?.users.some((admin) => admin.id === userId)\n );\n\n if (!isCreator && !isClassTeacher && !isSchoolAdmin) {\n throw new TRPCError({\n code: \"FORBIDDEN\",\n message: \"Only the announcement creator, class teachers, or school admins can delete announcements\",\n });\n }\n\n await deleteAnnouncement(id);\n return { success: true };\n}\n"],"names":[],"mappings":"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","debug_id":"b88341ca-3e8f-5744-9797-90d17a558460"}
|
|
@@ -16,12 +16,6 @@ export declare function getAssignment(id: string, _classId: string): Promise<{
|
|
|
16
16
|
name: string;
|
|
17
17
|
id: string;
|
|
18
18
|
}[];
|
|
19
|
-
submissions: {
|
|
20
|
-
student: {
|
|
21
|
-
id: string;
|
|
22
|
-
username: string;
|
|
23
|
-
};
|
|
24
|
-
}[];
|
|
25
19
|
class: {
|
|
26
20
|
name: string;
|
|
27
21
|
id: string;
|
|
@@ -30,6 +24,12 @@ export declare function getAssignment(id: string, _classId: string): Promise<{
|
|
|
30
24
|
name: string;
|
|
31
25
|
id: string;
|
|
32
26
|
} | null;
|
|
27
|
+
submissions: {
|
|
28
|
+
student: {
|
|
29
|
+
id: string;
|
|
30
|
+
username: string;
|
|
31
|
+
};
|
|
32
|
+
}[];
|
|
33
33
|
markScheme: {
|
|
34
34
|
id: string;
|
|
35
35
|
structured: string;
|
|
@@ -144,8 +144,8 @@ export declare function getSubmission(assignmentId: string, studentId: string):
|
|
|
144
144
|
type: string;
|
|
145
145
|
name: string;
|
|
146
146
|
id: string;
|
|
147
|
-
size: number | null;
|
|
148
147
|
userId: string | null;
|
|
148
|
+
size: number | null;
|
|
149
149
|
uploadedAt: Date | null;
|
|
150
150
|
uploadStatus: import(".prisma/client").$Enums.UploadStatus;
|
|
151
151
|
uploadUrl: string | null;
|
|
@@ -172,8 +172,8 @@ export declare function getSubmission(assignmentId: string, studentId: string):
|
|
|
172
172
|
type: string;
|
|
173
173
|
name: string;
|
|
174
174
|
id: string;
|
|
175
|
-
size: number | null;
|
|
176
175
|
userId: string | null;
|
|
176
|
+
size: number | null;
|
|
177
177
|
uploadedAt: Date | null;
|
|
178
178
|
uploadStatus: import(".prisma/client").$Enums.UploadStatus;
|
|
179
179
|
uploadUrl: string | null;
|
|
@@ -200,8 +200,8 @@ export declare function getSubmission(assignmentId: string, studentId: string):
|
|
|
200
200
|
username: string;
|
|
201
201
|
};
|
|
202
202
|
id: string;
|
|
203
|
-
assignmentId: string;
|
|
204
203
|
createdAt: Date;
|
|
204
|
+
assignmentId: string;
|
|
205
205
|
modifiedAt: Date;
|
|
206
206
|
studentId: string;
|
|
207
207
|
extendedResponse: string | null;
|
|
@@ -270,8 +270,8 @@ export declare function getSubmissionById(submissionId: string, classId: string,
|
|
|
270
270
|
type: string;
|
|
271
271
|
name: string;
|
|
272
272
|
id: string;
|
|
273
|
-
size: number | null;
|
|
274
273
|
userId: string | null;
|
|
274
|
+
size: number | null;
|
|
275
275
|
uploadedAt: Date | null;
|
|
276
276
|
uploadStatus: import(".prisma/client").$Enums.UploadStatus;
|
|
277
277
|
uploadUrl: string | null;
|
|
@@ -298,8 +298,8 @@ export declare function getSubmissionById(submissionId: string, classId: string,
|
|
|
298
298
|
type: string;
|
|
299
299
|
name: string;
|
|
300
300
|
id: string;
|
|
301
|
-
size: number | null;
|
|
302
301
|
userId: string | null;
|
|
302
|
+
size: number | null;
|
|
303
303
|
uploadedAt: Date | null;
|
|
304
304
|
uploadStatus: import(".prisma/client").$Enums.UploadStatus;
|
|
305
305
|
uploadUrl: string | null;
|
|
@@ -326,10 +326,10 @@ export declare function getSubmissionById(submissionId: string, classId: string,
|
|
|
326
326
|
username: string;
|
|
327
327
|
profile: {
|
|
328
328
|
id: string;
|
|
329
|
-
userId: string;
|
|
330
329
|
createdAt: Date;
|
|
331
|
-
location: string | null;
|
|
332
330
|
updatedAt: Date;
|
|
331
|
+
userId: string;
|
|
332
|
+
location: string | null;
|
|
333
333
|
displayName: string | null;
|
|
334
334
|
bio: string | null;
|
|
335
335
|
website: string | null;
|
|
@@ -338,8 +338,8 @@ export declare function getSubmissionById(submissionId: string, classId: string,
|
|
|
338
338
|
} | null;
|
|
339
339
|
};
|
|
340
340
|
id: string;
|
|
341
|
-
assignmentId: string;
|
|
342
341
|
createdAt: Date;
|
|
342
|
+
assignmentId: string;
|
|
343
343
|
modifiedAt: Date;
|
|
344
344
|
studentId: string;
|
|
345
345
|
extendedResponse: string | null;
|
|
@@ -405,8 +405,8 @@ export declare function getSubmissions(assignmentId: string, teacherId: string):
|
|
|
405
405
|
type: string;
|
|
406
406
|
name: string;
|
|
407
407
|
id: string;
|
|
408
|
-
size: number | null;
|
|
409
408
|
userId: string | null;
|
|
409
|
+
size: number | null;
|
|
410
410
|
uploadedAt: Date | null;
|
|
411
411
|
uploadStatus: import(".prisma/client").$Enums.UploadStatus;
|
|
412
412
|
uploadUrl: string | null;
|
|
@@ -433,8 +433,8 @@ export declare function getSubmissions(assignmentId: string, teacherId: string):
|
|
|
433
433
|
type: string;
|
|
434
434
|
name: string;
|
|
435
435
|
id: string;
|
|
436
|
-
size: number | null;
|
|
437
436
|
userId: string | null;
|
|
437
|
+
size: number | null;
|
|
438
438
|
uploadedAt: Date | null;
|
|
439
439
|
uploadStatus: import(".prisma/client").$Enums.UploadStatus;
|
|
440
440
|
uploadUrl: string | null;
|
|
@@ -466,8 +466,8 @@ export declare function getSubmissions(assignmentId: string, teacherId: string):
|
|
|
466
466
|
} | null;
|
|
467
467
|
};
|
|
468
468
|
id: string;
|
|
469
|
-
assignmentId: string;
|
|
470
469
|
createdAt: Date;
|
|
470
|
+
assignmentId: string;
|
|
471
471
|
modifiedAt: Date;
|
|
472
472
|
studentId: string;
|
|
473
473
|
extendedResponse: string | null;
|
|
@@ -565,12 +565,7 @@ export declare function updateAssignmentRecord(userId: string, input: {
|
|
|
565
565
|
}): Promise<{
|
|
566
566
|
type: import(".prisma/client").$Enums.AssignmentType;
|
|
567
567
|
id: string;
|
|
568
|
-
|
|
569
|
-
student: {
|
|
570
|
-
id: string;
|
|
571
|
-
username: string;
|
|
572
|
-
};
|
|
573
|
-
}[];
|
|
568
|
+
createdAt: Date | null;
|
|
574
569
|
class: {
|
|
575
570
|
name: string;
|
|
576
571
|
id: string;
|
|
@@ -587,7 +582,12 @@ export declare function updateAssignmentRecord(userId: string, input: {
|
|
|
587
582
|
classId: string;
|
|
588
583
|
order: number | null;
|
|
589
584
|
} | null;
|
|
590
|
-
|
|
585
|
+
submissions: {
|
|
586
|
+
student: {
|
|
587
|
+
id: string;
|
|
588
|
+
username: string;
|
|
589
|
+
};
|
|
590
|
+
}[];
|
|
591
591
|
title: string;
|
|
592
592
|
instructions: string;
|
|
593
593
|
dueDate: Date;
|
|
@@ -617,8 +617,8 @@ export declare function updateAssignmentRecord(userId: string, input: {
|
|
|
617
617
|
type: string;
|
|
618
618
|
name: string;
|
|
619
619
|
id: string;
|
|
620
|
-
size: number | null;
|
|
621
620
|
userId: string | null;
|
|
621
|
+
size: number | null;
|
|
622
622
|
uploadedAt: Date | null;
|
|
623
623
|
uploadStatus: import(".prisma/client").$Enums.UploadStatus;
|
|
624
624
|
uploadUrl: string | null;
|
|
@@ -708,8 +708,8 @@ export declare function updateSubmissionRecord(userId: string, input: {
|
|
|
708
708
|
type: string;
|
|
709
709
|
name: string;
|
|
710
710
|
id: string;
|
|
711
|
-
size: number | null;
|
|
712
711
|
userId: string | null;
|
|
712
|
+
size: number | null;
|
|
713
713
|
uploadedAt: Date | null;
|
|
714
714
|
uploadStatus: import(".prisma/client").$Enums.UploadStatus;
|
|
715
715
|
uploadUrl: string | null;
|
|
@@ -737,8 +737,8 @@ export declare function updateSubmissionRecord(userId: string, input: {
|
|
|
737
737
|
};
|
|
738
738
|
} & {
|
|
739
739
|
id: string;
|
|
740
|
-
assignmentId: string;
|
|
741
740
|
createdAt: Date;
|
|
741
|
+
assignmentId: string;
|
|
742
742
|
modifiedAt: Date;
|
|
743
743
|
studentId: string;
|
|
744
744
|
extendedResponse: string | null;
|
|
@@ -823,8 +823,8 @@ export declare function updateSubmissionAsTeacherRecord(teacherId: string, input
|
|
|
823
823
|
type: string;
|
|
824
824
|
name: string;
|
|
825
825
|
id: string;
|
|
826
|
-
size: number | null;
|
|
827
826
|
userId: string | null;
|
|
827
|
+
size: number | null;
|
|
828
828
|
uploadedAt: Date | null;
|
|
829
829
|
uploadStatus: import(".prisma/client").$Enums.UploadStatus;
|
|
830
830
|
uploadUrl: string | null;
|
|
@@ -851,8 +851,8 @@ export declare function updateSubmissionAsTeacherRecord(teacherId: string, input
|
|
|
851
851
|
type: string;
|
|
852
852
|
name: string;
|
|
853
853
|
id: string;
|
|
854
|
-
size: number | null;
|
|
855
854
|
userId: string | null;
|
|
855
|
+
size: number | null;
|
|
856
856
|
uploadedAt: Date | null;
|
|
857
857
|
uploadStatus: import(".prisma/client").$Enums.UploadStatus;
|
|
858
858
|
uploadUrl: string | null;
|
|
@@ -880,8 +880,8 @@ export declare function updateSubmissionAsTeacherRecord(teacherId: string, input
|
|
|
880
880
|
type: string;
|
|
881
881
|
name: string;
|
|
882
882
|
id: string;
|
|
883
|
-
size: number | null;
|
|
884
883
|
userId: string | null;
|
|
884
|
+
size: number | null;
|
|
885
885
|
uploadedAt: Date | null;
|
|
886
886
|
uploadStatus: import(".prisma/client").$Enums.UploadStatus;
|
|
887
887
|
uploadUrl: string | null;
|
|
@@ -908,8 +908,8 @@ export declare function updateSubmissionAsTeacherRecord(teacherId: string, input
|
|
|
908
908
|
type: string;
|
|
909
909
|
name: string;
|
|
910
910
|
id: string;
|
|
911
|
-
size: number | null;
|
|
912
911
|
userId: string | null;
|
|
912
|
+
size: number | null;
|
|
913
913
|
uploadedAt: Date | null;
|
|
914
914
|
uploadStatus: import(".prisma/client").$Enums.UploadStatus;
|
|
915
915
|
uploadUrl: string | null;
|
|
@@ -942,8 +942,8 @@ export declare function updateSubmissionAsTeacherRecord(teacherId: string, input
|
|
|
942
942
|
};
|
|
943
943
|
} & {
|
|
944
944
|
id: string;
|
|
945
|
-
assignmentId: string;
|
|
946
945
|
createdAt: Date;
|
|
946
|
+
assignmentId: string;
|
|
947
947
|
modifiedAt: Date;
|
|
948
948
|
studentId: string;
|
|
949
949
|
extendedResponse: string | null;
|
|
@@ -1093,8 +1093,8 @@ export declare function attachMarkSchemeRecord(teacherId: string, assignmentId:
|
|
|
1093
1093
|
type: string;
|
|
1094
1094
|
name: string;
|
|
1095
1095
|
id: string;
|
|
1096
|
-
size: number | null;
|
|
1097
1096
|
userId: string | null;
|
|
1097
|
+
size: number | null;
|
|
1098
1098
|
uploadedAt: Date | null;
|
|
1099
1099
|
uploadStatus: import(".prisma/client").$Enums.UploadStatus;
|
|
1100
1100
|
uploadUrl: string | null;
|
|
@@ -1180,8 +1180,8 @@ export declare function detachMarkSchemeRecord(teacherId: string, assignmentId:
|
|
|
1180
1180
|
type: string;
|
|
1181
1181
|
name: string;
|
|
1182
1182
|
id: string;
|
|
1183
|
-
size: number | null;
|
|
1184
1183
|
userId: string | null;
|
|
1184
|
+
size: number | null;
|
|
1185
1185
|
uploadedAt: Date | null;
|
|
1186
1186
|
uploadStatus: import(".prisma/client").$Enums.UploadStatus;
|
|
1187
1187
|
uploadUrl: string | null;
|
|
@@ -1267,8 +1267,8 @@ export declare function attachGradingBoundaryRecord(teacherId: string, assignmen
|
|
|
1267
1267
|
type: string;
|
|
1268
1268
|
name: string;
|
|
1269
1269
|
id: string;
|
|
1270
|
-
size: number | null;
|
|
1271
1270
|
userId: string | null;
|
|
1271
|
+
size: number | null;
|
|
1272
1272
|
uploadedAt: Date | null;
|
|
1273
1273
|
uploadStatus: import(".prisma/client").$Enums.UploadStatus;
|
|
1274
1274
|
uploadUrl: string | null;
|
|
@@ -1354,8 +1354,8 @@ export declare function detachGradingBoundaryRecord(teacherId: string, assignmen
|
|
|
1354
1354
|
type: string;
|
|
1355
1355
|
name: string;
|
|
1356
1356
|
id: string;
|
|
1357
|
-
size: number | null;
|
|
1358
1357
|
userId: string | null;
|
|
1358
|
+
size: number | null;
|
|
1359
1359
|
uploadedAt: Date | null;
|
|
1360
1360
|
uploadStatus: import(".prisma/client").$Enums.UploadStatus;
|
|
1361
1361
|
uploadUrl: string | null;
|