@studious-lms/server 1.4.6 → 1.4.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. package/dist/models/access.d.ts +112 -0
  2. package/dist/models/access.d.ts.map +1 -0
  3. package/dist/models/access.js +49 -0
  4. package/dist/models/access.js.map +1 -0
  5. package/dist/models/announcement.d.ts +17 -2
  6. package/dist/models/announcement.d.ts.map +1 -1
  7. package/dist/models/announcement.js +21 -4
  8. package/dist/models/announcement.js.map +1 -1
  9. package/dist/models/assignment.d.ts +37 -37
  10. package/dist/models/assignment.d.ts.map +1 -1
  11. package/dist/models/assignment.js +15 -15
  12. package/dist/models/assignment.js.map +1 -1
  13. package/dist/models/attendance.d.ts +1 -1
  14. package/dist/models/attendance.d.ts.map +1 -1
  15. package/dist/models/attendance.js +6 -5
  16. package/dist/models/attendance.js.map +1 -1
  17. package/dist/models/auth.d.ts +5 -5
  18. package/dist/models/auth.d.ts.map +1 -1
  19. package/dist/models/auth.js +7 -11
  20. package/dist/models/auth.js.map +1 -1
  21. package/dist/models/class.d.ts +26 -26
  22. package/dist/models/class.d.ts.map +1 -1
  23. package/dist/models/class.js +7 -11
  24. package/dist/models/class.js.map +1 -1
  25. package/dist/models/comment.d.ts +134 -70
  26. package/dist/models/comment.d.ts.map +1 -1
  27. package/dist/models/comment.js +30 -42
  28. package/dist/models/comment.js.map +1 -1
  29. package/dist/models/conversation.d.ts +7 -7
  30. package/dist/models/event.d.ts +52 -3
  31. package/dist/models/event.d.ts.map +1 -1
  32. package/dist/models/event.js +56 -6
  33. package/dist/models/event.js.map +1 -1
  34. package/dist/models/file.d.ts +178 -103
  35. package/dist/models/file.d.ts.map +1 -1
  36. package/dist/models/file.js +54 -14
  37. package/dist/models/file.js.map +1 -1
  38. package/dist/models/folder.d.ts +22 -22
  39. package/dist/models/folder.d.ts.map +1 -1
  40. package/dist/models/folder.js +5 -4
  41. package/dist/models/folder.js.map +1 -1
  42. package/dist/models/labChat.d.ts +20 -20
  43. package/dist/models/labChat.d.ts.map +1 -1
  44. package/dist/models/labChat.js +8 -10
  45. package/dist/models/labChat.js.map +1 -1
  46. package/dist/models/marketing.d.ts +1 -1
  47. package/dist/models/message.d.ts +6 -6
  48. package/dist/models/newtonChat.d.ts +5 -5
  49. package/dist/models/school.d.ts +361 -0
  50. package/dist/models/school.d.ts.map +1 -0
  51. package/dist/models/school.js +314 -0
  52. package/dist/models/school.js.map +1 -0
  53. package/dist/models/section.d.ts +1 -1
  54. package/dist/models/section.d.ts.map +1 -1
  55. package/dist/models/section.js +5 -4
  56. package/dist/models/section.js.map +1 -1
  57. package/dist/models/user.d.ts +4 -4
  58. package/dist/models/worksheet.d.ts +65 -65
  59. package/dist/models/worksheet.d.ts.map +1 -1
  60. package/dist/models/worksheet.js +6 -14
  61. package/dist/models/worksheet.js.map +1 -1
  62. package/dist/pipelines/gradeWorksheet.d.ts +2 -2
  63. package/dist/pipelines/pdfToWorksheet.d.ts +1 -1
  64. package/dist/routers/_app.d.ts +2855 -2051
  65. package/dist/routers/_app.d.ts.map +1 -1
  66. package/dist/routers/_app.js +4 -2
  67. package/dist/routers/_app.js.map +1 -1
  68. package/dist/routers/announcement.d.ts +5 -5
  69. package/dist/routers/announcement.d.ts.map +1 -1
  70. package/dist/routers/announcement.js +25 -5
  71. package/dist/routers/announcement.js.map +1 -1
  72. package/dist/routers/assignment.d.ts +44 -44
  73. package/dist/routers/assignment.d.ts.map +1 -1
  74. package/dist/routers/assignment.js +24 -11
  75. package/dist/routers/assignment.js.map +1 -1
  76. package/dist/routers/class.d.ts +21 -20
  77. package/dist/routers/class.d.ts.map +1 -1
  78. package/dist/routers/class.js +3 -2
  79. package/dist/routers/class.js.map +1 -1
  80. package/dist/routers/comment.d.ts +5 -5
  81. package/dist/routers/conversation.d.ts +6 -6
  82. package/dist/routers/event.d.ts +21 -2
  83. package/dist/routers/event.d.ts.map +1 -1
  84. package/dist/routers/file.d.ts +2 -2
  85. package/dist/routers/folder.d.ts +24 -24
  86. package/dist/routers/labChat.d.ts +7 -7
  87. package/dist/routers/school.d.ts +384 -0
  88. package/dist/routers/school.d.ts.map +1 -0
  89. package/dist/routers/school.js +79 -0
  90. package/dist/routers/school.js.map +1 -0
  91. package/dist/routers/search.d.ts +1 -1
  92. package/dist/routers/worksheet.d.ts +21 -21
  93. package/dist/services/announcement.d.ts.map +1 -1
  94. package/dist/services/announcement.js +10 -6
  95. package/dist/services/announcement.js.map +1 -1
  96. package/dist/services/assignment.d.ts +36 -36
  97. package/dist/services/class.d.ts +20 -19
  98. package/dist/services/class.d.ts.map +1 -1
  99. package/dist/services/class.js +22 -3
  100. package/dist/services/class.js.map +1 -1
  101. package/dist/services/comment.d.ts +5 -5
  102. package/dist/services/comment.d.ts.map +1 -1
  103. package/dist/services/comment.js +8 -3
  104. package/dist/services/comment.js.map +1 -1
  105. package/dist/services/conversation.d.ts +6 -6
  106. package/dist/services/event.d.ts +21 -2
  107. package/dist/services/event.d.ts.map +1 -1
  108. package/dist/services/event.js +11 -7
  109. package/dist/services/event.js.map +1 -1
  110. package/dist/services/file.d.ts +2 -2
  111. package/dist/services/file.d.ts.map +1 -1
  112. package/dist/services/file.js +17 -8
  113. package/dist/services/file.js.map +1 -1
  114. package/dist/services/folder.d.ts +24 -24
  115. package/dist/services/labChat.d.ts +7 -7
  116. package/dist/services/school.d.ts +299 -0
  117. package/dist/services/school.d.ts.map +1 -0
  118. package/dist/services/school.js +225 -0
  119. package/dist/services/school.js.map +1 -0
  120. package/dist/services/worksheet.d.ts +21 -21
  121. package/package.json +1 -1
  122. package/prisma/migrations/20260504071500_school_memberships/migration.sql +81 -0
  123. package/prisma/schema.prisma +66 -2
  124. package/src/models/access.ts +48 -0
  125. package/src/models/announcement.ts +19 -2
  126. package/src/models/assignment.ts +17 -13
  127. package/src/models/attendance.ts +4 -3
  128. package/src/models/auth.ts +8 -9
  129. package/src/models/class.ts +8 -9
  130. package/src/models/comment.ts +29 -40
  131. package/src/models/event.ts +54 -4
  132. package/src/models/file.ts +53 -12
  133. package/src/models/folder.ts +3 -2
  134. package/src/models/labChat.ts +9 -8
  135. package/src/models/school.ts +361 -0
  136. package/src/models/section.ts +3 -2
  137. package/src/models/worksheet.ts +7 -12
  138. package/src/routers/_app.ts +2 -0
  139. package/src/routers/announcement.ts +30 -4
  140. package/src/routers/assignment.ts +27 -9
  141. package/src/routers/class.ts +1 -0
  142. package/src/routers/school.ts +122 -0
  143. package/src/services/announcement.ts +12 -4
  144. package/src/services/class.ts +25 -2
  145. package/src/services/comment.ts +10 -1
  146. package/src/services/event.ts +23 -6
  147. package/src/services/file.ts +20 -6
  148. package/src/services/school.ts +308 -0
