@studious-lms/server 1.20.0 → 1.22.0

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 (117) hide show
  1. package/Dockerfile +5 -2
  2. package/dist/models/agenda.d.ts +6 -0
  3. package/dist/models/agenda.d.ts.map +1 -1
  4. package/dist/models/announcement.d.ts +2 -0
  5. package/dist/models/announcement.d.ts.map +1 -1
  6. package/dist/models/assignment.d.ts +27 -0
  7. package/dist/models/assignment.d.ts.map +1 -1
  8. package/dist/models/auth.d.ts +4 -0
  9. package/dist/models/auth.d.ts.map +1 -1
  10. package/dist/models/class.d.ts +14 -0
  11. package/dist/models/class.d.ts.map +1 -1
  12. package/dist/models/event.d.ts +11 -0
  13. package/dist/models/event.d.ts.map +1 -1
  14. package/dist/models/file.d.ts +19 -0
  15. package/dist/models/file.d.ts.map +1 -1
  16. package/dist/models/folder.d.ts +4 -0
  17. package/dist/models/folder.d.ts.map +1 -1
  18. package/dist/models/gradebook.d.ts +180 -0
  19. package/dist/models/gradebook.d.ts.map +1 -0
  20. package/dist/models/gradebook.js +88 -0
  21. package/dist/models/gradebook.js.map +1 -0
  22. package/dist/models/labChat.d.ts +4 -0
  23. package/dist/models/labChat.d.ts.map +1 -1
  24. package/dist/models/newtonChat.d.ts +2 -0
  25. package/dist/models/newtonChat.d.ts.map +1 -1
  26. package/dist/models/school.d.ts +2 -0
  27. package/dist/models/school.d.ts.map +1 -1
  28. package/dist/models/section.d.ts +3 -0
  29. package/dist/models/section.d.ts.map +1 -1
  30. package/dist/models/worksheet.d.ts +6 -0
  31. package/dist/models/worksheet.d.ts.map +1 -1
  32. package/dist/routers/_app.d.ts +1359 -37
  33. package/dist/routers/_app.d.ts.map +1 -1
  34. package/dist/routers/_app.js +4 -2
  35. package/dist/routers/_app.js.map +1 -1
  36. package/dist/routers/admin.d.ts +164 -0
  37. package/dist/routers/admin.d.ts.map +1 -1
  38. package/dist/routers/admin.js +23 -4
  39. package/dist/routers/admin.js.map +1 -1
  40. package/dist/routers/agenda.d.ts +6 -0
  41. package/dist/routers/agenda.d.ts.map +1 -1
  42. package/dist/routers/assignment.d.ts +102 -1
  43. package/dist/routers/assignment.d.ts.map +1 -1
  44. package/dist/routers/assignment.js +180 -2
  45. package/dist/routers/assignment.js.map +1 -1
  46. package/dist/routers/class.d.ts +17 -0
  47. package/dist/routers/class.d.ts.map +1 -1
  48. package/dist/routers/event.d.ts +4 -0
  49. package/dist/routers/event.d.ts.map +1 -1
  50. package/dist/routers/file.d.ts +66 -0
  51. package/dist/routers/file.d.ts.map +1 -1
  52. package/dist/routers/file.js +111 -2
  53. package/dist/routers/file.js.map +1 -1
  54. package/dist/routers/gradebook.d.ts +299 -0
  55. package/dist/routers/gradebook.d.ts.map +1 -0
  56. package/dist/routers/gradebook.js +107 -0
  57. package/dist/routers/gradebook.js.map +1 -0
  58. package/dist/routers/school.d.ts +4 -0
  59. package/dist/routers/school.d.ts.map +1 -1
  60. package/dist/routers/section.d.ts +1 -1
  61. package/dist/routers/worksheet.d.ts +3 -1
  62. package/dist/routers/worksheet.d.ts.map +1 -1
  63. package/dist/services/adminInstitution.d.ts +51 -0
  64. package/dist/services/adminInstitution.d.ts.map +1 -1
  65. package/dist/services/adminInstitution.js +52 -2
  66. package/dist/services/adminInstitution.js.map +1 -1
  67. package/dist/services/adminMetrics.d.ts +17 -0
  68. package/dist/services/adminMetrics.d.ts.map +1 -0
  69. package/dist/services/adminMetrics.js +37 -0
  70. package/dist/services/adminMetrics.js.map +1 -0
  71. package/dist/services/adminRunJob.d.ts +9 -0
  72. package/dist/services/adminRunJob.d.ts.map +1 -1
  73. package/dist/services/adminRunJob.js +18 -2
  74. package/dist/services/adminRunJob.js.map +1 -1
  75. package/dist/services/adminUser.d.ts +67 -0
  76. package/dist/services/adminUser.d.ts.map +1 -0
  77. package/dist/services/adminUser.js +87 -0
  78. package/dist/services/adminUser.js.map +1 -0
  79. package/dist/services/agenda.d.ts +6 -0
  80. package/dist/services/agenda.d.ts.map +1 -1
  81. package/dist/services/assignment.d.ts +27 -0
  82. package/dist/services/assignment.d.ts.map +1 -1
  83. package/dist/services/class.d.ts +17 -0
  84. package/dist/services/class.d.ts.map +1 -1
  85. package/dist/services/event.d.ts +4 -0
  86. package/dist/services/event.d.ts.map +1 -1
  87. package/dist/services/gradeCalculation.d.ts +70 -0
  88. package/dist/services/gradeCalculation.d.ts.map +1 -0
  89. package/dist/services/gradeCalculation.js +148 -0
  90. package/dist/services/gradeCalculation.js.map +1 -0
  91. package/dist/services/gradebook.d.ts +197 -0
  92. package/dist/services/gradebook.d.ts.map +1 -0
  93. package/dist/services/gradebook.js +263 -0
  94. package/dist/services/gradebook.js.map +1 -0
  95. package/dist/services/school.d.ts +4 -0
  96. package/dist/services/school.d.ts.map +1 -1
  97. package/dist/services/worksheet.d.ts +2 -0
  98. package/dist/services/worksheet.d.ts.map +1 -1
  99. package/docker-entrypoint.sh +7 -0
  100. package/package.json +1 -1
  101. package/prisma/migrations/20260708011456_add_file_annotations/migration.sql +35 -0
  102. package/prisma/migrations/20260708011629_add_gradebook_categories_columns_policies/migration.sql +78 -0
  103. package/prisma/migrations/20260723142314_make_file_annotation_submission_optional/migration.sql +2 -0
  104. package/prisma/schema.prisma +130 -38
  105. package/src/models/gradebook.ts +91 -0
  106. package/src/routers/_app.ts +2 -0
  107. package/src/routers/admin.ts +28 -0
  108. package/src/routers/assignment.ts +204 -0
  109. package/src/routers/file.ts +128 -0
  110. package/src/routers/gradebook.ts +173 -0
  111. package/src/services/adminInstitution.ts +52 -0
  112. package/src/services/adminMetrics.ts +46 -0
  113. package/src/services/adminRunJob.ts +24 -0
  114. package/src/services/adminUser.ts +93 -0
  115. package/src/services/gradeCalculation.ts +253 -0
  116. package/src/services/gradebook.ts +383 -0
  117. package/tests/unit/services/gradeCalculation.test.ts +206 -0
