@studious-lms/server 1.6.0 → 1.8.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 (212) hide show
  1. package/dist/models/access.d.ts +21 -66
  2. package/dist/models/access.d.ts.map +1 -1
  3. package/dist/models/access.js +10 -26
  4. package/dist/models/access.js.map +1 -1
  5. package/dist/models/agenda.d.ts +2 -0
  6. package/dist/models/agenda.d.ts.map +1 -1
  7. package/dist/models/announcement.d.ts +2 -1
  8. package/dist/models/announcement.d.ts.map +1 -1
  9. package/dist/models/announcement.js +2 -3
  10. package/dist/models/announcement.js.map +1 -1
  11. package/dist/models/assignment.d.ts +7 -0
  12. package/dist/models/assignment.d.ts.map +1 -1
  13. package/dist/models/auth.d.ts +2 -4
  14. package/dist/models/auth.d.ts.map +1 -1
  15. package/dist/models/auth.js +2 -3
  16. package/dist/models/auth.js.map +1 -1
  17. package/dist/models/class.d.ts +32 -4
  18. package/dist/models/class.d.ts.map +1 -1
  19. package/dist/models/class.js +15 -2
  20. package/dist/models/class.js.map +1 -1
  21. package/dist/models/cloudStorage.d.ts +140 -0
  22. package/dist/models/cloudStorage.d.ts.map +1 -0
  23. package/dist/models/cloudStorage.js +175 -0
  24. package/dist/models/cloudStorage.js.map +1 -0
  25. package/dist/models/comment.d.ts +0 -24
  26. package/dist/models/comment.d.ts.map +1 -1
  27. package/dist/models/comment.js +2 -6
  28. package/dist/models/comment.js.map +1 -1
  29. package/dist/models/conversation.d.ts +38 -22
  30. package/dist/models/conversation.d.ts.map +1 -1
  31. package/dist/models/conversation.js +50 -2
  32. package/dist/models/conversation.js.map +1 -1
  33. package/dist/models/department.d.ts +154 -0
  34. package/dist/models/department.d.ts.map +1 -0
  35. package/dist/models/department.js +135 -0
  36. package/dist/models/department.js.map +1 -0
  37. package/dist/models/event.d.ts +7 -1
  38. package/dist/models/event.d.ts.map +1 -1
  39. package/dist/models/event.js +2 -5
  40. package/dist/models/event.js.map +1 -1
  41. package/dist/models/file.d.ts +25 -10
  42. package/dist/models/file.d.ts.map +1 -1
  43. package/dist/models/file.js +2 -5
  44. package/dist/models/file.js.map +1 -1
  45. package/dist/models/folder.d.ts +47 -0
  46. package/dist/models/folder.d.ts.map +1 -1
  47. package/dist/models/labChat.d.ts +5 -3
  48. package/dist/models/labChat.d.ts.map +1 -1
  49. package/dist/models/message.d.ts +46 -12
  50. package/dist/models/message.d.ts.map +1 -1
  51. package/dist/models/message.js +19 -10
  52. package/dist/models/message.js.map +1 -1
  53. package/dist/models/newtonChat.d.ts +2 -1
  54. package/dist/models/newtonChat.d.ts.map +1 -1
  55. package/dist/models/school.d.ts +45 -12
  56. package/dist/models/school.d.ts.map +1 -1
  57. package/dist/models/school.js +19 -2
  58. package/dist/models/school.js.map +1 -1
  59. package/dist/models/section.d.ts +1 -0
  60. package/dist/models/section.d.ts.map +1 -1
  61. package/dist/models/tag.d.ts +117 -0
  62. package/dist/models/tag.d.ts.map +1 -0
  63. package/dist/models/tag.js +113 -0
  64. package/dist/models/tag.js.map +1 -0
  65. package/dist/models/worksheet.d.ts +3 -0
  66. package/dist/models/worksheet.d.ts.map +1 -1
  67. package/dist/pipelines/aiLabChatContract.d.ts +8 -8
  68. package/dist/routers/_app.d.ts +3556 -2298
  69. package/dist/routers/_app.d.ts.map +1 -1
  70. package/dist/routers/_app.js +6 -2
  71. package/dist/routers/_app.js.map +1 -1
  72. package/dist/routers/agenda.d.ts +2 -0
  73. package/dist/routers/agenda.d.ts.map +1 -1
  74. package/dist/routers/announcement.d.ts.map +1 -1
  75. package/dist/routers/announcement.js +3 -5
  76. package/dist/routers/announcement.js.map +1 -1
  77. package/dist/routers/assignment.d.ts +18 -9
  78. package/dist/routers/assignment.d.ts.map +1 -1
  79. package/dist/routers/assignment.js +2 -3
  80. package/dist/routers/assignment.js.map +1 -1
  81. package/dist/routers/class.d.ts +87 -14
  82. package/dist/routers/class.d.ts.map +1 -1
  83. package/dist/routers/class.js +5 -2
  84. package/dist/routers/class.js.map +1 -1
  85. package/dist/routers/conversation.d.ts +20 -5
  86. package/dist/routers/conversation.d.ts.map +1 -1
  87. package/dist/routers/conversation.js +6 -3
  88. package/dist/routers/conversation.js.map +1 -1
  89. package/dist/routers/department.d.ts +293 -0
  90. package/dist/routers/department.d.ts.map +1 -0
  91. package/dist/routers/department.js +93 -0
  92. package/dist/routers/department.js.map +1 -0
  93. package/dist/routers/event.d.ts +2 -1
  94. package/dist/routers/event.d.ts.map +1 -1
  95. package/dist/routers/file.d.ts +8 -6
  96. package/dist/routers/file.d.ts.map +1 -1
  97. package/dist/routers/file.js +26 -17
  98. package/dist/routers/file.js.map +1 -1
  99. package/dist/routers/folder.d.ts +139 -186
  100. package/dist/routers/folder.d.ts.map +1 -1
  101. package/dist/routers/folder.js +82 -90
  102. package/dist/routers/folder.js.map +1 -1
  103. package/dist/routers/labChat.d.ts +11 -2
  104. package/dist/routers/labChat.d.ts.map +1 -1
  105. package/dist/routers/message.d.ts +20 -2
  106. package/dist/routers/message.d.ts.map +1 -1
  107. package/dist/routers/newtonChat.d.ts +9 -0
  108. package/dist/routers/newtonChat.d.ts.map +1 -1
  109. package/dist/routers/school.d.ts +160 -17
  110. package/dist/routers/school.d.ts.map +1 -1
  111. package/dist/routers/school.js +46 -3
  112. package/dist/routers/school.js.map +1 -1
  113. package/dist/routers/tag.d.ts +119 -0
  114. package/dist/routers/tag.d.ts.map +1 -0
  115. package/dist/routers/tag.js +52 -0
  116. package/dist/routers/tag.js.map +1 -0
  117. package/dist/routers/worksheet.d.ts +1 -0
  118. package/dist/routers/worksheet.d.ts.map +1 -1
  119. package/dist/seedDatabase.d.ts +0 -1
  120. package/dist/seedDatabase.d.ts.map +1 -1
  121. package/dist/services/agenda.d.ts +2 -0
  122. package/dist/services/agenda.d.ts.map +1 -1
  123. package/dist/services/assignment.d.ts +18 -9
  124. package/dist/services/assignment.d.ts.map +1 -1
  125. package/dist/services/assignment.js +4 -4
  126. package/dist/services/assignment.js.map +1 -1
  127. package/dist/services/class.d.ts +87 -14
  128. package/dist/services/class.d.ts.map +1 -1
  129. package/dist/services/class.js +91 -4
  130. package/dist/services/class.js.map +1 -1
  131. package/dist/services/conversation.d.ts +21 -5
  132. package/dist/services/conversation.d.ts.map +1 -1
  133. package/dist/services/conversation.js +22 -3
  134. package/dist/services/conversation.js.map +1 -1
  135. package/dist/services/department.d.ts +200 -0
  136. package/dist/services/department.d.ts.map +1 -0
  137. package/dist/services/department.js +368 -0
  138. package/dist/services/department.js.map +1 -0
  139. package/dist/services/event.d.ts +2 -1
  140. package/dist/services/event.d.ts.map +1 -1
  141. package/dist/services/file.d.ts +85 -0
  142. package/dist/services/file.d.ts.map +1 -1
  143. package/dist/services/file.js +92 -2
  144. package/dist/services/file.js.map +1 -1
  145. package/dist/services/folder.d.ts +125 -149
  146. package/dist/services/folder.d.ts.map +1 -1
  147. package/dist/services/folder.js +258 -199
  148. package/dist/services/folder.js.map +1 -1
  149. package/dist/services/labChat.d.ts +11 -2
  150. package/dist/services/labChat.d.ts.map +1 -1
  151. package/dist/services/labChat.js +8 -7
  152. package/dist/services/labChat.js.map +1 -1
  153. package/dist/services/message.d.ts +20 -2
  154. package/dist/services/message.d.ts.map +1 -1
  155. package/dist/services/message.js +7 -23
  156. package/dist/services/message.js.map +1 -1
  157. package/dist/services/newtonChat.d.ts +9 -0
  158. package/dist/services/newtonChat.d.ts.map +1 -1
  159. package/dist/services/newtonChat.js +7 -6
  160. package/dist/services/newtonChat.js.map +1 -1
  161. package/dist/services/school.d.ts +142 -15
  162. package/dist/services/school.d.ts.map +1 -1
  163. package/dist/services/school.js +308 -54
  164. package/dist/services/school.js.map +1 -1
  165. package/dist/services/tag.d.ts +71 -0
  166. package/dist/services/tag.d.ts.map +1 -0
  167. package/dist/services/tag.js +178 -0
  168. package/dist/services/tag.js.map +1 -0
  169. package/dist/services/worksheet.d.ts +1 -0
  170. package/dist/services/worksheet.d.ts.map +1 -1
  171. package/dist/utils/aiUser.d.ts.map +1 -1
  172. package/dist/utils/aiUser.js +2 -3
  173. package/dist/utils/aiUser.js.map +1 -1
  174. package/package.json +1 -1
  175. package/prisma/migrations/20260509220000_institution_overhaul/migration.sql +184 -0
  176. package/prisma/schema.prisma +119 -35
  177. package/src/models/access.ts +8 -24
  178. package/src/models/announcement.ts +0 -1
  179. package/src/models/auth.ts +0 -1
  180. package/src/models/class.ts +13 -0
  181. package/src/models/cloudStorage.ts +194 -0
  182. package/src/models/comment.ts +0 -4
  183. package/src/models/conversation.ts +54 -0
  184. package/src/models/department.ts +159 -0
  185. package/src/models/event.ts +0 -3
  186. package/src/models/file.ts +0 -3
  187. package/src/models/message.ts +19 -5
  188. package/src/models/school.ts +26 -0
  189. package/src/models/tag.ts +140 -0
  190. package/src/routers/_app.ts +4 -0
  191. package/src/routers/announcement.ts +1 -3
  192. package/src/routers/assignment.ts +0 -1
  193. package/src/routers/class.ts +3 -0
  194. package/src/routers/conversation.ts +7 -0
  195. package/src/routers/department.ts +174 -0
  196. package/src/routers/file.ts +29 -26
  197. package/src/routers/folder.ts +100 -121
  198. package/src/routers/school.ts +83 -0
  199. package/src/routers/tag.ts +78 -0
  200. package/src/services/assignment.ts +2 -3
  201. package/src/services/class.ts +108 -3
  202. package/src/services/conversation.ts +30 -0
  203. package/src/services/department.ts +478 -0
  204. package/src/services/file.ts +100 -0
  205. package/src/services/folder.ts +313 -240
  206. package/src/services/labChat.ts +7 -6
  207. package/src/services/message.ts +5 -21
  208. package/src/services/newtonChat.ts +5 -5
  209. package/src/services/school.ts +369 -57
  210. package/src/services/tag.ts +229 -0
  211. package/src/utils/aiUser.ts +0 -1
  212. package/tests/integration/routers/conversation.test.ts +121 -2
