@studious-lms/server 1.4.5 → 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 (167) hide show
  1. package/dist/lib/config/cors.d.ts.map +1 -1
  2. package/dist/lib/config/cors.js +8 -3
  3. package/dist/lib/config/cors.js.map +1 -1
  4. package/dist/models/access.d.ts +112 -0
  5. package/dist/models/access.d.ts.map +1 -0
  6. package/dist/models/access.js +49 -0
  7. package/dist/models/access.js.map +1 -0
  8. package/dist/models/announcement.d.ts +17 -2
  9. package/dist/models/announcement.d.ts.map +1 -1
  10. package/dist/models/announcement.js +21 -4
  11. package/dist/models/announcement.js.map +1 -1
  12. package/dist/models/assignment.d.ts +37 -37
  13. package/dist/models/assignment.d.ts.map +1 -1
  14. package/dist/models/assignment.js +15 -15
  15. package/dist/models/assignment.js.map +1 -1
  16. package/dist/models/attendance.d.ts +1 -1
  17. package/dist/models/attendance.d.ts.map +1 -1
  18. package/dist/models/attendance.js +6 -5
  19. package/dist/models/attendance.js.map +1 -1
  20. package/dist/models/auth.d.ts +5 -5
  21. package/dist/models/auth.d.ts.map +1 -1
  22. package/dist/models/auth.js +7 -11
  23. package/dist/models/auth.js.map +1 -1
  24. package/dist/models/class.d.ts +26 -26
  25. package/dist/models/class.d.ts.map +1 -1
  26. package/dist/models/class.js +7 -11
  27. package/dist/models/class.js.map +1 -1
  28. package/dist/models/comment.d.ts +233 -6
  29. package/dist/models/comment.d.ts.map +1 -1
  30. package/dist/models/comment.js +133 -3
  31. package/dist/models/comment.js.map +1 -1
  32. package/dist/models/conversation.d.ts +7 -7
  33. package/dist/models/event.d.ts +52 -3
  34. package/dist/models/event.d.ts.map +1 -1
  35. package/dist/models/event.js +56 -6
  36. package/dist/models/event.js.map +1 -1
  37. package/dist/models/file.d.ts +178 -103
  38. package/dist/models/file.d.ts.map +1 -1
  39. package/dist/models/file.js +54 -14
  40. package/dist/models/file.js.map +1 -1
  41. package/dist/models/folder.d.ts +22 -22
  42. package/dist/models/folder.d.ts.map +1 -1
  43. package/dist/models/folder.js +5 -4
  44. package/dist/models/folder.js.map +1 -1
  45. package/dist/models/labChat.d.ts +20 -20
  46. package/dist/models/labChat.d.ts.map +1 -1
  47. package/dist/models/labChat.js +8 -10
  48. package/dist/models/labChat.js.map +1 -1
  49. package/dist/models/marketing.d.ts +1 -1
  50. package/dist/models/message.d.ts +6 -6
  51. package/dist/models/newtonChat.d.ts +5 -5
  52. package/dist/models/school.d.ts +361 -0
  53. package/dist/models/school.d.ts.map +1 -0
  54. package/dist/models/school.js +314 -0
  55. package/dist/models/school.js.map +1 -0
  56. package/dist/models/section.d.ts +1 -1
  57. package/dist/models/section.d.ts.map +1 -1
  58. package/dist/models/section.js +5 -4
  59. package/dist/models/section.js.map +1 -1
  60. package/dist/models/user.d.ts +4 -4
  61. package/dist/models/worksheet.d.ts +67 -65
  62. package/dist/models/worksheet.d.ts.map +1 -1
  63. package/dist/models/worksheet.js +6 -14
  64. package/dist/models/worksheet.js.map +1 -1
  65. package/dist/pipelines/aiLabChat.d.ts.map +1 -1
  66. package/dist/pipelines/aiLabChat.js +4 -3
  67. package/dist/pipelines/aiLabChat.js.map +1 -1
  68. package/dist/pipelines/gradeWorksheet.d.ts +2 -2
  69. package/dist/pipelines/pdfToWorksheet.d.ts +1 -1
  70. package/dist/routers/_app.d.ts +2462 -1104
  71. package/dist/routers/_app.d.ts.map +1 -1
  72. package/dist/routers/_app.js +4 -2
  73. package/dist/routers/_app.js.map +1 -1
  74. package/dist/routers/announcement.d.ts +13 -5
  75. package/dist/routers/announcement.d.ts.map +1 -1
  76. package/dist/routers/announcement.js +25 -5
  77. package/dist/routers/announcement.js.map +1 -1
  78. package/dist/routers/assignment.d.ts +266 -36
  79. package/dist/routers/assignment.d.ts.map +1 -1
  80. package/dist/routers/assignment.js +221 -3
  81. package/dist/routers/assignment.js.map +1 -1
  82. package/dist/routers/class.d.ts +21 -20
  83. package/dist/routers/class.d.ts.map +1 -1
  84. package/dist/routers/class.js +3 -2
  85. package/dist/routers/class.js.map +1 -1
  86. package/dist/routers/comment.d.ts +40 -3
  87. package/dist/routers/comment.d.ts.map +1 -1
  88. package/dist/routers/comment.js +14 -5
  89. package/dist/routers/comment.js.map +1 -1
  90. package/dist/routers/conversation.d.ts +6 -6
  91. package/dist/routers/event.d.ts +21 -2
  92. package/dist/routers/event.d.ts.map +1 -1
  93. package/dist/routers/file.d.ts +2 -2
  94. package/dist/routers/folder.d.ts +24 -24
  95. package/dist/routers/labChat.d.ts +7 -7
  96. package/dist/routers/school.d.ts +384 -0
  97. package/dist/routers/school.d.ts.map +1 -0
  98. package/dist/routers/school.js +79 -0
  99. package/dist/routers/school.js.map +1 -0
  100. package/dist/routers/search.d.ts +1 -1
  101. package/dist/routers/worksheet.d.ts +23 -21
  102. package/dist/routers/worksheet.d.ts.map +1 -1
  103. package/dist/services/announcement.d.ts.map +1 -1
  104. package/dist/services/announcement.js +10 -6
  105. package/dist/services/announcement.js.map +1 -1
  106. package/dist/services/assignment.d.ts +36 -36
  107. package/dist/services/class.d.ts +20 -19
  108. package/dist/services/class.d.ts.map +1 -1
  109. package/dist/services/class.js +22 -3
  110. package/dist/services/class.js.map +1 -1
  111. package/dist/services/comment.d.ts +31 -5
  112. package/dist/services/comment.d.ts.map +1 -1
  113. package/dist/services/comment.js +102 -19
  114. package/dist/services/comment.js.map +1 -1
  115. package/dist/services/conversation.d.ts +6 -6
  116. package/dist/services/event.d.ts +21 -2
  117. package/dist/services/event.d.ts.map +1 -1
  118. package/dist/services/event.js +11 -7
  119. package/dist/services/event.js.map +1 -1
  120. package/dist/services/file.d.ts +2 -2
  121. package/dist/services/file.d.ts.map +1 -1
  122. package/dist/services/file.js +17 -8
  123. package/dist/services/file.js.map +1 -1
  124. package/dist/services/folder.d.ts +24 -24
  125. package/dist/services/labChat.d.ts +7 -7
  126. package/dist/services/school.d.ts +299 -0
  127. package/dist/services/school.d.ts.map +1 -0
  128. package/dist/services/school.js +225 -0
  129. package/dist/services/school.js.map +1 -0
  130. package/dist/services/worksheet.d.ts +23 -21
  131. package/dist/services/worksheet.d.ts.map +1 -1
  132. package/package.json +1 -1
  133. package/prisma/migrations/20260502230500_assignment_submission_comments/migration.sql +60 -0
  134. package/prisma/migrations/20260504071500_school_memberships/migration.sql +81 -0
  135. package/prisma/schema.prisma +75 -2
  136. package/src/lib/config/cors.ts +8 -1
  137. package/src/models/access.ts +48 -0
  138. package/src/models/announcement.ts +19 -2
  139. package/src/models/assignment.ts +17 -13
  140. package/src/models/attendance.ts +4 -3
  141. package/src/models/auth.ts +8 -9
  142. package/src/models/class.ts +8 -9
  143. package/src/models/comment.ts +137 -1
  144. package/src/models/event.ts +54 -4
  145. package/src/models/file.ts +53 -12
  146. package/src/models/folder.ts +3 -2
  147. package/src/models/labChat.ts +9 -8
  148. package/src/models/school.ts +361 -0
  149. package/src/models/section.ts +3 -2
  150. package/src/models/worksheet.ts +7 -12
  151. package/src/pipelines/aiLabChat.ts +2 -1
  152. package/src/routers/_app.ts +2 -0
  153. package/src/routers/announcement.ts +30 -4
  154. package/src/routers/assignment.ts +243 -2
  155. package/src/routers/class.ts +1 -0
  156. package/src/routers/comment.ts +19 -2
  157. package/src/routers/school.ts +122 -0
  158. package/src/services/announcement.ts +12 -4
  159. package/src/services/class.ts +25 -2
  160. package/src/services/comment.ts +122 -18
  161. package/src/services/event.ts +23 -6
  162. package/src/services/file.ts +20 -6
  163. package/src/services/school.ts +308 -0
  164. package/tests/lib/cors.test.ts +13 -1
  165. package/tests/routers/assignment.test.ts +68 -2
  166. package/tests/routers/comment.test.ts +42 -1
  167. package/vercel.json +8 -0