@@ -21,8 +21,8 @@ export declare const assignmentRouter: import("@trpc/server").TRPCBuiltRouter<{
21
21
  input: {
22
22
  [x: string]: unknown;
23
23
  classId: string;
24
- movedId: string;
25
24
  position: "end" | "start" | "before" | "after";
25
+ movedId: string;
26
26
  targetId?: string | undefined;
27
27
  };
28
28
  output: {
@@ -50,6 +50,7 @@ export declare const assignmentRouter: import("@trpc/server").TRPCBuiltRouter<{
50
50
  markSchemeId: string | null;
51
51
  order: number | null;
52
52
  gradingBoundaryId: string | null;
53
+ gradeCategoryId: string | null;
53
54
  } | null;
54
55
  meta: object;
55
56
  }>;
@@ -94,6 +95,7 @@ export declare const assignmentRouter: import("@trpc/server").TRPCBuiltRouter<{
94
95
  markSchemeId: string | null;
95
96
  order: number | null;
96
97
  gradingBoundaryId: string | null;
98
+ gradeCategoryId: string | null;
97
99
  } | null;
98
100
  meta: object;
99
101
  }>;
@@ -189,6 +191,7 @@ export declare const assignmentRouter: import("@trpc/server").TRPCBuiltRouter<{
189
191
  markSchemeId: string | null;
190
192
  order: number | null;
191
193
  gradingBoundaryId: string | null;
194
+ gradeCategoryId: string | null;
192
195
  };