@@ -28,7 +28,6 @@ export declare const eventRouter: import("@trpc/server").TRPCBuiltRouter<{
28
28
  email: string;
29
29
  password: string;
30
30
  verified: boolean;
31
- role: import(".prisma/client").$Enums.UserRole;
32
31
  schoolId: string | null;
33
32
  } | null;
34
33
  class: ({
@@ -42,6 +41,7 @@ export declare const eventRouter: import("@trpc/server").TRPCBuiltRouter<{
42
41
  } & {
43
42
  name: string;
44
43
  id: string;
44
+ description: string | null;
45
45
  logoId: string | null;
46
46
  subdomain: string | null;
47
47
  createdAt: Date;
@@ -58,6 +58,7 @@ export declare const eventRouter: import("@trpc/server").TRPCBuiltRouter<{
58
58
  color: string | null;
59
59
  section: string;
60
60
  syllabus: string | null;
61
+ departmentId: string | null;
61
62
  }) | null;
62
63
  assignmentsAttached: {
63
64
  type: import(".prisma/client").$Enums.AssignmentType;
@@ -1 +1 @@
1
- {"version":3,"file":"event.d.ts","sourceRoot":"/","sources":["routers/event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAsBxB,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDtB,CAAC"}
1
+ {"version":3,"file":"event.d.ts","sourceRoot":"/","sources":["routers/event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAsBxB,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDtB,CAAC"}
@@ -1,4 +1,12 @@
1
1
  import { z } from "zod";
2
+ /**
3
+ * File router. Backed by the same unified scope-aware permission model as the
4
+ * folder router. The class files page and the cloud-storage page (personal /
5
+ * institution) both run through the same endpoints.
6
+ *
7
+ * Permissions are derived from the file's parent folder scope, so callers
8
+ * never need to send `classId` / `scope` — just the file id.
9
+ */
2
10
  export declare const fileRouter: import("@trpc/server").TRPCBuiltRouter<{
3
11
  ctx: import("../trpc.js").Context;
4
12
  meta: object;
@@ -27,8 +35,6 @@ export declare const fileRouter: import("@trpc/server").TRPCBuiltRouter<{
27
35
  }>;
28
36
  move: import("@trpc/server").TRPCMutationProcedure<{
29
37
  input: {
30
- [x: string]: unknown;
31
- classId: string;
32
38
  fileId: string;
33
39
  targetFolderId: string;
34
40
  };
@@ -69,8 +75,6 @@ export declare const fileRouter: import("@trpc/server").TRPCBuiltRouter<{
69
75
  }>;
70
76
  rename: import("@trpc/server").TRPCMutationProcedure<{
71
77
  input: {
72
- [x: string]: unknown;
73
- classId: string;
74
78
  fileId: string;
75
79
  newName: string;
76
80
  };
@@ -111,8 +115,6 @@ export declare const fileRouter: import("@trpc/server").TRPCBuiltRouter<{
111
115
  }>;
112
116
  delete: import("@trpc/server").TRPCMutationProcedure<{
113
117
  input: {
114
- [x: string]: unknown;
115
- classId: string;
116
118
  fileId: string;
117
119
  };
118
120
  output: {
@@ -1 +1 @@
1
- {"version":3,"file":"file.d.ts","sourceRoot":"/","sources":["routers/file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAaxB,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCrB,CAAC"}
1
+ {"version":3,"file":"file.d.ts","sourceRoot":"/","sources":["routers/file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCrB,CAAC"}
@@ -1,32 +1,41 @@
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]="f44142e2-ff83-5313-838b-11e431be8a3e")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="978fd381-abcb-514c-84a7-291fb8f62f7a")}catch(e){}}();
3
3
  import { z } from "zod";
4
- import { createTRPCRouter, protectedProcedure, protectedTeacherProcedure, } from "../trpc.js";
5
- import { getFileSignedUrl, moveFile, renameFile, deleteFileRecord, } from "../services/file.js";
4
+ import { createTRPCRouter, protectedProcedure } from "../trpc.js";
5
+ import { deleteFileGeneric, getFileSignedUrl, moveFileScoped, renameFileScoped, } from "../services/file.js";
6
+ /**
7
+ * File router. Backed by the same unified scope-aware permission model as the
8
+ * folder router. The class files page and the cloud-storage page (personal /
9
+ * institution) both run through the same endpoints.
10
+ *
11
+ * Permissions are derived from the file's parent folder scope, so callers
12
+ * never need to send `classId` / `scope` — just the file id.
13
+ */
6
14
  export const fileRouter = createTRPCRouter({
7
15
  getSignedUrl: protectedProcedure
8
16
  .input(z.object({ fileId: z.string() }))
9
17
  .mutation(({ ctx, input }) => getFileSignedUrl(ctx.user.id, input.fileId)),
10
- move: protectedTeacherProcedure
18
+ move: protectedProcedure
11
19
  .input(z.object({
12
20
  fileId: z.string(),
13
21
  targetFolderId: z.string(),
14
- classId: z.string(),
15
22
  }))
16
- .mutation(({ input }) => moveFile(input.fileId, input.targetFolderId)),
17
- rename: protectedTeacherProcedure
23
+ .mutation(({ ctx, input }) => moveFileScoped(ctx.user.id, {
24
+ fileId: input.fileId,
25
+ targetFolderId: input.targetFolderId,
26
+ })),
27
+ rename: protectedProcedure
18
28
  .input(z.object({
19
29
  fileId: z.string(),
20
- newName: z.string(),
21
- classId: z.string(),
30
+ newName: z.string().min(1),
22
31
  }))
23
- .mutation(({ input }) => renameFile(input.fileId, input.newName)),
24
- delete: protectedTeacherProcedure
25
- .input(z.object({
26
- fileId: z.string(),
27
- classId: z.string(),
28
- }))
29
- .mutation(({ input }) => deleteFileRecord(input.fileId, input.classId)),
32
+ .mutation(({ ctx, input }) => renameFileScoped(ctx.user.id, {
33
+ fileId: input.fileId,
34
+ newName: input.newName,
35
+ })),
36
+ delete: protectedProcedure
37
+ .input(z.object({ fileId: z.string() }))
38
+ .mutation(({ ctx, input }) => deleteFileGeneric(ctx.user.id, input.fileId)),
30
39
  });
31
40
  //# sourceMappingURL=file.js.map
32
- //# debugId=f44142e2-ff83-5313-838b-11e431be8a3e
41
+ //# debugId=978fd381-abcb-514c-84a7-291fb8f62f7a
@@ -1 +1 @@
1
- {"version":3,"file":"file.js","sources":["routers/file.ts"],"sourceRoot":"/","sourcesContent":["import { z } from \"zod\";\nimport {\n createTRPCRouter,\n protectedProcedure,\n protectedTeacherProcedure,\n} from \"../trpc.js\";\nimport {\n getFileSignedUrl,\n moveFile,\n renameFile,\n deleteFileRecord,\n} from \"../services/file.js\";\n\nexport const fileRouter = createTRPCRouter({\n getSignedUrl: protectedProcedure\n .input(z.object({ fileId: z.string() }))\n .mutation(({ ctx, input }) =>\n getFileSignedUrl(ctx.user!.id, input.fileId)\n ),\n\n move: protectedTeacherProcedure\n .input(\n z.object({\n fileId: z.string(),\n targetFolderId: z.string(),\n classId: z.string(),\n })\n )\n .mutation(({ input }) =>\n moveFile(input.fileId, input.targetFolderId)\n ),\n\n rename: protectedTeacherProcedure\n .input(\n z.object({\n fileId: z.string(),\n newName: z.string(),\n classId: z.string(),\n })\n )\n .mutation(({ input }) =>\n renameFile(input.fileId, input.newName)\n ),\n\n delete: protectedTeacherProcedure\n .input(\n z.object({\n fileId: z.string(),\n classId: z.string(),\n })\n )\n .mutation(({ input }) =>\n deleteFileRecord(input.fileId, input.classId)\n ),\n});\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,gBAAgB,EAChB,QAAQ,EACR,UAAU,EACV,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,CAAC,MAAM,UAAU,GAAG,gBAAgB,CAAC;IACzC,YAAY,EAAE,kBAAkB;SAC7B,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;SACvC,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAC3B,gBAAgB,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,CAC7C;IAEH,IAAI,EAAE,yBAAyB;SAC5B,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;QAClB,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE;QAC1B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;KACpB,CAAC,CACH;SACA,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CACtB,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,cAAc,CAAC,CAC7C;IAEH,MAAM,EAAE,yBAAyB;SAC9B,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;QAClB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;KACpB,CAAC,CACH;SACA,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CACtB,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CACxC;IAEH,MAAM,EAAE,yBAAyB;SAC9B,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;QAClB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;KACpB,CAAC,CACH;SACA,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CACtB,gBAAgB,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAC9C;CACJ,CAAC,CAAC","debug_id":"f44142e2-ff83-5313-838b-11e431be8a3e"}
1
+ {"version":3,"file":"file.js","sources":["routers/file.ts"],"sourceRoot":"/","sourcesContent":["import { z } from \"zod\";\nimport { createTRPCRouter, protectedProcedure } from \"../trpc.js\";\nimport {\n deleteFileGeneric,\n getFileSignedUrl,\n moveFileScoped,\n renameFileScoped,\n} from \"../services/file.js\";\n\n/**\n * File router. Backed by the same unified scope-aware permission model as the\n * folder router. The class files page and the cloud-storage page (personal /\n * institution) both run through the same endpoints.\n *\n * Permissions are derived from the file's parent folder scope, so callers\n * never need to send `classId` / `scope` — just the file id.\n */\nexport const fileRouter = createTRPCRouter({\n getSignedUrl: protectedProcedure\n .input(z.object({ fileId: z.string() }))\n .mutation(({ ctx, input }) =>\n getFileSignedUrl(ctx.user!.id, input.fileId)\n ),\n\n move: protectedProcedure\n .input(\n z.object({\n fileId: z.string(),\n targetFolderId: z.string(),\n })\n )\n .mutation(({ ctx, input }) =>\n moveFileScoped(ctx.user!.id, {\n fileId: input.fileId,\n targetFolderId: input.targetFolderId,\n })\n ),\n\n rename: protectedProcedure\n .input(\n z.object({\n fileId: z.string(),\n newName: z.string().min(1),\n })\n )\n .mutation(({ ctx, input }) =>\n renameFileScoped(ctx.user!.id, {\n fileId: input.fileId,\n newName: input.newName,\n })\n ),\n\n delete: protectedProcedure\n .input(z.object({ fileId: z.string() }))\n .mutation(({ ctx, input }) =>\n deleteFileGeneric(ctx.user!.id, input.fileId)\n ),\n});\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAE7B;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,gBAAgB,CAAC;IACzC,YAAY,EAAE,kBAAkB;SAC7B,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;SACvC,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAC3B,gBAAgB,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,CAC7C;IAEH,IAAI,EAAE,kBAAkB;SACrB,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;QAClB,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE;KAC3B,CAAC,CACH;SACA,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAC3B,cAAc,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE;QAC3B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,cAAc,EAAE,KAAK,CAAC,cAAc;KACrC,CAAC,CACH;IAEH,MAAM,EAAE,kBAAkB;SACvB,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;QAClB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;KAC3B,CAAC,CACH;SACA,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAC3B,gBAAgB,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE;QAC7B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC,CACH;IAEH,MAAM,EAAE,kBAAkB;SACvB,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;SACvC,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAC3B,iBAAiB,CAAC,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,CAC9C;CACJ,CAAC,CAAC","debug_id":"978fd381-abcb-514c-84a7-291fb8f62f7a"}
@@ -16,52 +16,110 @@ export declare const folderRouter: import("@trpc/server").TRPCBuiltRouter<{
16
16
  };
17
17
  transformer: false;
18
18
  }, import("@trpc/server").TRPCDecorateCreateRouterOptions<{
19
- create: import("@trpc/server").TRPCMutationProcedure<{
19
+ /** Browse a folder (or scope root) with breadcrumbs and access flag. */
20
+ browse: import("@trpc/server").TRPCQueryProcedure<{
20
21
  input: {
21
- [x: string]: unknown;
22
- classId: string;
23
- name: string;
24
- color?: string | undefined;
25
- parentFolderId?: string | undefined;
22
+ folderId: string;
23
+ } | {
24
+ scope: {
25
+ classId: string;
26
+ kind: "CLASS";
27
+ } | {
28
+ schoolId: string;
29
+ kind: "SCHOOL_STORAGE";
30
+ } | {
31
+ userId: string;
32
+ kind: "PERSONAL";
33
+ };
26
34
  };
27
35
  output: {
28
- files: {
29
- type: string;
30
- name: string;
31
- id: string;
32
- user: {
36
+ folder: {
37
+ files: {
38
+ path: string;
39
+ type: string;
40
+ name: string;
41
+ id: string;
42
+ user: {
43
+ id: string;
44
+ username: string;
45
+ } | null;
46
+ size: number | null;
47
+ uploadedAt: Date | null;
48
+ }[];
49
+ childFolders: {
50
+ name: string;
51
+ id: string;
52
+ color: string | null;
53
+ _count: {
54
+ files: number;
55
+ childFolders: number;
56
+ };
57
+ }[];
58
+ parentFolder: {
59
+ name: string;
33
60
  id: string;
34
- username: string;
35
61
  } | null;
36
- size: number | null;
37
- uploadedAt: Date | null;
62
+ } & {
63
+ name: string;
64
+ id: string;
65
+ color: string | null;
66
+ classId: string | null;
67
+ schoolStorageId: string | null;
68
+ personalOwnerId: string | null;
69
+ scope: import(".prisma/client").$Enums.FolderScope;
70
+ parentFolderId: string | null;
71
+ };
72
+ breadcrumbs: {
73
+ id: string;
74
+ name: string;
38
75
  }[];
39
- childFolders: {
76
+ canWrite: boolean;
77
+ scope: import("../models/cloudStorage.js").CloudScope;
78
+ };
79
+ meta: object;
80
+ }>;
81
+ /** What scopes can this user pick from in the cloud-storage UI? */
82
+ listScopes: import("@trpc/server").TRPCQueryProcedure<{
83
+ input: void;
84
+ output: {
85
+ personal: {
86
+ kind: "PERSONAL";
87
+ userId: string;
88
+ };
89
+ schools: {
90
+ id: string;
91
+ name: string;
92
+ logoId: string | null;
93
+ role: import(".prisma/client").$Enums.SchoolMembershipRole;
94
+ }[];
95
+ classes: {
40
96
  name: string;
41
97
  id: string;
98
+ schoolId: string | null;
99
+ subject: string;
42
100
  color: string | null;
43
- _count: {
44
- files: number;
45
- childFolders: number;
46
- };
101
+ section: string;
47
102
  }[];
48
- } & {
49
- name: string;
50
- id: string;
51
- color: string | null;
52
- classId: string | null;
53
- parentFolderId: string | null;
54
103
  };
55
104
  meta: object;
56
105
  }>;
57
- get: import("@trpc/server").TRPCQueryProcedure<{
106
+ /** Root folder for any scope (no folderId). */
107
+ getRootFolder: import("@trpc/server").TRPCQueryProcedure<{
58
108
  input: {
59
- [x: string]: unknown;
60
- classId: string;
61
- folderId: string;
109
+ scope: {
110
+ classId: string;
111
+ kind: "CLASS";
112
+ } | {
113
+ schoolId: string;
114
+ kind: "SCHOOL_STORAGE";
115
+ } | {
116
+ userId: string;
117
+ kind: "PERSONAL";
118
+ };
62
119
  };
63
120
  output: {
64
121
  files: {
122
+ path: string;
65
123
  type: string;
66
124
  name: string;
67
125
  id: string;
@@ -90,17 +148,20 @@ export declare const folderRouter: import("@trpc/server").TRPCBuiltRouter<{
90
148
  id: string;
91
149
  color: string | null;
92
150
  classId: string | null;
151
+ schoolStorageId: string | null;
152
+ personalOwnerId: string | null;
153
+ scope: import(".prisma/client").$Enums.FolderScope;
93
154
  parentFolderId: string | null;
94
155
  };
95
156
  meta: object;
96
157
  }>;
97
- getChildFolders: import("@trpc/server").TRPCQueryProcedure<{
158
+ get: import("@trpc/server").TRPCQueryProcedure<{
98
159
  input: {
99
- [x: string]: unknown;
100
- classId: string;
160
+ folderId: string;
101
161
  };
102
- output: ({
162
+ output: {
103
163
  files: {
164
+ path: string;
104
165
  type: string;
105
166
  name: string;
106
167
  id: string;
@@ -120,214 +181,106 @@ export declare const folderRouter: import("@trpc/server").TRPCBuiltRouter<{
120
181
  childFolders: number;
121
182
  };
122
183
  }[];
184
+ parentFolder: {
185
+ name: string;
186
+ id: string;
187
+ } | null;
123
188
  } & {
124
189
  name: string;
125
190
  id: string;
126
191
  color: string | null;
127
192
  classId: string | null;
193
+ schoolStorageId: string | null;
194
+ personalOwnerId: string | null;
195
+ scope: import(".prisma/client").$Enums.FolderScope;
128
196
  parentFolderId: string | null;
129
- })[];
197
+ };
130
198
  meta: object;
131
199
  }>;
132
- getFolderChildren: import("@trpc/server").TRPCQueryProcedure<{
200
+ getParents: import("@trpc/server").TRPCQueryProcedure<{
133
201
  input: {
134
- [x: string]: unknown;
135
- classId: string;
136
202
  folderId: string;
137
203
  };
138
204
  output: ({
139
- files: {
140
- type: string;
141
- name: string;
142
- id: string;
143
- user: {
144
- id: string;
145
- username: string;
146
- } | null;
147
- size: number | null;
148
- uploadedAt: Date | null;
149
- }[];
150
- childFolders: {
151
- name: string;
152
- id: string;
153
- color: string | null;
154
- _count: {
155
- files: number;
156
- childFolders: number;
157
- };
158
- }[];
159
- } & {
160
205
  name: string;
161
206
  id: string;
162
207
  color: string | null;
163
208
  classId: string | null;
209
+ schoolStorageId: string | null;
210
+ personalOwnerId: string | null;
211
+ scope: import(".prisma/client").$Enums.FolderScope;
164
212
  parentFolderId: string | null;
165
- })[];
213
+ } | null)[];
166
214
  meta: object;
167
215
  }>;
168
- getRootFolder: import("@trpc/server").TRPCQueryProcedure<{
216
+ create: import("@trpc/server").TRPCMutationProcedure<{
169
217
  input: {
170
- [x: string]: unknown;
171
- classId: string;
218
+ name: string;
219
+ color?: string | undefined;
220
+ scope?: {
221
+ classId: string;
222
+ kind: "CLASS";
223
+ } | {
224
+ schoolId: string;
225
+ kind: "SCHOOL_STORAGE";
226
+ } | {
227
+ userId: string;
228
+ kind: "PERSONAL";
229
+ } | undefined;
230
+ parentFolderId?: string | null | undefined;
172
231
  };
173
232
  output: {
174
- files: {
175
- type: string;
176
- name: string;
177
- id: string;
178
- user: {
179
- id: string;
180
- username: string;
181
- } | null;
182
- size: number | null;
183
- uploadedAt: Date | null;
184
- }[];
185
- childFolders: {
186
- name: string;
187
- id: string;
188
- color: string | null;
189
- _count: {
190
- files: number;
191
- childFolders: number;
192
- };
193
- files: {
194
- id: string;
195
- }[];
196
- childFolders: {
197
- id: string;
198
- }[];
199
- }[];
200
- } & {
201
233
  name: string;
202
234
  id: string;
203
235
  color: string | null;
204
236
  classId: string | null;
237
+ schoolStorageId: string | null;
238
+ personalOwnerId: string | null;
239
+ scope: import(".prisma/client").$Enums.FolderScope;
205
240
  parentFolderId: string | null;
206
241
  };
207
242
  meta: object;
208
243
  }>;
209
- uploadFiles: import("@trpc/server").TRPCMutationProcedure<{
244
+ update: import("@trpc/server").TRPCMutationProcedure<{
210
245
  input: {
211
- [x: string]: unknown;
212
- classId: string;
213
246
  folderId: string;
214
- files: {
215
- type: string;
216
- name: string;
217
- size: number;
218
- }[];
247
+ name?: string | undefined;
248
+ color?: string | undefined;
219
249
  };
220
250
  output: {
221
- success: boolean;
222
- uploadedCount: number;
251
+ name: string;
252
+ id: string;
253
+ color: string | null;
254
+ classId: string | null;
255
+ schoolStorageId: string | null;
256
+ personalOwnerId: string | null;
257
+ scope: import(".prisma/client").$Enums.FolderScope;
258
+ parentFolderId: string | null;
223
259
  };
224
260
  meta: object;
225
261
  }>;
226
262
  delete: import("@trpc/server").TRPCMutationProcedure<{
227
263
  input: {
228
- [x: string]: unknown;
229
- classId: string;
230
264
  folderId: string;
231
265
  };
232
266
  output: {
233
267
  success: boolean;
234
- deletedFiles: number;
235
- deletedFolders: number;
236
268
  };
237
269
  meta: object;
238
270
  }>;
239
271
  move: import("@trpc/server").TRPCMutationProcedure<{
240
272
  input: {
241
- [x: string]: unknown;
242
- classId: string;
243
273
  folderId: string;
244
274
  targetParentFolderId: string;
245
275
  };
246
276
  output: {
247
- files: {
248
- type: string;
249
- name: string;
250
- id: string;
251
- user: {
252
- id: string;
253
- username: string;
254
- } | null;
255
- size: number | null;
256
- uploadedAt: Date | null;
257
- }[];
258
- childFolders: {
259
- name: string;
260
- id: string;
261
- color: string | null;
262
- _count: {
263
- files: number;
264
- childFolders: number;
265
- };
266
- }[];
267
- } & {
268
- name: string;
269
- id: string;
270
- color: string | null;
271
- classId: string | null;
272
- parentFolderId: string | null;
273
- };
274
- meta: object;
275
- }>;
276
- update: import("@trpc/server").TRPCMutationProcedure<{
277
- input: {
278
- [x: string]: unknown;
279
- classId: string;
280
- name: string;
281
- folderId: string;
282
- color?: string | undefined;
283
- };
284
- output: {
285
- files: {
286
- type: string;
287
- name: string;
288
- id: string;
289
- user: {
290
- id: string;
291
- username: string;
292
- } | null;
293
- size: number | null;
294
- uploadedAt: Date | null;
295
- }[];
296
- childFolders: {
297
- name: string;
298
- id: string;
299
- color: string | null;
300
- _count: {
301
- files: number;
302
- childFolders: number;
303
- };
304
- }[];
305
- } & {
306
- name: string;
307
- id: string;
308
- color: string | null;
309
- classId: string | null;
310
- parentFolderId: string | null;
311
- };
312
- meta: object;
313
- }>;
314
- getParents: import("@trpc/server").TRPCQueryProcedure<{
315
- input: {
316
- folderId: string;
277
+ success: boolean;
317
278
  };
318
- output: ({
319
- name: string;
320
- id: string;
321
- color: string | null;
322
- classId: string | null;
323
- parentFolderId: string | null;
324
- } | null)[];
325
279
  meta: object;
326
280
  }>;
281
+ /** Get signed upload URLs for direct-to-GCS upload. */
327
282
  getFolderUploadUrls: import("@trpc/server").TRPCMutationProcedure<{
328
283
  input: {
329
- [x: string]: unknown;
330
- classId: string;
331
284
  folderId: string;
332
285
  files: {
333
286
  type: string;
@@ -338,12 +291,12 @@ export declare const folderRouter: import("@trpc/server").TRPCBuiltRouter<{
338
291
  output: import("../lib/fileUpload.js").DirectUploadFile[];
339
292
  meta: object;
340
293
  }>;
294
+ /** Acknowledge a direct upload completed (or failed). */
341
295
  confirmFolderUpload: import("@trpc/server").TRPCMutationProcedure<{
342
296
  input: {
343
- [x: string]: unknown;
344
- classId: string;
345
297
  fileId: string;
346
298
  uploadSuccess: boolean;
299
+ errorMessage?: string | undefined;
347
300
  };
348
301
  output: {
349
302
  success: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"folder.d.ts","sourceRoot":"/","sources":["routers/folder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA0CxB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqIvB,CAAC"}
1
+ {"version":3,"file":"folder.d.ts","sourceRoot":"/","sources":["routers/folder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA0CxB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;IACvB,wEAAwE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAUxE,mEAAmE;;;;;;;;;;;;;;;;;;;;;;;;;IAKnE,+CAA+C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAiE/C,uDAAuD;;;;;;;;;;;;;IAevD,yDAAyD;;;;;;;;;;;;GAgBzD,CAAC"}