@@ -1,5 +1,5 @@
1
1
  import { test, expect, describe, beforeEach } from 'vitest';
2
- import { user1Caller, user2Caller } from '../setup';
2
+ import { user1Caller, user2Caller, user3Caller } from '../setup';
3
3
  import { expectForbidden, expectUnauth } from '../helpers';
4
4
 
5
5
  describe('Assignment Router', () => {
@@ -145,6 +145,73 @@ describe('Assignment Router', () => {
145
145
  });
146
146
  });
147
147
 
148
+ describe('comments', () => {
149
+ test('allows class members to add and read assignment-level comments', async () => {
150
+ const { comment } = await user2Caller.assignment.addComment({
151
+ classId: testClass.id,
152
+ assignmentId: testAssignment.id,
153
+ content: 'I have a question about this assignment.',
154
+ });
155
+
156
+ expect(comment.assignmentId).toBe(testAssignment.id);
157
+ expect(comment.submissionId).toBeNull();
158
+
159
+ const { comments } = await user1Caller.assignment.getComments({
160
+ classId: testClass.id,
161
+ assignmentId: testAssignment.id,
162
+ });
163
+
164
+ expect(comments.some((item) => item.id === comment.id)).toBe(true);
165
+ });
166
+
167
+ test('allows only the submission student and teachers to read private submission comments', async () => {
168
+ const submission = await user2Caller.assignment.getSubmission({
169
+ classId: testClass.id,
170
+ assignmentId: testAssignment.id,
171
+ });
172
+
173
+ const { comment } = await user1Caller.assignment.addSubmissionComment({
174
+ classId: testClass.id,
175
+ assignmentId: testAssignment.id,
176
+ submissionId: submission.id,
177
+ content: 'Private note for this submission.',
178
+ });
179
+
180
+ expect(comment.submissionId).toBe(submission.id);
181
+
182
+ const studentView = await user2Caller.assignment.getSubmissionComments({
183
+ classId: testClass.id,
184
+ assignmentId: testAssignment.id,
185
+ submissionId: submission.id,
186
+ });
187
+ expect(studentView.comments.some((item) => item.id === comment.id)).toBe(true);
188
+
189
+ const teacherView = await user1Caller.assignment.getSubmissionComments({
190
+ classId: testClass.id,
191
+ assignmentId: testAssignment.id,
192
+ submissionId: submission.id,
193
+ });
194
+ expect(teacherView.comments.some((item) => item.id === comment.id)).toBe(true);
195
+
196
+ const classmateProfile = await user3Caller.user.getProfile();
197
+ await user1Caller.class.addStudent({
198
+ classId: testClass.id,
199
+ studentId: classmateProfile.id,
200
+ });
201
+
202
+ await expect(
203
+ user3Caller.assignment.getSubmissionComments({
204
+ classId: testClass.id,
205
+ assignmentId: testAssignment.id,
206
+ submissionId: submission.id,
207
+ }),
208
+ ).rejects.toMatchObject({
209
+ code: 'NOT_FOUND',
210
+ message: 'Submission not found',
211
+ });
212
+ });
213
+ });
214
+
148
215
  // describe('getAll', () => {