193
196
  meta: object;
194
197
  }>;
@@ -236,6 +239,8 @@ export declare const assignmentRouter: import("@trpc/server").TRPCBuiltRouter<{
236
239
  discussionsEnabled: boolean;
237
240
  studentsCanCreateDiscussions: boolean;
238
241
  studentsCanReply: boolean;
242
+ treatMissingAsZero: boolean;
243
+ gradeRoundingMode: import(".prisma/client").$Enums.GradeRoundingMode;
239
244
  };
240
245
  section: {
241
246
  id: string;
@@ -404,6 +409,7 @@ export declare const assignmentRouter: import("@trpc/server").TRPCBuiltRouter<{
404
409
  markSchemeId: string | null;
405
410
  order: number | null;
406
411
  gradingBoundaryId: string | null;
412
+ gradeCategoryId: string | null;
407
413
  };
408
414
  meta: object;
409
415
  }>;
@@ -429,6 +435,8 @@ export declare const assignmentRouter: import("@trpc/server").TRPCBuiltRouter<{
429
435
  discussionsEnabled: boolean;
430
436
  studentsCanCreateDiscussions: boolean;
431
437
  studentsCanReply: boolean;
438
+ treatMissingAsZero: boolean;
439
+ gradeRoundingMode: import(".prisma/client").$Enums.GradeRoundingMode;
432
440
  };
