@studious-lms/server 1.4.6 → 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.
Files changed (148) hide show
  1. package/dist/models/access.d.ts +112 -0
  2. package/dist/models/access.d.ts.map +1 -0
  3. package/dist/models/access.js +49 -0
  4. package/dist/models/access.js.map +1 -0
  5. package/dist/models/announcement.d.ts +17 -2
  6. package/dist/models/announcement.d.ts.map +1 -1
  7. package/dist/models/announcement.js +21 -4
  8. package/dist/models/announcement.js.map +1 -1
  9. package/dist/models/assignment.d.ts +37 -37
  10. package/dist/models/assignment.d.ts.map +1 -1
  11. package/dist/models/assignment.js +15 -15
  12. package/dist/models/assignment.js.map +1 -1
  13. package/dist/models/attendance.d.ts +1 -1
  14. package/dist/models/attendance.d.ts.map +1 -1
  15. package/dist/models/attendance.js +6 -5
  16. package/dist/models/attendance.js.map +1 -1
  17. package/dist/models/auth.d.ts +5 -5
  18. package/dist/models/auth.d.ts.map +1 -1
  19. package/dist/models/auth.js +7 -11
  20. package/dist/models/auth.js.map +1 -1
  21. package/dist/models/class.d.ts +26 -26
  22. package/dist/models/class.d.ts.map +1 -1
  23. package/dist/models/class.js +7 -11
  24. package/dist/models/class.js.map +1 -1
  25. package/dist/models/comment.d.ts +134 -70
  26. package/dist/models/comment.d.ts.map +1 -1
  27. package/dist/models/comment.js +30 -42
  28. package/dist/models/comment.js.map +1 -1
  29. package/dist/models/conversation.d.ts +7 -7
  30. package/dist/models/event.d.ts +52 -3
  31. package/dist/models/event.d.ts.map +1 -1
  32. package/dist/models/event.js +56 -6
  33. package/dist/models/event.js.map +1 -1
  34. package/dist/models/file.d.ts +178 -103
  35. package/dist/models/file.d.ts.map +1 -1
  36. package/dist/models/file.js +54 -14
  37. package/dist/models/file.js.map +1 -1
  38. package/dist/models/folder.d.ts +22 -22
  39. package/dist/models/folder.d.ts.map +1 -1
  40. package/dist/models/folder.js +5 -4
  41. package/dist/models/folder.js.map +1 -1
  42. package/dist/models/labChat.d.ts +20 -20
  43. package/dist/models/labChat.d.ts.map +1 -1
  44. package/dist/models/labChat.js +8 -10
  45. package/dist/models/labChat.js.map +1 -1
  46. package/dist/models/marketing.d.ts +1 -1
  47. package/dist/models/message.d.ts +6 -6
  48. package/dist/models/newtonChat.d.ts +5 -5
  49. package/dist/models/school.d.ts +361 -0
  50. package/dist/models/school.d.ts.map +1 -0
  51. package/dist/models/school.js +314 -0
  52. package/dist/models/school.js.map +1 -0
  53. package/dist/models/section.d.ts +1 -1
  54. package/dist/models/section.d.ts.map +1 -1
  55. package/dist/models/section.js +5 -4
  56. package/dist/models/section.js.map +1 -1
  57. package/dist/models/user.d.ts +4 -4
  58. package/dist/models/worksheet.d.ts +65 -65
  59. package/dist/models/worksheet.d.ts.map +1 -1
  60. package/dist/models/worksheet.js +6 -14
  61. package/dist/models/worksheet.js.map +1 -1
  62. package/dist/pipelines/gradeWorksheet.d.ts +2 -2
  63. package/dist/pipelines/pdfToWorksheet.d.ts +1 -1
  64. package/dist/routers/_app.d.ts +2855 -2051
  65. package/dist/routers/_app.d.ts.map +1 -1
  66. package/dist/routers/_app.js +4 -2
  67. package/dist/routers/_app.js.map +1 -1
  68. package/dist/routers/announcement.d.ts +5 -5
  69. package/dist/routers/announcement.d.ts.map +1 -1
  70. package/dist/routers/announcement.js +25 -5
  71. package/dist/routers/announcement.js.map +1 -1
  72. package/dist/routers/assignment.d.ts +44 -44
  73. package/dist/routers/assignment.d.ts.map +1 -1
  74. package/dist/routers/assignment.js +24 -11
  75. package/dist/routers/assignment.js.map +1 -1
  76. package/dist/routers/class.d.ts +21 -20
  77. package/dist/routers/class.d.ts.map +1 -1
  78. package/dist/routers/class.js +3 -2
  79. package/dist/routers/class.js.map +1 -1
  80. package/dist/routers/comment.d.ts +5 -5
  81. package/dist/routers/conversation.d.ts +6 -6
  82. package/dist/routers/event.d.ts +21 -2
  83. package/dist/routers/event.d.ts.map +1 -1
  84. package/dist/routers/file.d.ts +2 -2
  85. package/dist/routers/folder.d.ts +24 -24
  86. package/dist/routers/labChat.d.ts +7 -7
  87. package/dist/routers/school.d.ts +384 -0
  88. package/dist/routers/school.d.ts.map +1 -0
  89. package/dist/routers/school.js +79 -0
  90. package/dist/routers/school.js.map +1 -0
  91. package/dist/routers/search.d.ts +1 -1
  92. package/dist/routers/worksheet.d.ts +21 -21
  93. package/dist/services/announcement.d.ts.map +1 -1
  94. package/dist/services/announcement.js +10 -6
  95. package/dist/services/announcement.js.map +1 -1
  96. package/dist/services/assignment.d.ts +36 -36
  97. package/dist/services/class.d.ts +20 -19
  98. package/dist/services/class.d.ts.map +1 -1
  99. package/dist/services/class.js +22 -3
  100. package/dist/services/class.js.map +1 -1
  101. package/dist/services/comment.d.ts +5 -5
  102. package/dist/services/comment.d.ts.map +1 -1
  103. package/dist/services/comment.js +8 -3
  104. package/dist/services/comment.js.map +1 -1
  105. package/dist/services/conversation.d.ts +6 -6
  106. package/dist/services/event.d.ts +21 -2
  107. package/dist/services/event.d.ts.map +1 -1
  108. package/dist/services/event.js +11 -7
  109. package/dist/services/event.js.map +1 -1
  110. package/dist/services/file.d.ts +2 -2
  111. package/dist/services/file.d.ts.map +1 -1
  112. package/dist/services/file.js +17 -8
  113. package/dist/services/file.js.map +1 -1
  114. package/dist/services/folder.d.ts +24 -24
  115. package/dist/services/labChat.d.ts +7 -7
  116. package/dist/services/school.d.ts +299 -0
  117. package/dist/services/school.d.ts.map +1 -0
  118. package/dist/services/school.js +225 -0
  119. package/dist/services/school.js.map +1 -0
  120. package/dist/services/worksheet.d.ts +21 -21
  121. package/package.json +1 -1
  122. package/prisma/migrations/20260504071500_school_memberships/migration.sql +81 -0
  123. package/prisma/schema.prisma +66 -2
  124. package/src/models/access.ts +48 -0
  125. package/src/models/announcement.ts +19 -2
  126. package/src/models/assignment.ts +17 -13
  127. package/src/models/attendance.ts +4 -3
  128. package/src/models/auth.ts +8 -9
  129. package/src/models/class.ts +8 -9
  130. package/src/models/comment.ts +29 -40
  131. package/src/models/event.ts +54 -4
  132. package/src/models/file.ts +53 -12
  133. package/src/models/folder.ts +3 -2
  134. package/src/models/labChat.ts +9 -8
  135. package/src/models/school.ts +361 -0
  136. package/src/models/section.ts +3 -2
  137. package/src/models/worksheet.ts +7 -12
  138. package/src/routers/_app.ts +2 -0
  139. package/src/routers/announcement.ts +30 -4
  140. package/src/routers/assignment.ts +27 -9
  141. package/src/routers/class.ts +1 -0
  142. package/src/routers/school.ts +122 -0
  143. package/src/services/announcement.ts +12 -4
  144. package/src/services/class.ts +25 -2
  145. package/src/services/comment.ts +10 -1
  146. package/src/services/event.ts +23 -6
  147. package/src/services/file.ts +20 -6
  148. package/src/services/school.ts +308 -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,10 +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
+ createdAt: Date;
413
414
  assignmentId: string | null;
414
415
  submissionId: string | null;
415
416
  announcementId: string | null;
416
- createdAt: Date;
417
417
  modifiedAt: Date | null;
418
418
  content: string;
419
419
  authorId: string;
@@ -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;;;;;;;;;;;;;;;;;;;;;;;;;;GAuHF;AAED,wBAAsB,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;;GAsBzF"}
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]="7b26ed1c-9d02-589d-b486-dc62ee96553c")}catch(e){}}();
5
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="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
- if (!isCreator && !isClassTeacher) {
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 or class teachers can update announcements",
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
- if (!isCreator && !isClassTeacher) {
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 or class teachers can delete announcements",
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=7b26ed1c-9d02-589d-b486-dc62ee96553c
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
- submissions: {
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
- createdAt: Date | null;
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;