@studious-lms/server 1.0.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 (103) hide show
  1. package/LICENSE.txt +8 -0
  2. package/README.md +143 -0
  3. package/dist/exportType.d.ts +9 -0
  4. package/dist/exportType.d.ts.map +1 -0
  5. package/dist/exportType.js +7 -0
  6. package/dist/index.d.ts +2 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +82 -0
  9. package/dist/lib/fileUpload.d.ts +38 -0
  10. package/dist/lib/fileUpload.d.ts.map +1 -0
  11. package/dist/lib/fileUpload.js +136 -0
  12. package/dist/lib/googleCloudStorage.d.ts +20 -0
  13. package/dist/lib/googleCloudStorage.d.ts.map +1 -0
  14. package/dist/lib/googleCloudStorage.js +88 -0
  15. package/dist/lib/prisma.d.ts +8 -0
  16. package/dist/lib/prisma.d.ts.map +1 -0
  17. package/dist/lib/prisma.js +11 -0
  18. package/dist/lib/thumbnailGenerator.d.ts +23 -0
  19. package/dist/lib/thumbnailGenerator.d.ts.map +1 -0
  20. package/dist/lib/thumbnailGenerator.js +180 -0
  21. package/dist/logger.d.ts +26 -0
  22. package/dist/logger.d.ts.map +1 -0
  23. package/dist/logger.js +135 -0
  24. package/dist/middleware/auth.d.ts +7 -0
  25. package/dist/middleware/auth.d.ts.map +1 -0
  26. package/dist/middleware/auth.js +170 -0
  27. package/dist/middleware/logging.d.ts +2 -0
  28. package/dist/middleware/logging.d.ts.map +1 -0
  29. package/dist/middleware/logging.js +51 -0
  30. package/dist/routers/_app.d.ts +4369 -0
  31. package/dist/routers/_app.d.ts.map +1 -0
  32. package/dist/routers/_app.js +29 -0
  33. package/dist/routers/agenda.d.ts +66 -0
  34. package/dist/routers/agenda.d.ts.map +1 -0
  35. package/dist/routers/agenda.js +78 -0
  36. package/dist/routers/announcement.d.ts +79 -0
  37. package/dist/routers/announcement.d.ts.map +1 -0
  38. package/dist/routers/announcement.js +122 -0
  39. package/dist/routers/assignment.d.ts +1051 -0
  40. package/dist/routers/assignment.d.ts.map +1 -0
  41. package/dist/routers/assignment.js +1497 -0
  42. package/dist/routers/attendance.d.ts +99 -0
  43. package/dist/routers/attendance.d.ts.map +1 -0
  44. package/dist/routers/attendance.js +269 -0
  45. package/dist/routers/auth.d.ts +87 -0
  46. package/dist/routers/auth.d.ts.map +1 -0
  47. package/dist/routers/auth.js +255 -0
  48. package/dist/routers/class.d.ts +427 -0
  49. package/dist/routers/class.d.ts.map +1 -0
  50. package/dist/routers/class.js +693 -0
  51. package/dist/routers/event.d.ts +249 -0
  52. package/dist/routers/event.d.ts.map +1 -0
  53. package/dist/routers/event.js +467 -0
  54. package/dist/routers/file.d.ts +27 -0
  55. package/dist/routers/file.d.ts.map +1 -0
  56. package/dist/routers/file.js +88 -0
  57. package/dist/routers/section.d.ts +51 -0
  58. package/dist/routers/section.d.ts.map +1 -0
  59. package/dist/routers/section.js +123 -0
  60. package/dist/routers/user.d.ts +49 -0
  61. package/dist/routers/user.d.ts.map +1 -0
  62. package/dist/routers/user.js +74 -0
  63. package/dist/socket/handlers.d.ts +3 -0
  64. package/dist/socket/handlers.d.ts.map +1 -0
  65. package/dist/socket/handlers.js +130 -0
  66. package/dist/trpc.d.ts +147 -0
  67. package/dist/trpc.d.ts.map +1 -0
  68. package/dist/trpc.js +67 -0
  69. package/dist/types/trpc.d.ts +16 -0
  70. package/dist/types/trpc.d.ts.map +1 -0
  71. package/dist/types/trpc.js +2 -0
  72. package/dist/utils/email.d.ts +3 -0
  73. package/dist/utils/email.d.ts.map +1 -0
  74. package/dist/utils/email.js +16 -0
  75. package/dist/utils/generateInviteCode.d.ts +6 -0
  76. package/dist/utils/generateInviteCode.d.ts.map +1 -0
  77. package/dist/utils/generateInviteCode.js +11 -0
  78. package/dist/utils/logger.d.ts +27 -0
  79. package/dist/utils/logger.d.ts.map +1 -0
  80. package/dist/utils/logger.js +124 -0
  81. package/generated/prisma/client.d.ts +1 -0
  82. package/generated/prisma/client.js +4 -0
  83. package/generated/prisma/default.d.ts +1 -0
  84. package/generated/prisma/default.js +4 -0
  85. package/generated/prisma/edge.d.ts +1 -0
  86. package/generated/prisma/edge.js +389 -0
  87. package/generated/prisma/index-browser.js +375 -0
  88. package/generated/prisma/index.d.ts +34865 -0
  89. package/generated/prisma/index.js +410 -0
  90. package/generated/prisma/libquery_engine-darwin-arm64.dylib.node +0 -0
  91. package/generated/prisma/package.json +140 -0
  92. package/generated/prisma/runtime/edge-esm.js +34 -0
  93. package/generated/prisma/runtime/edge.js +34 -0
  94. package/generated/prisma/runtime/index-browser.d.ts +370 -0
  95. package/generated/prisma/runtime/index-browser.js +16 -0
  96. package/generated/prisma/runtime/library.d.ts +3647 -0
  97. package/generated/prisma/runtime/library.js +146 -0
  98. package/generated/prisma/runtime/react-native.js +83 -0
  99. package/generated/prisma/runtime/wasm.js +35 -0
  100. package/generated/prisma/schema.prisma +304 -0
  101. package/generated/prisma/wasm.d.ts +1 -0
  102. package/generated/prisma/wasm.js +375 -0
  103. package/package.json +46 -0
