@studious-lms/server 1.0.4 → 1.0.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 (101) hide show
  1. package/API_SPECIFICATION.md +1117 -0
  2. package/dist/exportType.js +1 -2
  3. package/dist/index.js +25 -30
  4. package/dist/lib/fileUpload.d.ts.map +1 -1
  5. package/dist/lib/fileUpload.js +31 -29
  6. package/dist/lib/googleCloudStorage.js +9 -14
  7. package/dist/lib/prisma.js +4 -7
  8. package/dist/lib/thumbnailGenerator.js +12 -20
  9. package/dist/middleware/auth.d.ts.map +1 -1
  10. package/dist/middleware/auth.js +17 -22
  11. package/dist/middleware/logging.js +5 -9
  12. package/dist/routers/_app.d.ts +3483 -1801
  13. package/dist/routers/_app.d.ts.map +1 -1
  14. package/dist/routers/_app.js +28 -27
  15. package/dist/routers/agenda.d.ts +13 -8
  16. package/dist/routers/agenda.d.ts.map +1 -1
  17. package/dist/routers/agenda.js +14 -17
  18. package/dist/routers/announcement.d.ts +4 -3
  19. package/dist/routers/announcement.d.ts.map +1 -1
  20. package/dist/routers/announcement.js +28 -31
  21. package/dist/routers/assignment.d.ts +282 -196
  22. package/dist/routers/assignment.d.ts.map +1 -1
  23. package/dist/routers/assignment.js +256 -202
  24. package/dist/routers/attendance.d.ts +5 -4
  25. package/dist/routers/attendance.d.ts.map +1 -1
  26. package/dist/routers/attendance.js +31 -34
  27. package/dist/routers/auth.d.ts +1 -0
  28. package/dist/routers/auth.d.ts.map +1 -1
  29. package/dist/routers/auth.js +80 -75
  30. package/dist/routers/class.d.ts +284 -14
  31. package/dist/routers/class.d.ts.map +1 -1
  32. package/dist/routers/class.js +435 -164
  33. package/dist/routers/event.d.ts +47 -38
  34. package/dist/routers/event.d.ts.map +1 -1
  35. package/dist/routers/event.js +76 -79
  36. package/dist/routers/file.d.ts +71 -1
  37. package/dist/routers/file.d.ts.map +1 -1
  38. package/dist/routers/file.js +267 -32
  39. package/dist/routers/folder.d.ts +296 -0
  40. package/dist/routers/folder.d.ts.map +1 -0
  41. package/dist/routers/folder.js +693 -0
  42. package/dist/routers/notifications.d.ts +103 -0
  43. package/dist/routers/notifications.d.ts.map +1 -0
  44. package/dist/routers/notifications.js +91 -0
  45. package/dist/routers/school.d.ts +208 -0
  46. package/dist/routers/school.d.ts.map +1 -0
  47. package/dist/routers/school.js +481 -0
  48. package/dist/routers/section.d.ts +1 -0
  49. package/dist/routers/section.d.ts.map +1 -1
  50. package/dist/routers/section.js +30 -33
  51. package/dist/routers/user.d.ts +2 -1
  52. package/dist/routers/user.d.ts.map +1 -1
  53. package/dist/routers/user.js +21 -24
  54. package/dist/seedDatabase.d.ts +22 -0
  55. package/dist/seedDatabase.d.ts.map +1 -0
  56. package/dist/seedDatabase.js +57 -0
  57. package/dist/socket/handlers.js +26 -30
  58. package/dist/trpc.d.ts +5 -0
  59. package/dist/trpc.d.ts.map +1 -1
  60. package/dist/trpc.js +35 -26
  61. package/dist/types/trpc.js +1 -2
  62. package/dist/utils/email.js +2 -8
  63. package/dist/utils/generateInviteCode.js +1 -5
  64. package/dist/utils/logger.d.ts.map +1 -1
  65. package/dist/utils/logger.js +13 -9
  66. package/dist/utils/prismaErrorHandler.d.ts +9 -0
  67. package/dist/utils/prismaErrorHandler.d.ts.map +1 -0
  68. package/dist/utils/prismaErrorHandler.js +234 -0
  69. package/dist/utils/prismaWrapper.d.ts +14 -0
  70. package/dist/utils/prismaWrapper.d.ts.map +1 -0
  71. package/dist/utils/prismaWrapper.js +64 -0
  72. package/package.json +17 -4
  73. package/prisma/migrations/20250807062924_init/migration.sql +436 -0
  74. package/prisma/migrations/migration_lock.toml +3 -0
  75. package/prisma/schema.prisma +67 -0
  76. package/src/index.ts +2 -2
  77. package/src/lib/fileUpload.ts +16 -7
  78. package/src/middleware/auth.ts +0 -2
  79. package/src/routers/_app.ts +5 -1
  80. package/src/routers/assignment.ts +82 -22
  81. package/src/routers/auth.ts +80 -54
  82. package/src/routers/class.ts +330 -36
  83. package/src/routers/file.ts +283 -20
  84. package/src/routers/folder.ts +755 -0
  85. package/src/routers/notifications.ts +93 -0
  86. package/src/seedDatabase.ts +66 -0
  87. package/src/socket/handlers.ts +4 -4
  88. package/src/trpc.ts +13 -0
  89. package/src/utils/logger.ts +14 -4
  90. package/src/utils/prismaErrorHandler.ts +275 -0
  91. package/src/utils/prismaWrapper.ts +91 -0
  92. package/tests/auth.test.ts +25 -0
  93. package/tests/class.test.ts +281 -0
  94. package/tests/setup.ts +98 -0
  95. package/tests/startup.test.ts +5 -0
  96. package/tsconfig.json +2 -1
  97. package/vitest.config.ts +11 -0
  98. package/dist/logger.d.ts +0 -26
  99. package/dist/logger.d.ts.map +0 -1
  100. package/dist/logger.js +0 -135
  101. package/src/logger.ts +0 -163
