@studious-lms/server 1.4.1 → 1.4.3
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/.coderabbit.yaml +4 -1
- package/.env.example +6 -0
- package/.env.test.example +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +101 -76
- package/dist/index.js.map +1 -1
- package/dist/lib/config/cors.d.ts +16 -0
- package/dist/lib/config/cors.d.ts.map +1 -0
- package/dist/lib/config/cors.js +75 -0
- package/dist/lib/config/cors.js.map +1 -0
- package/dist/lib/config/env.d.ts +14 -0
- package/dist/lib/config/env.d.ts.map +1 -1
- package/dist/lib/config/env.js +9 -2
- package/dist/lib/config/env.js.map +1 -1
- package/dist/lib/fileUpload.d.ts +10 -2
- package/dist/lib/fileUpload.d.ts.map +1 -1
- package/dist/lib/fileUpload.js +38 -6
- package/dist/lib/fileUpload.js.map +1 -1
- package/dist/lib/prisma.d.ts +14 -2
- package/dist/lib/prisma.d.ts.map +1 -1
- package/dist/lib/prisma.js +27 -8
- package/dist/lib/prisma.js.map +1 -1
- package/dist/middleware/auth.d.ts.map +1 -1
- package/dist/middleware/auth.js +18 -5
- package/dist/middleware/auth.js.map +1 -1
- package/dist/middleware/security.d.ts.map +1 -1
- package/dist/middleware/security.js +3 -3
- package/dist/middleware/security.js.map +1 -1
- package/dist/models/agenda.d.ts +16 -16
- package/dist/models/announcement.d.ts +59 -23
- package/dist/models/announcement.d.ts.map +1 -1
- package/dist/models/assignment.d.ts +363 -276
- package/dist/models/assignment.d.ts.map +1 -1
- package/dist/models/attendance.d.ts +63 -21
- package/dist/models/attendance.d.ts.map +1 -1
- package/dist/models/auth.d.ts +115 -26
- package/dist/models/auth.d.ts.map +1 -1
- package/dist/models/auth.js +53 -30
- package/dist/models/auth.js.map +1 -1
- package/dist/models/class.d.ts +115 -65
- package/dist/models/class.d.ts.map +1 -1
- package/dist/models/class.js +16 -4
- package/dist/models/class.js.map +1 -1
- package/dist/models/comment.d.ts +52 -16
- package/dist/models/comment.d.ts.map +1 -1
- package/dist/models/conversation.d.ts +46 -16
- package/dist/models/conversation.d.ts.map +1 -1
- package/dist/models/event.d.ts +107 -53
- package/dist/models/event.d.ts.map +1 -1
- package/dist/models/file.d.ts +213 -165
- package/dist/models/file.d.ts.map +1 -1
- package/dist/models/folder.d.ts +161 -77
- package/dist/models/folder.d.ts.map +1 -1
- package/dist/models/labChat.d.ts +73 -31
- package/dist/models/labChat.d.ts.map +1 -1
- package/dist/models/marketing.d.ts +25 -7
- package/dist/models/marketing.d.ts.map +1 -1
- package/dist/models/message.d.ts +31 -13
- package/dist/models/message.d.ts.map +1 -1
- package/dist/models/newtonChat.d.ts +34 -10
- package/dist/models/newtonChat.d.ts.map +1 -1
- package/dist/models/notification.d.ts +29 -10
- package/dist/models/notification.d.ts.map +1 -1
- package/dist/models/notification.js +13 -9
- package/dist/models/notification.js.map +1 -1
- package/dist/models/section.d.ts +71 -23
- package/dist/models/section.d.ts.map +1 -1
- package/dist/models/user.d.ts +27 -9
- package/dist/models/user.d.ts.map +1 -1
- package/dist/models/worksheet.d.ts +606 -106
- package/dist/models/worksheet.d.ts.map +1 -1
- package/dist/models/worksheet.js +168 -2
- package/dist/models/worksheet.js.map +1 -1
- package/dist/pipelines/aiLabChat.d.ts +22 -2
- package/dist/pipelines/aiLabChat.d.ts.map +1 -1
- package/dist/pipelines/aiLabChat.js +133 -95
- package/dist/pipelines/aiLabChat.js.map +1 -1
- package/dist/pipelines/aiLabChatContract.d.ts +25 -25
- package/dist/pipelines/aiNewtonChat.d.ts.map +1 -1
- package/dist/pipelines/aiNewtonChat.js +25 -14
- package/dist/pipelines/aiNewtonChat.js.map +1 -1
- package/dist/pipelines/gradeWorksheet.d.ts +8 -8
- package/dist/pipelines/gradeWorksheet.d.ts.map +1 -1
- package/dist/pipelines/gradeWorksheet.js +12 -5
- package/dist/pipelines/gradeWorksheet.js.map +1 -1
- package/dist/pipelines/labChatPrompt.d.ts +27 -0
- package/dist/pipelines/labChatPrompt.d.ts.map +1 -1
- package/dist/pipelines/labChatPrompt.js +143 -69
- package/dist/pipelines/labChatPrompt.js.map +1 -1
- package/dist/routers/_app.d.ts +1579 -1257
- package/dist/routers/_app.d.ts.map +1 -1
- package/dist/routers/agenda.d.ts +16 -16
- package/dist/routers/announcement.d.ts +19 -19
- package/dist/routers/assignment.d.ts +307 -291
- package/dist/routers/assignment.d.ts.map +1 -1
- package/dist/routers/assignment.js +3 -2
- package/dist/routers/assignment.js.map +1 -1
- package/dist/routers/attendance.d.ts +7 -7
- package/dist/routers/auth.d.ts +1 -1
- package/dist/routers/class.d.ts +79 -72
- package/dist/routers/class.d.ts.map +1 -1
- package/dist/routers/class.js +3 -3
- package/dist/routers/class.js.map +1 -1
- package/dist/routers/comment.d.ts +6 -6
- package/dist/routers/conversation.d.ts +11 -11
- package/dist/routers/event.d.ts +35 -35
- package/dist/routers/file.d.ts +12 -12
- package/dist/routers/folder.d.ts +54 -54
- package/dist/routers/labChat.d.ts +18 -12
- package/dist/routers/labChat.d.ts.map +1 -1
- package/dist/routers/labChat.js +5 -3
- package/dist/routers/labChat.js.map +1 -1
- package/dist/routers/marketing.d.ts +2 -2
- package/dist/routers/message.d.ts +33 -2
- package/dist/routers/message.d.ts.map +1 -1
- package/dist/routers/message.js +27 -4
- package/dist/routers/message.js.map +1 -1
- package/dist/routers/newtonChat.d.ts +7 -1
- package/dist/routers/newtonChat.d.ts.map +1 -1
- package/dist/routers/newtonChat.js +5 -4
- package/dist/routers/newtonChat.js.map +1 -1
- package/dist/routers/notifications.d.ts +13 -6
- package/dist/routers/notifications.d.ts.map +1 -1
- package/dist/routers/notifications.js +4 -4
- package/dist/routers/notifications.js.map +1 -1
- package/dist/routers/section.d.ts +7 -7
- package/dist/routers/studentProgress.d.ts +86 -0
- package/dist/routers/studentProgress.d.ts.map +1 -1
- package/dist/routers/studentProgress.js +14 -4
- package/dist/routers/studentProgress.js.map +1 -1
- package/dist/routers/user.d.ts +1 -1
- package/dist/routers/worksheet.d.ts +64 -62
- package/dist/routers/worksheet.d.ts.map +1 -1
- package/dist/routers/worksheet.js +18 -16
- package/dist/routers/worksheet.js.map +1 -1
- package/dist/seedDatabase.d.ts +1 -1
- package/dist/services/agenda.d.ts +16 -16
- package/dist/services/announcement.d.ts +8 -8
- package/dist/services/assignment.d.ts +299 -283
- package/dist/services/assignment.d.ts.map +1 -1
- package/dist/services/assignment.js +24 -5
- package/dist/services/assignment.js.map +1 -1
- package/dist/services/attendance.d.ts +7 -7
- package/dist/services/auth.d.ts +2 -2
- package/dist/services/auth.d.ts.map +1 -1
- package/dist/services/auth.js +19 -12
- package/dist/services/auth.js.map +1 -1
- package/dist/services/class.d.ts +74 -68
- package/dist/services/class.d.ts.map +1 -1
- package/dist/services/class.js +6 -3
- package/dist/services/class.js.map +1 -1
- package/dist/services/comment.d.ts +6 -6
- package/dist/services/conversation.d.ts +11 -11
- package/dist/services/event.d.ts +31 -31
- package/dist/services/file.d.ts +12 -12
- package/dist/services/file.d.ts.map +1 -1
- package/dist/services/file.js +7 -2
- package/dist/services/file.js.map +1 -1
- package/dist/services/folder.d.ts +52 -52
- package/dist/services/labChat.d.ts +18 -12
- package/dist/services/labChat.d.ts.map +1 -1
- package/dist/services/labChat.js +30 -18
- package/dist/services/labChat.js.map +1 -1
- package/dist/services/marketing.d.ts +2 -2
- package/dist/services/message.d.ts +30 -0
- package/dist/services/message.d.ts.map +1 -1
- package/dist/services/message.js +97 -21
- package/dist/services/message.js.map +1 -1
- package/dist/services/newtonChat.d.ts +6 -1
- package/dist/services/newtonChat.d.ts.map +1 -1
- package/dist/services/newtonChat.js +36 -18
- package/dist/services/newtonChat.js.map +1 -1
- package/dist/services/notification.d.ts +16 -9
- package/dist/services/notification.d.ts.map +1 -1
- package/dist/services/notification.js +24 -9
- package/dist/services/notification.js.map +1 -1
- package/dist/services/section.d.ts +6 -6
- package/dist/services/studentProgress.d.ts +75 -0
- package/dist/services/studentProgress.d.ts.map +1 -1
- package/dist/services/studentProgress.js +300 -107
- package/dist/services/studentProgress.js.map +1 -1
- package/dist/services/worksheet.d.ts +64 -64
- package/dist/services/worksheet.d.ts.map +1 -1
- package/dist/services/worksheet.js +138 -54
- package/dist/services/worksheet.js.map +1 -1
- package/dist/trpc.d.ts.map +1 -1
- package/dist/trpc.js +11 -17
- package/dist/trpc.js.map +1 -1
- package/dist/utils/inference.d.ts +9 -12
- package/dist/utils/inference.d.ts.map +1 -1
- package/dist/utils/inference.js +135 -95
- package/dist/utils/inference.js.map +1 -1
- package/package.json +1 -1
- package/prisma/migrations/20260410124000_add_submission_recommendation_state/migration.sql +14 -0
- package/prisma/migrations/20260415103500_add_session_type/migration.sql +33 -0
- package/prisma/migrations/20260415133000_add_ai_usage_logs/migration.sql +19 -0
- package/prisma/schema.prisma +41 -1
- package/scripts/test-pre-push.ts +6 -2
- package/src/index.ts +119 -79
- package/src/lib/config/cors.ts +96 -0
- package/src/lib/config/env.ts +12 -1
- package/src/lib/fileUpload.ts +55 -5
- package/src/lib/prisma.ts +25 -6
- package/src/middleware/auth.ts +19 -4
- package/src/middleware/security.ts +1 -1
- package/src/models/auth.ts +59 -29
- package/src/models/class.ts +15 -4
- package/src/models/notification.ts +13 -7
- package/src/models/worksheet.ts +202 -0
- package/src/pipelines/aiLabChat.ts +183 -104
- package/src/pipelines/aiNewtonChat.ts +24 -14
- package/src/pipelines/gradeWorksheet.ts +10 -2
- package/src/pipelines/labChatPrompt.ts +196 -68
- package/src/routers/assignment.ts +1 -0
- package/src/routers/class.ts +2 -2
- package/src/routers/labChat.ts +3 -1
- package/src/routers/message.ts +38 -1
- package/src/routers/newtonChat.ts +4 -2
- package/src/routers/notifications.ts +2 -2
- package/src/routers/studentProgress.ts +25 -1
- package/src/routers/worksheet.ts +31 -19
- package/src/services/assignment.ts +30 -2
- package/src/services/auth.ts +26 -12
- package/src/services/class.ts +4 -1
- package/src/services/file.ts +6 -0
- package/src/services/labChat.ts +42 -18
- package/src/services/message.ts +163 -18
- package/src/services/newtonChat.ts +49 -18
- package/src/services/notification.ts +27 -8
- package/src/services/studentProgress.ts +425 -121
- package/src/services/worksheet.ts +191 -51
- package/src/trpc.ts +12 -18
- package/src/utils/inference.ts +205 -112
- package/tests/globalSetup.ts +13 -4
- package/tests/lib/cors.test.ts +103 -0
- package/tests/pipelines/aiLabChat.test.ts +64 -84
- package/tests/routers/auth.test.ts +120 -17
- package/tests/routers/class.test.ts +7 -1
- package/tests/routers/message.test.ts +236 -9
- package/tests/routers/newtonChat.test.ts +81 -0
- package/tests/routers/notification.test.ts +12 -0
- package/tests/routers/studentProgress.test.ts +2 -31
- package/tests/routers/worksheet.test.ts +194 -0
- package/tests/setup.ts +22 -5
- package/tests/utils/aiLabChatPrompt.test.ts +114 -6
- package/tests/utils/inference.test.ts +218 -0
- package/tests/utils/studentProgress.test.ts +361 -0
- package/vitest.unit.config.ts +1 -0
package/dist/models/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sources":["models/auth.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Auth model – user lookup, session CRUD, Redis session cache.\n * findUserBySessionToken checks Redis first, then DB.\n */\nimport { getRedis } from \"../lib/redis.js\";\nimport { prisma } from \"../lib/prisma.js\";\n\n/** @returns User by username (includes password for login). */\nexport function findUserByUsername(username: string) {\n return prisma.user.findFirst({\n where: { username },\n select: {\n id: true,\n username: true,\n password: true,\n email: true,\n verified: true,\n },\n });\n}\n\n/** @returns User by username or email. */\nexport function findUserByUsernameOrEmail(username: string, email: string) {\n return prisma.user.findFirst({\n where: {\n OR: [{ username }, { email }],\n },\n select: {\n id: true,\n username: true,\n email: true,\n verified: true,\n },\n });\n}\n\n/** @returns User by email with profile. */\nexport function findUserByEmail(email: string) {\n return prisma.user.findFirst({\n where: { email },\n select: {\n id: true,\n email: true,\n role: true,\n profile: {\n select: {\n displayName: true,\n bio: true,\n location: true,\n website: true,\n profilePicture: true,\n },\n },\n },\n });\n}\n\n/** @returns User by ID with profile. */\nexport function findUserById(id: string) {\n return prisma.user.findUnique({\n where: { id },\n select: {\n id: true,\n username: true,\n profile: {\n select: {\n displayName: true,\n bio: true,\n location: true,\n website: true,\n profilePicture: true,\n profilePictureThumbnail: true,\n },\n },\n },\n });\n}\n\n/** Create a user with empty profile. */\nexport function createUser(data: {\n username: string;\n email: string;\n password: string;\n verified?: boolean;\n}) {\n return prisma.user.create({\n data: {\n username: data.username,\n email: data.email,\n password: data.password,\n verified: data.verified ?? false,\n profile: { create: {} },\n },\n select: {\n id: true,\n username: true,\n email: true,\n },\n });\n}\n\n/** Create a session. */\nexport function createSession(data: {\n id: string;\n userId: string;\n expiresAt: Date;\n}) {\n return prisma.session.create({\n data,\n });\n}\n\n/** Delete all sessions for user. Invalidates Redis cache. */\nexport async function deleteSessionsByUserId(userId: string) {\n const sessions = await prisma.session.findMany({\n where: { userId },\n });\n for (const session of sessions) {\n await getRedis()?.del(`session:${session.id}`);\n }\n return prisma.session.deleteMany({\n where: { userId },\n });\n}\n\n/** Delete short-lived sessions (no classId) expiring before date. */\nexport function deleteShortLivedSessionsByUserId(\n userId: string,\n expiresBefore: Date\n) {\n return prisma.session.deleteMany({\n where: {\n userId,\n classId: null,\n expiresAt: { lte: expiresBefore },\n },\n });\n}\n\n/** Delete a user. */\nexport function deleteUserById(id: string) {\n return prisma.user.delete({\n where: { id },\n });\n}\n\n/** @returns Session by ID. */\nexport function findSessionById(id: string) {\n return prisma.session.findUnique({\n where: { id },\n });\n}\n\n/** @returns Session with user. */\nexport function findSessionByIdWithUser(id: string) {\n return prisma.session.findUnique({\n where: { id },\n include: {\n user: { select: { id: true } },\n },\n });\n}\n\n/** Set user verified status. */\nexport function updateUserVerified(userId: string, verified: boolean) {\n return prisma.user.update({\n where: { id: userId },\n data: { verified },\n });\n}\n\n/** Update user password. */\nexport function updateUserPassword(userId: string, password: string) {\n return prisma.user.update({\n where: { id: userId },\n data: { password },\n });\n}\n\n/** Delete a session. */\nexport function deleteSessionById(id: string) {\n return prisma.session.delete({\n where: { id },\n });\n}\n\n/** @returns User from session token. Checks Redis first, then DB. Caches in Redis. */\nexport async function findUserBySessionToken(token: string) {\n const session = await getRedis()?.get(`session:${token}`);\n\n if (session)\n return JSON.parse(session);\n\n const user = await prisma.user.findFirst({\n where: {\n sessions: { some: { id: token } },\n },\n select: {\n id: true,\n username: true,\n },\n });\n\n if (user) {\n const r = getRedis();\n if (r) {\n const ttlSeconds = 30 * 24 * 60 * 60; // 30 days, match session expiry\n await r.setex(`session:${token}`, ttlSeconds, JSON.stringify(user));\n }\n return user;\n }\n\n return null;\n}\n\n/** @returns Class IDs where user is a teacher. */\nexport function findTeacherClassesByUserId(userId: string) {\n return prisma.class.findMany({\n where: {\n teachers: { some: { id: userId } },\n },\n select: { id: true },\n });\n}\n\n/** @returns Class if user is student or teacher. */\nexport function findClassWithMember(classId: string, userId: string) {\n return prisma.class.findFirst({\n where: {\n id: classId,\n OR: [\n { students: { some: { id: userId } } },\n { teachers: { some: { id: userId } } },\n ],\n },\n });\n}\n\n/** @returns Class if user is a teacher. */\nexport function findClassWithTeacher(classId: string, teacherId: string) {\n return prisma.class.findFirst({\n where: {\n id: classId,\n teachers: { some: { id: teacherId } },\n },\n });\n}\n"],"names":[],"mappings":"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","debug_id":"807b5838-7465-59d7-9c89-4d5177b75a3c"}
|
|
1
|
+
{"version":3,"file":"auth.js","sources":["models/auth.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Auth model – user lookup, session CRUD, Redis session cache.\n * findUserBySessionToken checks Redis first, then DB.\n */\nimport { SessionType } from \"@prisma/client\";\nimport { getRedis } from \"../lib/redis.js\";\nimport { prisma } from \"../lib/prisma.js\";\n\nconst AUTH_SESSION_CACHE_PREFIX = \"auth-session:\";\n\nfunction getAuthSessionCacheKey(token: string) {\n return `${AUTH_SESSION_CACHE_PREFIX}${token}`;\n}\n\nfunction getSessionTtlSeconds(expiresAt?: Date | null) {\n if (!expiresAt) {\n return null;\n }\n\n const ttlSeconds = Math.floor((expiresAt.getTime() - Date.now()) / 1000);\n return ttlSeconds > 0 ? ttlSeconds : null;\n}\n\n/** @returns User by username (includes password for login). */\nexport function findUserByUsername(username: string) {\n return prisma.user.findFirst({\n where: { username },\n select: {\n id: true,\n username: true,\n password: true,\n email: true,\n verified: true,\n },\n });\n}\n\n/** @returns User by username or email. */\nexport function findUserByUsernameOrEmail(username: string, email: string) {\n return prisma.user.findFirst({\n where: {\n OR: [{ username }, { email }],\n },\n select: {\n id: true,\n username: true,\n email: true,\n verified: true,\n },\n });\n}\n\n/** @returns User by email with profile. */\nexport function findUserByEmail(email: string) {\n return prisma.user.findFirst({\n where: { email },\n select: {\n id: true,\n email: true,\n role: true,\n profile: {\n select: {\n displayName: true,\n bio: true,\n location: true,\n website: true,\n profilePicture: true,\n },\n },\n },\n });\n}\n\n/** @returns User by ID with profile. */\nexport function findUserById(id: string) {\n return prisma.user.findUnique({\n where: { id },\n select: {\n id: true,\n username: true,\n profile: {\n select: {\n displayName: true,\n bio: true,\n location: true,\n website: true,\n profilePicture: true,\n profilePictureThumbnail: true,\n },\n },\n },\n });\n}\n\n/** Create a user with empty profile. */\nexport function createUser(data: {\n username: string;\n email: string;\n password: string;\n verified?: boolean;\n}) {\n return prisma.user.create({\n data: {\n username: data.username,\n email: data.email,\n password: data.password,\n verified: data.verified ?? false,\n profile: { create: {} },\n },\n select: {\n id: true,\n username: true,\n email: true,\n },\n });\n}\n\n/** Create a session. */\nexport function createSession(data: {\n id: string;\n type: SessionType;\n expiresAt: Date;\n userId?: string;\n classId?: string;\n}) {\n return prisma.session.create({\n data,\n });\n}\n\n/** Delete all sessions for user. Invalidates Redis cache. */\nexport async function deleteSessionsByUserId(userId: string) {\n const sessions = await prisma.session.findMany({\n where: { userId },\n });\n for (const session of sessions) {\n await getRedis()?.del(getAuthSessionCacheKey(session.id));\n }\n return prisma.session.deleteMany({\n where: { userId },\n });\n}\n\n/** Delete password reset sessions expiring before date. */\nexport function deleteShortLivedSessionsByUserId(\n userId: string,\n expiresBefore: Date\n) {\n return prisma.session.deleteMany({\n where: {\n userId,\n type: SessionType.PASSWORD_RESET,\n expiresAt: { lte: expiresBefore },\n },\n });\n}\n\n/** Delete a user. */\nexport function deleteUserById(id: string) {\n return prisma.user.delete({\n where: { id },\n });\n}\n\n/** @returns Session by ID and type. */\nexport function findSessionByIdAndType(id: string, type: SessionType) {\n return prisma.session.findFirst({\n where: { id, type },\n });\n}\n\n/** @returns Session with user by ID and type. */\nexport function findSessionByIdWithUserAndType(id: string, type: SessionType) {\n return prisma.session.findFirst({\n where: { id, type },\n include: {\n user: { select: { id: true } },\n },\n });\n}\n\n/** Set user verified status. */\nexport function updateUserVerified(userId: string, verified: boolean) {\n return prisma.user.update({\n where: { id: userId },\n data: { verified },\n });\n}\n\n/** Update user password. */\nexport function updateUserPassword(userId: string, password: string) {\n return prisma.user.update({\n where: { id: userId },\n data: { password },\n });\n}\n\n/** Delete a session. */\nexport async function deleteSessionById(id: string) {\n await getRedis()?.del(getAuthSessionCacheKey(id));\n return prisma.session.delete({\n where: { id },\n });\n}\n\n/** @returns User from valid auth session token. Checks Redis first, then DB. Caches in Redis. */\nexport async function findUserBySessionToken(token: string) {\n const cacheKey = getAuthSessionCacheKey(token);\n const cachedUser = await getRedis()?.get(cacheKey);\n\n if (cachedUser) {\n return JSON.parse(cachedUser);\n }\n\n const session = await prisma.session.findFirst({\n where: {\n id: token,\n type: SessionType.AUTH,\n userId: { not: null },\n expiresAt: { gt: new Date() },\n },\n select: {\n expiresAt: true,\n user: {\n select: {\n id: true,\n username: true,\n },\n },\n },\n });\n\n if (!session?.user) {\n return null;\n }\n\n const ttlSeconds = getSessionTtlSeconds(session.expiresAt);\n const r = getRedis();\n if (r && ttlSeconds) {\n await r.setex(cacheKey, ttlSeconds, JSON.stringify(session.user));\n }\n\n return session.user;\n}\n\n/** @returns Class IDs where user is a teacher. */\nexport function findTeacherClassesByUserId(userId: string) {\n return prisma.class.findMany({\n where: {\n teachers: { some: { id: userId } },\n },\n select: { id: true },\n });\n}\n\n/** @returns Class if user is student or teacher. */\nexport function findClassWithMember(classId: string, userId: string) {\n return prisma.class.findFirst({\n where: {\n id: classId,\n OR: [\n { students: { some: { id: userId } } },\n { teachers: { some: { id: userId } } },\n ],\n },\n });\n}\n\n/** @returns Class if user is a teacher. */\nexport function findClassWithTeacher(classId: string, teacherId: string) {\n return prisma.class.findFirst({\n where: {\n id: classId,\n teachers: { some: { id: teacherId } },\n },\n });\n}\n"],"names":[],"mappings":"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","debug_id":"caa0301d-42ed-55b1-a0ef-383918fe715a"}
|
package/dist/models/class.d.ts
CHANGED
|
@@ -30,9 +30,9 @@ export declare function findTeacherClasses(userId: string): import(".prisma/clie
|
|
|
30
30
|
} | null;
|
|
31
31
|
}[];
|
|
32
32
|
} & {
|
|
33
|
+
name: string;
|
|
33
34
|
id: string;
|
|
34
35
|
schoolId: string | null;
|
|
35
|
-
name: string;
|
|
36
36
|
subject: string;
|
|
37
37
|
color: string | null;
|
|
38
38
|
section: string;
|
|
@@ -65,9 +65,9 @@ export declare function findStudentClasses(userId: string): import(".prisma/clie
|
|
|
65
65
|
} | null;
|
|
66
66
|
}[];
|
|
67
67
|
} & {
|
|
68
|
+
name: string;
|
|
68
69
|
id: string;
|
|
69
70
|
schoolId: string | null;
|
|
70
|
-
name: string;
|
|
71
71
|
subject: string;
|
|
72
72
|
color: string | null;
|
|
73
73
|
section: string;
|
|
@@ -75,14 +75,20 @@ export declare function findStudentClasses(userId: string): import(".prisma/clie
|
|
|
75
75
|
})[]>;
|
|
76
76
|
/** @returns Class if user is a teacher. */
|
|
77
77
|
export declare function isTeacherInClass(classId: string, userId: string): import(".prisma/client").Prisma.Prisma__ClassClient<{
|
|
78
|
+
name: string;
|
|
78
79
|
id: string;
|
|
79
80
|
schoolId: string | null;
|
|
80
|
-
name: string;
|
|
81
81
|
subject: string;
|
|
82
82
|
color: string | null;
|
|
83
83
|
section: string;
|
|
84
84
|
syllabus: string | null;
|
|
85
|
-
} | null, null, import("@prisma/client/runtime/library.js").DefaultArgs,
|
|
85
|
+
} | null, null, import("@prisma/client/runtime/library.js").DefaultArgs, {
|
|
86
|
+
datasources: {
|
|
87
|
+
db: {
|
|
88
|
+
url: string;
|
|
89
|
+
};
|
|
90
|
+
};
|
|
91
|
+
}>;
|
|
86
92
|
/** @returns Class with assignments. Students see only assigned; teachers see all. */
|
|
87
93
|
export declare function findClassWithAssignments(classId: string, options: {
|
|
88
94
|
isTeacher: boolean;
|
|
@@ -101,16 +107,16 @@ export declare function findClassWithAssignments(classId: string, options: {
|
|
|
101
107
|
submitted: boolean | null;
|
|
102
108
|
returned: boolean | null;
|
|
103
109
|
}[];
|
|
104
|
-
createdAt: Date | null;
|
|
105
110
|
section: {
|
|
106
|
-
id: string;
|
|
107
111
|
name: string;
|
|
112
|
+
id: string;
|
|
108
113
|
} | null;
|
|
114
|
+
createdAt: Date | null;
|
|
109
115
|
title: string;
|
|
110
|
-
dueDate: Date;
|
|
111
|
-
maxGrade: number | null;
|
|
112
116
|
instructions: string;
|
|
117
|
+
dueDate: Date;
|
|
113
118
|
graded: boolean;
|
|
119
|
+
maxGrade: number | null;
|
|
114
120
|
weight: number;
|
|
115
121
|
inProgress: boolean;
|
|
116
122
|
order: number | null;
|
|
@@ -126,8 +132,8 @@ export declare function findClassWithAssignments(classId: string, options: {
|
|
|
126
132
|
announcements: {
|
|
127
133
|
id: string;
|
|
128
134
|
createdAt: Date;
|
|
129
|
-
remarks: string;
|
|
130
135
|
modifiedAt: Date | null;
|
|
136
|
+
remarks: string;
|
|
131
137
|
teacher: {
|
|
132
138
|
id: string;
|
|
133
139
|
username: string;
|
|
@@ -157,53 +163,85 @@ export declare function findClassWithAssignments(classId: string, options: {
|
|
|
157
163
|
} | null;
|
|
158
164
|
}[];
|
|
159
165
|
} & {
|
|
166
|
+
name: string;
|
|
160
167
|
id: string;
|
|
161
168
|
schoolId: string | null;
|
|
162
|
-
name: string;
|
|
163
169
|
subject: string;
|
|
164
170
|
color: string | null;
|
|
165
171
|
section: string;
|
|
166
172
|
syllabus: string | null;
|
|
167
|
-
}) | null, null, import("@prisma/client/runtime/library.js").DefaultArgs,
|
|
173
|
+
}) | null, null, import("@prisma/client/runtime/library.js").DefaultArgs, {
|
|
174
|
+
datasources: {
|
|
175
|
+
db: {
|
|
176
|
+
url: string;
|
|
177
|
+
};
|
|
178
|
+
};
|
|
179
|
+
}>;
|
|
168
180
|
/** @returns Class by ID (minimal). */
|
|
169
181
|
export declare function findClassByIdBasic(classId: string): import(".prisma/client").Prisma.Prisma__ClassClient<{
|
|
182
|
+
name: string;
|
|
170
183
|
id: string;
|
|
171
184
|
schoolId: string | null;
|
|
172
|
-
name: string;
|
|
173
185
|
subject: string;
|
|
174
186
|
color: string | null;
|
|
175
187
|
section: string;
|
|
176
188
|
syllabus: string | null;
|
|
177
|
-
} | null, null, import("@prisma/client/runtime/library.js").DefaultArgs,
|
|
189
|
+
} | null, null, import("@prisma/client/runtime/library.js").DefaultArgs, {
|
|
190
|
+
datasources: {
|
|
191
|
+
db: {
|
|
192
|
+
url: string;
|
|
193
|
+
};
|
|
194
|
+
};
|
|
195
|
+
}>;
|
|
178
196
|
/** @returns Sections for a class. */
|
|
179
197
|
export declare function findSectionsByClassId(classId: string): import(".prisma/client").Prisma.PrismaPromise<{
|
|
180
|
-
id: string;
|
|
181
|
-
classId: string;
|
|
182
198
|
name: string;
|
|
199
|
+
id: string;
|
|
183
200
|
color: string | null;
|
|
201
|
+
classId: string;
|
|
184
202
|
order: number | null;
|
|
185
203
|
}[]>;
|
|
186
204
|
/** @returns User by ID (id, username only). */
|
|
187
205
|
export declare function findUserById(userId: string): import(".prisma/client").Prisma.Prisma__UserClient<{
|
|
188
206
|
id: string;
|
|
189
207
|
username: string;
|
|
190
|
-
} | null, null, import("@prisma/client/runtime/library.js").DefaultArgs,
|
|
208
|
+
} | null, null, import("@prisma/client/runtime/library.js").DefaultArgs, {
|
|
209
|
+
datasources: {
|
|
210
|
+
db: {
|
|
211
|
+
url: string;
|
|
212
|
+
};
|
|
213
|
+
};
|
|
214
|
+
}>;
|
|
191
215
|
/** @returns Session by class invite code. */
|
|
192
216
|
export declare function findSessionByClassCode(classCode: string): import(".prisma/client").Prisma.Prisma__SessionClient<{
|
|
217
|
+
type: import(".prisma/client").$Enums.SessionType;
|
|
193
218
|
id: string;
|
|
194
219
|
userId: string | null;
|
|
195
220
|
createdAt: Date | null;
|
|
196
221
|
expiresAt: Date | null;
|
|
197
222
|
classId: string | null;
|
|
198
|
-
} | null, null, import("@prisma/client/runtime/library.js").DefaultArgs,
|
|
223
|
+
} | null, null, import("@prisma/client/runtime/library.js").DefaultArgs, {
|
|
224
|
+
datasources: {
|
|
225
|
+
db: {
|
|
226
|
+
url: string;
|
|
227
|
+
};
|
|
228
|
+
};
|
|
229
|
+
}>;
|
|
199
230
|
/** @returns Session for a class. */
|
|
200
231
|
export declare function findSessionByClassId(classId: string): import(".prisma/client").Prisma.Prisma__SessionClient<{
|
|
232
|
+
type: import(".prisma/client").$Enums.SessionType;
|
|
201
233
|
id: string;
|
|
202
234
|
userId: string | null;
|
|
203
235
|
createdAt: Date | null;
|
|
204
236
|
expiresAt: Date | null;
|
|
205
237
|
classId: string | null;
|
|
206
|
-
} | null, null, import("@prisma/client/runtime/library.js").DefaultArgs,
|
|
238
|
+
} | null, null, import("@prisma/client/runtime/library.js").DefaultArgs, {
|
|
239
|
+
datasources: {
|
|
240
|
+
db: {
|
|
241
|
+
url: string;
|
|
242
|
+
};
|
|
243
|
+
};
|
|
244
|
+
}>;
|
|
207
245
|
/** @returns User's graded submissions for grade calculation. */
|
|
208
246
|
export declare function findSubmissionsForGrades(userId: string, classId: string): import(".prisma/client").Prisma.PrismaPromise<({
|
|
209
247
|
assignment: {
|
|
@@ -223,12 +261,15 @@ export declare function findSubmissionsForGrades(userId: string, classId: string
|
|
|
223
261
|
};
|
|
224
262
|
} & {
|
|
225
263
|
id: string;
|
|
226
|
-
createdAt: Date;
|
|
227
264
|
assignmentId: string;
|
|
265
|
+
createdAt: Date;
|
|
228
266
|
modifiedAt: Date;
|
|
229
267
|
studentId: string;
|
|
230
268
|
extendedResponse: string | null;
|
|
231
269
|
gradeReceived: number | null;
|
|
270
|
+
recommendationState: import(".prisma/client").$Enums.SubmissionRecommendationState;
|
|
271
|
+
recommendationUpdatedAt: Date | null;
|
|
272
|
+
targetedAssignmentId: string | null;
|
|
232
273
|
rubricState: string | null;
|
|
233
274
|
teacherComments: string | null;
|
|
234
275
|
submittedAt: Date | null;
|
|
@@ -256,19 +297,23 @@ export declare function findGradingBoundariesByClassId(classId: string): import(
|
|
|
256
297
|
/** @returns Class syllabus. */
|
|
257
298
|
export declare function findClassSyllabus(classId: string): import(".prisma/client").Prisma.Prisma__ClassClient<{
|
|
258
299
|
syllabus: string | null;
|
|
259
|
-
} | null, null, import("@prisma/client/runtime/library.js").DefaultArgs,
|
|
300
|
+
} | null, null, import("@prisma/client/runtime/library.js").DefaultArgs, {
|
|
301
|
+
datasources: {
|
|
302
|
+
db: {
|
|
303
|
+
url: string;
|
|
304
|
+
};
|
|
305
|
+
};
|
|
306
|
+
}>;
|
|
260
307
|
/** @returns In-progress lab drafts for a teacher. */
|
|
261
308
|
export declare function findLabDraftsByClass(classId: string, teacherId: string): import(".prisma/client").Prisma.PrismaPromise<{
|
|
262
309
|
type: import(".prisma/client").$Enums.AssignmentType;
|
|
263
310
|
id: string;
|
|
264
311
|
createdAt: Date | null;
|
|
312
|
+
modifiedAt: Date | null;
|
|
265
313
|
classId: string;
|
|
266
314
|
title: string;
|
|
267
|
-
dueDate: Date;
|
|
268
|
-
maxGrade: number | null;
|
|
269
|
-
eventId: string | null;
|
|
270
315
|
instructions: string;
|
|
271
|
-
|
|
316
|
+
dueDate: Date;
|
|
272
317
|
teacherId: string;
|
|
273
318
|
acceptFiles: boolean;
|
|
274
319
|
acceptExtendedResponse: boolean;
|
|
@@ -277,9 +322,11 @@ export declare function findLabDraftsByClass(classId: string, teacherId: string)
|
|
|
277
322
|
aiPolicyLevel: number;
|
|
278
323
|
sectionId: string | null;
|
|
279
324
|
graded: boolean;
|
|
325
|
+
maxGrade: number | null;
|
|
280
326
|
weight: number;
|
|
281
327
|
inProgress: boolean;
|
|
282
328
|
template: boolean;
|
|
329
|
+
eventId: string | null;
|
|
283
330
|
markSchemeId: string | null;
|
|
284
331
|
order: number | null;
|
|
285
332
|
gradingBoundaryId: string | null;
|
|
@@ -287,44 +334,47 @@ export declare function findLabDraftsByClass(classId: string, teacherId: string)
|
|
|
287
334
|
/** @returns Assignments with attachments and submissions. */
|
|
288
335
|
export declare function findAssignmentsWithFiles(classId: string): import(".prisma/client").Prisma.PrismaPromise<({
|
|
289
336
|
submissions: ({
|
|
290
|
-
|
|
337
|
+
annotations: {
|
|
291
338
|
path: string;
|
|
292
339
|
type: string;
|
|
293
|
-
user: {
|
|
294
|
-
id: string;
|
|
295
|
-
username: string;
|
|
296
|
-
} | null;
|
|
297
|
-
id: string;
|
|
298
340
|
name: string;
|
|
341
|
+
id: string;
|
|
299
342
|
size: number | null;
|
|
300
343
|
uploadedAt: Date | null;
|
|
301
344
|
thumbnailId: string | null;
|
|
302
|
-
}[];
|
|
303
|
-
student: {
|
|
304
|
-
id: string;
|
|
305
|
-
username: string;
|
|
306
|
-
};
|
|
307
|
-
annotations: {
|
|
308
|
-
path: string;
|
|
309
|
-
type: string;
|
|
310
345
|
user: {
|
|
311
346
|
id: string;
|
|
312
347
|
username: string;
|
|
313
348
|
} | null;
|
|
314
|
-
|
|
349
|
+
}[];
|
|
350
|
+
attachments: {
|
|
351
|
+
path: string;
|
|
352
|
+
type: string;
|
|
315
353
|
name: string;
|
|
354
|
+
id: string;
|
|
316
355
|
size: number | null;
|
|
317
356
|
uploadedAt: Date | null;
|
|
318
357
|
thumbnailId: string | null;
|
|
358
|
+
user: {
|
|
359
|
+
id: string;
|
|
360
|
+
username: string;
|
|
361
|
+
} | null;
|
|
319
362
|
}[];
|
|
363
|
+
student: {
|
|
364
|
+
id: string;
|
|
365
|
+
username: string;
|
|
366
|
+
};
|
|
320
367
|
} & {
|
|
321
368
|
id: string;
|
|
322
|
-
createdAt: Date;
|
|
323
369
|
assignmentId: string;
|
|
370
|
+
createdAt: Date;
|
|
324
371
|
modifiedAt: Date;
|
|
325
372
|
studentId: string;
|
|
326
373
|
extendedResponse: string | null;
|
|
327
374
|
gradeReceived: number | null;
|
|
375
|
+
recommendationState: import(".prisma/client").$Enums.SubmissionRecommendationState;
|
|
376
|
+
recommendationUpdatedAt: Date | null;
|
|
377
|
+
targetedAssignmentId: string | null;
|
|
328
378
|
rubricState: string | null;
|
|
329
379
|
teacherComments: string | null;
|
|
330
380
|
submittedAt: Date | null;
|
|
@@ -338,27 +388,25 @@ export declare function findAssignmentsWithFiles(classId: string): import(".pris
|
|
|
338
388
|
attachments: {
|
|
339
389
|
path: string;
|
|
340
390
|
type: string;
|
|
341
|
-
user: {
|
|
342
|
-
id: string;
|
|
343
|
-
username: string;
|
|
344
|
-
} | null;
|
|
345
|
-
id: string;
|
|
346
391
|
name: string;
|
|
392
|
+
id: string;
|
|
347
393
|
size: number | null;
|
|
348
394
|
uploadedAt: Date | null;
|
|
349
395
|
thumbnailId: string | null;
|
|
396
|
+
user: {
|
|
397
|
+
id: string;
|
|
398
|
+
username: string;
|
|
399
|
+
} | null;
|
|
350
400
|
}[];
|
|
351
401
|
} & {
|
|
352
402
|
type: import(".prisma/client").$Enums.AssignmentType;
|
|
353
403
|
id: string;
|
|
354
404
|
createdAt: Date | null;
|
|
405
|
+
modifiedAt: Date | null;
|
|
355
406
|
classId: string;
|
|
356
407
|
title: string;
|
|
357
|
-
dueDate: Date;
|
|
358
|
-
maxGrade: number | null;
|
|
359
|
-
eventId: string | null;
|
|
360
408
|
instructions: string;
|
|
361
|
-
|
|
409
|
+
dueDate: Date;
|
|
362
410
|
teacherId: string;
|
|
363
411
|
acceptFiles: boolean;
|
|
364
412
|
acceptExtendedResponse: boolean;
|
|
@@ -367,9 +415,11 @@ export declare function findAssignmentsWithFiles(classId: string): import(".pris
|
|
|
367
415
|
aiPolicyLevel: number;
|
|
368
416
|
sectionId: string | null;
|
|
369
417
|
graded: boolean;
|
|
418
|
+
maxGrade: number | null;
|
|
370
419
|
weight: number;
|
|
371
420
|
inProgress: boolean;
|
|
372
421
|
template: boolean;
|
|
422
|
+
eventId: string | null;
|
|
373
423
|
markSchemeId: string | null;
|
|
374
424
|
order: number | null;
|
|
375
425
|
gradingBoundaryId: string | null;
|
|
@@ -379,20 +429,15 @@ export declare function findFullExportableClass(classId: string): Promise<{
|
|
|
379
429
|
assignments: {
|
|
380
430
|
type: import(".prisma/client").$Enums.AssignmentType;
|
|
381
431
|
id: string;
|
|
382
|
-
createdAt: Date | null;
|
|
383
|
-
classId: string;
|
|
384
432
|
section: {
|
|
385
|
-
id: string;
|
|
386
433
|
name: string;
|
|
387
|
-
} | null;
|
|
388
|
-
worksheets: {
|
|
389
434
|
id: string;
|
|
390
|
-
}
|
|
435
|
+
} | null;
|
|
436
|
+
createdAt: Date | null;
|
|
437
|
+
classId: string;
|
|
391
438
|
title: string;
|
|
392
|
-
dueDate: Date;
|
|
393
|
-
maxGrade: number | null;
|
|
394
|
-
eventId: string | null;
|
|
395
439
|
instructions: string;
|
|
440
|
+
dueDate: Date;
|
|
396
441
|
teacherId: string;
|
|
397
442
|
acceptFiles: boolean;
|
|
398
443
|
acceptExtendedResponse: boolean;
|
|
@@ -401,8 +446,10 @@ export declare function findFullExportableClass(classId: string): Promise<{
|
|
|
401
446
|
aiPolicyLevel: number;
|
|
402
447
|
sectionId: string | null;
|
|
403
448
|
graded: boolean;
|
|
449
|
+
maxGrade: number | null;
|
|
404
450
|
weight: number;
|
|
405
451
|
inProgress: boolean;
|
|
452
|
+
eventId: string | null;
|
|
406
453
|
markSchemeId: string | null;
|
|
407
454
|
order: number | null;
|
|
408
455
|
gradingBoundaryId: string | null;
|
|
@@ -414,27 +461,30 @@ export declare function findFullExportableClass(classId: string): Promise<{
|
|
|
414
461
|
id: string;
|
|
415
462
|
structured: string;
|
|
416
463
|
} | null;
|
|
464
|
+
worksheets: {
|
|
465
|
+
id: string;
|
|
466
|
+
}[];
|
|
417
467
|
}[];
|
|
418
468
|
sections: {
|
|
419
|
-
id: string;
|
|
420
|
-
classId: string;
|
|
421
469
|
name: string;
|
|
470
|
+
id: string;
|
|
422
471
|
color: string | null;
|
|
472
|
+
classId: string;
|
|
423
473
|
order: number | null;
|
|
424
474
|
}[];
|
|
425
475
|
worksheets: {
|
|
476
|
+
name: string;
|
|
426
477
|
id: string;
|
|
427
478
|
classId: string;
|
|
428
|
-
name: string;
|
|
429
479
|
questions: {
|
|
430
|
-
options: import("@prisma/client/runtime/library.js").JsonValue;
|
|
431
480
|
type: import(".prisma/client").$Enums.WorksheetQuestionType;
|
|
481
|
+
options: import("@prisma/client/runtime/library.js").JsonValue;
|
|
432
482
|
order: number | null;
|
|
433
|
-
|
|
483
|
+
points: number;
|
|
434
484
|
worksheetId: string;
|
|
485
|
+
markScheme: import("@prisma/client/runtime/library.js").JsonValue;
|
|
435
486
|
question: string;
|
|
436
487
|
answer: string;
|
|
437
|
-
points: number;
|
|
438
488
|
}[];
|
|
439
489
|
}[];
|
|
440
490
|
markSchemes: {
|
|
@@ -447,9 +497,9 @@ export declare function findFullExportableClass(classId: string): Promise<{
|
|
|
447
497
|
classId: string;
|
|
448
498
|
structured: string;
|
|
449
499
|
}[];
|
|
500
|
+
name: string;
|
|
450
501
|
id: string;
|
|
451
502
|
schoolId: string | null;
|
|
452
|
-
name: string;
|
|
453
503
|
subject: string;
|
|
454
504
|
color: string | null;
|
|
455
505
|
section: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"class.d.ts","sourceRoot":"/","sources":["models/class.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,OAAO,EAAc,KAAK,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"class.d.ts","sourceRoot":"/","sources":["models/class.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,OAAO,EAAc,KAAK,EAAE,MAAM,EAAgE,MAAM,gBAAgB,CAAC;AAgDzH,gDAAgD;AAChD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAKhD;AAED,gDAAgD;AAChD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAKhD;AAED,2CAA2C;AAC3C,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;;;;;;;;;;;;;;GAO/D;AAsHD,qFAAqF;AACrF,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CjD;AAED,sCAAsC;AACtC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM;;;;;;;;;;;;;;GAIjD;AAED,qCAAqC;AACrC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM;;;;;;KAIpD;AAED,+CAA+C;AAC/C,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM;;;;;;;;;GAK1C;AAED,6CAA6C;AAC7C,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM;;;;;;;;;;;;;GAOvD;AAED,oCAAoC;AACpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM;;;;;;;;;;;;;GAInD;AAED,gEAAgE;AAChE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAsBvE;AAED,mCAAmC;AACnC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM;;;;KAKlD;AAED,yCAAyC;AACzC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM;;;;KAIvD;AAED,+CAA+C;AAC/C,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,MAAM;;;;KAI7D;AAED,+BAA+B;AAC/B,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM;;;;;;;;GAKhD;AAED,qDAAqD;AACrD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;KAStE;AAED,6DAA6D;AAC7D,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAiDvD;AAoGD,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAoF5D;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,GAAG;IAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA6HjK"}
|
package/dist/models/class.js
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
* grading boundaries, syllabus, lab drafts, invite codes.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
!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]="
|
|
6
|
+
!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]="f92cda2a-2ce2-5da3-914b-24deba15bc61")}catch(e){}}();
|
|
7
|
+
import { SessionType } from "@prisma/client";
|
|
7
8
|
import { prisma } from "../lib/prisma.js";
|
|
8
9
|
import { v4 as uuidv4 } from 'uuid';
|
|
9
10
|
import { copyFile } from "../lib/googleCloudStorage.js";
|
|
@@ -198,8 +199,18 @@ export function findClassWithAssignments(classId, options) {
|
|
|
198
199
|
const submissionWhere = !options.isTeacher && options.userId
|
|
199
200
|
? { studentId: options.userId }
|
|
200
201
|
: undefined;
|
|
201
|
-
return prisma.class.
|
|
202
|
-
where: {
|
|
202
|
+
return prisma.class.findFirst({
|
|
203
|
+
where: {
|
|
204
|
+
id: classId,
|
|
205
|
+
...(options.userId
|
|
206
|
+
? {
|
|
207
|
+
OR: [
|
|
208
|
+
{ students: { some: { id: options.userId } } },
|
|
209
|
+
{ teachers: { some: { id: options.userId } } },
|
|
210
|
+
],
|
|
211
|
+
}
|
|
212
|
+
: {}),
|
|
213
|
+
},
|
|
203
214
|
include: {
|
|
204
215
|
teachers: classIncludeForGet.teachers,
|
|
205
216
|
students: classIncludeForGet.students,
|
|
@@ -241,6 +252,7 @@ export function findSessionByClassCode(classCode) {
|
|
|
241
252
|
return prisma.session.findFirst({
|
|
242
253
|
where: {
|
|
243
254
|
id: { equals: classCode, mode: "insensitive" },
|
|
255
|
+
type: SessionType.CLASS_INVITE,
|
|
244
256
|
},
|
|
245
257
|
});
|
|
246
258
|
}
|
|
@@ -642,4 +654,4 @@ export async function createClassByImport(classId, userId, year, classData) {
|
|
|
642
654
|
return newClassId;
|
|
643
655
|
}
|
|
644
656
|
//# sourceMappingURL=class.js.map
|
|
645
|
-
//# debugId=
|
|
657
|
+
//# debugId=f92cda2a-2ce2-5da3-914b-24deba15bc61
|