@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.
- package/Dockerfile +5 -2
- package/dist/models/agenda.d.ts +6 -0
- package/dist/models/agenda.d.ts.map +1 -1
- package/dist/models/announcement.d.ts +2 -0
- package/dist/models/announcement.d.ts.map +1 -1
- package/dist/models/assignment.d.ts +27 -0
- package/dist/models/assignment.d.ts.map +1 -1
- package/dist/models/auth.d.ts +4 -0
- package/dist/models/auth.d.ts.map +1 -1
- package/dist/models/class.d.ts +14 -0
- package/dist/models/class.d.ts.map +1 -1
- package/dist/models/event.d.ts +11 -0
- package/dist/models/event.d.ts.map +1 -1
- package/dist/models/file.d.ts +19 -0
- package/dist/models/file.d.ts.map +1 -1
- package/dist/models/folder.d.ts +4 -0
- package/dist/models/folder.d.ts.map +1 -1
- package/dist/models/gradebook.d.ts +180 -0
- package/dist/models/gradebook.d.ts.map +1 -0
- package/dist/models/gradebook.js +88 -0
- package/dist/models/gradebook.js.map +1 -0
- package/dist/models/labChat.d.ts +4 -0
- package/dist/models/labChat.d.ts.map +1 -1
- package/dist/models/newtonChat.d.ts +2 -0
- package/dist/models/newtonChat.d.ts.map +1 -1
- package/dist/models/school.d.ts +2 -0
- package/dist/models/school.d.ts.map +1 -1
- package/dist/models/section.d.ts +3 -0
- package/dist/models/section.d.ts.map +1 -1
- package/dist/models/worksheet.d.ts +6 -0
- package/dist/models/worksheet.d.ts.map +1 -1
- package/dist/routers/_app.d.ts +1359 -37
- 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/admin.d.ts +164 -0
- package/dist/routers/admin.d.ts.map +1 -1
- package/dist/routers/admin.js +23 -4
- package/dist/routers/admin.js.map +1 -1
- package/dist/routers/agenda.d.ts +6 -0
- package/dist/routers/agenda.d.ts.map +1 -1
- package/dist/routers/assignment.d.ts +102 -1
- package/dist/routers/assignment.d.ts.map +1 -1
- package/dist/routers/assignment.js +180 -2
- package/dist/routers/assignment.js.map +1 -1
- package/dist/routers/class.d.ts +17 -0
- package/dist/routers/class.d.ts.map +1 -1
- package/dist/routers/event.d.ts +4 -0
- package/dist/routers/event.d.ts.map +1 -1
- package/dist/routers/file.d.ts +66 -0
- package/dist/routers/file.d.ts.map +1 -1
- package/dist/routers/file.js +111 -2
- package/dist/routers/file.js.map +1 -1
- package/dist/routers/gradebook.d.ts +299 -0
- package/dist/routers/gradebook.d.ts.map +1 -0
- package/dist/routers/gradebook.js +107 -0
- package/dist/routers/gradebook.js.map +1 -0
- package/dist/routers/school.d.ts +4 -0
- package/dist/routers/school.d.ts.map +1 -1
- package/dist/routers/section.d.ts +1 -1
- package/dist/routers/worksheet.d.ts +3 -1
- package/dist/routers/worksheet.d.ts.map +1 -1
- package/dist/services/adminInstitution.d.ts +51 -0
- package/dist/services/adminInstitution.d.ts.map +1 -1
- package/dist/services/adminInstitution.js +52 -2
- package/dist/services/adminInstitution.js.map +1 -1
- package/dist/services/adminMetrics.d.ts +17 -0
- package/dist/services/adminMetrics.d.ts.map +1 -0
- package/dist/services/adminMetrics.js +37 -0
- package/dist/services/adminMetrics.js.map +1 -0
- package/dist/services/adminRunJob.d.ts +9 -0
- package/dist/services/adminRunJob.d.ts.map +1 -1
- package/dist/services/adminRunJob.js +18 -2
- package/dist/services/adminRunJob.js.map +1 -1
- package/dist/services/adminUser.d.ts +67 -0
- package/dist/services/adminUser.d.ts.map +1 -0
- package/dist/services/adminUser.js +87 -0
- package/dist/services/adminUser.js.map +1 -0
- package/dist/services/agenda.d.ts +6 -0
- package/dist/services/agenda.d.ts.map +1 -1
- package/dist/services/assignment.d.ts +27 -0
- package/dist/services/assignment.d.ts.map +1 -1
- package/dist/services/class.d.ts +17 -0
- package/dist/services/class.d.ts.map +1 -1
- package/dist/services/event.d.ts +4 -0
- package/dist/services/event.d.ts.map +1 -1
- package/dist/services/gradeCalculation.d.ts +70 -0
- package/dist/services/gradeCalculation.d.ts.map +1 -0
- package/dist/services/gradeCalculation.js +148 -0
- package/dist/services/gradeCalculation.js.map +1 -0
- package/dist/services/gradebook.d.ts +197 -0
- package/dist/services/gradebook.d.ts.map +1 -0
- package/dist/services/gradebook.js +263 -0
- package/dist/services/gradebook.js.map +1 -0
- package/dist/services/school.d.ts +4 -0
- package/dist/services/school.d.ts.map +1 -1
- package/dist/services/worksheet.d.ts +2 -0
- package/dist/services/worksheet.d.ts.map +1 -1
- package/docker-entrypoint.sh +7 -0
- package/package.json +1 -1
- package/prisma/migrations/20260708011456_add_file_annotations/migration.sql +35 -0
- package/prisma/migrations/20260708011629_add_gradebook_categories_columns_policies/migration.sql +78 -0
- package/prisma/migrations/20260723142314_make_file_annotation_submission_optional/migration.sql +2 -0
- package/prisma/schema.prisma +130 -38
- package/src/models/gradebook.ts +91 -0
- package/src/routers/_app.ts +2 -0
- package/src/routers/admin.ts +28 -0
- package/src/routers/assignment.ts +204 -0
- package/src/routers/file.ts +128 -0
- package/src/routers/gradebook.ts +173 -0
- package/src/services/adminInstitution.ts +52 -0
- package/src/services/adminMetrics.ts +46 -0
- package/src/services/adminRunJob.ts +24 -0
- package/src/services/adminUser.ts +93 -0
- package/src/services/gradeCalculation.ts +253 -0
- package/src/services/gradebook.ts +383 -0
- 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;
|
|
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]="
|
|
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=
|
|
994
|
+
//# debugId=07b5401b-6117-521f-94c9-8e2f5fb68c0f
|