@@ -0,0 +1,103 @@
1
+ import { z } from "zod";
2
+ export declare const notificationRouter: import("@trpc/server").TRPCBuiltRouter<{
3
+ ctx: import("../trpc").Context;
4
+ meta: object;
5
+ errorShape: {
6
+ data: {
7
+ zodError: z.typeToFlattenedError<any, string> | null;
8
+ prismaError: import("../utils/prismaErrorHandler").PrismaErrorInfo | null;
9
+ code: import("@trpc/server").TRPC_ERROR_CODE_KEY;
10
+ httpStatus: number;
11
+ path?: string;
12
+ stack?: string;
13
+ };
14
+ message: string;
15
+ code: import("@trpc/server").TRPC_ERROR_CODE_NUMBER;
16
+ };
17
+ transformer: false;
18
+ }, import("@trpc/server").TRPCDecorateCreateRouterOptions<{
19
+ list: import("@trpc/server").TRPCQueryProcedure<{
20
+ input: void;
21
+ output: ({
22
+ sender: {
23
+ username: string;
24
+ } | null;
25
+ receiver: {
26
+ username: string;
27
+ };
28
+ } & {
29
+ id: string;
30
+ title: string;
31
+ content: string;
32
+ createdAt: Date;
33
+ read: boolean;
34
+ receiverId: string;
35
+ senderId: string | null;
36
+ })[];
37
+ meta: object;
38
+ }>;
39
+ get: import("@trpc/server").TRPCQueryProcedure<{
40
+ input: {
41
+ id: string;
42
+ };
43
+ output: ({
44
+ sender: {
45
+ username: string;
46
+ } | null;
47
+ receiver: {
48
+ username: string;
49
+ };
50
+ } & {
51
+ id: string;
52
+ title: string;
53
+ content: string;
54
+ createdAt: Date;
55
+ read: boolean;
56
+ receiverId: string;
57
+ senderId: string | null;
58
+ }) | null;
59
+ meta: object;
60
+ }>;
61
+ sendTo: import("@trpc/server").TRPCMutationProcedure<{
62
+ input: {
63
+ title: string;
64
+ content: string;
65
+ receiverId: string;
66
+ };
67
+ output: {
68
+ id: string;
69
+ title: string;
70
+ content: string;
71
+ createdAt: Date;
72
+ read: boolean;
73
+ receiverId: string;
74
+ senderId: string | null;
75
+ };
76
+ meta: object;
77
+ }>;
78
+ sendToMultiple: import("@trpc/server").TRPCMutationProcedure<{
79
+ input: {
80
+ title: string;
81
+ content: string;
82
+ receiverIds: string[];
83
+ };
84
+ output: import(".prisma/client").Prisma.BatchPayload;
85
+ meta: object;
86
+ }>;
87
+ markAsRead: import("@trpc/server").TRPCMutationProcedure<{
88
+ input: {
89
+ id: string;
90
+ };
91
+ output: {
92
+ id: string;
93
+ title: string;
94
+ content: string;
95
+ createdAt: Date;
96
+ read: boolean;
97
+ receiverId: string;
98
+ senderId: string | null;
99
+ };
100
+ meta: object;
101
+ }>;
102
+ }>>;
103
+ //# sourceMappingURL=notifications.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../src/routers/notifications.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwF7B,CAAA"}
@@ -0,0 +1,91 @@
1
+ import { createTRPCRouter, protectedProcedure } from "../trpc";
2
+ import { prisma } from "../lib/prisma";
3
+ import { z } from "zod";
4
+ export const notificationRouter = createTRPCRouter({
5
+ list: protectedProcedure.query(async ({ ctx }) => {
6
+ const notifications = await prisma.notification.findMany({
7
+ where: {
8
+ receiverId: ctx.user.id,
9
+ },
10
+ orderBy: {
11
+ createdAt: "desc",
12
+ },
13
+ include: {
14
+ sender: {
15
+ select: {
16
+ username: true,
17
+ },
18
+ },
19
+ receiver: {
20
+ select: {
21
+ username: true,
22
+ },
23
+ },
24
+ },
25
+ });
26
+ return notifications;
27
+ }),
28
+ get: protectedProcedure.input(z.object({
29
+ id: z.string(),
30
+ })).query(async ({ ctx, input }) => {
31
+ const { id } = input;
32
+ const notification = await prisma.notification.findUnique({
33
+ where: {
34
+ id,
35
+ },
36
+ include: {
37
+ sender: {
38
+ select: {
39
+ username: true,
40
+ },
41
+ },
42
+ receiver: {
43
+ select: {
44
+ username: true,
45
+ },
46
+ },
47
+ },
48
+ });
49
+ return notification;
50
+ }),
51
+ sendTo: protectedProcedure.input(z.object({
52
+ receiverId: z.string(),
53
+ title: z.string(),
54
+ content: z.string(),
55
+ })).mutation(async ({ ctx, input }) => {
56
+ const { receiverId, title, content } = input;
57
+ const notification = await prisma.notification.create({
58
+ data: {
59
+ receiverId,
60
+ title,
61
+ content,
62
+ },
63
+ });
64
+ return notification;
65
+ }),
66
+ sendToMultiple: protectedProcedure.input(z.object({
67
+ receiverIds: z.array(z.string()),
68
+ title: z.string(),
69
+ content: z.string(),
70
+ })).mutation(async ({ ctx, input }) => {
71
+ const { receiverIds, title, content } = input;
72
+ const notifications = await prisma.notification.createMany({
73
+ data: receiverIds.map(receiverId => ({
74
+ receiverId,
75
+ title,
76
+ content,
77
+ })),
78
+ });
79
+ return notifications;
80
+ }),
81
+ markAsRead: protectedProcedure.input(z.object({
82
+ id: z.string(),
83
+ })).mutation(async ({ ctx, input }) => {
84
+ const { id } = input;
85
+ const notification = await prisma.notification.update({
86
+ where: { id },
87
+ data: { read: true },
88
+ });
89
+ return notification;
90
+ }),
91
+ });
@@ -0,0 +1,208 @@
1
+ import { z } from 'zod';
2
+ export declare const schoolRouter: import("@trpc/server").TRPCBuiltRouter<{
3
+ ctx: import("../trpc").Context;
4
+ meta: object;
5
+ errorShape: {
6
+ data: {
7
+ zodError: z.typeToFlattenedError<any, string> | null;
8
+ prismaError: null;
9
+ code: import("@trpc/server").TRPC_ERROR_CODE_KEY;
10
+ httpStatus: number;
11
+ path?: string;
12
+ stack?: string;
13
+ };
14
+ message: string;
15
+ code: import("@trpc/server").TRPC_ERROR_CODE_NUMBER;
16
+ };
17
+ transformer: false;
18
+ }, import("@trpc/server").TRPCDecorateCreateRouterOptions<{
19
+ createSchool: import("@trpc/server").TRPCMutationProcedure<{
20
+ input: {
21
+ name: string;
22
+ subdomain: string;
23
+ };
24
+ output: {
25
+ id: string;
26
+ name: string;
27
+ logoId: string;
28
+ subdomain: string | null;
29
+ };
30
+ meta: object;
31
+ }>;
32
+ checkAdmin: import("@trpc/server").TRPCQueryProcedure<{
33
+ input: {
34
+ schoolId: string;
35
+ };
36
+ output: boolean;
37
+ meta: object;
38
+ }>;
39
+ getUsers: import("@trpc/server").TRPCQueryProcedure<{
40
+ input: {
41
+ schoolId: string;
42
+ role?: "STUDENT" | "TEACHER" | "ADMIN" | "NONE" | undefined;
43
+ };
44
+ output: {
45
+ id: string;
46
+ username: string;
47
+ email: string;
48
+ verified: boolean;
49
+ role: import(".prisma/client").$Enums.UserRole;
50
+ profile: {
51
+ id: string;
52
+ userId: string;
53
+ } | null;
54
+ }[];
55
+ meta: object;
56
+ }>;
57
+ createUser: import("@trpc/server").TRPCMutationProcedure<{
58
+ input: {
59
+ username: string;
60
+ email: string;
61
+ role: "STUDENT" | "TEACHER" | "ADMIN" | "NONE";
62
+ schoolId: string;
63
+ sendInvite?: boolean | undefined;
64
+ };
65
+ output: {
66
+ id: string;
67
+ username: string;
68
+ email: string;
69
+ password: string;
70
+ verified: boolean;
71
+ role: import(".prisma/client").$Enums.UserRole;
72
+ profileId: string | null;
73
+ schoolId: string | null;
74
+ };
75
+ meta: object;
76
+ }>;
77
+ bulkCreateUsers: import("@trpc/server").TRPCMutationProcedure<{
78
+ input: {
79
+ schoolId: string;
80
+ users: {
81
+ username: string;
82
+ email: string;
83
+ role: "STUDENT" | "TEACHER" | "ADMIN" | "NONE";
84
+ }[];
85
+ };
86
+ output: {
87
+ results: never[];
88
+ errors: never[];
89
+ };
90
+ meta: object;
91
+ }>;
92
+ updateUser: import("@trpc/server").TRPCMutationProcedure<{
93
+ input: {
94
+ schoolId: string;
95
+ userId: string;
96
+ verified?: boolean | undefined;
97
+ role?: "STUDENT" | "TEACHER" | "ADMIN" | "NONE" | undefined;
98
+ };
99
+ output: {
100
+ id: string;
101
+ username: string;
102
+ email: string;
103
+ password: string;
104
+ verified: boolean;
105
+ role: import(".prisma/client").$Enums.UserRole;
106
+ profileId: string | null;
107
+ schoolId: string | null;
108
+ };
109
+ meta: object;
110
+ }>;
111
+ deleteUser: import("@trpc/server").TRPCMutationProcedure<{
112
+ input: {
113
+ schoolId: string;
114
+ userId: string;
115
+ };
116
+ output: {
117
+ id: string;
118
+ username: string;
119
+ email: string;
120
+ password: string;
121
+ verified: boolean;
122
+ role: import(".prisma/client").$Enums.UserRole;
123
+ profileId: string | null;
124
+ schoolId: string | null;
125
+ };
126
+ meta: object;
127
+ }>;
128
+ getSchool: import("@trpc/server").TRPCQueryProcedure<{
129
+ input: {
130
+ schoolId: string;
131
+ };
132
+ output: ({
133
+ _count: {
134
+ users: number;
135
+ classes: number;
136
+ };
137
+ logo: {
138
+ path: string;
139
+ type: string;
140
+ id: string;
141
+ name: string;
142
+ size: number | null;
143
+ uploadedAt: Date | null;
144
+ assignmentId: string | null;
145
+ submissionId: string | null;
146
+ userId: string | null;
147
+ thumbnailId: string | null;
148
+ annotationId: string | null;
149
+ classDraftId: string | null;
150
+ folderId: string | null;
151
+ };
152
+ } & {
153
+ id: string;
154
+ name: string;
155
+ logoId: string;
156
+ subdomain: string | null;
157
+ }) | null;
158
+ meta: object;
159
+ }>;
160
+ updateSchool: import("@trpc/server").TRPCMutationProcedure<{
161
+ input: {
162
+ schoolId: string;
163
+ name?: string | undefined;
164
+ logoId?: string | undefined;
165
+ subdomain?: string | undefined;
166
+ };
167
+ output: {
168
+ id: string;
169
+ name: string;
170
+ logoId: string;
171
+ subdomain: string | null;
172
+ };
173
+ meta: object;
174
+ }>;
175
+ getClasses: import("@trpc/server").TRPCQueryProcedure<{
176
+ input: {
177
+ schoolId: string;
178
+ };
179
+ output: ({
180
+ _count: {
181
+ assignments: number;
182
+ students: number;
183
+ teachers: number;
184
+ };
185
+ } & {
186
+ id: string;
187
+ schoolId: string | null;
188
+ name: string;
189
+ subject: string;
190
+ color: string | null;
191
+ section: string;
192
+ syllabus: string | null;
193
+ })[];
194
+ meta: object;
195
+ }>;
196
+ sendBulkEmail: import("@trpc/server").TRPCMutationProcedure<{
197
+ input: {
198
+ schoolId: string;
199
+ subject: string;
200
+ content: string;
201
+ recipientRole?: "STUDENT" | "TEACHER" | "ADMIN" | "ALL" | undefined;
202
+ recipientIds?: string[] | undefined;
203
+ };
204
+ output: never[];
205
+ meta: object;
206
+ }>;
207
+ }>>;
208
+ //# sourceMappingURL=school.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"school.d.ts","sourceRoot":"","sources":["../../src/routers/school.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4gBvB,CAAC"}