@studious-lms/server 1.7.0 → 1.9.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/middleware/security.d.ts.map +1 -1
  2. package/dist/middleware/security.js +3 -3
  3. package/dist/middleware/security.js.map +1 -1
  4. package/dist/models/access.d.ts +21 -66
  5. package/dist/models/access.d.ts.map +1 -1
  6. package/dist/models/access.js +10 -26
  7. package/dist/models/access.js.map +1 -1
  8. package/dist/models/agenda.d.ts +4 -2
  9. package/dist/models/agenda.d.ts.map +1 -1
  10. package/dist/models/announcement.d.ts +4 -3
  11. package/dist/models/announcement.d.ts.map +1 -1
  12. package/dist/models/announcement.js +2 -3
  13. package/dist/models/announcement.js.map +1 -1
  14. package/dist/models/assignment.d.ts +40 -33
  15. package/dist/models/assignment.d.ts.map +1 -1
  16. package/dist/models/auth.d.ts +2 -4
  17. package/dist/models/auth.d.ts.map +1 -1
  18. package/dist/models/auth.js +2 -3
  19. package/dist/models/auth.js.map +1 -1
  20. package/dist/models/class.d.ts +34 -6
  21. package/dist/models/class.d.ts.map +1 -1
  22. package/dist/models/class.js +15 -2
  23. package/dist/models/class.js.map +1 -1
  24. package/dist/models/cloudStorage.d.ts +153 -0
  25. package/dist/models/cloudStorage.d.ts.map +1 -0
  26. package/dist/models/cloudStorage.js +295 -0
  27. package/dist/models/cloudStorage.js.map +1 -0
  28. package/dist/models/comment.d.ts +0 -24
  29. package/dist/models/comment.d.ts.map +1 -1
  30. package/dist/models/comment.js +2 -6
  31. package/dist/models/comment.js.map +1 -1
  32. package/dist/models/conversation.d.ts +22 -22
  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 +10 -4
  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 +52 -36
  42. package/dist/models/file.d.ts.map +1 -1
  43. package/dist/models/file.js +4 -42
  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 +11 -9
  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 +2 -1
  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 +6704 -5222
  69. package/dist/routers/_app.d.ts.map +1 -1
  70. package/dist/routers/_app.js +8 -2
  71. package/dist/routers/_app.js.map +1 -1
  72. package/dist/routers/agenda.d.ts +4 -2
  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 +49 -40
  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 +92 -19
  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 +5 -5
  86. package/dist/routers/department.d.ts +293 -0
  87. package/dist/routers/department.d.ts.map +1 -0
  88. package/dist/routers/department.js +93 -0
  89. package/dist/routers/department.js.map +1 -0
  90. package/dist/routers/event.d.ts +4 -3
  91. package/dist/routers/event.d.ts.map +1 -1
  92. package/dist/routers/file.d.ts +10 -8
  93. package/dist/routers/file.d.ts.map +1 -1
  94. package/dist/routers/file.js +26 -17
  95. package/dist/routers/file.js.map +1 -1
  96. package/dist/routers/folder.d.ts +163 -186
  97. package/dist/routers/folder.d.ts.map +1 -1
  98. package/dist/routers/folder.js +102 -88
  99. package/dist/routers/folder.js.map +1 -1
  100. package/dist/routers/labChat.d.ts +13 -4
  101. package/dist/routers/labChat.d.ts.map +1 -1
  102. package/dist/routers/message.d.ts +20 -2
  103. package/dist/routers/message.d.ts.map +1 -1
  104. package/dist/routers/newtonChat.d.ts +10 -1
  105. package/dist/routers/newtonChat.d.ts.map +1 -1
  106. package/dist/routers/permissions.d.ts +120 -0
  107. package/dist/routers/permissions.d.ts.map +1 -0
  108. package/dist/routers/permissions.js +50 -0
  109. package/dist/routers/permissions.js.map +1 -0
  110. package/dist/routers/school.d.ts +160 -17
  111. package/dist/routers/school.d.ts.map +1 -1
  112. package/dist/routers/school.js +46 -3
  113. package/dist/routers/school.js.map +1 -1
  114. package/dist/routers/tag.d.ts +119 -0
  115. package/dist/routers/tag.d.ts.map +1 -0
  116. package/dist/routers/tag.js +52 -0
  117. package/dist/routers/tag.js.map +1 -0
  118. package/dist/routers/worksheet.d.ts +1 -0
  119. package/dist/routers/worksheet.d.ts.map +1 -1
  120. package/dist/seedDatabase.d.ts +0 -1
  121. package/dist/seedDatabase.d.ts.map +1 -1
  122. package/dist/services/agenda.d.ts +4 -2
  123. package/dist/services/agenda.d.ts.map +1 -1
  124. package/dist/services/assignment.d.ts +49 -40
  125. package/dist/services/assignment.d.ts.map +1 -1
  126. package/dist/services/class.d.ts +92 -19
  127. package/dist/services/class.d.ts.map +1 -1
  128. package/dist/services/class.js +92 -5
  129. package/dist/services/class.js.map +1 -1
  130. package/dist/services/conversation.d.ts +5 -5
  131. package/dist/services/department.d.ts +200 -0
  132. package/dist/services/department.d.ts.map +1 -0
  133. package/dist/services/department.js +368 -0
  134. package/dist/services/department.js.map +1 -0
  135. package/dist/services/event.d.ts +4 -3
  136. package/dist/services/event.d.ts.map +1 -1
  137. package/dist/services/file.d.ts +105 -3
  138. package/dist/services/file.d.ts.map +1 -1
  139. package/dist/services/file.js +167 -41
  140. package/dist/services/file.js.map +1 -1
  141. package/dist/services/folder.d.ts +220 -149
  142. package/dist/services/folder.d.ts.map +1 -1
  143. package/dist/services/folder.js +326 -196
  144. package/dist/services/folder.js.map +1 -1
  145. package/dist/services/labChat.d.ts +13 -4
  146. package/dist/services/labChat.d.ts.map +1 -1
  147. package/dist/services/labChat.js +4 -3
  148. package/dist/services/labChat.js.map +1 -1
  149. package/dist/services/message.d.ts +20 -2
  150. package/dist/services/message.d.ts.map +1 -1
  151. package/dist/services/message.js +7 -23
  152. package/dist/services/message.js.map +1 -1
  153. package/dist/services/newtonChat.d.ts +9 -0
  154. package/dist/services/newtonChat.d.ts.map +1 -1
  155. package/dist/services/newtonChat.js +4 -3
  156. package/dist/services/newtonChat.js.map +1 -1
  157. package/dist/services/permissions.d.ts +188 -0
  158. package/dist/services/permissions.d.ts.map +1 -0
  159. package/dist/services/permissions.js +661 -0
  160. package/dist/services/permissions.js.map +1 -0
  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/migrations/20260510170000_add_folder_permissions/migration.sql +93 -0
  177. package/prisma/schema.prisma +193 -35
  178. package/src/middleware/security.ts +1 -1
  179. package/src/models/access.ts +8 -24
  180. package/src/models/announcement.ts +0 -1
  181. package/src/models/auth.ts +0 -1
  182. package/src/models/class.ts +13 -0
  183. package/src/models/cloudStorage.ts +327 -0
  184. package/src/models/comment.ts +0 -4
  185. package/src/models/department.ts +159 -0
  186. package/src/models/event.ts +0 -3
  187. package/src/models/file.ts +2 -40
  188. package/src/models/message.ts +19 -5
  189. package/src/models/school.ts +26 -0
  190. package/src/models/tag.ts +140 -0
  191. package/src/routers/_app.ts +6 -0
  192. package/src/routers/announcement.ts +1 -3
  193. package/src/routers/assignment.ts +0 -1
  194. package/src/routers/class.ts +3 -0
  195. package/src/routers/department.ts +174 -0
  196. package/src/routers/file.ts +29 -26
  197. package/src/routers/folder.ts +127 -118
  198. package/src/routers/permissions.ts +71 -0
  199. package/src/routers/school.ts +83 -0
  200. package/src/routers/tag.ts +78 -0
  201. package/src/services/class.ts +109 -4
  202. package/src/services/department.ts +478 -0
  203. package/src/services/file.ts +172 -43
  204. package/src/services/folder.ts +399 -237
  205. package/src/services/labChat.ts +2 -1
  206. package/src/services/message.ts +5 -21
  207. package/src/services/newtonChat.ts +2 -1
  208. package/src/services/permissions.ts +778 -0
  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/unit/services/permissions.test.ts +463 -0
