@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
@@ -0,0 +1,197 @@
1
+ /**
2
+ * Gradebook service – grade categories, custom columns/entries, class
3
+ * grade-calculation policies, the computed gradebook, and CSV export.
4
+ *
5
+ * All grade math lives in `gradeCalculation.ts` (pure, unit-tested); this
6
+ * service only assembles inputs and persists configuration.
7
+ */
8
+ import { GradeRoundingMode as PrismaGradeRoundingMode } from "@prisma/client";
9
+ import { type FinalGradeResult } from "./gradeCalculation.js";
10
+ export declare function listGradeCategories(classId: string): Promise<{
11
+ id: string;
12
+ name: string;
13
+ classId: string;
14
+ weight: number;
15
+ dropLowest: number;
16
+ position: number;
17
+ }[]>;
18
+ export declare function createGradeCategory(classId: string, data: {
19
+ name: string;
20
+ weight: number;
21
+ dropLowest?: number;
22
+ position?: number;
23
+ }): Promise<{
24
+ id: string;
25
+ name: string;
26
+ classId: string;
27
+ weight: number;
28
+ dropLowest: number;
29
+ position: number;
30
+ }>;
31
+ export declare function updateGradeCategory(categoryId: string, classId: string, data: {
32
+ name?: string;
33
+ weight?: number;
34
+ dropLowest?: number;
35
+ position?: number;
36
+ }): Promise<{
37
+ id: string;
38
+ name: string;
39
+ classId: string;
40
+ weight: number;
41
+ dropLowest: number;
42
+ position: number;
43
+ }>;
44
+ export declare function deleteGradeCategory(categoryId: string, classId: string): Promise<{
45
+ id: string;
46
+ name: string;
47
+ classId: string;
48
+ weight: number;
49
+ dropLowest: number;
50
+ position: number;
51
+ }>;
52
+ export declare function assignAssignmentCategory(classId: string, assignmentId: string, gradeCategoryId: string | null): Promise<{
53
+ type: import(".prisma/client").$Enums.AssignmentType;
54
+ id: string;
55
+ createdAt: Date | null;
56
+ classId: string;
57
+ title: string;
58
+ dueDate: Date;
59
+ maxGrade: number | null;
60
+ eventId: string | null;
61
+ instructions: string;
62
+ modifiedAt: Date | null;
63
+ teacherId: string;
64
+ acceptFiles: boolean;
65
+ acceptExtendedResponse: boolean;
66
+ acceptWorksheet: boolean;
67
+ gradeWithAI: boolean;
68
+ aiPolicyLevel: number;
69
+ sectionId: string | null;
70
+ graded: boolean;
71
+ weight: number;
72
+ inProgress: boolean;
73
+ template: boolean;
74
+ markSchemeId: string | null;
75
+ order: number | null;
76
+ gradingBoundaryId: string | null;
77
+ gradeCategoryId: string | null;
78
+ }>;
79
+ export declare function listCustomGradeColumns(classId: string): Promise<({
80
+ entries: {
81
+ id: string;
82
+ points: number;
83
+ studentId: string;
84
+ note: string | null;
85
+ }[];
86
+ } & {
87
+ id: string;
88
+ name: string;
89
+ classId: string;
90
+ gradeCategoryId: string | null;
91
+ position: number;
92
+ maxPoints: number;
93
+ })[]>;
94
+ export declare function createCustomGradeColumn(classId: string, data: {
95
+ name: string;
96
+ maxPoints: number;
97
+ gradeCategoryId?: string | null;
98
+ position?: number;
99
+ }): Promise<{
100
+ id: string;
101
+ name: string;
102
+ classId: string;
103
+ gradeCategoryId: string | null;
104
+ position: number;
105
+ maxPoints: number;
106
+ }>;
107
+ export declare function updateCustomGradeColumn(columnId: string, classId: string, data: {
108
+ name?: string;
109
+ maxPoints?: number;
110
+ gradeCategoryId?: string | null;
111
+ position?: number;
112
+ }): Promise<{
113
+ id: string;
114
+ name: string;
115
+ classId: string;
116
+ gradeCategoryId: string | null;
117
+ position: number;
118
+ maxPoints: number;
119
+ }>;
120
+ export declare function deleteCustomGradeColumn(columnId: string, classId: string): Promise<{
121
+ id: string;
122
+ name: string;
123
+ classId: string;
124
+ gradeCategoryId: string | null;
125
+ position: number;
126
+ maxPoints: number;
127
+ }>;
128
+ export declare function setCustomGradeEntry(classId: string, columnId: string, studentId: string, points: number | null, note?: string | null): Promise<{
129
+ id: string;
130
+ points: number;
131
+ studentId: string;
132
+ columnId: string;
133
+ note: string | null;
134
+ } | null>;
135
+ export declare function getGradePolicies(classId: string): Promise<{
136
+ id: string;
137
+ treatMissingAsZero: boolean;
138
+ gradeRoundingMode: import(".prisma/client").$Enums.GradeRoundingMode;
139
+ }>;
140
+ export declare function updateGradePolicies(classId: string, data: {
141
+ treatMissingAsZero?: boolean;
142
+ gradeRoundingMode?: PrismaGradeRoundingMode;
143
+ }): Promise<{
144
+ id: string;
145
+ treatMissingAsZero: boolean;
146
+ gradeRoundingMode: import(".prisma/client").$Enums.GradeRoundingMode;
147
+ }>;
148
+ export interface GradebookStudentRow {
149
+ studentId: string;
150
+ studentName: string;
151
+ assignmentScores: Record<string, number | null>;
152
+ customScores: Record<string, {
153
+ points: number | null;
154
+ note: string | null;
155
+ }>;
156
+ result: FinalGradeResult;
157
+ letterGrade: string | null;
158
+ }
159
+ export declare function getComputedGradebook(classId: string, userId: string): Promise<{
160
+ policies: {
161
+ treatMissingAsZero: boolean;
162
+ roundingMode: import(".prisma/client").$Enums.GradeRoundingMode;
163
+ };
164
+ categories: {
165
+ id: string;
166
+ name: string;
167
+ classId: string;
168
+ weight: number;
169
+ dropLowest: number;
170
+ position: number;
171
+ }[];
172
+ assignments: {
173
+ id: string;
174
+ title: string;
175
+ maxGrade: number | null;
176
+ weight: number;
177
+ gradeCategoryId: string | null;
178
+ dueDate: Date;
179
+ }[];
180
+ customColumns: {
181
+ id: string;
182
+ name: string;
183
+ maxPoints: number;
184
+ gradeCategoryId: string | null;
185
+ position: number;
186
+ }[];
187
+ gradingBoundary: {
188
+ id: string;
189
+ name: string | null;
190
+ structured: string;
191
+ };
192
+ students: GradebookStudentRow[];
193
+ }>;
194
+ export declare function exportGradebookCsv(classId: string, userId: string): Promise<{
195
+ csv: string;
196
+ }>;
197
+ //# sourceMappingURL=gradebook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gradebook.d.ts","sourceRoot":"/","sources":["services/gradebook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,263 @@
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]="2860d786-c6b1-5d9a-b1bd-880c5bef0f51")}catch(e){}}();
3
+ import { TRPCError } from "@trpc/server";
4
+ import { prisma } from "../lib/prisma.js";
5
+ import { isTeacherInClass } from "../models/class.js";
6
+ import { findGradeCategoriesByClassId, findGradeCategory, findCustomGradeColumnsByClassId, findCustomGradeColumn, findClassForGradebook, findClassGradePolicies, } from "../models/gradebook.js";
7
+ import { computeFinalGrade, resolveLetterGrade, } from "./gradeCalculation.js";
8
+ // ===== Categories =====
9
+ export async function listGradeCategories(classId) {
10
+ return findGradeCategoriesByClassId(classId);
11
+ }
12
+ export async function createGradeCategory(classId, data) {
13
+ return prisma.gradeCategory.create({
14
+ data: {
15
+ classId,
16
+ name: data.name,
17
+ weight: data.weight,
18
+ dropLowest: data.dropLowest ?? 0,
19
+ position: data.position ?? (await findGradeCategoriesByClassId(classId)).length,
20
+ },
21
+ });
22
+ }
23
+ export async function updateGradeCategory(categoryId, classId, data) {
24
+ const category = await findGradeCategory(categoryId, classId);
25
+ if (!category) {
26
+ throw new TRPCError({ code: "NOT_FOUND", message: "Category not found" });
27
+ }
28
+ return prisma.gradeCategory.update({
29
+ where: { id: categoryId },
30
+ data,
31
+ });
32
+ }
33
+ export async function deleteGradeCategory(categoryId, classId) {
34
+ const category = await findGradeCategory(categoryId, classId);
35
+ if (!category) {
36
+ throw new TRPCError({ code: "NOT_FOUND", message: "Category not found" });
37
+ }
38
+ return prisma.gradeCategory.delete({ where: { id: categoryId } });
39
+ }
40
+ export async function assignAssignmentCategory(classId, assignmentId, gradeCategoryId) {
41
+ if (gradeCategoryId) {
42
+ const category = await findGradeCategory(gradeCategoryId, classId);
43
+ if (!category) {
44
+ throw new TRPCError({ code: "NOT_FOUND", message: "Category not found" });
45
+ }
46
+ }
47
+ return prisma.assignment.update({
48
+ where: { id: assignmentId, classId },
49
+ data: { gradeCategoryId },
50
+ });
51
+ }
52
+ // ===== Custom columns =====
53
+ export async function listCustomGradeColumns(classId) {
54
+ return findCustomGradeColumnsByClassId(classId);
55
+ }
56
+ export async function createCustomGradeColumn(classId, data) {
57
+ if (data.gradeCategoryId) {
58
+ const category = await findGradeCategory(data.gradeCategoryId, classId);
59
+ if (!category) {
60
+ throw new TRPCError({ code: "NOT_FOUND", message: "Category not found" });
61
+ }
62
+ }
63
+ return prisma.customGradeColumn.create({
64
+ data: {
65
+ classId,
66
+ name: data.name,
67
+ maxPoints: data.maxPoints,
68
+ gradeCategoryId: data.gradeCategoryId ?? null,
69
+ position: data.position ?? (await findCustomGradeColumnsByClassId(classId)).length,
70
+ },
71
+ });
72
+ }
73
+ export async function updateCustomGradeColumn(columnId, classId, data) {
74
+ const column = await findCustomGradeColumn(columnId, classId);
75
+ if (!column) {
76
+ throw new TRPCError({ code: "NOT_FOUND", message: "Column not found" });
77
+ }
78
+ if (data.gradeCategoryId) {
79
+ const category = await findGradeCategory(data.gradeCategoryId, classId);
80
+ if (!category) {
81
+ throw new TRPCError({ code: "NOT_FOUND", message: "Category not found" });
82
+ }
83
+ }
84
+ return prisma.customGradeColumn.update({
85
+ where: { id: columnId },
86
+ data,
87
+ });
88
+ }
89
+ export async function deleteCustomGradeColumn(columnId, classId) {
90
+ const column = await findCustomGradeColumn(columnId, classId);
91
+ if (!column) {
92
+ throw new TRPCError({ code: "NOT_FOUND", message: "Column not found" });
93
+ }
94
+ return prisma.customGradeColumn.delete({ where: { id: columnId } });
95
+ }
96
+ export async function setCustomGradeEntry(classId, columnId, studentId, points, note) {
97
+ const column = await findCustomGradeColumn(columnId, classId);
98
+ if (!column) {
99
+ throw new TRPCError({ code: "NOT_FOUND", message: "Column not found" });
100
+ }
101
+ if (points === null) {
102
+ await prisma.customGradeEntry.deleteMany({
103
+ where: { columnId, studentId },
104
+ });
105
+ return null;
106
+ }
107
+ return prisma.customGradeEntry.upsert({
108
+ where: { columnId_studentId: { columnId, studentId } },
109
+ create: { columnId, studentId, points, note: note ?? null },
110
+ update: { points, ...(note !== undefined ? { note } : {}) },
111
+ });
112
+ }
113
+ // ===== Policies =====
114
+ export async function getGradePolicies(classId) {
115
+ const policies = await findClassGradePolicies(classId);
116
+ if (!policies) {
117
+ throw new TRPCError({ code: "NOT_FOUND", message: "Class not found" });
118
+ }
119
+ return policies;
120
+ }
121
+ export async function updateGradePolicies(classId, data) {
122
+ return prisma.class.update({
123
+ where: { id: classId },
124
+ data,
125
+ select: {
126
+ id: true,
127
+ treatMissingAsZero: true,
128
+ gradeRoundingMode: true,
129
+ },
130
+ });
131
+ }
132
+ export async function getComputedGradebook(classId, userId) {
133
+ const [classData, categories, columns, isTeacher] = await Promise.all([
134
+ findClassForGradebook(classId),
135
+ findGradeCategoriesByClassId(classId),
136
+ findCustomGradeColumnsByClassId(classId),
137
+ isTeacherInClass(classId, userId),
138
+ ]);
139
+ if (!classData) {
140
+ throw new TRPCError({ code: "NOT_FOUND", message: "Class not found" });
141
+ }
142
+ // Students only ever see their own row.
143
+ const students = isTeacher
144
+ ? classData.students
145
+ : classData.students.filter((student) => student.id === userId);
146
+ const policies = {
147
+ treatMissingAsZero: classData.treatMissingAsZero,
148
+ roundingMode: classData.gradeRoundingMode,
149
+ };
150
+ const categoryInputs = categories.map((category) => ({
151
+ id: category.id,
152
+ name: category.name,
153
+ weight: category.weight,
154
+ dropLowest: category.dropLowest,
155
+ }));
156
+ const boundary = classData.gradingBoundaries[0] ?? null;
157
+ const rows = students.map((student) => {
158
+ const assignmentScores = {};
159
+ const scores = [];
160
+ for (const assignment of classData.assignments) {
161
+ const submission = assignment.submissions.find((item) => item.studentId === student.id);
162
+ const pointsEarned = submission?.gradeReceived ?? null;
163
+ assignmentScores[assignment.id] = pointsEarned;
164
+ scores.push({
165
+ categoryId: assignment.gradeCategoryId,
166
+ pointsEarned,
167
+ maxPoints: assignment.maxGrade ?? 0,
168
+ weight: assignment.weight,
169
+ });
170
+ }
171
+ const customScores = {};
172
+ for (const column of columns) {
173
+ const entry = column.entries.find((item) => item.studentId === student.id);
174
+ customScores[column.id] = {
175
+ points: entry?.points ?? null,
176
+ note: entry?.note ?? null,
177
+ };
178
+ scores.push({
179
+ categoryId: column.gradeCategoryId,
180
+ pointsEarned: entry?.points ?? null,
181
+ maxPoints: column.maxPoints,
182
+ });
183
+ }
184
+ const result = computeFinalGrade(policies, categoryInputs, scores);
185
+ const letterGrade = boundary && result.percentage !== null
186
+ ? resolveLetterGrade(boundary.structured, result.percentage)
187
+ : null;
188
+ return {
189
+ studentId: student.id,
190
+ studentName: student.profile?.displayName || student.username,
191
+ assignmentScores,
192
+ customScores,
193
+ result,
194
+ letterGrade,
195
+ };
196
+ });
197
+ return {
198
+ policies,
199
+ categories,
200
+ assignments: classData.assignments.map((assignment) => ({
201
+ id: assignment.id,
202
+ title: assignment.title,
203
+ maxGrade: assignment.maxGrade,
204
+ weight: assignment.weight,
205
+ gradeCategoryId: assignment.gradeCategoryId,
206
+ dueDate: assignment.dueDate,
207
+ })),
208
+ customColumns: columns.map((column) => ({
209
+ id: column.id,
210
+ name: column.name,
211
+ maxPoints: column.maxPoints,
212
+ gradeCategoryId: column.gradeCategoryId,
213
+ position: column.position,
214
+ })),
215
+ gradingBoundary: boundary,
216
+ students: rows,
217
+ };
218
+ }
219
+ // ===== CSV export =====
220
+ function escapeCsvCell(value) {
221
+ if (/[",\n\r]/.test(value)) {
222
+ return `"${value.replace(/"/g, '""')}"`;
223
+ }
224
+ return value;
225
+ }
226
+ export async function exportGradebookCsv(classId, userId) {
227
+ const gradebook = await getComputedGradebook(classId, userId);
228
+ const header = [
229
+ "Student",
230
+ ...gradebook.assignments.map((assignment) => `${assignment.title} (/${assignment.maxGrade ?? 0})`),
231
+ ...gradebook.customColumns.map((column) => `${column.name} (/${column.maxPoints})`),
232
+ ...gradebook.categories.map((category) => `${category.name} Avg (%)`),
233
+ "Final (%)",
234
+ "Letter",
235
+ ];
236
+ const lines = [header.map(escapeCsvCell).join(",")];
237
+ for (const row of gradebook.students) {
238
+ const categoryCells = gradebook.categories.map((category) => {
239
+ const average = row.result.categories.find((item) => item.categoryId === category.id)?.average;
240
+ return average === null || average === undefined
241
+ ? ""
242
+ : average.toFixed(2);
243
+ });
244
+ const cells = [
245
+ row.studentName,
246
+ ...gradebook.assignments.map((assignment) => {
247
+ const points = row.assignmentScores[assignment.id];
248
+ return points === null || points === undefined ? "" : String(points);
249
+ }),
250
+ ...gradebook.customColumns.map((column) => {
251
+ const points = row.customScores[column.id]?.points;
252
+ return points === null || points === undefined ? "" : String(points);
253
+ }),
254
+ ...categoryCells,
255
+ row.result.percentage === null ? "" : row.result.percentage.toFixed(2),
256
+ row.letterGrade ?? "",
257
+ ];
258
+ lines.push(cells.map(escapeCsvCell).join(","));
259
+ }
260
+ return { csv: lines.join("\n") };
261
+ }
262
+ //# sourceMappingURL=gradebook.js.map
263
+ //# debugId=2860d786-c6b1-5d9a-b1bd-880c5bef0f51
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gradebook.js","sources":["services/gradebook.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Gradebook service – grade categories, custom columns/entries, class\n * grade-calculation policies, the computed gradebook, and CSV export.\n *\n * All grade math lives in `gradeCalculation.ts` (pure, unit-tested); this\n * service only assembles inputs and persists configuration.\n */\nimport { GradeRoundingMode as PrismaGradeRoundingMode } from \"@prisma/client\";\nimport { TRPCError } from \"@trpc/server\";\nimport { prisma } from \"../lib/prisma.js\";\nimport { isTeacherInClass } from \"../models/class.js\";\nimport {\n findGradeCategoriesByClassId,\n findGradeCategory,\n findCustomGradeColumnsByClassId,\n findCustomGradeColumn,\n findClassForGradebook,\n findClassGradePolicies,\n} from \"../models/gradebook.js\";\nimport {\n computeFinalGrade,\n resolveLetterGrade,\n type FinalGradeResult,\n type GradeCategoryInput,\n type ScoreInput,\n} from \"./gradeCalculation.js\";\n\n// ===== Categories =====\n\nexport async function listGradeCategories(classId: string) {\n return findGradeCategoriesByClassId(classId);\n}\n\nexport async function createGradeCategory(\n classId: string,\n data: { name: string; weight: number; dropLowest?: number; position?: number }\n) {\n return prisma.gradeCategory.create({\n data: {\n classId,\n name: data.name,\n weight: data.weight,\n dropLowest: data.dropLowest ?? 0,\n position: data.position ?? (await findGradeCategoriesByClassId(classId)).length,\n },\n });\n}\n\nexport async function updateGradeCategory(\n categoryId: string,\n classId: string,\n data: {\n name?: string;\n weight?: number;\n dropLowest?: number;\n position?: number;\n }\n) {\n const category = await findGradeCategory(categoryId, classId);\n if (!category) {\n throw new TRPCError({ code: \"NOT_FOUND\", message: \"Category not found\" });\n }\n return prisma.gradeCategory.update({\n where: { id: categoryId },\n data,\n });\n}\n\nexport async function deleteGradeCategory(categoryId: string, classId: string) {\n const category = await findGradeCategory(categoryId, classId);\n if (!category) {\n throw new TRPCError({ code: \"NOT_FOUND\", message: \"Category not found\" });\n }\n return prisma.gradeCategory.delete({ where: { id: categoryId } });\n}\n\nexport async function assignAssignmentCategory(\n classId: string,\n assignmentId: string,\n gradeCategoryId: string | null\n) {\n if (gradeCategoryId) {\n const category = await findGradeCategory(gradeCategoryId, classId);\n if (!category) {\n throw new TRPCError({ code: \"NOT_FOUND\", message: \"Category not found\" });\n }\n }\n return prisma.assignment.update({\n where: { id: assignmentId, classId },\n data: { gradeCategoryId },\n });\n}\n\n// ===== Custom columns =====\n\nexport async function listCustomGradeColumns(classId: string) {\n return findCustomGradeColumnsByClassId(classId);\n}\n\nexport async function createCustomGradeColumn(\n classId: string,\n data: {\n name: string;\n maxPoints: number;\n gradeCategoryId?: string | null;\n position?: number;\n }\n) {\n if (data.gradeCategoryId) {\n const category = await findGradeCategory(data.gradeCategoryId, classId);\n if (!category) {\n throw new TRPCError({ code: \"NOT_FOUND\", message: \"Category not found\" });\n }\n }\n return prisma.customGradeColumn.create({\n data: {\n classId,\n name: data.name,\n maxPoints: data.maxPoints,\n gradeCategoryId: data.gradeCategoryId ?? null,\n position:\n data.position ?? (await findCustomGradeColumnsByClassId(classId)).length,\n },\n });\n}\n\nexport async function updateCustomGradeColumn(\n columnId: string,\n classId: string,\n data: {\n name?: string;\n maxPoints?: number;\n gradeCategoryId?: string | null;\n position?: number;\n }\n) {\n const column = await findCustomGradeColumn(columnId, classId);\n if (!column) {\n throw new TRPCError({ code: \"NOT_FOUND\", message: \"Column not found\" });\n }\n if (data.gradeCategoryId) {\n const category = await findGradeCategory(data.gradeCategoryId, classId);\n if (!category) {\n throw new TRPCError({ code: \"NOT_FOUND\", message: \"Category not found\" });\n }\n }\n return prisma.customGradeColumn.update({\n where: { id: columnId },\n data,\n });\n}\n\nexport async function deleteCustomGradeColumn(\n columnId: string,\n classId: string\n) {\n const column = await findCustomGradeColumn(columnId, classId);\n if (!column) {\n throw new TRPCError({ code: \"NOT_FOUND\", message: \"Column not found\" });\n }\n return prisma.customGradeColumn.delete({ where: { id: columnId } });\n}\n\nexport async function setCustomGradeEntry(\n classId: string,\n columnId: string,\n studentId: string,\n points: number | null,\n note?: string | null\n) {\n const column = await findCustomGradeColumn(columnId, classId);\n if (!column) {\n throw new TRPCError({ code: \"NOT_FOUND\", message: \"Column not found\" });\n }\n if (points === null) {\n await prisma.customGradeEntry.deleteMany({\n where: { columnId, studentId },\n });\n return null;\n }\n return prisma.customGradeEntry.upsert({\n where: { columnId_studentId: { columnId, studentId } },\n create: { columnId, studentId, points, note: note ?? null },\n update: { points, ...(note !== undefined ? { note } : {}) },\n });\n}\n\n// ===== Policies =====\n\nexport async function getGradePolicies(classId: string) {\n const policies = await findClassGradePolicies(classId);\n if (!policies) {\n throw new TRPCError({ code: \"NOT_FOUND\", message: \"Class not found\" });\n }\n return policies;\n}\n\nexport async function updateGradePolicies(\n classId: string,\n data: {\n treatMissingAsZero?: boolean;\n gradeRoundingMode?: PrismaGradeRoundingMode;\n }\n) {\n return prisma.class.update({\n where: { id: classId },\n data,\n select: {\n id: true,\n treatMissingAsZero: true,\n gradeRoundingMode: true,\n },\n });\n}\n\n// ===== Computed gradebook =====\n\nexport interface GradebookStudentRow {\n studentId: string;\n studentName: string;\n assignmentScores: Record<string, number | null>;\n customScores: Record<string, { points: number | null; note: string | null }>;\n result: FinalGradeResult;\n letterGrade: string | null;\n}\n\nexport async function getComputedGradebook(classId: string, userId: string) {\n const [classData, categories, columns, isTeacher] = await Promise.all([\n findClassForGradebook(classId),\n findGradeCategoriesByClassId(classId),\n findCustomGradeColumnsByClassId(classId),\n isTeacherInClass(classId, userId),\n ]);\n if (!classData) {\n throw new TRPCError({ code: \"NOT_FOUND\", message: \"Class not found\" });\n }\n\n // Students only ever see their own row.\n const students = isTeacher\n ? classData.students\n : classData.students.filter((student) => student.id === userId);\n\n const policies = {\n treatMissingAsZero: classData.treatMissingAsZero,\n roundingMode: classData.gradeRoundingMode,\n };\n const categoryInputs: GradeCategoryInput[] = categories.map((category) => ({\n id: category.id,\n name: category.name,\n weight: category.weight,\n dropLowest: category.dropLowest,\n }));\n const boundary = classData.gradingBoundaries[0] ?? null;\n\n const rows: GradebookStudentRow[] = students.map((student) => {\n const assignmentScores: Record<string, number | null> = {};\n const scores: ScoreInput[] = [];\n\n for (const assignment of classData.assignments) {\n const submission = assignment.submissions.find(\n (item) => item.studentId === student.id\n );\n const pointsEarned = submission?.gradeReceived ?? null;\n assignmentScores[assignment.id] = pointsEarned;\n scores.push({\n categoryId: assignment.gradeCategoryId,\n pointsEarned,\n maxPoints: assignment.maxGrade ?? 0,\n weight: assignment.weight,\n });\n }\n\n const customScores: GradebookStudentRow[\"customScores\"] = {};\n for (const column of columns) {\n const entry = column.entries.find(\n (item) => item.studentId === student.id\n );\n customScores[column.id] = {\n points: entry?.points ?? null,\n note: entry?.note ?? null,\n };\n scores.push({\n categoryId: column.gradeCategoryId,\n pointsEarned: entry?.points ?? null,\n maxPoints: column.maxPoints,\n });\n }\n\n const result = computeFinalGrade(policies, categoryInputs, scores);\n const letterGrade =\n boundary && result.percentage !== null\n ? resolveLetterGrade(boundary.structured, result.percentage)\n : null;\n\n return {\n studentId: student.id,\n studentName: student.profile?.displayName || student.username,\n assignmentScores,\n customScores,\n result,\n letterGrade,\n };\n });\n\n return {\n policies,\n categories,\n assignments: classData.assignments.map((assignment) => ({\n id: assignment.id,\n title: assignment.title,\n maxGrade: assignment.maxGrade,\n weight: assignment.weight,\n gradeCategoryId: assignment.gradeCategoryId,\n dueDate: assignment.dueDate,\n })),\n customColumns: columns.map((column) => ({\n id: column.id,\n name: column.name,\n maxPoints: column.maxPoints,\n gradeCategoryId: column.gradeCategoryId,\n position: column.position,\n })),\n gradingBoundary: boundary,\n students: rows,\n };\n}\n\n// ===== CSV export =====\n\nfunction escapeCsvCell(value: string): string {\n if (/[\",\\n\\r]/.test(value)) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n}\n\nexport async function exportGradebookCsv(classId: string, userId: string) {\n const gradebook = await getComputedGradebook(classId, userId);\n\n const header = [\n \"Student\",\n ...gradebook.assignments.map(\n (assignment) => `${assignment.title} (/${assignment.maxGrade ?? 0})`\n ),\n ...gradebook.customColumns.map(\n (column) => `${column.name} (/${column.maxPoints})`\n ),\n ...gradebook.categories.map((category) => `${category.name} Avg (%)`),\n \"Final (%)\",\n \"Letter\",\n ];\n\n const lines = [header.map(escapeCsvCell).join(\",\")];\n\n for (const row of gradebook.students) {\n const categoryCells = gradebook.categories.map((category) => {\n const average = row.result.categories.find(\n (item) => item.categoryId === category.id\n )?.average;\n return average === null || average === undefined\n ? \"\"\n : average.toFixed(2);\n });\n\n const cells = [\n row.studentName,\n ...gradebook.assignments.map((assignment) => {\n const points = row.assignmentScores[assignment.id];\n return points === null || points === undefined ? \"\" : String(points);\n }),\n ...gradebook.customColumns.map((column) => {\n const points = row.customScores[column.id]?.points;\n return points === null || points === undefined ? \"\" : String(points);\n }),\n ...categoryCells,\n row.result.percentage === null ? \"\" : row.result.percentage.toFixed(2),\n row.letterGrade ?? \"\",\n ];\n lines.push(cells.map(escapeCsvCell).join(\",\"));\n }\n\n return { csv: lines.join(\"\\n\") };\n}\n"],"names":[],"mappings":"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","debug_id":"2860d786-c6b1-5d9a-b1bd-880c5bef0f51"}
@@ -144,6 +144,8 @@ export declare function listClasses(userId: string, schoolId: string): Promise<{
144
144
  discussionsEnabled: boolean;
145
145
  studentsCanCreateDiscussions: boolean;
146
146
  studentsCanReply: boolean;
147
+ treatMissingAsZero: boolean;
148
+ gradeRoundingMode: import(".prisma/client").$Enums.GradeRoundingMode;
147
149
  })[];
