@studious-lms/server 1.4.6 → 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/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 +69 -37
- package/dist/models/assignment.d.ts.map +1 -1
- package/dist/models/assignment.js +124 -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 +134 -70
- package/dist/models/comment.d.ts.map +1 -1
- package/dist/models/comment.js +30 -42
- 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 +163 -141
- package/dist/models/worksheet.d.ts.map +1 -1
- package/dist/models/worksheet.js +42 -17
- package/dist/models/worksheet.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 +1271 -327
- 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 +5 -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 +79 -44
- package/dist/routers/assignment.d.ts.map +1 -1
- package/dist/routers/assignment.js +32 -12
- package/dist/routers/assignment.js.map +1 -1
- package/dist/routers/class.d.ts +40 -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 +5 -5
- 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 +36 -20
- 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/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 +66 -36
- 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 +39 -19
- package/dist/services/class.d.ts.map +1 -1
- package/dist/services/class.js +52 -15
- package/dist/services/class.js.map +1 -1
- package/dist/services/comment.d.ts +5 -5
- package/dist/services/comment.d.ts.map +1 -1
- package/dist/services/comment.js +8 -3
- 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 +31 -20
- 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 +81 -0
- package/prisma/schema.prisma +66 -2
- package/src/models/access.ts +48 -0
- package/src/models/announcement.ts +19 -2
- package/src/models/assignment.ts +149 -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 +29 -40
- 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 +61 -12
- package/src/routers/_app.ts +2 -0
- package/src/routers/announcement.ts +30 -4
- package/src/routers/assignment.ts +46 -9
- package/src/routers/class.ts +1 -0
- package/src/routers/school.ts +122 -0
- package/src/routers/worksheet.ts +18 -0
- package/src/services/announcement.ts +12 -4
- package/src/services/assignment.ts +47 -1
- package/src/services/class.ts +61 -14
- package/src/services/comment.ts +10 -1
- package/src/services/event.ts +23 -6
- package/src/services/file.ts +20 -6
- package/src/services/school.ts +308 -0
- 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
|
@@ -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,24 @@ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
116
116
|
name: string;
|
|
117
117
|
id: string;
|
|
118
118
|
createdAt: Date;
|
|
119
|
+
updatedAt: Date;
|
|
120
|
+
classId: string;
|
|
121
|
+
};
|
|
122
|
+
meta: object;
|
|
123
|
+
}>;
|
|
124
|
+
duplicateWorksheet: import("@trpc/server").TRPCMutationProcedure<{
|
|
125
|
+
input: {
|
|
126
|
+
[x: string]: unknown;
|
|
119
127
|
classId: string;
|
|
128
|
+
name: string;
|
|
129
|
+
worksheetId: string;
|
|
130
|
+
};
|
|
131
|
+
output: {
|
|
132
|
+
name: string;
|
|
133
|
+
id: string;
|
|
134
|
+
createdAt: Date;
|
|
120
135
|
updatedAt: Date;
|
|
136
|
+
classId: string;
|
|
121
137
|
};
|
|
122
138
|
meta: object;
|
|
123
139
|
}>;
|
|
@@ -131,8 +147,8 @@ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
131
147
|
name: string;
|
|
132
148
|
id: string;
|
|
133
149
|
createdAt: Date;
|
|
134
|
-
classId: string;
|
|
135
150
|
updatedAt: Date;
|
|
151
|
+
classId: string;
|
|
136
152
|
};
|
|
137
153
|
meta: object;
|
|
138
154
|
}>;
|
|
@@ -176,8 +192,8 @@ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
176
192
|
name: string;
|
|
177
193
|
id: string;
|
|
178
194
|
createdAt: Date;
|
|
179
|
-
classId: string;
|
|
180
195
|
updatedAt: Date;
|
|
196
|
+
classId: string;
|
|
181
197
|
};
|
|
182
198
|
meta: object;
|
|
183
199
|
}>;
|
|
@@ -196,9 +212,9 @@ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
196
212
|
options: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
197
213
|
id: string;
|
|
198
214
|
createdAt: Date;
|
|
215
|
+
updatedAt: Date;
|
|
199
216
|
order: number | null;
|
|
200
217
|
points: number;
|
|
201
|
-
updatedAt: Date;
|
|
202
218
|
worksheetId: string;
|
|
203
219
|
markScheme: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
204
220
|
question: string;
|
|
@@ -234,9 +250,9 @@ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
234
250
|
options: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
235
251
|
id: string;
|
|
236
252
|
createdAt: Date;
|
|
253
|
+
updatedAt: Date;
|
|
237
254
|
order: number | null;
|
|
238
255
|
points: number;
|
|
239
|
-
updatedAt: Date;
|
|
240
256
|
worksheetId: string;
|
|
241
257
|
markScheme: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
242
258
|
question: string;
|
|
@@ -254,9 +270,9 @@ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
254
270
|
options: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
255
271
|
id: string;
|
|
256
272
|
createdAt: Date;
|
|
273
|
+
updatedAt: Date;
|
|
257
274
|
order: number | null;
|
|
258
275
|
points: number;
|
|
259
|
-
updatedAt: Date;
|
|
260
276
|
worksheetId: string;
|
|
261
277
|
markScheme: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
262
278
|
question: string;
|
|
@@ -278,6 +294,7 @@ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
278
294
|
status: import(".prisma/client").$Enums.GenerationStatus | null;
|
|
279
295
|
id: string;
|
|
280
296
|
createdAt: Date;
|
|
297
|
+
updatedAt: Date | null;
|
|
281
298
|
studentId: string;
|
|
282
299
|
questionId: string;
|
|
283
300
|
response: string;
|
|
@@ -285,17 +302,16 @@ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
285
302
|
markschemeState: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
286
303
|
points: number;
|
|
287
304
|
feedback: string | null;
|
|
288
|
-
updatedAt: Date | null;
|
|
289
305
|
studentWorksheetResponseId: string | null;
|
|
290
306
|
})[];
|
|
291
307
|
} & {
|
|
292
308
|
id: string;
|
|
293
|
-
submissionId: string | null;
|
|
294
309
|
createdAt: Date;
|
|
310
|
+
updatedAt: Date;
|
|
311
|
+
submissionId: string | null;
|
|
295
312
|
studentId: string;
|
|
296
313
|
submittedAt: Date | null;
|
|
297
314
|
submitted: boolean;
|
|
298
|
-
updatedAt: Date;
|
|
299
315
|
worksheetId: string;
|
|
300
316
|
};
|
|
301
317
|
meta: object;
|
|
@@ -311,6 +327,7 @@ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
311
327
|
status: import(".prisma/client").$Enums.GenerationStatus | null;
|
|
312
328
|
id: string;
|
|
313
329
|
createdAt: Date;
|
|
330
|
+
updatedAt: Date | null;
|
|
314
331
|
studentId: string;
|
|
315
332
|
questionId: string;
|
|
316
333
|
response: string;
|
|
@@ -318,17 +335,16 @@ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
318
335
|
markschemeState: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
319
336
|
points: number;
|
|
320
337
|
feedback: string | null;
|
|
321
|
-
updatedAt: Date | null;
|
|
322
338
|
studentWorksheetResponseId: string | null;
|
|
323
339
|
}[];
|
|
324
340
|
} & {
|
|
325
341
|
id: string;
|
|
326
|
-
submissionId: string | null;
|
|
327
342
|
createdAt: Date;
|
|
343
|
+
updatedAt: Date;
|
|
344
|
+
submissionId: string | null;
|
|
328
345
|
studentId: string;
|
|
329
346
|
submittedAt: Date | null;
|
|
330
347
|
submitted: boolean;
|
|
331
|
-
updatedAt: Date;
|
|
332
348
|
worksheetId: string;
|
|
333
349
|
};
|
|
334
350
|
meta: object;
|
|
@@ -342,6 +358,7 @@ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
342
358
|
status: import(".prisma/client").$Enums.GenerationStatus | null;
|
|
343
359
|
id: string;
|
|
344
360
|
createdAt: Date;
|
|
361
|
+
updatedAt: Date | null;
|
|
345
362
|
studentId: string;
|
|
346
363
|
questionId: string;
|
|
347
364
|
response: string;
|
|
@@ -349,7 +366,6 @@ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
349
366
|
markschemeState: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
350
367
|
points: number;
|
|
351
368
|
feedback: string | null;
|
|
352
|
-
updatedAt: Date | null;
|
|
353
369
|
studentWorksheetResponseId: string | null;
|
|
354
370
|
};
|
|
355
371
|
meta: object;
|
|
@@ -363,6 +379,7 @@ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
363
379
|
status: import(".prisma/client").$Enums.GenerationStatus | null;
|
|
364
380
|
id: string;
|
|
365
381
|
createdAt: Date;
|
|
382
|
+
updatedAt: Date | null;
|
|
366
383
|
studentId: string;
|
|
367
384
|
questionId: string;
|
|
368
385
|
response: string;
|
|
@@ -370,7 +387,6 @@ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
370
387
|
markschemeState: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
371
388
|
points: number;
|
|
372
389
|
feedback: string | null;
|
|
373
|
-
updatedAt: Date | null;
|
|
374
390
|
studentWorksheetResponseId: string | null;
|
|
375
391
|
};
|
|
376
392
|
meta: object;
|
|
@@ -390,6 +406,7 @@ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
390
406
|
status: import(".prisma/client").$Enums.GenerationStatus | null;
|
|
391
407
|
id: string;
|
|
392
408
|
createdAt: Date;
|
|
409
|
+
updatedAt: Date | null;
|
|
393
410
|
studentId: string;
|
|
394
411
|
questionId: string;
|
|
395
412
|
response: string;
|
|
@@ -397,7 +414,6 @@ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
397
414
|
markschemeState: import("@prisma/client/runtime/library.js").JsonValue | null;
|
|
398
415
|
points: number;
|
|
399
416
|
feedback: string | null;
|
|
400
|
-
updatedAt: Date | null;
|
|
401
417
|
studentWorksheetResponseId: string | null;
|
|
402
418
|
};
|
|
403
419
|
meta: object;
|
|
@@ -410,10 +426,10 @@ export declare const worksheetRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
410
426
|
output: {
|
|
411
427
|
status: import(".prisma/client").$Enums.GenerationStatus | null;
|
|
412
428
|
id: string;
|
|
429
|
+
createdAt: Date;
|
|
413
430
|
assignmentId: string | null;
|
|
414
431
|
submissionId: string | null;
|
|
415
432
|
announcementId: string | null;
|
|
416
|
-
createdAt: Date;
|
|
417
433
|
modifiedAt: Date | null;
|
|
418
434
|
content: string;
|
|
419
435
|
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;
|
|
1
|
+
{"version":3,"file":"worksheet.d.ts","sourceRoot":"/","sources":["routers/worksheet.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAyDxB,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkW1B,CAAC"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="48eee8c6-e5af-5f3e-b8a3-cdffb17d292a")}catch(e){}}();
|
|
3
3
|
import { TRPCError } from "@trpc/server";
|
|
4
4
|
import { prisma } from "../lib/prisma.js";
|
|
5
5
|
import { confirmDirectUpload, createDirectUploadFiles, updateUploadProgress, } from "../lib/fileUpload.js";
|
|
6
6
|
import { createTRPCRouter, protectedClassMemberProcedure, protectedProcedure, protectedTeacherProcedure, } from "../trpc.js";
|
|
7
7
|
import { z } from "zod";
|
|
8
|
-
import { getWorksheet, worksheetExists, listWorksheets, updateWorksheetRecord, deleteWorksheetRecord, createWorksheetRecord, createWorksheetFromPdf, createWorksheetFromUploadedPdf, addQuestionToWorksheet, reorderWorksheetQuestions, updateWorksheetQuestionRecord, deleteWorksheetQuestionRecord, getWorksheetSubmission, answerWorksheetQuestion, cancelGrading, regradeQuestion, gradeAnswer, addCommentToResponse, } from "../services/worksheet.js";
|
|
8
|
+
import { getWorksheet, worksheetExists, listWorksheets, updateWorksheetRecord, deleteWorksheetRecord, createWorksheetRecord, duplicateWorksheetRecord, createWorksheetFromPdf, createWorksheetFromUploadedPdf, addQuestionToWorksheet, reorderWorksheetQuestions, updateWorksheetQuestionRecord, deleteWorksheetQuestionRecord, getWorksheetSubmission, answerWorksheetQuestion, cancelGrading, regradeQuestion, gradeAnswer, addCommentToResponse, } from "../services/worksheet.js";
|
|
9
9
|
const directFileSchema = z.object({
|
|
10
10
|
name: z.string(),
|
|
11
11
|
type: z.string(),
|
|
@@ -63,6 +63,13 @@ export const worksheetRouter = createTRPCRouter({
|
|
|
63
63
|
create: protectedTeacherProcedure
|
|
64
64
|
.input(z.object({ classId: z.string(), name: z.string() }))
|
|
65
65
|
.mutation(({ input }) => createWorksheetRecord(input.classId, input.name)),
|
|
66
|
+
duplicateWorksheet: protectedTeacherProcedure
|
|
67
|
+
.input(z.object({
|
|
68
|
+
classId: z.string(),
|
|
69
|
+
name: z.string(),
|
|
70
|
+
worksheetId: z.string(),
|
|
71
|
+
}))
|
|
72
|
+
.mutation(({ ctx, input }) => duplicateWorksheetRecord(input.worksheetId, input.classId, input.name, ctx.user.id)),
|
|
66
73
|
createFromPdf: protectedTeacherProcedure
|
|
67
74
|
.input(z.object({ classId: z.string(), url: z.string().url() }))
|
|
68
75
|
.mutation(({ input }) => createWorksheetFromPdf(input.classId, input.url)),
|
|
@@ -259,4 +266,4 @@ export const worksheetRouter = createTRPCRouter({
|
|
|
259
266
|
}),
|
|
260
267
|
});
|
|
261
268
|
//# sourceMappingURL=worksheet.js.map
|
|
262
|
-
//# debugId=
|
|
269
|
+
//# debugId=48eee8c6-e5af-5f3e-b8a3-cdffb17d292a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worksheet.js","sources":["routers/worksheet.ts"],"sourceRoot":"/","sourcesContent":["import { TRPCError } from \"@trpc/server\";\nimport { prisma } from \"../lib/prisma.js\";\nimport {\n confirmDirectUpload,\n createDirectUploadFiles,\n updateUploadProgress,\n} from \"../lib/fileUpload.js\";\nimport {\n createTRPCRouter,\n protectedClassMemberProcedure,\n protectedProcedure,\n protectedTeacherProcedure,\n} from \"../trpc.js\";\nimport { z } from \"zod\";\nimport {\n getWorksheet,\n worksheetExists,\n listWorksheets,\n updateWorksheetRecord,\n deleteWorksheetRecord,\n createWorksheetRecord,\n createWorksheetFromPdf,\n createWorksheetFromUploadedPdf,\n addQuestionToWorksheet,\n reorderWorksheetQuestions,\n updateWorksheetQuestionRecord,\n deleteWorksheetQuestionRecord,\n getWorksheetSubmission,\n answerWorksheetQuestion,\n cancelGrading,\n regradeQuestion,\n gradeAnswer,\n addCommentToResponse,\n} from \"../services/worksheet.js\";\n\nconst directFileSchema = z.object({\n name: z.string(),\n type: z.string(),\n size: z.number(),\n});\n\nconst pdfFileSchema = directFileSchema.superRefine((file, ctx) => {\n const isPdf =\n file.type === \"application/pdf\" && file.name.toLowerCase().endsWith(\".pdf\");\n if (!isPdf) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Only PDF files are supported\",\n });\n }\n});\n\nconst getWorksheetUploadUrlsSchema = z.object({\n classId: z.string(),\n files: z.array(pdfFileSchema),\n});\n\nconst confirmWorksheetUploadSchema = z.object({\n classId: z.string(),\n fileId: z.string(),\n uploadSuccess: z.boolean(),\n errorMessage: z.string().optional(),\n});\n\nconst updateUploadProgressSchema = z.object({\n fileId: z.string(),\n progress: z.number().min(0).max(100),\n});\n\nexport const worksheetRouter = createTRPCRouter({\n getWorksheet: protectedProcedure\n .input(z.object({ worksheetId: z.string() }))\n .query(({ ctx, input }) => getWorksheet(input.worksheetId, ctx.user!.id)),\n\n exists: protectedClassMemberProcedure\n .input(z.object({ id: z.string() }))\n .query(async ({ ctx, input }) => {\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"User must be authenticated\",\n });\n }\n return worksheetExists(input.id);\n }),\n\n listWorksheets: protectedClassMemberProcedure\n .input(z.object({ classId: z.string() }))\n .query(({ input }) => listWorksheets(input.classId)),\n\n updateWorksheet: protectedProcedure\n .input(z.object({ worksheetId: z.string(), name: z.string().optional() }))\n .mutation(({ ctx, input }) =>\n updateWorksheetRecord(input.worksheetId, ctx.user!.id, {\n name: input.name,\n })\n ),\n\n deleteWorksheet: protectedProcedure\n .input(z.object({ worksheetId: z.string() }))\n .mutation(({ ctx, input }) =>\n deleteWorksheetRecord(input.worksheetId, ctx.user!.id)\n ),\n\n create: protectedTeacherProcedure\n .input(z.object({ classId: z.string(), name: z.string() }))\n .mutation(({ input }) =>\n createWorksheetRecord(input.classId, input.name)\n ),\n\n createFromPdf: protectedTeacherProcedure\n .input(z.object({ classId: z.string(), url: z.string().url() }))\n .mutation(({ input }) => createWorksheetFromPdf(input.classId, input.url)),\n\n getWorksheetUploadUrls: protectedTeacherProcedure\n .input(getWorksheetUploadUrlsSchema)\n .mutation(async ({ ctx, input }) => {\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"You must be logged in to upload files\",\n });\n }\n\n const uploadFiles = await createDirectUploadFiles(\n input.files,\n ctx.user.id\n );\n\n return {\n success: true,\n uploadFiles,\n };\n }),\n\n confirmWorksheetUpload: protectedTeacherProcedure\n .input(confirmWorksheetUploadSchema)\n .mutation(async ({ ctx, input }) => {\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"You must be logged in\",\n });\n }\n\n const file = await prisma.file.findFirst({\n where: {\n id: input.fileId,\n userId: ctx.user.id,\n },\n });\n\n if (!file) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"File not found or you don't have permission\",\n });\n }\n\n await confirmDirectUpload(\n input.fileId,\n input.uploadSuccess,\n input.errorMessage\n );\n\n return {\n success: true,\n message: input.uploadSuccess\n ? \"Upload confirmed successfully\"\n : \"Upload failed\",\n };\n }),\n\n createFromUploadedPdf: protectedTeacherProcedure\n .input(z.object({ classId: z.string(), fileId: z.string() }))\n .mutation(({ ctx, input }) =>\n createWorksheetFromUploadedPdf(input.classId, input.fileId, ctx.user!.id)\n ),\n\n addQuestion: protectedProcedure\n .input(\n z.object({\n worksheetId: z.string(),\n question: z.string(),\n answer: z.string(),\n points: z.number().optional(),\n options: z.any().optional(),\n markScheme: z.any().optional(),\n type: z.enum([\n \"MULTIPLE_CHOICE\",\n \"TRUE_FALSE\",\n \"SHORT_ANSWER\",\n \"LONG_ANSWER\",\n \"MATH_EXPRESSION\",\n \"ESSAY\",\n ]),\n })\n )\n .mutation(({ ctx, input }) =>\n addQuestionToWorksheet(input.worksheetId, ctx.user!.id, {\n question: input.question,\n answer: input.answer,\n points: input.points,\n options: input.options,\n markScheme: input.markScheme,\n type: input.type,\n })\n ),\n\n reorderQuestions: protectedProcedure\n .input(\n z.object({\n worksheetId: z.string(),\n movedId: z.string(),\n position: z.enum([\"before\", \"after\"]),\n targetId: z.string(),\n })\n )\n .mutation(({ ctx, input }) =>\n reorderWorksheetQuestions(\n input.worksheetId,\n ctx.user!.id,\n input.movedId,\n input.position,\n input.targetId\n )\n ),\n\n updateQuestion: protectedProcedure\n .input(\n z.object({\n worksheetId: z.string(),\n questionId: z.string(),\n question: z.string().optional(),\n answer: z.string().optional(),\n points: z.number().optional(),\n options: z.any().optional(),\n markScheme: z.any().optional(),\n type: z\n .enum([\n \"MULTIPLE_CHOICE\",\n \"TRUE_FALSE\",\n \"SHORT_ANSWER\",\n \"LONG_ANSWER\",\n \"MATH_EXPRESSION\",\n \"ESSAY\",\n ])\n .optional(),\n })\n )\n .mutation(({ ctx, input }) =>\n updateWorksheetQuestionRecord(\n input.worksheetId,\n input.questionId,\n ctx.user!.id,\n {\n question: input.question,\n answer: input.answer,\n points: input.points,\n options: input.options,\n markScheme: input.markScheme,\n type: input.type,\n }\n )\n ),\n\n deleteQuestion: protectedProcedure\n .input(\n z.object({\n worksheetId: z.string(),\n questionId: z.string(),\n })\n )\n .mutation(({ ctx, input }) =>\n deleteWorksheetQuestionRecord(\n input.worksheetId,\n input.questionId,\n ctx.user!.id\n )\n ),\n\n getWorksheetSubmission: protectedProcedure\n .input(\n z.object({\n worksheetId: z.string(),\n submissionId: z.string(),\n })\n )\n .query(({ ctx, input }) =>\n getWorksheetSubmission(input.worksheetId, input.submissionId, ctx.user!.id)\n ),\n\n answerQuestion: protectedProcedure\n .input(\n z.object({\n worksheetResponseId: z.string(),\n questionId: z.string(),\n response: z.string(),\n })\n )\n .mutation(({ ctx, input }) =>\n answerWorksheetQuestion(\n input.worksheetResponseId,\n input.questionId,\n input.response,\n ctx.user!.id\n )\n ),\n\n cancelGrading: protectedProcedure\n .input(\n z.object({\n worksheetResponseId: z.string(),\n progressId: z.string(),\n })\n )\n .mutation(({ ctx, input }) =>\n cancelGrading(input.worksheetResponseId, input.progressId, ctx.user!.id)\n ),\n\n regradeQuestion: protectedProcedure\n .input(\n z.object({\n worksheetResponseId: z.string(),\n progressId: z.string(),\n })\n )\n .mutation(({ ctx, input }) =>\n regradeQuestion(input.worksheetResponseId, input.progressId, ctx.user!.id)\n ),\n\n gradeAnswer: protectedProcedure\n .input(\n z.object({\n questionId: z.string(),\n responseId: z.string().optional(),\n studentWorksheetResponseId: z.string(),\n response: z.string().optional(),\n isCorrect: z.boolean(),\n feedback: z.string().optional(),\n markschemeState: z.any().optional(),\n points: z.number().optional(),\n })\n )\n .mutation(({ ctx, input }) =>\n gradeAnswer(\n input.questionId,\n input.studentWorksheetResponseId,\n ctx.user!.id,\n {\n responseId: input.responseId,\n response: input.response,\n isCorrect: input.isCorrect,\n feedback: input.feedback,\n markschemeState: input.markschemeState,\n points: input.points,\n }\n )\n ),\n\n addComment: protectedProcedure\n .input(\n z.object({\n responseId: z.string(),\n comment: z.string(),\n })\n )\n .mutation(({ ctx, input }) =>\n addCommentToResponse(\n input.responseId,\n input.comment,\n ctx.user!.id\n )\n ),\n\n updateUploadProgress: protectedProcedure\n .input(updateUploadProgressSchema)\n .mutation(async ({ ctx, input }) => {\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"You must be logged in\",\n });\n }\n\n const file = await prisma.file.findFirst({\n where: {\n id: input.fileId,\n userId: ctx.user.id,\n },\n });\n\n if (!file) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"File not found or you don't have permission\",\n });\n }\n\n await updateUploadProgress(input.fileId, input.progress);\n\n return {\n success: true,\n progress: input.progress,\n };\n }),\n});\n"],"names":[],"mappings":"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","debug_id":"31932b12-1093-5e0f-a21c-e9301dcb8c25"}
|
|
1
|
+
{"version":3,"file":"worksheet.js","sources":["routers/worksheet.ts"],"sourceRoot":"/","sourcesContent":["import { TRPCError } from \"@trpc/server\";\nimport { prisma } from \"../lib/prisma.js\";\nimport {\n confirmDirectUpload,\n createDirectUploadFiles,\n updateUploadProgress,\n} from \"../lib/fileUpload.js\";\nimport {\n createTRPCRouter,\n protectedClassMemberProcedure,\n protectedProcedure,\n protectedTeacherProcedure,\n} from \"../trpc.js\";\nimport { z } from \"zod\";\nimport {\n getWorksheet,\n worksheetExists,\n listWorksheets,\n updateWorksheetRecord,\n deleteWorksheetRecord,\n createWorksheetRecord,\n duplicateWorksheetRecord,\n createWorksheetFromPdf,\n createWorksheetFromUploadedPdf,\n addQuestionToWorksheet,\n reorderWorksheetQuestions,\n updateWorksheetQuestionRecord,\n deleteWorksheetQuestionRecord,\n getWorksheetSubmission,\n answerWorksheetQuestion,\n cancelGrading,\n regradeQuestion,\n gradeAnswer,\n addCommentToResponse,\n} from \"../services/worksheet.js\";\n\nconst directFileSchema = z.object({\n name: z.string(),\n type: z.string(),\n size: z.number(),\n});\n\nconst pdfFileSchema = directFileSchema.superRefine((file, ctx) => {\n const isPdf =\n file.type === \"application/pdf\" && file.name.toLowerCase().endsWith(\".pdf\");\n if (!isPdf) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Only PDF files are supported\",\n });\n }\n});\n\nconst getWorksheetUploadUrlsSchema = z.object({\n classId: z.string(),\n files: z.array(pdfFileSchema),\n});\n\nconst confirmWorksheetUploadSchema = z.object({\n classId: z.string(),\n fileId: z.string(),\n uploadSuccess: z.boolean(),\n errorMessage: z.string().optional(),\n});\n\nconst updateUploadProgressSchema = z.object({\n fileId: z.string(),\n progress: z.number().min(0).max(100),\n});\n\nexport const worksheetRouter = createTRPCRouter({\n getWorksheet: protectedProcedure\n .input(z.object({ worksheetId: z.string() }))\n .query(({ ctx, input }) => getWorksheet(input.worksheetId, ctx.user!.id)),\n\n exists: protectedClassMemberProcedure\n .input(z.object({ id: z.string() }))\n .query(async ({ ctx, input }) => {\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"User must be authenticated\",\n });\n }\n return worksheetExists(input.id);\n }),\n\n listWorksheets: protectedClassMemberProcedure\n .input(z.object({ classId: z.string() }))\n .query(({ input }) => listWorksheets(input.classId)),\n\n updateWorksheet: protectedProcedure\n .input(z.object({ worksheetId: z.string(), name: z.string().optional() }))\n .mutation(({ ctx, input }) =>\n updateWorksheetRecord(input.worksheetId, ctx.user!.id, {\n name: input.name,\n })\n ),\n\n deleteWorksheet: protectedProcedure\n .input(z.object({ worksheetId: z.string() }))\n .mutation(({ ctx, input }) =>\n deleteWorksheetRecord(input.worksheetId, ctx.user!.id)\n ),\n\n create: protectedTeacherProcedure\n .input(z.object({ classId: z.string(), name: z.string() }))\n .mutation(({ input }) =>\n createWorksheetRecord(input.classId, input.name)\n ),\n\n duplicateWorksheet: protectedTeacherProcedure\n .input(\n z.object({\n classId: z.string(),\n name: z.string(),\n worksheetId: z.string(),\n })\n )\n .mutation(({ ctx, input }) =>\n duplicateWorksheetRecord(\n input.worksheetId,\n input.classId,\n input.name,\n ctx.user!.id\n )\n ),\n\n createFromPdf: protectedTeacherProcedure\n .input(z.object({ classId: z.string(), url: z.string().url() }))\n .mutation(({ input }) => createWorksheetFromPdf(input.classId, input.url)),\n\n getWorksheetUploadUrls: protectedTeacherProcedure\n .input(getWorksheetUploadUrlsSchema)\n .mutation(async ({ ctx, input }) => {\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"You must be logged in to upload files\",\n });\n }\n\n const uploadFiles = await createDirectUploadFiles(\n input.files,\n ctx.user.id\n );\n\n return {\n success: true,\n uploadFiles,\n };\n }),\n\n confirmWorksheetUpload: protectedTeacherProcedure\n .input(confirmWorksheetUploadSchema)\n .mutation(async ({ ctx, input }) => {\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"You must be logged in\",\n });\n }\n\n const file = await prisma.file.findFirst({\n where: {\n id: input.fileId,\n userId: ctx.user.id,\n },\n });\n\n if (!file) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"File not found or you don't have permission\",\n });\n }\n\n await confirmDirectUpload(\n input.fileId,\n input.uploadSuccess,\n input.errorMessage\n );\n\n return {\n success: true,\n message: input.uploadSuccess\n ? \"Upload confirmed successfully\"\n : \"Upload failed\",\n };\n }),\n\n createFromUploadedPdf: protectedTeacherProcedure\n .input(z.object({ classId: z.string(), fileId: z.string() }))\n .mutation(({ ctx, input }) =>\n createWorksheetFromUploadedPdf(input.classId, input.fileId, ctx.user!.id)\n ),\n\n addQuestion: protectedProcedure\n .input(\n z.object({\n worksheetId: z.string(),\n question: z.string(),\n answer: z.string(),\n points: z.number().optional(),\n options: z.any().optional(),\n markScheme: z.any().optional(),\n type: z.enum([\n \"MULTIPLE_CHOICE\",\n \"TRUE_FALSE\",\n \"SHORT_ANSWER\",\n \"LONG_ANSWER\",\n \"MATH_EXPRESSION\",\n \"ESSAY\",\n ]),\n })\n )\n .mutation(({ ctx, input }) =>\n addQuestionToWorksheet(input.worksheetId, ctx.user!.id, {\n question: input.question,\n answer: input.answer,\n points: input.points,\n options: input.options,\n markScheme: input.markScheme,\n type: input.type,\n })\n ),\n\n reorderQuestions: protectedProcedure\n .input(\n z.object({\n worksheetId: z.string(),\n movedId: z.string(),\n position: z.enum([\"before\", \"after\"]),\n targetId: z.string(),\n })\n )\n .mutation(({ ctx, input }) =>\n reorderWorksheetQuestions(\n input.worksheetId,\n ctx.user!.id,\n input.movedId,\n input.position,\n input.targetId\n )\n ),\n\n updateQuestion: protectedProcedure\n .input(\n z.object({\n worksheetId: z.string(),\n questionId: z.string(),\n question: z.string().optional(),\n answer: z.string().optional(),\n points: z.number().optional(),\n options: z.any().optional(),\n markScheme: z.any().optional(),\n type: z\n .enum([\n \"MULTIPLE_CHOICE\",\n \"TRUE_FALSE\",\n \"SHORT_ANSWER\",\n \"LONG_ANSWER\",\n \"MATH_EXPRESSION\",\n \"ESSAY\",\n ])\n .optional(),\n })\n )\n .mutation(({ ctx, input }) =>\n updateWorksheetQuestionRecord(\n input.worksheetId,\n input.questionId,\n ctx.user!.id,\n {\n question: input.question,\n answer: input.answer,\n points: input.points,\n options: input.options,\n markScheme: input.markScheme,\n type: input.type,\n }\n )\n ),\n\n deleteQuestion: protectedProcedure\n .input(\n z.object({\n worksheetId: z.string(),\n questionId: z.string(),\n })\n )\n .mutation(({ ctx, input }) =>\n deleteWorksheetQuestionRecord(\n input.worksheetId,\n input.questionId,\n ctx.user!.id\n )\n ),\n\n getWorksheetSubmission: protectedProcedure\n .input(\n z.object({\n worksheetId: z.string(),\n submissionId: z.string(),\n })\n )\n .query(({ ctx, input }) =>\n getWorksheetSubmission(input.worksheetId, input.submissionId, ctx.user!.id)\n ),\n\n answerQuestion: protectedProcedure\n .input(\n z.object({\n worksheetResponseId: z.string(),\n questionId: z.string(),\n response: z.string(),\n })\n )\n .mutation(({ ctx, input }) =>\n answerWorksheetQuestion(\n input.worksheetResponseId,\n input.questionId,\n input.response,\n ctx.user!.id\n )\n ),\n\n cancelGrading: protectedProcedure\n .input(\n z.object({\n worksheetResponseId: z.string(),\n progressId: z.string(),\n })\n )\n .mutation(({ ctx, input }) =>\n cancelGrading(input.worksheetResponseId, input.progressId, ctx.user!.id)\n ),\n\n regradeQuestion: protectedProcedure\n .input(\n z.object({\n worksheetResponseId: z.string(),\n progressId: z.string(),\n })\n )\n .mutation(({ ctx, input }) =>\n regradeQuestion(input.worksheetResponseId, input.progressId, ctx.user!.id)\n ),\n\n gradeAnswer: protectedProcedure\n .input(\n z.object({\n questionId: z.string(),\n responseId: z.string().optional(),\n studentWorksheetResponseId: z.string(),\n response: z.string().optional(),\n isCorrect: z.boolean(),\n feedback: z.string().optional(),\n markschemeState: z.any().optional(),\n points: z.number().optional(),\n })\n )\n .mutation(({ ctx, input }) =>\n gradeAnswer(\n input.questionId,\n input.studentWorksheetResponseId,\n ctx.user!.id,\n {\n responseId: input.responseId,\n response: input.response,\n isCorrect: input.isCorrect,\n feedback: input.feedback,\n markschemeState: input.markschemeState,\n points: input.points,\n }\n )\n ),\n\n addComment: protectedProcedure\n .input(\n z.object({\n responseId: z.string(),\n comment: z.string(),\n })\n )\n .mutation(({ ctx, input }) =>\n addCommentToResponse(\n input.responseId,\n input.comment,\n ctx.user!.id\n )\n ),\n\n updateUploadProgress: protectedProcedure\n .input(updateUploadProgressSchema)\n .mutation(async ({ ctx, input }) => {\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"You must be logged in\",\n });\n }\n\n const file = await prisma.file.findFirst({\n where: {\n id: input.fileId,\n userId: ctx.user.id,\n },\n });\n\n if (!file) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"File not found or you don't have permission\",\n });\n }\n\n await updateUploadProgress(input.fileId, input.progress);\n\n return {\n success: true,\n progress: input.progress,\n };\n }),\n});\n"],"names":[],"mappings":"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","debug_id":"48eee8c6-e5af-5f3e-b8a3-cdffb17d292a"}
|
|
@@ -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":"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","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"}
|