149
216
  // test('should get all assignments for class', async () => {
150
217
  // const result = await user1Caller.assignment.get({
@@ -834,4 +901,3 @@ describe('Assignment Router', () => {
834
901
  });
835
902
  });
836
903
  });
837
-
@@ -1,5 +1,5 @@
1
1
  import { test, expect, describe, beforeAll } from 'vitest';
2
- import { user1Caller, user2Caller } from '../setup';
2
+ import { user1Caller, user2Caller, user3Caller } from '../setup';
3
3
 
4
4
  describe('Comment Router', () => {
5
5
  let testClass: any;
@@ -42,6 +42,47 @@ describe('Comment Router', () => {
42
42
  user1Caller.comment.get({ id: 'nonexistent-id' }),
43
43
  ).rejects.toThrow();
44
44
  });
45
+
46
+ test('should fail for users outside the comment class', async () => {
47
+ await expect(
48
+ user2Caller.comment.get({ id: commentId }),
49
+ ).rejects.toMatchObject({ code: 'FORBIDDEN' });
50
+ });
51
+
52
+ test('should fail for the author after class removal', async () => {
53
+ const removalClass = await user1Caller.class.create({
54
+ name: 'Removed Comment Author Class',
55
+ subject: 'History',
56
+ section: '11th Grade',
57
+ });
58
+ const user3Profile = await user3Caller.user.getProfile();
59
+ await user1Caller.class.addStudent({
60
+ classId: removalClass.id,
61
+ studentId: user3Profile.id,
62
+ });
63
+
64
+ const { announcement: removalAnnouncement } = await user1Caller.announcement.create({
65
+ classId: removalClass.id,
66
+ remarks: 'Announcement with removable author comment',
67
+ });
68
+ const { comment } = await user3Caller.announcement.addComment({
69
+ announcementId: removalAnnouncement.id,
70
+ classId: removalClass.id,
71
+ content: 'I should lose access when removed.',
72
+ });
73
+
74
+ await user1Caller.class.removeMember({
75
+ classId: removalClass.id,
76
+ userId: user3Profile.id,
77
+ });
78
+
79
+ await expect(
80
+ user3Caller.comment.get({ id: comment.id }),
81
+ ).rejects.toThrow();
82
+ await expect(
83
+ user3Caller.comment.update({ id: comment.id, content: 'Updated after removal' }),
84
+ ).rejects.toThrow();
85
+ });
45
86
  });
46
87
 
47
88
  describe('replyToComment', () => {
package/vercel.json ADDED
@@ -0,0 +1,8 @@
1
+ {
2
+ "fluid": true,
3
+ "functions": {
4
+ "src/index.ts": {
5
+ "maxDuration": 500
6
+ }
7
+ }
8
+ }