148
150
  }>;
149
151
  export declare function createSchoolClass(userId: string, input: {
@@ -191,6 +193,8 @@ export declare function createSchoolClass(userId: string, input: {
191
193
  discussionsEnabled: boolean;
192
194
  studentsCanCreateDiscussions: boolean;
193
195
  studentsCanReply: boolean;
196
+ treatMissingAsZero: boolean;
197
+ gradeRoundingMode: import(".prisma/client").$Enums.GradeRoundingMode;
194
198
  };
195
199
  }>;
196
200
  export declare function listMembers(userId: string, schoolId: string): Promise<{
@@ -1 +1 @@
1
- {"version":3,"file":"school.d.ts","sourceRoot":"/","sources":["services/school.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"school.d.ts","sourceRoot":"/","sources":["services/school.ts"],"names":[],"mappings":"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"}
@@ -14,6 +14,8 @@ export declare function getWorksheet(worksheetId: string, userId: string): Promi
14
14
  discussionsEnabled: boolean;
15
15
  studentsCanCreateDiscussions: boolean;
16
16
  studentsCanReply: boolean;
17
+ treatMissingAsZero: boolean;
18
+ gradeRoundingMode: import(".prisma/client").$Enums.GradeRoundingMode;
17
19
  } | null;
18
20
  tags: {
19
21
  id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"worksheet.d.ts","sourceRoot":"/","sources":["services/worksheet.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"worksheet.d.ts","sourceRoot":"/","sources":["services/worksheet.ts"],"names":[],"mappings":"AAKA,OAAO,EAAa,MAAM,EAAE,KAAK,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AA8D/E,qDAAqD;AACrD,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAerE;AAED,iCAAiC;AACjC,wBAAsB,eAAe,CAAC,EAAE,EAAE,MAAM,oBAG/C;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;KAMnD;AAED,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE;;;;;;;;;GAaxB;AAED,wBAAsB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;;;;;;;;;GAS9E;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;;;;;;;;;GAKxE;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM;;;;;;;;;GAmCf;AAED;;;;;;;;GAQG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO;;;;;;;;;GA2DhC;AAED;;GAEG;AACH,wBAAsB,8BAA8B,CAClD,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO;;;;;;;;;GAoChC;AAED,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;IACJ,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,qBAAqB,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;;;;;;;;;;;;GAaF;AAED,8EAA8E;AAC9E,MAAM,WAAW,yBAAyB;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,qBAAqB,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAOD;;;;GAIG;AACH,wBAAsB,yBAAyB,CAC7C,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,yBAAyB,EAAE,iBAwCvC;AAED,wBAAsB,yBAAyB,CAC7C,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,QAAQ,GAAG,OAAO,EAC5B,QAAQ,EAAE,MAAM;;KAmDjB;AAED,wBAAsB,6BAA6B,CACjD,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;IACJ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,qBAAqB,CAAC;CAC9B;;;;;;;;;;;;GAUF;AAED,wBAAsB,6BAA6B,CACjD,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM;;;;;;;;;;;;GAUf;AAED,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2Bf;AAED,wBAAsB,uBAAuB,CAC3C,mBAAmB,EAAE,MAAM,EAC3B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;GAmEf;AAED,wBAAsB,aAAa,CACjC,mBAAmB,EAAE,MAAM,EAC3B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM;;;;;;;;;;;;;;GAcf;AAED,wBAAsB,eAAe,CACnC,mBAAmB,EAAE,MAAM,EAC3B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM;;;;;;;;;;;;;;UAcf;AAED,wBAAsB,UAAU,CAC9B,mBAAmB,EAAE,MAAM,EAC3B,MAAM,EAAE,MAAM,iBAef;AAED,wBAAsB,WAAW,CAC/B,UAAU,EAAE,MAAM,EAClB,0BAA0B,EAAE,MAAM,EAClC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;IACJ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;;;;;;;;;;;;;;GA0EF;AAED,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM;;;;;;;;;;;;GAmBjB"}
@@ -0,0 +1,7 @@
1
+ #!/bin/sh
2
+ set -e
3
+
4
+ # Apply pending database migrations before starting the API.
5
+ ./node_modules/.bin/prisma migrate deploy
6
+
7
+ exec node dist/index.js
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@studious-lms/server",
3
- "version": "1.20.0",
3
+ "version": "1.22.0",
4
4
  "description": "Backend server for Studious application",
5
5
  "main": "dist/exportType.js",
6
6
  "types": "dist/exportType.d.ts",
@@ -0,0 +1,35 @@
1
+ -- CreateEnum
2
+ CREATE TYPE "FileAnnotationType" AS ENUM ('HIGHLIGHT', 'INK', 'COMMENT', 'TEXT');
3
+
4
+ -- CreateTable
5
+ CREATE TABLE "FileAnnotation" (
6
+ "id" TEXT NOT NULL,
7
+ "fileId" TEXT NOT NULL,
8
+ "submissionId" TEXT NOT NULL,
9
+ "authorId" TEXT NOT NULL,
10
+ "page" INTEGER NOT NULL,
11
+ "type" "FileAnnotationType" NOT NULL,
12
+ "geometry" JSONB NOT NULL,
13
+ "text" TEXT,
14
+ "color" TEXT,
15
+ "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
16
+ "updatedAt" TIMESTAMP(3) NOT NULL,
17
+
18
+ CONSTRAINT "FileAnnotation_pkey" PRIMARY KEY ("id")
19
+ );
20
+
21
+ -- CreateIndex
22
+ CREATE INDEX "FileAnnotation_fileId_idx" ON "FileAnnotation"("fileId");
23
+
24
+ -- CreateIndex
25
+ CREATE INDEX "FileAnnotation_submissionId_idx" ON "FileAnnotation"("submissionId");
26
+
27
+ -- AddForeignKey
28
+ ALTER TABLE "FileAnnotation" ADD CONSTRAINT "FileAnnotation_fileId_fkey" FOREIGN KEY ("fileId") REFERENCES "File"("id") ON DELETE CASCADE ON UPDATE CASCADE;
29
+
30
+ -- AddForeignKey
31
+ ALTER TABLE "FileAnnotation" ADD CONSTRAINT "FileAnnotation_submissionId_fkey" FOREIGN KEY ("submissionId") REFERENCES "Submission"("id") ON DELETE CASCADE ON UPDATE CASCADE;
32
+
33
+ -- AddForeignKey
34
+ ALTER TABLE "FileAnnotation" ADD CONSTRAINT "FileAnnotation_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
35
+