@studious-lms/server 1.0.7 → 1.1.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.
- package/API_SPECIFICATION.md +352 -8
- package/dist/exportType.d.ts +3 -3
- package/dist/exportType.d.ts.map +1 -1
- package/dist/index.js +4 -4
- package/dist/lib/fileUpload.js +3 -3
- package/dist/lib/thumbnailGenerator.js +2 -2
- package/dist/middleware/auth.js +1 -1
- package/dist/middleware/logging.js +1 -1
- package/dist/routers/_app.d.ts +64 -64
- package/dist/routers/_app.js +14 -14
- package/dist/routers/agenda.d.ts +2 -2
- package/dist/routers/agenda.js +2 -2
- package/dist/routers/announcement.d.ts +2 -2
- package/dist/routers/announcement.js +2 -2
- package/dist/routers/assignment.d.ts +2 -2
- package/dist/routers/assignment.js +4 -4
- package/dist/routers/attendance.d.ts +2 -2
- package/dist/routers/attendance.js +2 -2
- package/dist/routers/auth.d.ts +2 -2
- package/dist/routers/auth.js +3 -3
- package/dist/routers/class.d.ts +7 -7
- package/dist/routers/class.d.ts.map +1 -1
- package/dist/routers/class.js +21 -13
- package/dist/routers/event.d.ts +2 -2
- package/dist/routers/event.js +2 -2
- package/dist/routers/file.d.ts +2 -2
- package/dist/routers/file.d.ts.map +1 -1
- package/dist/routers/file.js +4 -11
- package/dist/routers/folder.d.ts +3 -3
- package/dist/routers/folder.js +5 -5
- package/dist/routers/notifications.d.ts +2 -2
- package/dist/routers/notifications.js +2 -2
- package/dist/routers/section.d.ts +2 -2
- package/dist/routers/section.js +2 -2
- package/dist/routers/user.d.ts +2 -2
- package/dist/routers/user.js +3 -3
- package/dist/seedDatabase.d.ts.map +1 -1
- package/dist/seedDatabase.js +21 -3
- package/dist/socket/handlers.js +1 -1
- package/dist/trpc.d.ts +1 -1
- package/dist/trpc.d.ts.map +1 -1
- package/dist/trpc.js +5 -5
- package/dist/types/trpc.d.ts +1 -1
- package/dist/types/trpc.d.ts.map +1 -1
- package/dist/utils/prismaWrapper.js +1 -1
- package/package.json +4 -3
- package/prisma/schema.prisma +2 -2
- package/src/exportType.ts +3 -3
- package/src/index.ts +4 -4
- package/src/lib/fileUpload.ts +3 -3
- package/src/lib/thumbnailGenerator.ts +2 -2
- package/src/middleware/auth.ts +2 -2
- package/src/middleware/logging.ts +2 -2
- package/src/routers/_app.ts +14 -14
- package/src/routers/agenda.ts +2 -2
- package/src/routers/announcement.ts +2 -2
- package/src/routers/assignment.ts +4 -4
- package/src/routers/attendance.ts +2 -2
- package/src/routers/auth.ts +4 -4
- package/src/routers/class.ts +25 -14
- package/src/routers/event.ts +2 -2
- package/src/routers/file.ts +4 -12
- package/src/routers/folder.ts +5 -5
- package/src/routers/notifications.ts +2 -2
- package/src/routers/section.ts +2 -2
- package/src/routers/user.ts +3 -3
- package/src/seedDatabase.ts +25 -3
- package/src/socket/handlers.ts +1 -1
- package/src/trpc.ts +5 -5
- package/src/types/trpc.ts +1 -1
- package/src/utils/prismaWrapper.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"class.d.ts","sourceRoot":"","sources":["../../src/routers/class.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"class.d.ts","sourceRoot":"","sources":["../../src/routers/class.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2hCtB,CAAC"}
|
package/dist/routers/class.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { createTRPCRouter, protectedProcedure, protectedTeacherProcedure, protectedClassMemberProcedure } from "../trpc";
|
|
3
|
-
import { prisma } from "../lib/prisma";
|
|
2
|
+
import { createTRPCRouter, protectedProcedure, protectedTeacherProcedure, protectedClassMemberProcedure } from "../trpc.js";
|
|
3
|
+
import { prisma } from "../lib/prisma.js";
|
|
4
4
|
import { TRPCError } from "@trpc/server";
|
|
5
|
-
import { generateInviteCode } from "../utils/generateInviteCode";
|
|
5
|
+
import { generateInviteCode } from "../utils/generateInviteCode.js";
|
|
6
6
|
export const classRouter = createTRPCRouter({
|
|
7
7
|
getAll: protectedProcedure
|
|
8
8
|
.query(async ({ ctx }) => {
|
|
@@ -163,23 +163,26 @@ export const classRouter = createTRPCRouter({
|
|
|
163
163
|
},
|
|
164
164
|
},
|
|
165
165
|
});
|
|
166
|
+
if (!classData) {
|
|
167
|
+
throw new Error('Class not found');
|
|
168
|
+
}
|
|
169
|
+
const formattedClassData = {
|
|
170
|
+
...classData,
|
|
171
|
+
assignments: classData.assignments.map(assignment => ({
|
|
172
|
+
...assignment,
|
|
173
|
+
late: assignment.dueDate < new Date(),
|
|
174
|
+
submitted: assignment.submissions.some(submission => submission.studentId === ctx.user?.id),
|
|
175
|
+
returned: assignment.submissions.some(submission => submission.studentId === ctx.user?.id && submission.returned),
|
|
176
|
+
})),
|
|
177
|
+
};
|
|
166
178
|
const sections = await prisma.section.findMany({
|
|
167
179
|
where: {
|
|
168
180
|
classId: classId,
|
|
169
181
|
},
|
|
170
182
|
});
|
|
171
|
-
if (!classData) {
|
|
172
|
-
throw new Error('Class not found');
|
|
173
|
-
}
|
|
174
183
|
return {
|
|
175
184
|
class: {
|
|
176
|
-
...
|
|
177
|
-
assignments: classData.assignments.map(assignment => ({
|
|
178
|
-
...assignment,
|
|
179
|
-
late: assignment.dueDate < new Date(),
|
|
180
|
-
submitted: assignment.submissions.some(submission => submission.studentId === ctx.user?.id),
|
|
181
|
-
returned: assignment.submissions.some(submission => submission.studentId === ctx.user?.id && submission.returned),
|
|
182
|
-
})),
|
|
185
|
+
...formattedClassData,
|
|
183
186
|
sections,
|
|
184
187
|
},
|
|
185
188
|
};
|
|
@@ -448,6 +451,11 @@ export const classRouter = createTRPCRouter({
|
|
|
448
451
|
}))
|
|
449
452
|
.mutation(async ({ ctx, input }) => {
|
|
450
453
|
const { classId } = input;
|
|
454
|
+
await prisma.session.deleteMany({
|
|
455
|
+
where: {
|
|
456
|
+
classId,
|
|
457
|
+
},
|
|
458
|
+
});
|
|
451
459
|
// Create a new session for the invite code
|
|
452
460
|
const session = await prisma.session.create({
|
|
453
461
|
data: {
|
package/dist/routers/event.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
export declare const eventRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
3
|
-
ctx: import("../trpc").Context;
|
|
3
|
+
ctx: import("../trpc.js").Context;
|
|
4
4
|
meta: object;
|
|
5
5
|
errorShape: {
|
|
6
6
|
data: {
|
|
7
7
|
zodError: z.typeToFlattenedError<any, string> | null;
|
|
8
|
-
prismaError: import("../utils/prismaErrorHandler").PrismaErrorInfo | null;
|
|
8
|
+
prismaError: import("../utils/prismaErrorHandler.js").PrismaErrorInfo | null;
|
|
9
9
|
code: import("@trpc/server").TRPC_ERROR_CODE_KEY;
|
|
10
10
|
httpStatus: number;
|
|
11
11
|
path?: string;
|
package/dist/routers/event.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { createTRPCRouter, protectedProcedure } from "../trpc";
|
|
2
|
+
import { createTRPCRouter, protectedProcedure } from "../trpc.js";
|
|
3
3
|
import { TRPCError } from "@trpc/server";
|
|
4
|
-
import { prisma } from "../lib/prisma";
|
|
4
|
+
import { prisma } from "../lib/prisma.js";
|
|
5
5
|
import { parseISO } from "date-fns";
|
|
6
6
|
const eventSchema = z.object({
|
|
7
7
|
name: z.string().optional(),
|
package/dist/routers/file.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
export declare const fileRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
3
|
-
ctx: import("../trpc").Context;
|
|
3
|
+
ctx: import("../trpc.js").Context;
|
|
4
4
|
meta: object;
|
|
5
5
|
errorShape: {
|
|
6
6
|
data: {
|
|
7
7
|
zodError: z.typeToFlattenedError<any, string> | null;
|
|
8
|
-
prismaError: import("../utils/prismaErrorHandler").PrismaErrorInfo | null;
|
|
8
|
+
prismaError: import("../utils/prismaErrorHandler.js").PrismaErrorInfo | null;
|
|
9
9
|
code: import("@trpc/server").TRPC_ERROR_CODE_KEY;
|
|
10
10
|
httpStatus: number;
|
|
11
11
|
path?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/routers/file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/routers/file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsVrB,CAAC"}
|
package/dist/routers/file.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { createTRPCRouter, protectedProcedure, protectedTeacherProcedure } from "../trpc";
|
|
2
|
+
import { createTRPCRouter, protectedProcedure, protectedTeacherProcedure } from "../trpc.js";
|
|
3
3
|
import { TRPCError } from "@trpc/server";
|
|
4
|
-
import { getSignedUrl, deleteFile } from "../lib/googleCloudStorage";
|
|
5
|
-
import { prisma } from "../lib/prisma";
|
|
6
|
-
import { logger } from "../utils/logger";
|
|
4
|
+
import { getSignedUrl, deleteFile } from "../lib/googleCloudStorage.js";
|
|
5
|
+
import { prisma } from "../lib/prisma.js";
|
|
6
|
+
import { logger } from "../utils/logger.js";
|
|
7
7
|
export const fileRouter = createTRPCRouter({
|
|
8
8
|
getSignedUrl: protectedProcedure
|
|
9
9
|
.input(z.object({
|
|
@@ -222,13 +222,6 @@ export const fileRouter = createTRPCRouter({
|
|
|
222
222
|
message: "File not found",
|
|
223
223
|
});
|
|
224
224
|
}
|
|
225
|
-
// Verify the file belongs to this class
|
|
226
|
-
if (file.folder?.classId !== classId) {
|
|
227
|
-
throw new TRPCError({
|
|
228
|
-
code: "FORBIDDEN",
|
|
229
|
-
message: "File does not belong to this class",
|
|
230
|
-
});
|
|
231
|
-
}
|
|
232
225
|
// Validate new name
|
|
233
226
|
if (!newName.trim()) {
|
|
234
227
|
throw new TRPCError({
|
package/dist/routers/folder.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
export declare const folderRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
3
|
-
ctx: import("../trpc").Context;
|
|
3
|
+
ctx: import("../trpc.js").Context;
|
|
4
4
|
meta: object;
|
|
5
5
|
errorShape: {
|
|
6
6
|
data: {
|
|
7
7
|
zodError: z.typeToFlattenedError<any, string> | null;
|
|
8
|
-
prismaError: import("../utils/prismaErrorHandler").PrismaErrorInfo | null;
|
|
8
|
+
prismaError: import("../utils/prismaErrorHandler.js").PrismaErrorInfo | null;
|
|
9
9
|
code: import("@trpc/server").TRPC_ERROR_CODE_KEY;
|
|
10
10
|
httpStatus: number;
|
|
11
11
|
path?: string;
|
|
@@ -227,7 +227,7 @@ export declare const folderRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
|
227
227
|
[x: string]: unknown;
|
|
228
228
|
classId: string;
|
|
229
229
|
folderId: string;
|
|
230
|
-
targetParentFolderId
|
|
230
|
+
targetParentFolderId: string;
|
|
231
231
|
};
|
|
232
232
|
output: {
|
|
233
233
|
files: {
|
package/dist/routers/folder.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { createTRPCRouter, protectedClassMemberProcedure, protectedTeacherProcedure } from "../trpc";
|
|
2
|
+
import { createTRPCRouter, protectedClassMemberProcedure, protectedTeacherProcedure } from "../trpc.js";
|
|
3
3
|
import { TRPCError } from "@trpc/server";
|
|
4
|
-
import { prisma } from "../lib/prisma";
|
|
5
|
-
import { uploadFiles } from "../lib/fileUpload";
|
|
4
|
+
import { prisma } from "../lib/prisma.js";
|
|
5
|
+
import { uploadFiles } from "../lib/fileUpload.js";
|
|
6
6
|
const fileSchema = z.object({
|
|
7
7
|
name: z.string(),
|
|
8
8
|
type: z.string(),
|
|
@@ -501,7 +501,7 @@ export const folderRouter = createTRPCRouter({
|
|
|
501
501
|
move: protectedTeacherProcedure
|
|
502
502
|
.input(z.object({
|
|
503
503
|
folderId: z.string(),
|
|
504
|
-
targetParentFolderId: z.string()
|
|
504
|
+
targetParentFolderId: z.string(),
|
|
505
505
|
classId: z.string(),
|
|
506
506
|
}))
|
|
507
507
|
.mutation(async ({ ctx, input }) => {
|
|
@@ -591,7 +591,7 @@ export const folderRouter = createTRPCRouter({
|
|
|
591
591
|
const updatedFolder = await prisma.folder.update({
|
|
592
592
|
where: { id: folderId },
|
|
593
593
|
data: {
|
|
594
|
-
parentFolderId: targetParentFolderId
|
|
594
|
+
parentFolderId: targetParentFolderId,
|
|
595
595
|
},
|
|
596
596
|
include: {
|
|
597
597
|
files: {
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
export declare const notificationRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
3
|
-
ctx: import("../trpc").Context;
|
|
3
|
+
ctx: import("../trpc.js").Context;
|
|
4
4
|
meta: object;
|
|
5
5
|
errorShape: {
|
|
6
6
|
data: {
|
|
7
7
|
zodError: z.typeToFlattenedError<any, string> | null;
|
|
8
|
-
prismaError: import("../utils/prismaErrorHandler").PrismaErrorInfo | null;
|
|
8
|
+
prismaError: import("../utils/prismaErrorHandler.js").PrismaErrorInfo | null;
|
|
9
9
|
code: import("@trpc/server").TRPC_ERROR_CODE_KEY;
|
|
10
10
|
httpStatus: number;
|
|
11
11
|
path?: string;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { createTRPCRouter, protectedProcedure } from "../trpc";
|
|
2
|
-
import { prisma } from "../lib/prisma";
|
|
1
|
+
import { createTRPCRouter, protectedProcedure } from "../trpc.js";
|
|
2
|
+
import { prisma } from "../lib/prisma.js";
|
|
3
3
|
import { z } from "zod";
|
|
4
4
|
export const notificationRouter = createTRPCRouter({
|
|
5
5
|
list: protectedProcedure.query(async ({ ctx }) => {
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
export declare const sectionRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
3
|
-
ctx: import("../trpc").Context;
|
|
3
|
+
ctx: import("../trpc.js").Context;
|
|
4
4
|
meta: object;
|
|
5
5
|
errorShape: {
|
|
6
6
|
data: {
|
|
7
7
|
zodError: z.typeToFlattenedError<any, string> | null;
|
|
8
|
-
prismaError: import("../utils/prismaErrorHandler").PrismaErrorInfo | null;
|
|
8
|
+
prismaError: import("../utils/prismaErrorHandler.js").PrismaErrorInfo | null;
|
|
9
9
|
code: import("@trpc/server").TRPC_ERROR_CODE_KEY;
|
|
10
10
|
httpStatus: number;
|
|
11
11
|
path?: string;
|
package/dist/routers/section.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { createTRPCRouter, protectedProcedure } from "../trpc";
|
|
2
|
+
import { createTRPCRouter, protectedProcedure } from "../trpc.js";
|
|
3
3
|
import { TRPCError } from "@trpc/server";
|
|
4
|
-
import { prisma } from "../lib/prisma";
|
|
4
|
+
import { prisma } from "../lib/prisma.js";
|
|
5
5
|
const createSectionSchema = z.object({
|
|
6
6
|
classId: z.string(),
|
|
7
7
|
name: z.string(),
|
package/dist/routers/user.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
export declare const userRouter: import("@trpc/server").TRPCBuiltRouter<{
|
|
3
|
-
ctx: import("../trpc").Context;
|
|
3
|
+
ctx: import("../trpc.js").Context;
|
|
4
4
|
meta: object;
|
|
5
5
|
errorShape: {
|
|
6
6
|
data: {
|
|
7
7
|
zodError: z.typeToFlattenedError<any, string> | null;
|
|
8
|
-
prismaError: import("../utils/prismaErrorHandler").PrismaErrorInfo | null;
|
|
8
|
+
prismaError: import("../utils/prismaErrorHandler.js").PrismaErrorInfo | null;
|
|
9
9
|
code: import("@trpc/server").TRPC_ERROR_CODE_KEY;
|
|
10
10
|
httpStatus: number;
|
|
11
11
|
path?: string;
|
package/dist/routers/user.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { createTRPCRouter, protectedProcedure } from "../trpc";
|
|
2
|
+
import { createTRPCRouter, protectedProcedure } from "../trpc.js";
|
|
3
3
|
import { TRPCError } from "@trpc/server";
|
|
4
|
-
import { prisma } from "../lib/prisma";
|
|
5
|
-
import { uploadFiles } from "../lib/fileUpload";
|
|
4
|
+
import { prisma } from "../lib/prisma.js";
|
|
5
|
+
import { uploadFiles } from "../lib/fileUpload.js";
|
|
6
6
|
const fileSchema = z.object({
|
|
7
7
|
name: z.string(),
|
|
8
8
|
type: z.string(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seedDatabase.d.ts","sourceRoot":"","sources":["../src/seedDatabase.ts"],"names":[],"mappings":"AAIA,wBAAsB,aAAa,
|
|
1
|
+
{"version":3,"file":"seedDatabase.d.ts","sourceRoot":"","sources":["../src/seedDatabase.ts"],"names":[],"mappings":"AAIA,wBAAsB,aAAa,kBA2BlC;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;;;;;;;;;GAOjF;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;;;;;;;;GAQnF;AAED,eAAO,MAAM,YAAY,qBA6BxB,CAAC"}
|
package/dist/seedDatabase.js
CHANGED
|
@@ -1,11 +1,29 @@
|
|
|
1
|
-
import { prisma } from "./lib/prisma";
|
|
1
|
+
import { prisma } from "./lib/prisma.js";
|
|
2
2
|
import { hash } from "bcryptjs";
|
|
3
|
-
import { logger } from "./utils/logger";
|
|
3
|
+
import { logger } from "./utils/logger.js";
|
|
4
4
|
export async function clearDatabase() {
|
|
5
|
+
// Delete in order to respect foreign key constraints
|
|
6
|
+
// Delete notifications first (they reference users)
|
|
7
|
+
await prisma.notification.deleteMany();
|
|
8
|
+
// Delete other records that reference users
|
|
9
|
+
await prisma.submission.deleteMany();
|
|
10
|
+
await prisma.assignment.deleteMany();
|
|
11
|
+
await prisma.announcement.deleteMany();
|
|
12
|
+
await prisma.event.deleteMany();
|
|
13
|
+
await prisma.attendance.deleteMany();
|
|
14
|
+
await prisma.file.deleteMany();
|
|
15
|
+
// Delete class-related records
|
|
16
|
+
await prisma.section.deleteMany();
|
|
17
|
+
await prisma.markScheme.deleteMany();
|
|
18
|
+
await prisma.gradingBoundary.deleteMany();
|
|
19
|
+
await prisma.folder.deleteMany();
|
|
5
20
|
await prisma.class.deleteMany();
|
|
6
|
-
|
|
21
|
+
// Delete user-related records
|
|
7
22
|
await prisma.session.deleteMany();
|
|
23
|
+
await prisma.userProfile.deleteMany();
|
|
24
|
+
// Finally delete users and schools
|
|
8
25
|
await prisma.user.deleteMany();
|
|
26
|
+
await prisma.school.deleteMany();
|
|
9
27
|
}
|
|
10
28
|
export async function createUser(email, password, username) {
|
|
11
29
|
logger.debug("Creating user", { email, username, password });
|
package/dist/socket/handlers.js
CHANGED
package/dist/trpc.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { TRPCError } from '@trpc/server';
|
|
2
2
|
import { Request, Response } from 'express';
|
|
3
3
|
import { z } from 'zod';
|
|
4
|
-
import { PrismaErrorInfo } from './utils/prismaErrorHandler';
|
|
4
|
+
import { PrismaErrorInfo } from './utils/prismaErrorHandler.js';
|
|
5
5
|
interface CreateContextOptions {
|
|
6
6
|
req: Request;
|
|
7
7
|
res: Response;
|
package/dist/trpc.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trpc.d.ts","sourceRoot":"","sources":["../src/trpc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,SAAS,EAAE,MAAM,cAAc,CAAC;AAMnD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAqB,eAAe,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"trpc.d.ts","sourceRoot":"","sources":["../src/trpc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,SAAS,EAAE,MAAM,cAAc,CAAC;AAMnD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAqB,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEnF,UAAU,oBAAoB;IAC5B,GAAG,EAAE,OAAO,CAAC;IACb,GAAG,EAAE,QAAQ,CAAC;CACf;AAED,MAAM,MAAM,OAAO,GAAG;IACpB,GAAG,EAAE,OAAO,CAAC;IACb,GAAG,EAAE,QAAQ,CAAC;IACd,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC5B,IAAI,CAAC,EAAE;QACL,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;CACH,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAU,MAAM,oBAAoB,KAAG,OAAO,CAAC,OAAO,CAwBnF,CAAC;AAEF,eAAO,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8BZ,CAAC;AAOH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;EAAW,CAAC;AACzC,eAAO,MAAM,eAAe,yOAAqC,CAAC;AAGlE,eAAO,MAAM,kBAAkB,yOAAgC,CAAC;AAChE,eAAO,MAAM,6BAA6B;;;;uHAEnB,CAAC;AACxB,eAAO,MAAM,yBAAyB;;;;uHAEd,CAAC;AAIzB,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;EAAwB,CAAC"}
|
package/dist/trpc.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { initTRPC } from '@trpc/server';
|
|
2
2
|
import { ZodError } from 'zod';
|
|
3
|
-
import { logger } from './utils/logger';
|
|
4
|
-
import { prisma } from './lib/prisma';
|
|
5
|
-
import { createLoggingMiddleware } from './middleware/logging';
|
|
6
|
-
import { createAuthMiddleware } from './middleware/auth';
|
|
3
|
+
import { logger } from './utils/logger.js';
|
|
4
|
+
import { prisma } from './lib/prisma.js';
|
|
5
|
+
import { createLoggingMiddleware } from './middleware/logging.js';
|
|
6
|
+
import { createAuthMiddleware } from './middleware/auth.js';
|
|
7
7
|
import { z } from 'zod';
|
|
8
|
-
import { handlePrismaError } from './utils/prismaErrorHandler';
|
|
8
|
+
import { handlePrismaError } from './utils/prismaErrorHandler.js';
|
|
9
9
|
export const createTRPCContext = async (opts) => {
|
|
10
10
|
const { req, res } = opts;
|
|
11
11
|
// Get user from session/token
|
package/dist/types/trpc.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { inferAsyncReturnType } from '@trpc/server';
|
|
2
|
-
import { createTRPCContext } from '../trpc';
|
|
2
|
+
import { createTRPCContext } from '../trpc.js';
|
|
3
3
|
export type Context = inferAsyncReturnType<typeof createTRPCContext> & {
|
|
4
4
|
isTeacher?: boolean;
|
|
5
5
|
teacherClassIds?: string[];
|
package/dist/types/trpc.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trpc.d.ts","sourceRoot":"","sources":["../../src/types/trpc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"trpc.d.ts","sourceRoot":"","sources":["../../src/types/trpc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,MAAM,OAAO,GAAG,oBAAoB,CAAC,OAAO,iBAAiB,CAAC,GAAG;IACrE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B,CAAC;AAEF,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,OAAO,CAAC;IACb,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE;QAAE,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;KAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IACzD,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { TRPCError } from '@trpc/server';
|
|
2
|
-
import { handlePrismaError } from './prismaErrorHandler';
|
|
2
|
+
import { handlePrismaError } from './prismaErrorHandler.js';
|
|
3
3
|
export async function withPrismaErrorHandling(operation, context = 'database operation') {
|
|
4
4
|
try {
|
|
5
5
|
return await operation();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@studious-lms/server",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Backend server for Studious application",
|
|
5
5
|
"main": "dist/exportType.js",
|
|
6
6
|
"types": "dist/exportType.d.ts",
|
|
@@ -12,13 +12,13 @@
|
|
|
12
12
|
}
|
|
13
13
|
},
|
|
14
14
|
"scripts": {
|
|
15
|
-
"dev": "
|
|
15
|
+
"dev": "tsx watch src/index.ts",
|
|
16
16
|
"build": "tsc",
|
|
17
17
|
"start": "node dist/index.js",
|
|
18
18
|
"generate": "npx prisma generate",
|
|
19
19
|
"prepublishOnly": "npm run generate && npm run build",
|
|
20
20
|
"test": "vitest",
|
|
21
|
-
"seed": "
|
|
21
|
+
"seed": "node dist/seedDatabase.js"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
24
|
"@google-cloud/storage": "^7.16.0",
|
|
@@ -48,6 +48,7 @@
|
|
|
48
48
|
"ts-node": "^10.9.2",
|
|
49
49
|
"ts-node-dev": "^2.0.0",
|
|
50
50
|
"tsconfig-paths": "^4.2.0",
|
|
51
|
+
"tsx": "^4.20.5",
|
|
51
52
|
"typescript": "^5.3.3",
|
|
52
53
|
"vitest": "^3.2.4"
|
|
53
54
|
}
|
package/prisma/schema.prisma
CHANGED
|
@@ -81,7 +81,7 @@ model User {
|
|
|
81
81
|
model UserProfile {
|
|
82
82
|
id String @id @default(uuid())
|
|
83
83
|
userId String @unique
|
|
84
|
-
user User? @relation(fields: [userId], references: [id])
|
|
84
|
+
user User? @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
85
85
|
|
|
86
86
|
}
|
|
87
87
|
|
|
@@ -291,5 +291,5 @@ model Notification {
|
|
|
291
291
|
receiverId String
|
|
292
292
|
read Boolean @default(false)
|
|
293
293
|
sender User? @relation("SentNotifications", fields: [senderId], references: [id])
|
|
294
|
-
receiver User @relation("ReceivedNotifications", fields: [receiverId], references: [id])
|
|
294
|
+
receiver User @relation("ReceivedNotifications", fields: [receiverId], references: [id], onDelete: Cascade)
|
|
295
295
|
}
|
package/src/exportType.ts
CHANGED
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
* to the client via npmjs
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
export type { AppRouter } from "./routers/_app";
|
|
8
|
-
export type { RouterInputs } from "./routers/_app";
|
|
9
|
-
export type { RouterOutputs } from "./routers/_app";
|
|
7
|
+
export type { AppRouter } from "./routers/_app.js";
|
|
8
|
+
export type { RouterInputs } from "./routers/_app.js";
|
|
9
|
+
export type { RouterOutputs } from "./routers/_app.js";
|
package/src/index.ts
CHANGED
|
@@ -5,10 +5,10 @@ import { Server } from 'socket.io';
|
|
|
5
5
|
import cors from 'cors';
|
|
6
6
|
import dotenv from 'dotenv';
|
|
7
7
|
import { createExpressMiddleware } from '@trpc/server/adapters/express';
|
|
8
|
-
import { appRouter } from './routers/_app';
|
|
9
|
-
import { createTRPCContext, createCallerFactory } from './trpc';
|
|
10
|
-
import { logger } from './utils/logger';
|
|
11
|
-
import { setupSocketHandlers } from './socket/handlers';
|
|
8
|
+
import { appRouter } from './routers/_app.js';
|
|
9
|
+
import { createTRPCContext, createCallerFactory } from './trpc.js';
|
|
10
|
+
import { logger } from './utils/logger.js';
|
|
11
|
+
import { setupSocketHandlers } from './socket/handlers.js';
|
|
12
12
|
|
|
13
13
|
dotenv.config();
|
|
14
14
|
|
package/src/lib/fileUpload.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { TRPCError } from "@trpc/server";
|
|
2
2
|
import { v4 as uuidv4 } from "uuid";
|
|
3
|
-
import { uploadFile as uploadToGCS, getSignedUrl } from "./googleCloudStorage";
|
|
4
|
-
import { generateThumbnail, storeThumbnail, generateMediaThumbnail } from "./thumbnailGenerator";
|
|
5
|
-
import { prisma } from "./prisma";
|
|
3
|
+
import { uploadFile as uploadToGCS, getSignedUrl } from "./googleCloudStorage.js";
|
|
4
|
+
import { generateThumbnail, storeThumbnail, generateMediaThumbnail } from "./thumbnailGenerator.js";
|
|
5
|
+
import { prisma } from "./prisma.js";
|
|
6
6
|
|
|
7
7
|
export interface FileData {
|
|
8
8
|
name: string;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import sharp from 'sharp';
|
|
2
|
-
import { prisma } from './prisma';
|
|
3
|
-
import { uploadFile, deleteFile, getSignedUrl } from './googleCloudStorage';
|
|
2
|
+
import { prisma } from './prisma.js';
|
|
3
|
+
import { uploadFile, deleteFile, getSignedUrl } from './googleCloudStorage.js';
|
|
4
4
|
|
|
5
5
|
// Thumbnail size configuration
|
|
6
6
|
const THUMBNAIL_WIDTH = 200;
|
package/src/middleware/auth.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { TRPCError } from '@trpc/server';
|
|
2
|
-
import { prisma } from '../lib/prisma';
|
|
3
|
-
import type { MiddlewareContext } from '../types/trpc';
|
|
2
|
+
import { prisma } from '../lib/prisma.js';
|
|
3
|
+
import type { MiddlewareContext } from '../types/trpc.js';
|
|
4
4
|
|
|
5
5
|
export const createAuthMiddleware = (t: any) => {
|
|
6
6
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { MiddlewareContext } from '../types/trpc';
|
|
2
|
-
import { logger } from '../utils/logger';
|
|
1
|
+
import type { MiddlewareContext } from '../types/trpc.js';
|
|
2
|
+
import { logger } from '../utils/logger.js';
|
|
3
3
|
|
|
4
4
|
export const createLoggingMiddleware = (t: any) => {
|
|
5
5
|
return t.middleware(async ({ path, type, next, ctx }: MiddlewareContext) => {
|
package/src/routers/_app.ts
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import { createTRPCRouter } from "../trpc";
|
|
2
|
-
import { classRouter } from "./class";
|
|
3
|
-
import { announcementRouter } from "./announcement";
|
|
4
|
-
import { assignmentRouter } from "./assignment";
|
|
5
|
-
import { userRouter } from "./user";
|
|
6
|
-
import { createCallerFactory } from "../trpc";
|
|
1
|
+
import { createTRPCRouter } from "../trpc.js";
|
|
2
|
+
import { classRouter } from "./class.js";
|
|
3
|
+
import { announcementRouter } from "./announcement.js";
|
|
4
|
+
import { assignmentRouter } from "./assignment.js";
|
|
5
|
+
import { userRouter } from "./user.js";
|
|
6
|
+
import { createCallerFactory } from "../trpc.js";
|
|
7
7
|
import type { inferRouterInputs, inferRouterOutputs } from "@trpc/server";
|
|
8
|
-
import { sectionRouter } from "./section";
|
|
9
|
-
import { attendanceRouter } from "./attendance";
|
|
10
|
-
import { eventRouter } from "./event";
|
|
11
|
-
import { authRouter } from "./auth";
|
|
12
|
-
import { agendaRouter } from "./agenda";
|
|
13
|
-
import { fileRouter } from "./file";
|
|
14
|
-
import { folderRouter } from "./folder";
|
|
15
|
-
import { notificationRouter } from "./notifications";
|
|
8
|
+
import { sectionRouter } from "./section.js";
|
|
9
|
+
import { attendanceRouter } from "./attendance.js";
|
|
10
|
+
import { eventRouter } from "./event.js";
|
|
11
|
+
import { authRouter } from "./auth.js";
|
|
12
|
+
import { agendaRouter } from "./agenda.js";
|
|
13
|
+
import { fileRouter } from "./file.js";
|
|
14
|
+
import { folderRouter } from "./folder.js";
|
|
15
|
+
import { notificationRouter } from "./notifications.js";
|
|
16
16
|
|
|
17
17
|
export const appRouter = createTRPCRouter({
|
|
18
18
|
class: classRouter,
|
package/src/routers/agenda.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { createTRPCRouter, protectedProcedure } from "../trpc";
|
|
3
|
-
import { prisma } from "../lib/prisma";
|
|
2
|
+
import { createTRPCRouter, protectedProcedure } from "../trpc.js";
|
|
3
|
+
import { prisma } from "../lib/prisma.js";
|
|
4
4
|
import { TRPCError } from "@trpc/server";
|
|
5
5
|
import { addDays, startOfDay, endOfDay } from "date-fns";
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { createTRPCRouter, protectedClassMemberProcedure, protectedTeacherProcedure, protectedProcedure } from "../trpc";
|
|
3
|
-
import { prisma } from "../lib/prisma";
|
|
2
|
+
import { createTRPCRouter, protectedClassMemberProcedure, protectedTeacherProcedure, protectedProcedure } from "../trpc.js";
|
|
3
|
+
import { prisma } from "../lib/prisma.js";
|
|
4
4
|
import { TRPCError } from "@trpc/server";
|
|
5
5
|
|
|
6
6
|
const AnnouncementSelect = {
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { createTRPCRouter, protectedProcedure, protectedClassMemberProcedure, protectedTeacherProcedure } from "../trpc";
|
|
2
|
+
import { createTRPCRouter, protectedProcedure, protectedClassMemberProcedure, protectedTeacherProcedure } from "../trpc.js";
|
|
3
3
|
import { TRPCError } from "@trpc/server";
|
|
4
|
-
import { prisma } from "../lib/prisma";
|
|
5
|
-
import { uploadFiles, type UploadedFile } from "../lib/fileUpload";
|
|
6
|
-
import { deleteFile } from "../lib/googleCloudStorage";
|
|
4
|
+
import { prisma } from "../lib/prisma.js";
|
|
5
|
+
import { uploadFiles, type UploadedFile } from "../lib/fileUpload.js";
|
|
6
|
+
import { deleteFile } from "../lib/googleCloudStorage.js";
|
|
7
7
|
|
|
8
8
|
const fileSchema = z.object({
|
|
9
9
|
name: z.string(),
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { createTRPCRouter, protectedProcedure } from "../trpc";
|
|
2
|
+
import { createTRPCRouter, protectedProcedure } from "../trpc.js";
|
|
3
3
|
import { TRPCError } from "@trpc/server";
|
|
4
|
-
import { prisma } from "../lib/prisma";
|
|
4
|
+
import { prisma } from "../lib/prisma.js";
|
|
5
5
|
|
|
6
6
|
const attendanceSchema = z.object({
|
|
7
7
|
eventId: z.string().optional(),
|
package/src/routers/auth.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { createTRPCRouter, protectedProcedure, publicProcedure } from "../trpc";
|
|
2
|
+
import { createTRPCRouter, protectedProcedure, publicProcedure } from "../trpc.js";
|
|
3
3
|
import { TRPCError } from "@trpc/server";
|
|
4
|
-
import { prisma } from "../lib/prisma";
|
|
4
|
+
import { prisma } from "../lib/prisma.js";
|
|
5
5
|
import { v4 as uuidv4 } from 'uuid';
|
|
6
6
|
import { compare, hash } from "bcryptjs";
|
|
7
|
-
import { transport } from "../utils/email";
|
|
8
|
-
import { prismaWrapper } from "../utils/prismaWrapper";
|
|
7
|
+
import { transport } from "../utils/email.js";
|
|
8
|
+
import { prismaWrapper } from "../utils/prismaWrapper.js";
|
|
9
9
|
|
|
10
10
|
const loginSchema = z.object({
|
|
11
11
|
username: z.string(),
|