@@ -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
  };
@@ -43,6 +49,7 @@ export declare const fileRouter: import("@trpc/server").TRPCBuiltRouter<{
43
49
  name: string;
44
50
  id: string;
45
51
  userId: string | null;
52
+ folderId: string | null;
46
53
  size: number | null;
47
54
  uploadedAt: Date | null;
48
55
  uploadStatus: import(".prisma/client").$Enums.UploadStatus;
@@ -59,7 +66,6 @@ export declare const fileRouter: import("@trpc/server").TRPCBuiltRouter<{
59
66
  submissionId: string | null;
60
67
  annotationId: string | null;
61
68
  classDraftId: string | null;
62
- folderId: string | null;
63
69
  conversationId: string | null;
64
70
  messageId: string | null;
65
71
  announcementId: string | null;
@@ -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
  };
@@ -85,6 +89,7 @@ export declare const fileRouter: import("@trpc/server").TRPCBuiltRouter<{
85
89
  name: string;
86
90
  id: string;
87
91
  userId: string | null;
92
+ folderId: string | null;
88
93
  size: number | null;
89
94
  uploadedAt: Date | null;
90
95
  uploadStatus: import(".prisma/client").$Enums.UploadStatus;
@@ -101,7 +106,6 @@ export declare const fileRouter: import("@trpc/server").TRPCBuiltRouter<{
101
106
  submissionId: string | null;
102
107
  annotationId: string | null;
103
108
  classDraftId: string | null;
104
- folderId: string | null;
105
109
  conversationId: string | null;
106
110
  messageId: string | null;
107
111
  announcementId: string | null;
@@ -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,134 @@ 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
+ } | {
34
+ kind: "SHARED_WITH_ME";
35
+ };
26
36
  };
27
37
  output: {
28
- files: {
29
- type: string;
30
- name: string;
31
- id: string;
32
- user: {
38
+ folder: {
39
+ files: {
40
+ path: string;
41
+ type: string;
42
+ name: string;
43
+ id: string;
44
+ user: {
45
+ id: string;
46
+ username: string;
47
+ } | null;
48
+ size: number | null;
49
+ uploadedAt: Date | null;
50
+ }[];
51
+ childFolders: {
52
+ name: string;
53
+ id: string;
54
+ color: string | null;
55
+ _count: {
56
+ files: number;
57
+ childFolders: number;
58
+ };
59
+ }[];
60
+ parentFolder: {
61
+ name: string;
33
62
  id: string;
34
- username: string;
35
63
  } | null;
36
- size: number | null;
37
- uploadedAt: Date | null;
64
+ } & {
65
+ name: string;
66
+ id: string;
67
+ color: string | null;
68
+ classId: string | null;
69
+ schoolStorageId: string | null;
70
+ personalOwnerId: string | null;
71
+ scope: import(".prisma/client").$Enums.FolderScope;
72
+ parentFolderId: string | null;
73
+ };
74
+ breadcrumbs: {
75
+ id: string;
76
+ name: string;
38
77
  }[];
39
- childFolders: {
78
+ canWrite: boolean;
79
+ scope: import("../models/cloudStorage.js").CloudScope;
80
+ displayRoot: {
81
+ kind: "SHARED_WITH_ME";
82
+ name: string;
83
+ } | null;
84
+ };
85
+ meta: object;
86
+ }>;
87
+ /** Top-most folders/files explicitly shared with the caller (Drive-style). */
88
+ listSharedWithMe: import("@trpc/server").TRPCQueryProcedure<{
89
+ input: void;
90
+ output: {
91
+ folders: {
92
+ id: string;
93
+ name: string;
94
+ color: string | null;
95
+ }[];
96
+ files: never[];
97
+ };
98
+ meta: object;
99
+ }>;
100
+ /** What scopes can this user pick from in the cloud-storage UI? */
101
+ listScopes: import("@trpc/server").TRPCQueryProcedure<{
102
+ input: void;
103
+ output: {
104
+ personal: {
105
+ kind: "PERSONAL";
106
+ userId: string;
107
+ };
108
+ schools: {
109
+ id: string;
110
+ name: string;
111
+ logoId: string | null;
112
+ role: import(".prisma/client").$Enums.SchoolMembershipRole;
113
+ }[];
114
+ classes: {
40
115
  name: string;
41
116
  id: string;
117
+ schoolId: string | null;
118
+ subject: string;
42
119
  color: string | null;
43
- _count: {
44
- files: number;
45
- childFolders: number;
46
- };
120
+ section: string;
47
121
  }[];
48
- } & {
49
- name: string;
50
- id: string;
51
- color: string | null;
52
- classId: string | null;
53
- parentFolderId: string | null;
122
+ sharedWithMe: {
123
+ kind: "SHARED_WITH_ME";
124
+ folderCount: number;
125
+ fileCount: number;
126
+ };
54
127
  };
55
128
  meta: object;
56
129
  }>;
57
- get: import("@trpc/server").TRPCQueryProcedure<{
130
+ /** Root folder for any scope (no folderId). */
131
+ getRootFolder: import("@trpc/server").TRPCQueryProcedure<{
58
132
  input: {
59
- [x: string]: unknown;
60
- classId: string;
61
- folderId: string;
133
+ scope: {
134
+ classId: string;
135
+ kind: "CLASS";
136
+ } | {
137
+ schoolId: string;
138
+ kind: "SCHOOL_STORAGE";
139
+ } | {
140
+ userId: string;
141
+ kind: "PERSONAL";
142
+ };
62
143
  };
63
144
  output: {
64
145
  files: {
146
+ path: string;
65
147
  type: string;
66
148
  name: string;
67
149
  id: string;
@@ -90,17 +172,20 @@ export declare const folderRouter: import("@trpc/server").TRPCBuiltRouter<{
90
172
  id: string;
91
173
  color: string | null;
92
174
  classId: string | null;
175
+ schoolStorageId: string | null;
176
+ personalOwnerId: string | null;
177
+ scope: import(".prisma/client").$Enums.FolderScope;
93
178
  parentFolderId: string | null;
94
179
  };
95
180
  meta: object;
96
181
  }>;
97
- getChildFolders: import("@trpc/server").TRPCQueryProcedure<{
182
+ get: import("@trpc/server").TRPCQueryProcedure<{
98
183
  input: {
99
- [x: string]: unknown;
100
- classId: string;
184
+ folderId: string;
101
185
  };
102
- output: ({
186
+ output: {
103
187
  files: {
188
+ path: string;
104
189
  type: string;
105
190
  name: string;
106
191
  id: string;
@@ -120,214 +205,106 @@ export declare const folderRouter: import("@trpc/server").TRPCBuiltRouter<{
120
205
  childFolders: number;
121
206
  };
122
207
  }[];
208
+ parentFolder: {
209
+ name: string;
210
+ id: string;
211
+ } | null;
123
212
  } & {
124
213
  name: string;
125
214
  id: string;
126
215
  color: string | null;
127
216
  classId: string | null;
217
+ schoolStorageId: string | null;
218
+ personalOwnerId: string | null;
219
+ scope: import(".prisma/client").$Enums.FolderScope;
128
220
  parentFolderId: string | null;
129
- })[];
221
+ };
130
222
  meta: object;
131
223
  }>;
132
- getFolderChildren: import("@trpc/server").TRPCQueryProcedure<{
224
+ getParents: import("@trpc/server").TRPCQueryProcedure<{
133
225
  input: {
134
- [x: string]: unknown;
135
- classId: string;
136
226
  folderId: string;
137
227
  };
138
228
  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
229
  name: string;
161
230
  id: string;
162
231
  color: string | null;
163
232
  classId: string | null;
233
+ schoolStorageId: string | null;
234
+ personalOwnerId: string | null;
235
+ scope: import(".prisma/client").$Enums.FolderScope;
164
236
  parentFolderId: string | null;
165
- })[];
237
+ } | null)[];
166
238
  meta: object;
167
239
  }>;
168
- getRootFolder: import("@trpc/server").TRPCQueryProcedure<{
240
+ create: import("@trpc/server").TRPCMutationProcedure<{
169
241
  input: {
170
- [x: string]: unknown;
171
- classId: string;
242
+ name: string;
243
+ color?: string | undefined;
244
+ scope?: {
245
+ classId: string;
246
+ kind: "CLASS";
247
+ } | {
248
+ schoolId: string;
249
+ kind: "SCHOOL_STORAGE";
250
+ } | {
251
+ userId: string;
252
+ kind: "PERSONAL";
253
+ } | undefined;
254
+ parentFolderId?: string | null | undefined;
172
255
  };
173
256
  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
257
  name: string;
202
258
  id: string;
203
259
  color: string | null;
204
260
  classId: string | null;
261
+ schoolStorageId: string | null;
262
+ personalOwnerId: string | null;
263
+ scope: import(".prisma/client").$Enums.FolderScope;
205
264
  parentFolderId: string | null;
206
265
  };
207
266
  meta: object;
208
267
  }>;
209
- uploadFiles: import("@trpc/server").TRPCMutationProcedure<{
268
+ update: import("@trpc/server").TRPCMutationProcedure<{
210
269
  input: {
211
- [x: string]: unknown;
212
- classId: string;
213
270
  folderId: string;
214
- files: {
215
- type: string;
216
- name: string;
217
- size: number;
218
- }[];
271
+ name?: string | undefined;
272
+ color?: string | undefined;
219
273
  };
220
274
  output: {
221
- success: boolean;
222
- uploadedCount: number;
275
+ name: string;
276
+ id: string;
277
+ color: string | null;
278
+ classId: string | null;
279
+ schoolStorageId: string | null;
280
+ personalOwnerId: string | null;
281
+ scope: import(".prisma/client").$Enums.FolderScope;
282
+ parentFolderId: string | null;
223
283
  };
224
284
  meta: object;
225
285
  }>;
226
286
  delete: import("@trpc/server").TRPCMutationProcedure<{
227
287
  input: {
228
- [x: string]: unknown;
229
- classId: string;
230
288
  folderId: string;
231
289
  };
232
290
  output: {
233
291
  success: boolean;
234
- deletedFiles: number;
235
- deletedFolders: number;
236
292
  };
237
293
  meta: object;
238
294
  }>;
239
295
  move: import("@trpc/server").TRPCMutationProcedure<{
240
296
  input: {
241
- [x: string]: unknown;
242
- classId: string;
243
297
  folderId: string;
244
298
  targetParentFolderId: string;
245
299
  };
246
300
  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;
301
+ success: boolean;
317
302
  };
318
- output: ({
319
- name: string;
320
- id: string;
321
- color: string | null;
322
- classId: string | null;
323
- parentFolderId: string | null;
324
- } | null)[];
325
303
  meta: object;
326
304
  }>;
305
+ /** Get signed upload URLs for direct-to-GCS upload. */
327
306
  getFolderUploadUrls: import("@trpc/server").TRPCMutationProcedure<{
328
307
  input: {
329
- [x: string]: unknown;
330
- classId: string;
331
308
  folderId: string;
332
309
  files: {
333
310
  type: string;
@@ -338,12 +315,12 @@ export declare const folderRouter: import("@trpc/server").TRPCBuiltRouter<{
338
315
  output: import("../lib/fileUpload.js").DirectUploadFile[];
339
316
  meta: object;
340
317
  }>;
318
+ /** Acknowledge a direct upload completed (or failed). */
341
319
  confirmFolderUpload: import("@trpc/server").TRPCMutationProcedure<{
342
320
  input: {
343
- [x: string]: unknown;
344
- classId: string;
345
321
  fileId: string;
346
322
  uploadSuccess: boolean;
323
+ errorMessage?: string | undefined;
347
324
  };
348
325
  output: {
349
326
  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;AAyDxB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;IACvB,wEAAwE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAoBxE,8EAA8E;;;;;;;;;;;;;IAK9E,mEAAmE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAKnE,+CAA+C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAiE/C,uDAAuD;;;;;;;;;;;;;IAevD,yDAAyD;;;;;;;;;;;;GAgBzD,CAAC"}