@@ -46,6 +46,27 @@ export const commentSelect = {
46
46
  },
47
47
  } as const;
48
48
 
49
+ const commentClassAuthSelect = {
50
+ id: true,
51
+ teachers: { select: { id: true } },
52
+ students: { select: { id: true } },
53
+ school: {
54
+ select: {
55
+ users: {
56
+ where: { role: "ADMIN" as const },
57
+ select: { id: true },
58
+ },
59
+ memberships: {
60
+ where: {
61
+ role: "ADMIN" as const,
62
+ status: "ACTIVE" as const,
63
+ },
64
+ select: { userId: true },
65
+ },
66
+ },
67
+ },
68
+ } as const;
69
+
49
70
  /** @returns Comment by ID with author and reactions. */
50
71
  export function findCommentById(id: string) {
51
72
  return prisma.comment.findUnique({
@@ -158,22 +179,14 @@ export function findCommentWithContext(commentId: string) {
158
179
  announcement: {
159
180
  select: {
160
181
  class: {
161
- select: {
162
- id: true,
163
- teachers: { select: { id: true } },
164
- students: { select: { id: true } },
165
- },
182
+ select: commentClassAuthSelect,
166
183
  },
167
184
  },
168
185
  },
169
186
  assignment: {
170
187
  select: {
171
188
  class: {
172
- select: {
173
- id: true,
174
- teachers: { select: { id: true } },
175
- students: { select: { id: true } },
176
- },
189
+ select: commentClassAuthSelect,
177
190
  },
178
191
  },
179
192
  },
@@ -183,11 +196,7 @@ export function findCommentWithContext(commentId: string) {
183
196
  assignment: {
184
197
  select: {
185
198
  class: {
186
- select: {
187
- id: true,
188
- teachers: { select: { id: true } },
189
- students: { select: { id: true } },
190
- },
199
+ select: commentClassAuthSelect,
191
200
  },
192
201
  },
193
202
  },
@@ -204,11 +213,7 @@ export function findCommentWithContext(commentId: string) {
204
213
  assignment: {
205
214
  select: {
206
215
  class: {
207
- select: {
208
- id: true,
209
- teachers: { select: { id: true } },
210
- students: { select: { id: true } },
211
- },
216
+ select: commentClassAuthSelect,
212
217
  },
213
218
  },
214
219
  },
@@ -223,22 +228,14 @@ export function findCommentWithContext(commentId: string) {
223
228
  announcement: {
224
229
  select: {
225
230
  class: {
226
- select: {
227
- id: true,
228
- teachers: { select: { id: true } },
229
- students: { select: { id: true } },
230
- },
231
+ select: commentClassAuthSelect,
231
232
  },
232
233
  },
233
234
  },
234
235
  assignment: {
235
236
  select: {
236
237
  class: {
237
- select: {
238
- id: true,
239
- teachers: { select: { id: true } },
240
- students: { select: { id: true } },
241
- },
238
+ select: commentClassAuthSelect,
242
239
  },
243
240
  },
244
241
  },
@@ -248,11 +245,7 @@ export function findCommentWithContext(commentId: string) {
248
245
  assignment: {
249
246
  select: {
250
247
  class: {
251
- select: {
252
- id: true,
253
- teachers: { select: { id: true } },
254
- students: { select: { id: true } },
255
- },
248
+ select: commentClassAuthSelect,
256
249
  },
257
250
  },
258
251
  },
@@ -269,11 +262,7 @@ export function findCommentWithContext(commentId: string) {
269
262
  assignment: {
270
263
  select: {
271
264
  class: {
272
- select: {
273
- id: true,
274
- teachers: { select: { id: true } },
275
- students: { select: { id: true } },
276
- },
265
+ select: commentClassAuthSelect,
277
266
  },
278
267
  },
279
268
  },
@@ -2,9 +2,29 @@
2
2
  * Event model – calendar events, assignment attachment/detachment.
3
3
  */
4
4
  import { prisma } from "../lib/prisma.js";
5
+ import { classTeacherOrSchoolAdminWhere } from "./access.js";
5
6
 
6
7
  const eventGetInclude = {
7
- class: true,
8
+ class: {
9
+ include: {
10
+ teachers: { select: { id: true } },
11
+ school: {
12
+ include: {
13
+ users: {
14
+ where: { role: "ADMIN" as const },
15
+ select: { id: true },
16
+ },
17
+ memberships: {
18
+ where: {
19
+ role: "ADMIN" as const,
20
+ status: "ACTIVE" as const,
21
+ },
22
+ select: { userId: true },
23
+ },
24
+ },
25
+ },
26
+ },
27
+ },
8
28
  user: true,
9
29
  assignmentsAttached: {
10
30
  select: {
@@ -50,12 +70,12 @@ export function findEventById(id: string) {
50
70
  });
51
71
  }
52
72
 
53
- /** @returns Class if user is a teacher. */
73
+ /** @returns Class if user is a teacher or school admin. */
54
74
  export function findClassWithTeachers(classId: string, teacherId: string) {
55
- return prisma.class.findUnique({
75
+ return prisma.class.findFirst({
56
76
  where: {
57
77
  id: classId,
58
- teachers: { some: { id: teacherId } },
78
+ ...classTeacherOrSchoolAdminWhere(teacherId),
59
79
  },
60
80
  });
61
81
  }
@@ -111,6 +131,21 @@ export function findEventWithClass(eventId: string) {
111
131
  class: {
112
132
  include: {
113
133
  teachers: { select: { id: true } },
134
+ school: {
135
+ include: {
136
+ users: {
137
+ where: { role: "ADMIN" as const },
138
+ select: { id: true },
139
+ },
140
+ memberships: {
141
+ where: {
142
+ role: "ADMIN" as const,
143
+ status: "ACTIVE" as const,
144
+ },
145
+ select: { userId: true },
146
+ },
147
+ },
148
+ },
114
149
  },
115
150
  },
116
151
  },
@@ -125,6 +160,21 @@ export function findAssignmentWithClass(assignmentId: string) {
125
160
  class: {
126
161
  include: {
127
162
  teachers: { select: { id: true } },
163
+ school: {
164
+ include: {
165
+ users: {
166
+ where: { role: "ADMIN" as const },
167
+ select: { id: true },
168
+ },
169
+ memberships: {
170
+ where: {
171
+ role: "ADMIN" as const,
172
+ status: "ACTIVE" as const,
173
+ },
174
+ select: { userId: true },
175
+ },
176
+ },
177
+ },
128
178
  },
129
179
  },
130
180
  },
@@ -3,6 +3,26 @@
3
3
  */
4
4
  import { prisma } from "../lib/prisma.js";
5
5
 
6
+ const classFileAccessInclude = {
7
+ students: true,
8
+ teachers: true,
9
+ school: {
10
+ include: {
11
+ users: {
12
+ where: { role: "ADMIN" as const },
13
+ select: { id: true },
14
+ },
15
+ memberships: {
16
+ where: {
17
+ role: "ADMIN" as const,
18
+ status: "ACTIVE" as const,
19
+ },
20
+ select: { userId: true },
21
+ },
22
+ },
23
+ },
24
+ } as const;
25
+
6
26
  /** @returns File with assignment, submission, annotations, folder, announcement for permission checks. */
7
27
  export function findFileById(fileId: string) {
8
28
  return prisma.file.findUnique({
@@ -11,10 +31,7 @@ export function findFileById(fileId: string) {
11
31
  assignment: {
12
32
  include: {
13
33
  class: {
14
- include: {
15
- students: true,
16
- teachers: true,
17
- },
34
+ include: classFileAccessInclude,
18
35
  },
19
36
  },
20
37
  },
@@ -26,6 +43,21 @@ export function findFileById(fileId: string) {
26
43
  class: {
27
44
  include: {
28
45
  teachers: true,
46
+ school: {
47
+ include: {
48
+ users: {
49
+ where: { role: "ADMIN" as const },
50
+ select: { id: true },
51
+ },
52
+ memberships: {
53
+ where: {
54
+ role: "ADMIN" as const,
55
+ status: "ACTIVE" as const,
56
+ },
57
+ select: { userId: true },
58
+ },
59
+ },
60
+ },
29
61
  },
30
62
  },
31
63
  },
@@ -40,6 +72,21 @@ export function findFileById(fileId: string) {
40
72
  class: {
41
73
  include: {
42
74
  teachers: true,
75
+ school: {
76
+ include: {
77
+ users: {
78
+ where: { role: "ADMIN" as const },
79
+ select: { id: true },
80
+ },
81
+ memberships: {
82
+ where: {
83
+ role: "ADMIN" as const,
84
+ status: "ACTIVE" as const,
85
+ },
86
+ select: { userId: true },
87
+ },
88
+ },
89
+ },
43
90
  },
44
91
  },
45
92
  },
@@ -49,20 +96,14 @@ export function findFileById(fileId: string) {
49
96
  folder: {
50
97
  include: {
51
98
  class: {
52
- include: {
53
- students: true,
54
- teachers: true,
55
- },
99
+ include: classFileAccessInclude,
56
100
  },
57
101
  },
58
102
  },
59
103
  announcement: {
60
104
  include: {
61
105
  class: {
62
- include: {
63
- students: true,
64
- teachers: true,
65
- },
106
+ include: classFileAccessInclude,
66
107
  },
67
108
  },
68
109
  },
@@ -2,6 +2,7 @@
2
2
  * Folder model – class folders, hierarchy, contents. Teacher permission checks.
3
3
  */
4
4
  import { prisma } from "../lib/prisma.js";
5
+ import { classTeacherOrSchoolAdminWhere } from "./access.js";
5
6
 
6
7
  const fileSelect = {
7
8
  id: true,
@@ -19,12 +20,12 @@ const childFolderSelect = {
19
20
  _count: { select: { files: true, childFolders: true } },
20
21
  };
21
22
 
22
- /** @returns Class if user is a teacher. */
23
+ /** @returns Class if user is a teacher or school admin. */
23
24
  export function findClassWithTeacher(classId: string, teacherId: string) {
24
25
  return prisma.class.findFirst({
25
26
  where: {
26
27
  id: classId,
27
- teachers: { some: { id: teacherId } },
28
+ ...classTeacherOrSchoolAdminWhere(teacherId),
28
29
  },
29
30
  });
30
31
  }
@@ -2,6 +2,10 @@
2
2
  * Lab chat model – AI lab conversations, members, posts. Teacher/student access.
3
3
  */
4
4
  import { prisma } from "../lib/prisma.js";
5
+ import {
6
+ classMemberOrSchoolAdminWhere,
7
+ classTeacherOrSchoolAdminWhere,
8
+ } from "./access.js";
5
9
 
6
10
  const labChatInclude = {
7
11
  conversation: {
@@ -51,7 +55,7 @@ export function findClassWithTeachersForLab(classId: string, teacherId: string)
51
55
  return prisma.class.findFirst({
52
56
  where: {
53
57
  id: classId,
54
- teachers: { some: { id: teacherId } },
58
+ ...classTeacherOrSchoolAdminWhere(teacherId),
55
59
  },
56
60
  include: {
57
61
  students: {
@@ -95,13 +99,13 @@ export function findLabChatByMember(labChatId: string, userId: string) {
95
99
  });
96
100
  }
97
101
 
98
- /** @returns Lab chat if user is class teacher. */
102
+ /** @returns Lab chat if user is class teacher or school admin. */
99
103
  export function findLabChatByTeacher(labChatId: string, userId: string) {
100
104
  return prisma.labChat.findFirst({
101
105
  where: {
102
106
  id: labChatId,
103
107
  class: {
104
- teachers: { some: { id: userId } },
108
+ ...classTeacherOrSchoolAdminWhere(userId),
105
109
  },
106
110
  },
107
111
  include: {
@@ -118,15 +122,12 @@ export function findLabChatById(labChatId: string) {
118
122
  });
119
123
  }
120
124
 
121
- /** @returns Class if user is student or teacher. */
125
+ /** @returns Class if user is student, teacher, or school admin. */
122
126
  export function findClassMembership(classId: string, userId: string) {
123
127
  return prisma.class.findFirst({
124
128
  where: {
125
129
  id: classId,
126
- OR: [
127
- { students: { some: { id: userId } } },
128
- { teachers: { some: { id: userId } } },
129
- ],
130
+ ...classMemberOrSchoolAdminWhere(userId),
130
131
  },
131
132
  });
132
133
  }