433
441
  markScheme: {
434
442
  id: string;
@@ -467,6 +475,7 @@ export declare const assignmentRouter: import("@trpc/server").TRPCBuiltRouter<{
467
475
  markSchemeId: string | null;
468
476
  order: number | null;
469
477
  gradingBoundaryId: string | null;
478
+ gradeCategoryId: string | null;
470
479
  };
471
480
  attachments: {
472
481
  path: string;
@@ -572,6 +581,8 @@ export declare const assignmentRouter: import("@trpc/server").TRPCBuiltRouter<{
572
581
  discussionsEnabled: boolean;
573
582
  studentsCanCreateDiscussions: boolean;
574
583
  studentsCanReply: boolean;
584
+ treatMissingAsZero: boolean;
585
+ gradeRoundingMode: import(".prisma/client").$Enums.GradeRoundingMode;
575
586
  };
576
587
  markScheme: {
577
588
  id: string;
@@ -610,6 +621,7 @@ export declare const assignmentRouter: import("@trpc/server").TRPCBuiltRouter<{
610
621
  markSchemeId: string | null;
611
622
  order: number | null;
612
623
  gradingBoundaryId: string | null;
624
+ gradeCategoryId: string | null;
613
625
  };
614
626
  attachments: {
615
627
  path: string;
@@ -736,6 +748,8 @@ export declare const assignmentRouter: import("@trpc/server").TRPCBuiltRouter<{
736
748
  discussionsEnabled: boolean;
737
749
  studentsCanCreateDiscussions: boolean;
738
750
  studentsCanReply: boolean;
751
+ treatMissingAsZero: boolean;
752
+ gradeRoundingMode: import(".prisma/client").$Enums.GradeRoundingMode;
739
753
  };
740
754
  markScheme: {
741
755
  id: string;
@@ -770,6 +784,7 @@ export declare const assignmentRouter: import("@trpc/server").TRPCBuiltRouter<{
770
784
  markSchemeId: string | null;
771
785
  order: number | null;
772
786
  gradingBoundaryId: string | null;
787
+ gradeCategoryId: string | null;
773
788
  };
774
789
  attachments: {
775
790
  path: string;
@@ -846,6 +861,8 @@ export declare const assignmentRouter: import("@trpc/server").TRPCBuiltRouter<{
846
861
  discussionsEnabled: boolean;
847
862
  studentsCanCreateDiscussions: boolean;
848
863
  studentsCanReply: boolean;
864
+ treatMissingAsZero: boolean;
865
+ gradeRoundingMode: import(".prisma/client").$Enums.GradeRoundingMode;
849
866
  };
850
867
  markScheme: {
851
868
  id: string;
@@ -880,6 +897,7 @@ export declare const assignmentRouter: import("@trpc/server").TRPCBuiltRouter<{
880
897
  markSchemeId: string | null;
881
898
  order: number | null;
882
899
  gradingBoundaryId: string | null;
900
+ gradeCategoryId: string | null;
883
901
  };
884
902
  attachments: ({
885
903
  thumbnail: {
@@ -1237,6 +1255,8 @@ export declare const assignmentRouter: import("@trpc/server").TRPCBuiltRouter<{
1237
1255
  discussionsEnabled: boolean;
1238
1256
  studentsCanCreateDiscussions: boolean;
1239
1257
  studentsCanReply: boolean;
1258
+ treatMissingAsZero: boolean;
1259
+ gradeRoundingMode: import(".prisma/client").$Enums.GradeRoundingMode;
1240
1260
  };
1241
1261
  markScheme: {
1242
1262
  id: string;
@@ -1271,6 +1291,7 @@ export declare const assignmentRouter: import("@trpc/server").TRPCBuiltRouter<{
1271
1291
  markSchemeId: string | null;
1272
1292
  order: number | null;
1273
1293
  gradingBoundaryId: string | null;
1294
+ gradeCategoryId: string | null;
1274
1295
  };
1275
1296
  attachments: ({
1276
1297
  thumbnail: {
@@ -1476,6 +1497,7 @@ export declare const assignmentRouter: import("@trpc/server").TRPCBuiltRouter<{
1476
1497
  markSchemeId: string | null;
1477
1498
  order: number | null;
1478
1499
  gradingBoundaryId: string | null;
1500
+ gradeCategoryId: string | null;
1479
1501
  };
1480
1502
  };
1481
1503
  meta: object;
@@ -1533,6 +1555,7 @@ export declare const assignmentRouter: import("@trpc/server").TRPCBuiltRouter<{
1533
1555
  markSchemeId: string | null;
1534
1556
  order: number | null;
1535
1557
  gradingBoundaryId: string | null;
1558
+ gradeCategoryId: string | null;
1536
1559
  };
1537
1560
  };
1538
1561
  meta: object;
@@ -1670,6 +1693,7 @@ export declare const assignmentRouter: import("@trpc/server").TRPCBuiltRouter<{
1670
1693
  markSchemeId: string | null;
1671
1694
  order: number | null;
1672
1695
  gradingBoundaryId: string | null;
1696
+ gradeCategoryId: string | null;
1673
1697
  };
1674
1698
  meta: object;
1675
1699
  }>;
@@ -1770,6 +1794,7 @@ export declare const assignmentRouter: import("@trpc/server").TRPCBuiltRouter<{
1770
1794
  markSchemeId: string | null;
1771
1795
  order: number | null;
1772
1796
  gradingBoundaryId: string | null;
1797
+ gradeCategoryId: string | null;
1773
1798
  };
1774
1799
  meta: object;
1775
1800
  }>;
@@ -1871,6 +1896,7 @@ export declare const assignmentRouter: import("@trpc/server").TRPCBuiltRouter<{
1871
1896
  markSchemeId: string | null;
1872
1897
  order: number | null;
1873
1898
  gradingBoundaryId: string | null;
1899
+ gradeCategoryId: string | null;
1874
1900
  };
1875
1901
  meta: object;
1876
1902
  }>;
@@ -1971,6 +1997,7 @@ export declare const assignmentRouter: import("@trpc/server").TRPCBuiltRouter<{
1971
1997
  markSchemeId: string | null;
1972
1998
  order: number | null;
1973
1999
  gradingBoundaryId: string | null;
2000
+ gradeCategoryId: string | null;
1974
2001
  };
1975
2002
  meta: object;
1976
2003
  }>;
@@ -2067,6 +2094,80 @@ export declare const assignmentRouter: import("@trpc/server").TRPCBuiltRouter<{
2067
2094
  };
2068
2095
  meta: object;
2069
2096
  }>;
2097
+ listFileAnnotations: import("@trpc/server").TRPCQueryProcedure<{
2098
+ input: {
2099
+ [x: string]: unknown;
2100
+ classId: string;
2101
+ submissionId: string;
2102
+ fileId: string;
2103
+ };
2104
+ output: {
2105
+ annotations: ({
2106
+ author: {
2107
+ id: string;
2108
+ username: string;
2109
+ profile: {
2110
+ displayName: string | null;
2111
+ } | null;
2112
+ };
2113
+ } & {
2114
+ type: import(".prisma/client").$Enums.FileAnnotationType;
2115
+ id: string;
2116
+ createdAt: Date;
2117
+ updatedAt: Date;
2118
+ color: string | null;
2119
+ submissionId: string | null;
2120
+ text: string | null;
2121
+ authorId: string;
2122
+ fileId: string;
2123
+ page: number;
2124
+ geometry: import("@prisma/client/runtime/library.js").JsonValue;
2125
+ })[];
2126
+ };
2127
+ meta: object;
2128
+ }>;
2129
+ upsertFileAnnotation: import("@trpc/server").TRPCMutationProcedure<{
2130
+ input: {
2131
+ [x: string]: unknown;
2132
+ classId: string;
2133
+ type: "HIGHLIGHT" | "INK" | "COMMENT" | "TEXT";
2134
+ submissionId: string;
2135
+ fileId: string;
2136
+ page: number;
2137
+ geometry: Record<string, unknown>;
2138
+ id?: string | undefined;
2139
+ color?: string | undefined;
2140
+ text?: string | undefined;
2141
+ };
2142
+ output: {
2143
+ annotation: {
2144
+ type: import(".prisma/client").$Enums.FileAnnotationType;
2145
+ id: string;
2146
+ createdAt: Date;
2147
+ updatedAt: Date;
2148
+ color: string | null;
2149
+ submissionId: string | null;
2150
+ text: string | null;
2151
+ authorId: string;
2152
+ fileId: string;
2153
+ page: number;
2154
+ geometry: import("@prisma/client/runtime/library.js").JsonValue;
2155
+ };
2156
+ };
2157
+ meta: object;
2158
+ }>;
2159
+ deleteFileAnnotation: import("@trpc/server").TRPCMutationProcedure<{
2160
+ input: {
2161
+ [x: string]: unknown;
2162
+ classId: string;
2163
+ id: string;
2164
+ submissionId: string;
2165
+ };
2166
+ output: {
2167
+ success: boolean;
2168
+ };
2169
+ meta: object;
2170
+ }>;
2070
2171
  updateUploadProgress: import("@trpc/server").TRPCMutationProcedure<{
2071
2172
  input: {
2072
2173
  progress: number;
@@ -1 +1 @@
1
- {"version":3,"file":"assignment.d.ts","sourceRoot":"/","sources":["routers/assignment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAA2B,KAAK,gBAAgB,EAAgE,MAAM,sBAAsB,CAAC;AAmPpJ,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmvB3B,CAAC"}
1
+ {"version":3,"file":"assignment.d.ts","sourceRoot":"/","sources":["routers/assignment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAA2B,KAAK,gBAAgB,EAAgE,MAAM,sBAAsB,CAAC;AA2QpJ,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAu6B3B,CAAC"}
@@ -1,5 +1,5 @@
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]="b92b663a-ff21-5fa5-be25-e670a06c81a9")}catch(e){}}();
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]="07b5401b-6117-521f-94c9-8e2f5fb68c0f")}catch(e){}}();
3
3
  import { z } from "zod";
4
4
  import { createTRPCRouter, protectedProcedure, protectedClassMemberProcedure, protectedTeacherProcedure } from "../trpc.js";
5
5
  import { TRPCError } from "@trpc/server";
@@ -135,6 +135,27 @@ const confirmAnnotationUploadSchema = z.object({
135
135
  uploadSuccess: z.boolean(),
136
136
  errorMessage: z.string().optional(),
137
137
  });
138
+ const listFileAnnotationsSchema = z.object({
139
+ classId: z.string(),
140
+ submissionId: z.string(),
141
+ fileId: z.string(),
142
+ });
143
+ const upsertFileAnnotationSchema = z.object({
144
+ classId: z.string(),
145
+ submissionId: z.string(),
146
+ fileId: z.string(),
147
+ id: z.string().optional(),
148
+ page: z.number().int().min(1),
149
+ type: z.enum(["HIGHLIGHT", "INK", "COMMENT", "TEXT"]),
150
+ geometry: z.record(z.string(), z.unknown()),
151
+ text: z.string().optional(),
152
+ color: z.string().optional(),
153
+ });
154
+ const deleteFileAnnotationSchema = z.object({
155
+ classId: z.string(),
156
+ submissionId: z.string(),
157
+ id: z.string(),
158
+ });
138
159
  const updateUploadProgressSchema = z.object({
139
160
  fileId: z.string(),
140
161
  progress: z.number().min(0).max(100),
@@ -782,6 +803,163 @@ export const assignmentRouter = createTRPCRouter({
782
803
  message: uploadSuccess ? "Annotation upload confirmed successfully" : "Annotation upload failed",
783
804
  };
784
805
  }),
806
+ listFileAnnotations: protectedClassMemberProcedure
807
+ .input(listFileAnnotationsSchema)
808
+ .query(async ({ ctx, input }) => {
809
+ const { classId, submissionId, fileId } = input;
810
+ const submission = await prisma.submission.findFirst({
811
+ where: {
812
+ id: submissionId,
813
+ assignment: { classId },
814
+ },
815
+ select: {
816
+ id: true,
817
+ studentId: true,
818
+ returned: true,
819
+ assignment: {
820
+ select: {
821
+ class: {
822
+ select: {
823
+ teachers: { where: { id: ctx.user.id }, select: { id: true } },
824
+ },
825
+ },
826
+ },
827
+ },
828
+ },
829
+ });
830
+ if (!submission) {
831
+ throw new TRPCError({
832
+ code: "NOT_FOUND",
833
+ message: "Submission not found",
834
+ });
835
+ }
836
+ const isTeacher = submission.assignment.class.teachers.length > 0;
837
+ const isOwningStudent = submission.studentId === ctx.user.id;
838
+ if (!isTeacher && !(isOwningStudent && submission.returned)) {
839
+ throw new TRPCError({
840
+ code: "FORBIDDEN",
841
+ message: "You don't have access to these annotations",
842
+ });
843
+ }
844
+ const annotations = await prisma.fileAnnotation.findMany({
845
+ where: { submissionId, fileId },
846
+ orderBy: { createdAt: "asc" },
847
+ include: {
848
+ author: {
849
+ select: {
850
+ id: true,
851
+ username: true,
852
+ profile: { select: { displayName: true } },
853
+ },
854
+ },
855
+ },
856
+ });
857
+ return { annotations };
858
+ }),
859
+ upsertFileAnnotation: protectedTeacherProcedure
860
+ .input(upsertFileAnnotationSchema)
861
+ .mutation(async ({ ctx, input }) => {
862
+ const { classId, submissionId, fileId, id, page, type, geometry, text, color } = input;
863
+ const submission = await prisma.submission.findFirst({
864
+ where: {
865
+ id: submissionId,
866
+ assignment: {
867
+ classId,
868
+ class: {
869
+ teachers: {
870
+ some: { id: ctx.user.id },
871
+ },
872
+ },
873
+ },
874
+ },
875
+ select: { id: true },
876
+ });
877
+ if (!submission) {
878
+ throw new TRPCError({
879
+ code: "NOT_FOUND",
880
+ message: "Submission not found or you are not a teacher of this class",
881
+ });
882
+ }
883
+ const file = await prisma.file.findFirst({
884
+ where: {
885
+ id: fileId,
886
+ OR: [{ submissionId }, { annotationId: submissionId }],
887
+ },
888
+ select: { id: true },
889
+ });
890
+ if (!file) {
891
+ throw new TRPCError({
892
+ code: "NOT_FOUND",
893
+ message: "File does not belong to this submission",
894
+ });
895
+ }
896
+ if (id) {
897
+ const existing = await prisma.fileAnnotation.findFirst({
898
+ where: { id, submissionId, fileId },
899
+ select: { id: true },
900
+ });
901
+ if (!existing) {
902
+ throw new TRPCError({
903
+ code: "NOT_FOUND",
904
+ message: "Annotation not found",
905
+ });
906
+ }
907
+ const annotation = await prisma.fileAnnotation.update({
908
+ where: { id },
909
+ data: {
910
+ page,
911
+ type,
912
+ geometry: geometry,
913
+ text: text ?? null,
914
+ color: color ?? null,
915
+ },
916
+ });
917
+ return { annotation };
918
+ }
919
+ const annotation = await prisma.fileAnnotation.create({
920
+ data: {
921
+ fileId,
922
+ submissionId,
923
+ authorId: ctx.user.id,
924
+ page,
925
+ type,
926
+ geometry: geometry,
927
+ text: text ?? null,
928
+ color: color ?? null,
929
+ },
930
+ });
931
+ return { annotation };
932
+ }),
933
+ deleteFileAnnotation: protectedTeacherProcedure
934
+ .input(deleteFileAnnotationSchema)
935
+ .mutation(async ({ ctx, input }) => {
936
+ const { classId, submissionId, id } = input;
937
+ const annotation = await prisma.fileAnnotation.findFirst({
938
+ where: {
939
+ id,
940
+ submissionId,
941
+ submission: {
942
+ assignment: {
943
+ classId,
944
+ class: {
945
+ teachers: {
946
+ some: { id: ctx.user.id },
947
+ },
948
+ },
949
+ },
950
+ },
951
+ },
952
+ select: { id: true },
953
+ });
954
+ if (!annotation) {
955
+ throw new TRPCError({
956
+ code: "NOT_FOUND",
957
+ message: "Annotation not found or you are not a teacher of this class",
958
+ });
959
+ }
960
+ await prisma.fileAnnotation.delete({ where: { id } });
961
+ return { success: true };
962
+ }),
785
963
  updateUploadProgress: protectedProcedure
786
964
  .input(updateUploadProgressSchema)
787
965
  .mutation(async ({ ctx, input }) => {
@@ -813,4 +991,4 @@ export const assignmentRouter = createTRPCRouter({
813
991
  }),
814
992
  });
815
993
  //# sourceMappingURL=assignment.js.map
816
- //# debugId=b92b663a-ff21-5fa5-be25-e670a06c81a9
994
+ //# debugId=07b5401b-6117-521f-94c9-8e2f5fb68c0f