@@ -0,0 +1,99 @@
1
+ import { z } from "zod";
2
+ export declare const attendanceRouter: import("@trpc/server/dist/unstable-core-do-not-import").BuiltRouter<{
3
+ ctx: import("../trpc").Context;
4
+ meta: object;
5
+ errorShape: {
6
+ data: {
7
+ zodError: z.typeToFlattenedError<any, string> | null;
8
+ code: import("@trpc/server/dist/unstable-core-do-not-import").TRPC_ERROR_CODE_KEY;
9
+ httpStatus: number;
10
+ path?: string;
11
+ stack?: string;
12
+ };
13
+ message: string;
14
+ code: import("@trpc/server/dist/unstable-core-do-not-import").TRPC_ERROR_CODE_NUMBER;
15
+ };
16
+ transformer: false;
17
+ }, import("@trpc/server/dist/unstable-core-do-not-import").DecorateCreateRouterOptions<{
18
+ get: import("@trpc/server").TRPCQueryProcedure<{
19
+ input: {
20
+ classId: string;
21
+ eventId?: string | undefined;
22
+ };
23
+ output: ({
24
+ event: {
25
+ id: string;
26
+ name: string | null;
27
+ color: string | null;
28
+ startTime: Date;
29
+ endTime: Date;
30
+ location: string | null;
31
+ } | null;
32
+ late: {
33
+ id: string;
34
+ username: string;
35
+ }[];
36
+ present: {
37
+ id: string;
38
+ username: string;
39
+ }[];
40
+ absent: {
41
+ id: string;
42
+ username: string;
43
+ }[];
44
+ } & {
45
+ id: string;
46
+ classId: string;
47
+ date: Date;
48
+ eventId: string | null;
49
+ })[];
50
+ }>;
51
+ update: import("@trpc/server").TRPCMutationProcedure<{
52
+ input: {
53
+ attendance: {
54
+ late: {
55
+ id: string;
56
+ username: string;
57
+ }[];
58
+ present: {
59
+ id: string;
60
+ username: string;
61
+ }[];
62
+ absent: {
63
+ id: string;
64
+ username: string;
65
+ }[];
66
+ eventId?: string | undefined;
67
+ };
68
+ classId: string;
69
+ eventId?: string | undefined;
70
+ };
71
+ output: {
72
+ event: {
73
+ id: string;
74
+ name: string | null;
75
+ startTime: Date;
76
+ endTime: Date;
77
+ location: string | null;
78
+ } | null;
79
+ late: {
80
+ id: string;
81
+ username: string;
82
+ }[];
83
+ present: {
84
+ id: string;
85
+ username: string;
86
+ }[];
87
+ absent: {
88
+ id: string;
89
+ username: string;
90
+ }[];
91
+ } & {
92
+ id: string;
93
+ classId: string;
94
+ date: Date;
95
+ eventId: string | null;
96
+ };
97
+ }>;
98
+ }>>;
99
+ //# sourceMappingURL=attendance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attendance.d.ts","sourceRoot":"","sources":["../../src/routers/attendance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAYxB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+Q3B,CAAC"}
@@ -0,0 +1,269 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.attendanceRouter = void 0;
4
+ const zod_1 = require("zod");
5
+ const trpc_1 = require("../trpc");
6
+ const server_1 = require("@trpc/server");
7
+ const prisma_1 = require("@lib/prisma");
8
+ const attendanceSchema = zod_1.z.object({
9
+ eventId: zod_1.z.string().optional(),
10
+ present: zod_1.z.array(zod_1.z.object({ id: zod_1.z.string(), username: zod_1.z.string() })),
11
+ late: zod_1.z.array(zod_1.z.object({ id: zod_1.z.string(), username: zod_1.z.string() })),
12
+ absent: zod_1.z.array(zod_1.z.object({ id: zod_1.z.string(), username: zod_1.z.string() })),
13
+ });
14
+ exports.attendanceRouter = (0, trpc_1.createTRPCRouter)({
15
+ get: trpc_1.protectedProcedure
16
+ .input(zod_1.z.object({
17
+ classId: zod_1.z.string(),
18
+ eventId: zod_1.z.string().optional(),
19
+ }))
20
+ .query(async ({ ctx, input }) => {
21
+ if (!ctx.user) {
22
+ throw new server_1.TRPCError({
23
+ code: "UNAUTHORIZED",
24
+ message: "You must be logged in to view attendance",
25
+ });
26
+ }
27
+ // Check if user is a teacher or student of the class
28
+ const classData = await prisma_1.prisma.class.findUnique({
29
+ where: {
30
+ id: input.classId,
31
+ OR: [
32
+ {
33
+ teachers: {
34
+ some: {
35
+ id: ctx.user.id,
36
+ },
37
+ },
38
+ },
39
+ {
40
+ students: {
41
+ some: {
42
+ id: ctx.user.id,
43
+ },
44
+ },
45
+ },
46
+ ],
47
+ },
48
+ select: {
49
+ students: {
50
+ select: {
51
+ id: true,
52
+ },
53
+ },
54
+ },
55
+ });
56
+ if (!classData) {
57
+ throw new server_1.TRPCError({
58
+ code: "UNAUTHORIZED",
59
+ message: "You are not authorized to view this class's attendance",
60
+ });
61
+ }
62
+ // check each event has an attendance, if not create one
63
+ const events = await prisma_1.prisma.event.findMany({
64
+ where: {
65
+ classId: input.classId,
66
+ },
67
+ });
68
+ for (const event of events) {
69
+ const attendance = await prisma_1.prisma.attendance.findFirst({
70
+ where: {
71
+ eventId: event.id,
72
+ },
73
+ });
74
+ if (!attendance) {
75
+ await prisma_1.prisma.attendance.create({
76
+ data: {
77
+ event: {
78
+ connect: {
79
+ id: event.id,
80
+ },
81
+ },
82
+ class: {
83
+ connect: {
84
+ id: input.classId,
85
+ },
86
+ },
87
+ present: {
88
+ connect: classData.students.map(student => ({ id: student.id })),
89
+ },
90
+ },
91
+ });
92
+ }
93
+ }
94
+ const attendance = await prisma_1.prisma.attendance.findMany({
95
+ where: {
96
+ classId: input.classId,
97
+ ...(input.eventId ? { eventId: input.eventId } : {}),
98
+ },
99
+ include: {
100
+ event: {
101
+ select: {
102
+ id: true,
103
+ name: true,
104
+ startTime: true,
105
+ endTime: true,
106
+ location: true,
107
+ color: true,
108
+ },
109
+ },
110
+ present: {
111
+ select: {
112
+ id: true,
113
+ username: true,
114
+ },
115
+ },
116
+ late: {
117
+ select: {
118
+ id: true,
119
+ username: true,
120
+ },
121
+ },
122
+ absent: {
123
+ select: {
124
+ id: true,
125
+ username: true,
126
+ },
127
+ },
128
+ },
129
+ orderBy: {
130
+ date: "desc",
131
+ },
132
+ });
133
+ return attendance;
134
+ }),
135
+ update: trpc_1.protectedProcedure
136
+ .input(zod_1.z.object({
137
+ classId: zod_1.z.string(),
138
+ eventId: zod_1.z.string().optional(),
139
+ attendance: attendanceSchema,
140
+ }))
141
+ .mutation(async ({ ctx, input }) => {
142
+ if (!ctx.user) {
143
+ throw new server_1.TRPCError({
144
+ code: "UNAUTHORIZED",
145
+ message: "You must be logged in to update attendance",
146
+ });
147
+ }
148
+ // Check if user is a teacher of the class
149
+ const classData = await prisma_1.prisma.class.findUnique({
150
+ where: {
151
+ id: input.classId,
152
+ teachers: {
153
+ some: {
154
+ id: ctx.user.id,
155
+ },
156
+ },
157
+ },
158
+ });
159
+ if (!classData) {
160
+ throw new server_1.TRPCError({
161
+ code: "UNAUTHORIZED",
162
+ message: "You are not authorized to update this class's attendance",
163
+ });
164
+ }
165
+ // Check if attendance record exists
166
+ const existingAttendance = await prisma_1.prisma.attendance.findFirst({
167
+ where: {
168
+ classId: input.classId,
169
+ eventId: input.eventId,
170
+ },
171
+ });
172
+ if (!existingAttendance) {
173
+ // Create new attendance record
174
+ const attendance = await prisma_1.prisma.attendance.create({
175
+ data: {
176
+ classId: input.classId,
177
+ eventId: input.eventId,
178
+ date: new Date(),
179
+ present: {
180
+ connect: input.attendance.present.map(student => ({ id: student.id })),
181
+ },
182
+ late: {
183
+ connect: input.attendance.late.map(student => ({ id: student.id })),
184
+ },
185
+ absent: {
186
+ connect: input.attendance.absent.map(student => ({ id: student.id })),
187
+ },
188
+ },
189
+ include: {
190
+ event: {
191
+ select: {
192
+ id: true,
193
+ name: true,
194
+ startTime: true,
195
+ endTime: true,
196
+ location: true,
197
+ },
198
+ },
199
+ present: {
200
+ select: {
201
+ id: true,
202
+ username: true,
203
+ },
204
+ },
205
+ late: {
206
+ select: {
207
+ id: true,
208
+ username: true,
209
+ },
210
+ },
211
+ absent: {
212
+ select: {
213
+ id: true,
214
+ username: true,
215
+ },
216
+ },
217
+ },
218
+ });
219
+ return attendance;
220
+ }
221
+ // Update existing attendance record
222
+ const attendance = await prisma_1.prisma.attendance.update({
223
+ where: {
224
+ id: existingAttendance.id,
225
+ },
226
+ data: {
227
+ present: {
228
+ set: input.attendance.present.map(student => ({ id: student.id })),
229
+ },
230
+ late: {
231
+ set: input.attendance.late.map(student => ({ id: student.id })),
232
+ },
233
+ absent: {
234
+ set: input.attendance.absent.map(student => ({ id: student.id })),
235
+ },
236
+ },
237
+ include: {
238
+ event: {
239
+ select: {
240
+ id: true,
241
+ name: true,
242
+ startTime: true,
243
+ endTime: true,
244
+ location: true,
245
+ },
246
+ },
247
+ present: {
248
+ select: {
249
+ id: true,
250
+ username: true,
251
+ },
252
+ },
253
+ late: {
254
+ select: {
255
+ id: true,
256
+ username: true,
257
+ },
258
+ },
259
+ absent: {
260
+ select: {
261
+ id: true,
262
+ username: true,
263
+ },
264
+ },
265
+ },
266
+ });
267
+ return attendance;
268
+ }),
269
+ });
@@ -0,0 +1,87 @@
1
+ import { z } from "zod";
2
+ export declare const authRouter: import("@trpc/server/dist/unstable-core-do-not-import").BuiltRouter<{
3
+ ctx: import("../trpc").Context;
4
+ meta: object;
5
+ errorShape: {
6
+ data: {
7
+ zodError: z.typeToFlattenedError<any, string> | null;
8
+ code: import("@trpc/server/dist/unstable-core-do-not-import").TRPC_ERROR_CODE_KEY;
9
+ httpStatus: number;
10
+ path?: string;
11
+ stack?: string;
12
+ };
13
+ message: string;
14
+ code: import("@trpc/server/dist/unstable-core-do-not-import").TRPC_ERROR_CODE_NUMBER;
15
+ };
16
+ transformer: false;
17
+ }, import("@trpc/server/dist/unstable-core-do-not-import").DecorateCreateRouterOptions<{
18
+ register: import("@trpc/server").TRPCMutationProcedure<{
19
+ input: {
20
+ username: string;
21
+ email: string;
22
+ password: string;
23
+ confirmPassword: string;
24
+ };
25
+ output: {
26
+ user: {
27
+ id: string;
28
+ username: string;
29
+ };
30
+ };
31
+ }>;
32
+ login: import("@trpc/server").TRPCMutationProcedure<{
33
+ input: {
34
+ username: string;
35
+ password: string;
36
+ };
37
+ output: {
38
+ verified: boolean;
39
+ user: {
40
+ email: string;
41
+ id?: undefined;
42
+ username?: undefined;
43
+ };
44
+ token?: undefined;
45
+ } | {
46
+ token: string;
47
+ user: {
48
+ id: string;
49
+ username: string;
50
+ email?: undefined;
51
+ };
52
+ verified?: undefined;
53
+ };
54
+ }>;
55
+ logout: import("@trpc/server").TRPCMutationProcedure<{
56
+ input: void;
57
+ output: {
58
+ success: boolean;
59
+ };
60
+ }>;
61
+ check: import("@trpc/server").TRPCQueryProcedure<{
62
+ input: void;
63
+ output: {
64
+ user: {
65
+ id: string;
66
+ username: string;
67
+ };
68
+ };
69
+ }>;
70
+ resendVerificationEmail: import("@trpc/server").TRPCMutationProcedure<{
71
+ input: {
72
+ email: string;
73
+ };
74
+ output: {
75
+ success: boolean;
76
+ };
77
+ }>;
78
+ verify: import("@trpc/server").TRPCMutationProcedure<{
79
+ input: {
80
+ token: string;
81
+ };
82
+ output: {
83
+ success: boolean;
84
+ };
85
+ }>;
86
+ }>>;
87
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/routers/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAuBxB,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsQrB,CAAC"}