@studious-lms/server 1.13.0 → 1.14.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/.dockerignore +28 -0
- package/.env.example +5 -0
- package/.github/workflows/deploy.yml +123 -0
- package/Dockerfile +54 -0
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/config/cors.d.ts.map +1 -1
- package/dist/lib/config/cors.js +31 -11
- package/dist/lib/config/cors.js.map +1 -1
- package/dist/lib/config/env.d.ts +17 -0
- package/dist/lib/config/env.d.ts.map +1 -1
- package/dist/lib/config/env.js +8 -2
- package/dist/lib/config/env.js.map +1 -1
- package/dist/lib/googleCloudStorage.d.ts +10 -0
- package/dist/lib/googleCloudStorage.d.ts.map +1 -1
- package/dist/lib/googleCloudStorage.js +22 -2
- package/dist/lib/googleCloudStorage.js.map +1 -1
- package/dist/lib/prisma.d.ts +104 -5
- package/dist/lib/prisma.d.ts.map +1 -1
- package/dist/lib/prisma.js +33 -2
- package/dist/lib/prisma.js.map +1 -1
- package/dist/models/agenda.d.ts +20 -20
- package/dist/models/announcement.d.ts +177 -69
- package/dist/models/announcement.d.ts.map +1 -1
- package/dist/models/assignment.d.ts +551 -353
- package/dist/models/assignment.d.ts.map +1 -1
- package/dist/models/attendance.d.ts +197 -71
- package/dist/models/attendance.d.ts.map +1 -1
- package/dist/models/auth.d.ts +348 -114
- package/dist/models/auth.d.ts.map +1 -1
- package/dist/models/class.d.ts +324 -198
- package/dist/models/class.d.ts.map +1 -1
- package/dist/models/class.js +2 -2
- package/dist/models/class.js.map +1 -1
- package/dist/models/cloudStorage.d.ts +146 -56
- package/dist/models/cloudStorage.d.ts.map +1 -1
- package/dist/models/comment.d.ts +267 -115
- package/dist/models/comment.d.ts.map +1 -1
- package/dist/models/conversation.d.ts +199 -73
- package/dist/models/conversation.d.ts.map +1 -1
- package/dist/models/department.d.ts +196 -70
- package/dist/models/department.d.ts.map +1 -1
- package/dist/models/event.d.ts +287 -125
- package/dist/models/event.d.ts.map +1 -1
- package/dist/models/file.d.ts +389 -263
- package/dist/models/file.d.ts.map +1 -1
- package/dist/models/folder.d.ts +433 -181
- package/dist/models/folder.d.ts.map +1 -1
- package/dist/models/labChat.d.ts +209 -83
- package/dist/models/labChat.d.ts.map +1 -1
- package/dist/models/marketing.d.ts +80 -26
- package/dist/models/marketing.d.ts.map +1 -1
- package/dist/models/message.d.ts +95 -41
- package/dist/models/message.d.ts.map +1 -1
- package/dist/models/newtonChat.d.ts +83 -29
- package/dist/models/newtonChat.d.ts.map +1 -1
- package/dist/models/notification.d.ts +61 -25
- package/dist/models/notification.d.ts.map +1 -1
- package/dist/models/school.d.ts +349 -133
- package/dist/models/school.d.ts.map +1 -1
- package/dist/models/section.d.ts +216 -72
- package/dist/models/section.d.ts.map +1 -1
- package/dist/models/tag.d.ts +156 -48
- package/dist/models/tag.d.ts.map +1 -1
- package/dist/models/user.d.ts +82 -28
- package/dist/models/user.d.ts.map +1 -1
- package/dist/models/worksheet.d.ts +1020 -411
- package/dist/models/worksheet.d.ts.map +1 -1
- package/dist/models/worksheet.js +8 -2
- package/dist/models/worksheet.js.map +1 -1
- package/dist/pipelines/aiLabChat.d.ts +0 -8
- package/dist/pipelines/aiLabChat.d.ts.map +1 -1
- package/dist/pipelines/aiLabChat.js +50 -67
- package/dist/pipelines/aiLabChat.js.map +1 -1
- package/dist/pipelines/aiLabChatContract.d.ts +393 -388
- package/dist/pipelines/aiLabChatContract.d.ts.map +1 -1
- package/dist/pipelines/aiLabChatContract.js +63 -69
- package/dist/pipelines/aiLabChatContract.js.map +1 -1
- package/dist/pipelines/aiNewtonChat.d.ts.map +1 -1
- package/dist/pipelines/aiNewtonChat.js +41 -41
- package/dist/pipelines/aiNewtonChat.js.map +1 -1
- package/dist/pipelines/gradeWorksheet.d.ts +8 -8
- package/dist/pipelines/labChatPrompt.d.ts +10 -8
- package/dist/pipelines/labChatPrompt.d.ts.map +1 -1
- package/dist/pipelines/labChatPrompt.js +47 -67
- package/dist/pipelines/labChatPrompt.js.map +1 -1
- package/dist/pipelines/pdfToWorksheet.d.ts +2 -2
- package/dist/routers/_app.d.ts +2203 -1957
- package/dist/routers/_app.d.ts.map +1 -1
- package/dist/routers/_app.js +4 -2
- package/dist/routers/_app.js.map +1 -1
- package/dist/routers/admin.d.ts +13 -13
- package/dist/routers/agenda.d.ts +18 -18
- package/dist/routers/announcement.d.ts +32 -32
- package/dist/routers/assignment.d.ts +335 -335
- package/dist/routers/attendance.d.ts +10 -10
- package/dist/routers/auth.d.ts +2 -2
- package/dist/routers/class.d.ts +147 -147
- package/dist/routers/comment.d.ts +22 -22
- package/dist/routers/conversation.d.ts +17 -17
- package/dist/routers/department.d.ts +34 -34
- package/dist/routers/discussion.d.ts +65 -53
- package/dist/routers/discussion.d.ts.map +1 -1
- package/dist/routers/discussion.js +6 -2
- package/dist/routers/discussion.js.map +1 -1
- package/dist/routers/embedding.d.ts +69 -0
- package/dist/routers/embedding.d.ts.map +1 -0
- package/dist/routers/embedding.js +143 -0
- package/dist/routers/embedding.js.map +1 -0
- package/dist/routers/event.d.ts +39 -39
- package/dist/routers/file.d.ts +12 -12
- package/dist/routers/folder.d.ts +38 -38
- package/dist/routers/labChat.d.ts +19 -19
- package/dist/routers/marketing.d.ts +2 -2
- package/dist/routers/message.d.ts +13 -13
- package/dist/routers/newtonChat.d.ts +4 -4
- package/dist/routers/notifications.d.ts +9 -9
- package/dist/routers/permissions.d.ts +14 -14
- package/dist/routers/school.d.ts +55 -55
- package/dist/routers/search.d.ts +22 -1
- package/dist/routers/search.d.ts.map +1 -1
- package/dist/routers/search.js +9 -3
- package/dist/routers/search.js.map +1 -1
- package/dist/routers/section.d.ts +4 -4
- package/dist/routers/studentProgress.d.ts +1 -1
- package/dist/routers/tag.d.ts +7 -7
- package/dist/routers/user.d.ts +10 -10
- package/dist/routers/worksheet.d.ts +95 -57
- package/dist/routers/worksheet.d.ts.map +1 -1
- package/dist/routers/worksheet.js +26 -2
- package/dist/routers/worksheet.js.map +1 -1
- package/dist/routes/aiStream.d.ts +2 -0
- package/dist/routes/aiStream.d.ts.map +1 -0
- package/dist/routes/aiStream.js +696 -0
- package/dist/routes/aiStream.js.map +1 -0
- package/dist/seedDatabase.d.ts +2 -2
- package/dist/seedDatabase.js +6 -6
- package/dist/seedDatabase.js.map +1 -1
- package/dist/services/adminInstitution.d.ts +8 -8
- package/dist/services/adminRunJob.d.ts +4 -4
- package/dist/services/agenda.d.ts +18 -18
- package/dist/services/aiChatStream.d.ts +68 -0
- package/dist/services/aiChatStream.d.ts.map +1 -0
- package/dist/services/aiChatStream.js +157 -0
- package/dist/services/aiChatStream.js.map +1 -0
- package/dist/services/aiModifierTools.d.ts +32 -0
- package/dist/services/aiModifierTools.d.ts.map +1 -0
- package/dist/services/aiModifierTools.js +165 -0
- package/dist/services/aiModifierTools.js.map +1 -0
- package/dist/services/aiProposalTools.d.ts +32 -0
- package/dist/services/aiProposalTools.d.ts.map +1 -0
- package/dist/services/aiProposalTools.js +207 -0
- package/dist/services/aiProposalTools.js.map +1 -0
- package/dist/services/aiStream.d.ts +22 -0
- package/dist/services/aiStream.d.ts.map +1 -0
- package/dist/services/aiStream.js +142 -0
- package/dist/services/aiStream.js.map +1 -0
- package/dist/services/aiTools.d.ts +16 -0
- package/dist/services/aiTools.d.ts.map +1 -0
- package/dist/services/aiTools.js +271 -0
- package/dist/services/aiTools.js.map +1 -0
- package/dist/services/announcement.d.ts +12 -12
- package/dist/services/announcement.d.ts.map +1 -1
- package/dist/services/announcement.js +7 -2
- package/dist/services/announcement.js.map +1 -1
- package/dist/services/assignment.d.ts +293 -293
- package/dist/services/assignment.d.ts.map +1 -1
- package/dist/services/assignment.js +28 -9
- package/dist/services/assignment.js.map +1 -1
- package/dist/services/attendance.d.ts +10 -10
- package/dist/services/auth.d.ts +2 -2
- package/dist/services/class.d.ts +138 -138
- package/dist/services/class.d.ts.map +1 -1
- package/dist/services/class.js +19 -3
- package/dist/services/class.js.map +1 -1
- package/dist/services/comment.d.ts +22 -22
- package/dist/services/conversation.d.ts +17 -17
- package/dist/services/department.d.ts +33 -33
- package/dist/services/discussion.d.ts +58 -58
- package/dist/services/discussion.d.ts.map +1 -1
- package/dist/services/discussion.js +8 -8
- package/dist/services/discussion.js.map +1 -1
- package/dist/services/discussionSummary.d.ts +21 -0
- package/dist/services/discussionSummary.d.ts.map +1 -0
- package/dist/services/discussionSummary.js +179 -0
- package/dist/services/discussionSummary.js.map +1 -0
- package/dist/services/embedding.d.ts +67 -0
- package/dist/services/embedding.d.ts.map +1 -0
- package/dist/services/embedding.js +226 -0
- package/dist/services/embedding.js.map +1 -0
- package/dist/services/event.d.ts +37 -37
- package/dist/services/file.d.ts +24 -24
- package/dist/services/folder.d.ts +36 -36
- package/dist/services/labChat.d.ts +19 -19
- package/dist/services/marketing.d.ts +2 -2
- package/dist/services/message.d.ts +11 -11
- package/dist/services/message.d.ts.map +1 -1
- package/dist/services/message.js +2 -2
- package/dist/services/message.js.map +1 -1
- package/dist/services/newtonChat.d.ts +4 -4
- package/dist/services/notification.d.ts +9 -9
- package/dist/services/notification.d.ts.map +1 -1
- package/dist/services/permissions.d.ts +14 -14
- package/dist/services/school.d.ts +50 -50
- package/dist/services/search.d.ts +12 -0
- package/dist/services/search.d.ts.map +1 -1
- package/dist/services/search.js +120 -2
- package/dist/services/search.js.map +1 -1
- package/dist/services/section.d.ts +3 -3
- package/dist/services/tag.d.ts +4 -4
- package/dist/services/user.d.ts +4 -4
- package/dist/services/user.d.ts.map +1 -1
- package/dist/services/user.js +10 -15
- package/dist/services/user.js.map +1 -1
- package/dist/services/worksheet.d.ts +60 -48
- package/dist/services/worksheet.d.ts.map +1 -1
- package/dist/services/worksheet.js +11 -4
- package/dist/services/worksheet.js.map +1 -1
- package/dist/utils/streamBroadcast.d.ts +11 -0
- package/dist/utils/streamBroadcast.d.ts.map +1 -0
- package/dist/utils/streamBroadcast.js +32 -0
- package/dist/utils/streamBroadcast.js.map +1 -0
- package/dist/workers/connection.d.ts +15 -0
- package/dist/workers/connection.d.ts.map +1 -1
- package/dist/workers/connection.js +20 -2
- package/dist/workers/connection.js.map +1 -1
- package/dist/workers/index.js +4 -2
- package/dist/workers/index.js.map +1 -1
- package/dist/workers/processors/createRunJobWorker.d.ts.map +1 -1
- package/dist/workers/processors/createRunJobWorker.js +31 -8
- package/dist/workers/processors/createRunJobWorker.js.map +1 -1
- package/dist/workers/processors/embedContent.d.ts +8 -0
- package/dist/workers/processors/embedContent.d.ts.map +1 -0
- package/dist/workers/processors/embedContent.js +76 -0
- package/dist/workers/processors/embedContent.js.map +1 -0
- package/dist/workers/queues.d.ts +6 -0
- package/dist/workers/queues.d.ts.map +1 -1
- package/dist/workers/queues.js +5 -3
- package/dist/workers/queues.js.map +1 -1
- package/package.json +5 -1
- package/prisma/migrations/20260609215135_init/migration.sql +1412 -0
- package/prisma/migrations/20260610130000_add_worksheet_tags/migration.sql +13 -0
- package/prisma/schema.prisma +38 -7
- package/src/index.ts +4 -0
- package/src/lib/config/cors.ts +32 -9
- package/src/lib/config/env.ts +6 -0
- package/src/lib/googleCloudStorage.ts +21 -0
- package/src/lib/prisma.ts +40 -1
- package/src/models/class.ts +3 -2
- package/src/models/worksheet.ts +5 -2
- package/src/pipelines/aiLabChat.ts +54 -79
- package/src/pipelines/aiLabChatContract.ts +69 -69
- package/src/pipelines/aiNewtonChat.ts +46 -43
- package/src/pipelines/labChatPrompt.ts +63 -88
- package/src/routers/_app.ts +2 -0
- package/src/routers/discussion.ts +7 -0
- package/src/routers/embedding.ts +159 -0
- package/src/routers/search.ts +10 -1
- package/src/routers/worksheet.ts +27 -0
- package/src/routes/aiStream.ts +789 -0
- package/src/seedDatabase.ts +4 -4
- package/src/services/aiChatStream.ts +219 -0
- package/src/services/aiModifierTools.ts +188 -0
- package/src/services/aiProposalTools.ts +272 -0
- package/src/services/aiStream.ts +175 -0
- package/src/services/aiTools.ts +290 -0
- package/src/services/announcement.ts +7 -0
- package/src/services/assignment.ts +28 -7
- package/src/services/class.ts +20 -1
- package/src/services/discussion.ts +9 -8
- package/src/services/discussionSummary.ts +226 -0
- package/src/services/embedding.ts +285 -0
- package/src/services/message.ts +2 -2
- package/src/services/search.ts +138 -0
- package/src/services/user.ts +9 -17
- package/src/services/worksheet.ts +9 -2
- package/src/utils/streamBroadcast.ts +48 -0
- package/src/workers/connection.ts +19 -0
- package/src/workers/index.ts +2 -0
- package/src/workers/processors/createRunJobWorker.ts +32 -6
- package/src/workers/processors/embedContent.ts +90 -0
- package/src/workers/queues.ts +5 -1
- package/tests/unit/pipelines/aiLabChatContract.test.ts +38 -21
- package/tests/unit/pipelines/labChatPrompt.test.ts +23 -36
- package/prisma/migrations/20250807062924_init/migration.sql +0 -436
- package/prisma/migrations/20250919063704_init2/migration.sql +0 -24
- package/prisma/migrations/20250920143543_add_profile_fields/migration.sql +0 -15
- package/prisma/migrations/20250922165147_add_chat_models/migration.sql +0 -68
- package/prisma/migrations/20250922165314_add_chat_roles/migration.sql +0 -5
- package/prisma/migrations/20250922171242_refactor_notification_system/migration.sql +0 -20
- package/prisma/migrations/20250922172208_add_mentions_system/migration.sql +0 -21
- package/prisma/migrations/20250925072732_add_lab_chat_system/migration.sql +0 -25
- package/prisma/migrations/20251020151505_add_upload_tracking_fields/migration.sql +0 -57
- package/prisma/migrations/20251109122857_annuoncements_comments/migration.sql +0 -30
- package/prisma/migrations/20251109135555_reactions_announcements_comments/migration.sql +0 -35
- package/prisma/migrations/20260410124000_add_submission_recommendation_state/migration.sql +0 -14
- package/prisma/migrations/20260415103500_add_session_type/migration.sql +0 -33
- package/prisma/migrations/20260415133000_add_ai_usage_logs/migration.sql +0 -19
- package/prisma/migrations/20260417083000_add_conversation_member_hidden_at/migration.sql +0 -2
- package/prisma/migrations/20260502230500_assignment_submission_comments/migration.sql +0 -60
- package/prisma/migrations/20260504071500_school_memberships/migration.sql +0 -81
- package/prisma/migrations/20260506162500_consolidate_run_job_and_unify_job_status/migration.sql +0 -166
- package/prisma/migrations/20260509220000_institution_overhaul/migration.sql +0 -184
- package/prisma/migrations/20260510170000_add_folder_permissions/migration.sql +0 -93
- package/prisma/migrations/20260510183000_add_discussions/migration.sql +0 -151
- /package/.github/workflows/{npm.yml → npm-publish.yml} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sources":["services/search.ts"],"sourceRoot":"/","sourcesContent":["import { prisma } from \"../lib/prisma.js\";\n\ntype SearchScope =\n | \"class\"\n | \"assignment\"\n | \"event\"\n | \"syllabus\"\n | \"worksheet\"\n | \"file\"\n | \"announcement\"\n | \"section\";\n\ntype SearchResult = {\n id: string;\n type: SearchScope;\n title: string;\n subtitle: string;\n classId: string;\n className: string;\n href: string;\n matchedText?: string | null;\n date?: Date | null;\n};\n\nconst SEARCH_LIMIT = 12;\n\nconst contains = (query: string) => ({\n contains: query,\n mode: \"insensitive\" as const,\n});\n\nconst includesToken = (query: string, ...tokens: string[]) =>\n tokens.some((token) => token.includes(query.toLowerCase()));\n\nconst excerpt = (value: string | null | undefined, query: string) => {\n if (!value) return null;\n const trimmed = value.replace(/\\s+/g, \" \").trim();\n if (!trimmed) return null;\n if (!query) return trimmed.slice(0, 140);\n\n const index = trimmed.toLowerCase().indexOf(query.toLowerCase());\n if (index < 0) return trimmed.slice(0, 140);\n\n const start = Math.max(0, index - 48);\n const end = Math.min(trimmed.length, index + query.length + 92);\n return `${start > 0 ? \"...\" : \"\"}${trimmed.slice(start, end)}${end < trimmed.length ? \"...\" : \"\"}`;\n};\n\nconst trimResults = (results: SearchResult[], limit: number) =>\n results\n .sort((a, b) => {\n const priority: Record<SearchScope, number> = {\n class: 0,\n assignment: 1,\n event: 2,\n syllabus: 3,\n worksheet: 4,\n file: 5,\n announcement: 6,\n section: 7,\n };\n const priorityDiff = priority[a.type] - priority[b.type];\n if (priorityDiff !== 0) return priorityDiff;\n return (b.date?.getTime() ?? 0) - (a.date?.getTime() ?? 0);\n })\n .slice(0, limit);\n\nexport async function searchGlobalClasses(\n userId: string,\n input: { query?: string; limit?: number }\n) {\n const rawQuery = input.query?.trim() ?? \"\";\n const query = rawQuery.slice(0, 80);\n const limit = Math.min(Math.max(input.limit ?? SEARCH_LIMIT, 1), 30);\n\n const memberships = await prisma.class.findMany({\n where: {\n OR: [\n { teachers: { some: { id: userId } } },\n { students: { some: { id: userId } } },\n ],\n },\n select: {\n id: true,\n name: true,\n section: true,\n subject: true,\n syllabus: true,\n teachers: { where: { id: userId }, select: { id: true } },\n students: { where: { id: userId }, select: { id: true } },\n },\n });\n\n const allClassIds = memberships.map((cls) => cls.id);\n if (allClassIds.length === 0) {\n return { query, results: [] as SearchResult[] };\n }\n\n const teacherClassIds = memberships\n .filter((cls) => cls.teachers.length > 0)\n .map((cls) => cls.id);\n const studentClassIds = memberships\n .filter((cls) => cls.students.length > 0 && cls.teachers.length === 0)\n .map((cls) => cls.id);\n const classById = new Map(memberships.map((cls) => [cls.id, cls]));\n\n const queryFilters = query\n ? {\n class: [\n { name: contains(query) },\n { section: contains(query) },\n { subject: contains(query) },\n ],\n assignment: [\n { title: contains(query) },\n { instructions: contains(query) },\n ],\n event: [\n { name: contains(query) },\n { location: contains(query) },\n { remarks: contains(query) },\n ],\n worksheet: [{ name: contains(query) }],\n file: [{ name: contains(query) }, { type: contains(query) }],\n announcement: [{ remarks: contains(query) }],\n section: [{ name: contains(query) }],\n }\n : null;\n\n const assignmentAccess = [\n ...(teacherClassIds.length > 0\n ? [{ classId: { in: teacherClassIds } }]\n : []),\n ...(studentClassIds.length > 0\n ? [\n {\n classId: { in: studentClassIds },\n OR: [\n { assignedTo: { some: { id: userId } } },\n { assignedTo: { none: {} } },\n ],\n },\n ]\n : []),\n ];\n\n const [\n classes,\n assignments,\n events,\n worksheets,\n files,\n announcements,\n sections,\n ] = await Promise.all([\n prisma.class.findMany({\n where: {\n id: { in: allClassIds },\n ...(queryFilters ? { OR: queryFilters.class } : {}),\n },\n select: { id: true, name: true, section: true, subject: true },\n take: limit,\n }),\n prisma.assignment.findMany({\n where: {\n template: false,\n AND: [\n ...(queryFilters ? [{ OR: queryFilters.assignment }] : []),\n ...(assignmentAccess.length > 0 ? [{ OR: assignmentAccess }] : []),\n ],\n },\n select: {\n id: true,\n title: true,\n instructions: true,\n dueDate: true,\n modifiedAt: true,\n classId: true,\n class: { select: { name: true } },\n },\n orderBy: { dueDate: \"asc\" },\n take: limit,\n }),\n prisma.event.findMany({\n where: {\n classId: { in: allClassIds },\n ...(queryFilters ? { OR: queryFilters.event } : {}),\n },\n select: {\n id: true,\n name: true,\n location: true,\n remarks: true,\n startTime: true,\n classId: true,\n class: { select: { name: true } },\n },\n orderBy: { startTime: \"asc\" },\n take: limit,\n }),\n prisma.worksheet.findMany({\n where: {\n classId: { in: allClassIds },\n ...(queryFilters && !includesToken(query, \"worksheet\", \"worksheets\")\n ? { OR: queryFilters.worksheet }\n : {}),\n },\n select: {\n id: true,\n name: true,\n updatedAt: true,\n classId: true,\n class: { select: { name: true } },\n },\n orderBy: { updatedAt: \"desc\" },\n take: limit,\n }),\n prisma.file.findMany({\n where: {\n ...(queryFilters ? { OR: queryFilters.file } : {}),\n AND: [\n {\n OR: [\n { folder: { classId: { in: allClassIds } } },\n { classDraftId: { in: teacherClassIds } },\n {\n assignment: {\n OR: assignmentAccess,\n },\n },\n { announcement: { classId: { in: allClassIds } } },\n ],\n },\n ],\n },\n select: {\n id: true,\n name: true,\n type: true,\n uploadedAt: true,\n folder: { select: { classId: true, class: { select: { name: true } } } },\n classDraft: { select: { id: true, name: true } },\n assignment: { select: { classId: true, class: { select: { name: true } } } },\n announcement: { select: { classId: true, class: { select: { name: true } } } },\n },\n orderBy: { uploadedAt: \"desc\" },\n take: limit,\n }),\n prisma.announcement.findMany({\n where: {\n classId: { in: allClassIds },\n ...(queryFilters ? { OR: queryFilters.announcement } : {}),\n },\n select: {\n id: true,\n remarks: true,\n createdAt: true,\n classId: true,\n class: { select: { name: true } },\n },\n orderBy: { createdAt: \"desc\" },\n take: limit,\n }),\n prisma.section.findMany({\n where: {\n classId: { in: allClassIds },\n ...(queryFilters && !includesToken(query, \"section\", \"sections\", \"assignment\", \"assignments\")\n ? { OR: queryFilters.section }\n : {}),\n },\n select: {\n id: true,\n name: true,\n classId: true,\n class: { select: { name: true } },\n },\n take: limit,\n }),\n ]);\n\n const results: SearchResult[] = [\n ...classes.map((cls) => ({\n id: cls.id,\n type: \"class\" as const,\n title: cls.name,\n subtitle: [cls.subject, cls.section].filter(Boolean).join(\" · \"),\n classId: cls.id,\n className: cls.name,\n href: `/class/${cls.id}`,\n })),\n ...assignments.map((assignment) => ({\n id: assignment.id,\n type: \"assignment\" as const,\n title: assignment.title,\n subtitle: `${assignment.class.name} · Assignment`,\n classId: assignment.classId,\n className: assignment.class.name,\n href: `/class/${assignment.classId}/assignment/${assignment.id}`,\n matchedText: excerpt(assignment.instructions, query),\n date: assignment.dueDate ?? assignment.modifiedAt,\n })),\n ...events.map((event) => ({\n id: event.id,\n type: \"event\" as const,\n title: event.name || \"Untitled event\",\n subtitle: `${event.class?.name ?? \"Class\"} · Event`,\n classId: event.classId!,\n className: event.class?.name ?? \"Class\",\n href: `/class/${event.classId}/attendance/${event.id}`,\n matchedText: excerpt(event.location || event.remarks, query),\n date: event.startTime,\n })),\n ...memberships\n .filter((cls) => {\n if (!cls.syllabus) return false;\n if (!query) return true;\n return (\n includesToken(query, \"syllabus\") ||\n cls.name.toLowerCase().includes(query.toLowerCase()) ||\n cls.subject.toLowerCase().includes(query.toLowerCase()) ||\n cls.syllabus.toLowerCase().includes(query.toLowerCase())\n );\n })\n .slice(0, limit)\n .map((cls) => ({\n id: `${cls.id}:syllabus`,\n type: \"syllabus\" as const,\n title: `${cls.name} syllabus`,\n subtitle: `${cls.subject} · Syllabus`,\n classId: cls.id,\n className: cls.name,\n href: `/class/${cls.id}/syllabus`,\n matchedText: excerpt(cls.syllabus, query),\n })),\n ...worksheets.map((worksheet) => ({\n id: worksheet.id,\n type: \"worksheet\" as const,\n title: worksheet.name,\n subtitle: `${worksheet.class?.name ?? \"Class\"} · Worksheet`,\n classId: worksheet.classId,\n className: worksheet.class?.name ?? \"Class\",\n href: `/class/${worksheet.classId}/worksheets`,\n date: worksheet.updatedAt,\n })),\n ...files.flatMap((file) => {\n const classId =\n file.folder?.classId ??\n file.classDraft?.id ??\n file.assignment?.classId ??\n file.announcement?.classId;\n const className =\n file.folder?.class?.name ??\n file.classDraft?.name ??\n file.assignment?.class?.name ??\n file.announcement?.class?.name ??\n (classId ? classById.get(classId)?.name : undefined);\n\n if (!classId || !className) return [];\n\n return [\n {\n id: file.id,\n type: \"file\" as const,\n title: file.name,\n subtitle: `${className} · File`,\n classId,\n className,\n href: `/class/${classId}/files`,\n matchedText: file.type,\n date: file.uploadedAt,\n },\n ];\n }),\n ...announcements.map((announcement) => ({\n id: announcement.id,\n type: \"announcement\" as const,\n title: excerpt(announcement.remarks, query) ?? \"Announcement\",\n subtitle: `${announcement.class.name} · Announcement`,\n classId: announcement.classId,\n className: announcement.class.name,\n href: `/class/${announcement.classId}`,\n matchedText: excerpt(announcement.remarks, query),\n date: announcement.createdAt,\n })),\n ...sections.map((section) => ({\n id: section.id,\n type: \"section\" as const,\n title: section.name,\n subtitle: `${section.class.name} · Section`,\n classId: section.classId,\n className: section.class.name,\n href: `/class/${section.classId}/assignments`,\n })),\n ];\n\n return { query, results: trimResults(results, limit) };\n}\n"],"names":[],"mappings":"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","debug_id":"9858c6c3-883b-538a-9404-7b225e24d88e"}
|
|
1
|
+
{"version":3,"file":"search.js","sources":["services/search.ts"],"sourceRoot":"/","sourcesContent":["import { prisma } from \"../lib/prisma.js\";\nimport { generateEmbedding } from \"./embedding.js\";\nimport { logger } from \"../utils/logger.js\";\nimport type { EmbeddingSourceType } from \"@prisma/client\";\n\ntype SearchScope =\n | \"class\"\n | \"assignment\"\n | \"event\"\n | \"syllabus\"\n | \"worksheet\"\n | \"file\"\n | \"announcement\"\n | \"section\";\n\ntype SearchResult = {\n id: string;\n type: SearchScope;\n title: string;\n subtitle: string;\n classId: string;\n className: string;\n href: string;\n matchedText?: string | null;\n date?: Date | null;\n};\n\nconst SEARCH_LIMIT = 12;\n\nconst contains = (query: string) => ({\n contains: query,\n mode: \"insensitive\" as const,\n});\n\nconst includesToken = (query: string, ...tokens: string[]) =>\n tokens.some((token) => token.includes(query.toLowerCase()));\n\nconst excerpt = (value: string | null | undefined, query: string) => {\n if (!value) return null;\n const trimmed = value.replace(/\\s+/g, \" \").trim();\n if (!trimmed) return null;\n if (!query) return trimmed.slice(0, 140);\n\n const index = trimmed.toLowerCase().indexOf(query.toLowerCase());\n if (index < 0) return trimmed.slice(0, 140);\n\n const start = Math.max(0, index - 48);\n const end = Math.min(trimmed.length, index + query.length + 92);\n return `${start > 0 ? \"...\" : \"\"}${trimmed.slice(start, end)}${end < trimmed.length ? \"...\" : \"\"}`;\n};\n\nconst trimResults = (results: SearchResult[], limit: number) =>\n results\n .sort((a, b) => {\n const priority: Record<SearchScope, number> = {\n class: 0,\n assignment: 1,\n event: 2,\n syllabus: 3,\n worksheet: 4,\n file: 5,\n announcement: 6,\n section: 7,\n };\n const priorityDiff = priority[a.type] - priority[b.type];\n if (priorityDiff !== 0) return priorityDiff;\n return (b.date?.getTime() ?? 0) - (a.date?.getTime() ?? 0);\n })\n .slice(0, limit);\n\nexport async function searchGlobalClasses(\n userId: string,\n input: { query?: string; limit?: number }\n) {\n const rawQuery = input.query?.trim() ?? \"\";\n const query = rawQuery.slice(0, 80);\n const limit = Math.min(Math.max(input.limit ?? SEARCH_LIMIT, 1), 30);\n\n const memberships = await prisma.class.findMany({\n where: {\n OR: [\n { teachers: { some: { id: userId } } },\n { students: { some: { id: userId } } },\n ],\n },\n select: {\n id: true,\n name: true,\n section: true,\n subject: true,\n syllabus: true,\n teachers: { where: { id: userId }, select: { id: true } },\n students: { where: { id: userId }, select: { id: true } },\n },\n });\n\n const allClassIds = memberships.map((cls) => cls.id);\n if (allClassIds.length === 0) {\n return { query, results: [] as SearchResult[] };\n }\n\n const teacherClassIds = memberships\n .filter((cls) => cls.teachers.length > 0)\n .map((cls) => cls.id);\n const studentClassIds = memberships\n .filter((cls) => cls.students.length > 0 && cls.teachers.length === 0)\n .map((cls) => cls.id);\n const classById = new Map(memberships.map((cls) => [cls.id, cls]));\n\n const queryFilters = query\n ? {\n class: [\n { name: contains(query) },\n { section: contains(query) },\n { subject: contains(query) },\n ],\n assignment: [\n { title: contains(query) },\n { instructions: contains(query) },\n ],\n event: [\n { name: contains(query) },\n { location: contains(query) },\n { remarks: contains(query) },\n ],\n worksheet: [{ name: contains(query) }],\n file: [{ name: contains(query) }, { type: contains(query) }],\n announcement: [{ remarks: contains(query) }],\n section: [{ name: contains(query) }],\n }\n : null;\n\n const assignmentAccess = [\n ...(teacherClassIds.length > 0\n ? [{ classId: { in: teacherClassIds } }]\n : []),\n ...(studentClassIds.length > 0\n ? [\n {\n classId: { in: studentClassIds },\n OR: [\n { assignedTo: { some: { id: userId } } },\n { assignedTo: { none: {} } },\n ],\n },\n ]\n : []),\n ];\n\n const [\n classes,\n assignments,\n events,\n worksheets,\n files,\n announcements,\n sections,\n ] = await Promise.all([\n prisma.class.findMany({\n where: {\n id: { in: allClassIds },\n ...(queryFilters ? { OR: queryFilters.class } : {}),\n },\n select: { id: true, name: true, section: true, subject: true },\n take: limit,\n }),\n prisma.assignment.findMany({\n where: {\n template: false,\n AND: [\n ...(queryFilters ? [{ OR: queryFilters.assignment }] : []),\n ...(assignmentAccess.length > 0 ? [{ OR: assignmentAccess }] : []),\n ],\n },\n select: {\n id: true,\n title: true,\n instructions: true,\n dueDate: true,\n modifiedAt: true,\n classId: true,\n class: { select: { name: true } },\n },\n orderBy: { dueDate: \"asc\" },\n take: limit,\n }),\n prisma.event.findMany({\n where: {\n classId: { in: allClassIds },\n ...(queryFilters ? { OR: queryFilters.event } : {}),\n },\n select: {\n id: true,\n name: true,\n location: true,\n remarks: true,\n startTime: true,\n classId: true,\n class: { select: { name: true } },\n },\n orderBy: { startTime: \"asc\" },\n take: limit,\n }),\n prisma.worksheet.findMany({\n where: {\n classId: { in: allClassIds },\n ...(queryFilters && !includesToken(query, \"worksheet\", \"worksheets\")\n ? { OR: queryFilters.worksheet }\n : {}),\n },\n select: {\n id: true,\n name: true,\n updatedAt: true,\n classId: true,\n class: { select: { name: true } },\n },\n orderBy: { updatedAt: \"desc\" },\n take: limit,\n }),\n prisma.file.findMany({\n where: {\n ...(queryFilters ? { OR: queryFilters.file } : {}),\n AND: [\n {\n OR: [\n { folder: { classId: { in: allClassIds } } },\n { classDraftId: { in: teacherClassIds } },\n {\n assignment: {\n OR: assignmentAccess,\n },\n },\n { announcement: { classId: { in: allClassIds } } },\n ],\n },\n ],\n },\n select: {\n id: true,\n name: true,\n type: true,\n uploadedAt: true,\n folder: { select: { classId: true, class: { select: { name: true } } } },\n classDraft: { select: { id: true, name: true } },\n assignment: { select: { classId: true, class: { select: { name: true } } } },\n announcement: { select: { classId: true, class: { select: { name: true } } } },\n },\n orderBy: { uploadedAt: \"desc\" },\n take: limit,\n }),\n prisma.announcement.findMany({\n where: {\n classId: { in: allClassIds },\n ...(queryFilters ? { OR: queryFilters.announcement } : {}),\n },\n select: {\n id: true,\n remarks: true,\n createdAt: true,\n classId: true,\n class: { select: { name: true } },\n },\n orderBy: { createdAt: \"desc\" },\n take: limit,\n }),\n prisma.section.findMany({\n where: {\n classId: { in: allClassIds },\n ...(queryFilters && !includesToken(query, \"section\", \"sections\", \"assignment\", \"assignments\")\n ? { OR: queryFilters.section }\n : {}),\n },\n select: {\n id: true,\n name: true,\n classId: true,\n class: { select: { name: true } },\n },\n take: limit,\n }),\n ]);\n\n const results: SearchResult[] = [\n ...classes.map((cls) => ({\n id: cls.id,\n type: \"class\" as const,\n title: cls.name,\n subtitle: [cls.subject, cls.section].filter(Boolean).join(\" · \"),\n classId: cls.id,\n className: cls.name,\n href: `/class/${cls.id}`,\n })),\n ...assignments.map((assignment) => ({\n id: assignment.id,\n type: \"assignment\" as const,\n title: assignment.title,\n subtitle: `${assignment.class.name} · Assignment`,\n classId: assignment.classId,\n className: assignment.class.name,\n href: `/class/${assignment.classId}/assignment/${assignment.id}`,\n matchedText: excerpt(assignment.instructions, query),\n date: assignment.dueDate ?? assignment.modifiedAt,\n })),\n ...events.map((event) => ({\n id: event.id,\n type: \"event\" as const,\n title: event.name || \"Untitled event\",\n subtitle: `${event.class?.name ?? \"Class\"} · Event`,\n classId: event.classId!,\n className: event.class?.name ?? \"Class\",\n href: `/class/${event.classId}/attendance/${event.id}`,\n matchedText: excerpt(event.location || event.remarks, query),\n date: event.startTime,\n })),\n ...memberships\n .filter((cls) => {\n if (!cls.syllabus) return false;\n if (!query) return true;\n return (\n includesToken(query, \"syllabus\") ||\n cls.name.toLowerCase().includes(query.toLowerCase()) ||\n cls.subject.toLowerCase().includes(query.toLowerCase()) ||\n cls.syllabus.toLowerCase().includes(query.toLowerCase())\n );\n })\n .slice(0, limit)\n .map((cls) => ({\n id: `${cls.id}:syllabus`,\n type: \"syllabus\" as const,\n title: `${cls.name} syllabus`,\n subtitle: `${cls.subject} · Syllabus`,\n classId: cls.id,\n className: cls.name,\n href: `/class/${cls.id}/syllabus`,\n matchedText: excerpt(cls.syllabus, query),\n })),\n ...worksheets.map((worksheet) => ({\n id: worksheet.id,\n type: \"worksheet\" as const,\n title: worksheet.name,\n subtitle: `${worksheet.class?.name ?? \"Class\"} · Worksheet`,\n classId: worksheet.classId,\n className: worksheet.class?.name ?? \"Class\",\n href: `/class/${worksheet.classId}/worksheets`,\n date: worksheet.updatedAt,\n })),\n ...files.flatMap((file) => {\n const classId =\n file.folder?.classId ??\n file.classDraft?.id ??\n file.assignment?.classId ??\n file.announcement?.classId;\n const className =\n file.folder?.class?.name ??\n file.classDraft?.name ??\n file.assignment?.class?.name ??\n file.announcement?.class?.name ??\n (classId ? classById.get(classId)?.name : undefined);\n\n if (!classId || !className) return [];\n\n return [\n {\n id: file.id,\n type: \"file\" as const,\n title: file.name,\n subtitle: `${className} · File`,\n classId,\n className,\n href: `/class/${classId}/files`,\n matchedText: file.type,\n date: file.uploadedAt,\n },\n ];\n }),\n ...announcements.map((announcement) => ({\n id: announcement.id,\n type: \"announcement\" as const,\n title: excerpt(announcement.remarks, query) ?? \"Announcement\",\n subtitle: `${announcement.class.name} · Announcement`,\n classId: announcement.classId,\n className: announcement.class.name,\n href: `/class/${announcement.classId}`,\n matchedText: excerpt(announcement.remarks, query),\n date: announcement.createdAt,\n })),\n ...sections.map((section) => ({\n id: section.id,\n type: \"section\" as const,\n title: section.name,\n subtitle: `${section.class.name} · Section`,\n classId: section.classId,\n className: section.class.name,\n href: `/class/${section.classId}/assignments`,\n })),\n ];\n\n return { query, results: trimResults(results, limit) };\n}\n\nconst SOURCE_TYPE_TO_SCOPE: Record<EmbeddingSourceType, SearchScope> = {\n ASSIGNMENT: \"assignment\",\n WORKSHEET: \"worksheet\",\n ANNOUNCEMENT: \"announcement\",\n FILE: \"file\",\n SECTION: \"section\",\n};\n\nconst MIN_SIMILARITY = 0.25;\n\n/**\n * Cross-class semantic search via pgvector.\n * Generates an embedding for `query`, searches across all classes the user\n * belongs to, and maps hits back to SearchResult shape.\n */\nexport async function searchSemanticGlobal(\n userId: string,\n input: { query: string; limit?: number },\n) {\n const query = input.query.trim().slice(0, 200);\n if (!query) {\n return { query, results: [] as SearchResult[] };\n }\n const limit = Math.min(Math.max(input.limit ?? SEARCH_LIMIT, 1), 30);\n\n const memberships = await prisma.class.findMany({\n where: {\n OR: [\n { teachers: { some: { id: userId } } },\n { students: { some: { id: userId } } },\n ],\n },\n select: { id: true, name: true },\n });\n const allClassIds = memberships.map((cls) => cls.id);\n if (allClassIds.length === 0) {\n return { query, results: [] as SearchResult[] };\n }\n const classById = new Map(memberships.map((cls) => [cls.id, cls]));\n\n let queryVector: number[];\n try {\n queryVector = await generateEmbedding(query);\n } catch (err) {\n logger.error(\"Semantic search embedding failed\", { err });\n return { query, results: [] as SearchResult[] };\n }\n\n const vectorStr = `[${queryVector.join(\",\")}]`;\n\n type SemanticRow = {\n sourceType: EmbeddingSourceType;\n sourceId: string;\n classId: string;\n content: string;\n similarity: number;\n };\n\n const hits = await prisma.$queryRaw<SemanticRow[]>`\n SELECT DISTINCT ON (\"sourceType\", \"sourceId\")\n \"sourceType\",\n \"sourceId\",\n \"classId\",\n content,\n 1 - (vector <=> ${vectorStr}::vector) as similarity\n FROM \"Embedding\"\n WHERE \"classId\" = ANY(${allClassIds}::text[])\n ORDER BY \"sourceType\", \"sourceId\", vector <=> ${vectorStr}::vector\n LIMIT ${limit * 3}\n `;\n\n const filtered = hits\n .filter((h) => h.similarity >= MIN_SIMILARITY)\n .sort((a, b) => b.similarity - a.similarity)\n .slice(0, limit);\n\n const results: SearchResult[] = [];\n for (const hit of filtered) {\n const cls = classById.get(hit.classId);\n const className = cls?.name ?? \"Class\";\n const scope = SOURCE_TYPE_TO_SCOPE[hit.sourceType];\n if (!scope) continue;\n\n const snippet = hit.content.replace(/\\s+/g, \" \").trim().slice(0, 140);\n\n let title = snippet.slice(0, 60);\n let href = `/class/${hit.classId}`;\n\n if (scope === \"assignment\") {\n const assignment = await prisma.assignment.findUnique({\n where: { id: hit.sourceId },\n select: { title: true },\n });\n title = assignment?.title ?? title;\n href = `/class/${hit.classId}/assignment/${hit.sourceId}`;\n } else if (scope === \"worksheet\") {\n const worksheet = await prisma.worksheet.findUnique({\n where: { id: hit.sourceId },\n select: { name: true },\n });\n title = worksheet?.name ?? title;\n href = `/class/${hit.classId}/worksheets`;\n } else if (scope === \"announcement\") {\n href = `/class/${hit.classId}`;\n } else if (scope === \"file\") {\n const file = await prisma.file.findUnique({\n where: { id: hit.sourceId },\n select: { name: true },\n });\n title = file?.name ?? title;\n href = `/class/${hit.classId}/files`;\n } else if (scope === \"section\") {\n const section = await prisma.section.findUnique({\n where: { id: hit.sourceId },\n select: { name: true },\n });\n title = section?.name ?? title;\n href = `/class/${hit.classId}/assignments`;\n }\n\n results.push({\n id: `semantic:${hit.sourceId}`,\n type: scope,\n title,\n subtitle: `${className} · ${scope.charAt(0).toUpperCase() + scope.slice(1)}`,\n classId: hit.classId,\n className,\n href,\n matchedText: snippet,\n });\n }\n\n return { query, results };\n}\n"],"names":[],"mappings":"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","debug_id":"95067932-0f2f-5d5f-bd33-0e2156d5ed88"}
|
|
@@ -7,8 +7,8 @@ export declare function createSectionRecord(userId: string, input: {
|
|
|
7
7
|
name: string;
|
|
8
8
|
color?: string;
|
|
9
9
|
}): Promise<{
|
|
10
|
-
name: string;
|
|
11
10
|
id: string;
|
|
11
|
+
name: string;
|
|
12
12
|
color: string | null;
|
|
13
13
|
classId: string;
|
|
14
14
|
order: number | null;
|
|
@@ -19,8 +19,8 @@ export declare function reorderSection(userId: string, input: {
|
|
|
19
19
|
position: "start" | "end" | "before" | "after";
|
|
20
20
|
targetId?: string;
|
|
21
21
|
}): Promise<{
|
|
22
|
-
name: string;
|
|
23
22
|
id: string;
|
|
23
|
+
name: string;
|
|
24
24
|
color: string | null;
|
|
25
25
|
classId: string;
|
|
26
26
|
order: number | null;
|
|
@@ -31,8 +31,8 @@ export declare function updateSectionRecord(userId: string, input: {
|
|
|
31
31
|
name: string;
|
|
32
32
|
color?: string;
|
|
33
33
|
}): Promise<{
|
|
34
|
-
name: string;
|
|
35
34
|
id: string;
|
|
35
|
+
name: string;
|
|
36
36
|
color: string | null;
|
|
37
37
|
classId: string;
|
|
38
38
|
order: number | null;
|
package/dist/services/tag.d.ts
CHANGED
|
@@ -3,10 +3,10 @@ export declare function listTags(userId: string, input: {
|
|
|
3
3
|
schoolId: string;
|
|
4
4
|
departmentId?: string | null;
|
|
5
5
|
}): Promise<{
|
|
6
|
-
name: string;
|
|
7
6
|
id: string;
|
|
8
7
|
createdAt: Date;
|
|
9
8
|
updatedAt: Date;
|
|
9
|
+
name: string;
|
|
10
10
|
schoolId: string;
|
|
11
11
|
color: string;
|
|
12
12
|
departmentId: string | null;
|
|
@@ -17,10 +17,10 @@ export declare function createTagRecord(userId: string, input: {
|
|
|
17
17
|
name: string;
|
|
18
18
|
color?: string;
|
|
19
19
|
}): Promise<{
|
|
20
|
-
name: string;
|
|
21
20
|
id: string;
|
|
22
21
|
createdAt: Date;
|
|
23
22
|
updatedAt: Date;
|
|
23
|
+
name: string;
|
|
24
24
|
schoolId: string;
|
|
25
25
|
color: string;
|
|
26
26
|
departmentId: string | null;
|
|
@@ -31,10 +31,10 @@ export declare function updateTagRecord(userId: string, input: {
|
|
|
31
31
|
color?: string;
|
|
32
32
|
departmentId?: string | null;
|
|
33
33
|
}): Promise<{
|
|
34
|
-
name: string;
|
|
35
34
|
id: string;
|
|
36
35
|
createdAt: Date;
|
|
37
36
|
updatedAt: Date;
|
|
37
|
+
name: string;
|
|
38
38
|
schoolId: string;
|
|
39
39
|
color: string;
|
|
40
40
|
departmentId: string | null;
|
|
@@ -60,10 +60,10 @@ export declare function getAttachedTags(userId: string, input: {
|
|
|
60
60
|
target: TagTarget;
|
|
61
61
|
targetId: string;
|
|
62
62
|
}): Promise<{
|
|
63
|
-
name: string;
|
|
64
63
|
id: string;
|
|
65
64
|
createdAt: Date;
|
|
66
65
|
updatedAt: Date;
|
|
66
|
+
name: string;
|
|
67
67
|
schoolId: string;
|
|
68
68
|
color: string;
|
|
69
69
|
departmentId: string | null;
|
package/dist/services/user.d.ts
CHANGED
|
@@ -7,8 +7,8 @@ export declare function getProfile(userId: string): Promise<{
|
|
|
7
7
|
bio: any;
|
|
8
8
|
location: any;
|
|
9
9
|
website: any;
|
|
10
|
-
profilePicture:
|
|
11
|
-
profilePictureThumbnail:
|
|
10
|
+
profilePicture: any;
|
|
11
|
+
profilePictureThumbnail: any;
|
|
12
12
|
};
|
|
13
13
|
}>;
|
|
14
14
|
/** Update user profile (display name, bio, etc.) and/or profile picture. */
|
|
@@ -36,8 +36,8 @@ export declare function updateProfile(userId: string, input: {
|
|
|
36
36
|
bio: any;
|
|
37
37
|
location: any;
|
|
38
38
|
website: any;
|
|
39
|
-
profilePicture:
|
|
40
|
-
profilePictureThumbnail:
|
|
39
|
+
profilePicture: any;
|
|
40
|
+
profilePictureThumbnail: any;
|
|
41
41
|
};
|
|
42
42
|
}>;
|
|
43
43
|
export declare function getUploadUrl(userId: string, fileName: string, fileType: string): Promise<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.d.ts","sourceRoot":"/","sources":["services/user.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"user.d.ts","sourceRoot":"/","sources":["services/user.ts"],"names":[],"mappings":"AASA,mEAAmE;AACnE,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM;;;;;;;;;;;GAgC9C;AAED,4EAA4E;AAC5E,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE;IACL,OAAO,CAAC,EAAE;QACR,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KACzB,CAAC;IACF,cAAc,CAAC,EAAE;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,cAAc,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CAClC;;;;;;;;;;;GAgEF;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM;;;;GAiCjB"}
|
package/dist/services/user.js
CHANGED
|
@@ -2,20 +2,12 @@
|
|
|
2
2
|
* User service – profile get/update, profile picture upload URLs.
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
!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]="
|
|
5
|
+
!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]="2051f702-a4dc-5ce1-b5d3-950cb385ebd6")}catch(e){}}();
|
|
6
6
|
import { TRPCError } from "@trpc/server";
|
|
7
7
|
import { logger } from "../utils/logger.js";
|
|
8
8
|
import { env } from "../lib/config/env.js";
|
|
9
9
|
import { findUserById, findUserProfileByUserId, upsertUserProfile } from "../models/user.js";
|
|
10
|
-
|
|
11
|
-
if (!filePath)
|
|
12
|
-
return null;
|
|
13
|
-
if (filePath.startsWith("http")) {
|
|
14
|
-
return filePath;
|
|
15
|
-
}
|
|
16
|
-
const backendUrl = env.BACKEND_URL || "http://localhost:3001";
|
|
17
|
-
return `${backendUrl}/api/files/${encodeURIComponent(filePath)}`;
|
|
18
|
-
}
|
|
10
|
+
import { makeFilePublic } from "../lib/googleCloudStorage.js";
|
|
19
11
|
/** Get user profile with display info and profile picture URLs. */
|
|
20
12
|
export async function getProfile(userId) {
|
|
21
13
|
const user = await findUserById(userId);
|
|
@@ -35,8 +27,8 @@ export async function getProfile(userId) {
|
|
|
35
27
|
bio: userProfile.bio || null,
|
|
36
28
|
location: userProfile.location || null,
|
|
37
29
|
website: userProfile.website || null,
|
|
38
|
-
profilePicture:
|
|
39
|
-
profilePictureThumbnail:
|
|
30
|
+
profilePicture: userProfile.profilePicture ?? null,
|
|
31
|
+
profilePictureThumbnail: userProfile.profilePictureThumbnail ?? null,
|
|
40
32
|
}
|
|
41
33
|
: {
|
|
42
34
|
displayName: null,
|
|
@@ -56,6 +48,9 @@ export async function updateProfile(userId, input) {
|
|
|
56
48
|
try {
|
|
57
49
|
profilePictureUrl = input.profilePicture.filePath;
|
|
58
50
|
profilePictureThumbnail = null;
|
|
51
|
+
// Best-effort: make the uploaded file publicly readable so the public
|
|
52
|
+
// GCS URL resolved by the Prisma extension actually works.
|
|
53
|
+
await makeFilePublic(profilePictureUrl);
|
|
59
54
|
}
|
|
60
55
|
catch (error) {
|
|
61
56
|
logger.error("Profile picture processing failed", {
|
|
@@ -101,8 +96,8 @@ export async function updateProfile(userId, input) {
|
|
|
101
96
|
bio: updatedProfile.bio || null,
|
|
102
97
|
location: updatedProfile.location || null,
|
|
103
98
|
website: updatedProfile.website || null,
|
|
104
|
-
profilePicture:
|
|
105
|
-
profilePictureThumbnail:
|
|
99
|
+
profilePicture: updatedProfile.profilePicture ?? null,
|
|
100
|
+
profilePictureThumbnail: updatedProfile.profilePictureThumbnail ?? null,
|
|
106
101
|
},
|
|
107
102
|
};
|
|
108
103
|
}
|
|
@@ -138,4 +133,4 @@ export async function getUploadUrl(userId, fileName, fileType) {
|
|
|
138
133
|
}
|
|
139
134
|
}
|
|
140
135
|
//# sourceMappingURL=user.js.map
|
|
141
|
-
//# debugId=
|
|
136
|
+
//# debugId=2051f702-a4dc-5ce1-b5d3-950cb385ebd6
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.js","sources":["services/user.ts"],"sourceRoot":"/","sourcesContent":["/**\n * User service – profile get/update, profile picture upload URLs.\n */\nimport { TRPCError } from \"@trpc/server\";\nimport { logger } from \"../utils/logger.js\";\nimport { env } from \"../lib/config/env.js\";\nimport { findUserById, findUserProfileByUserId, upsertUserProfile } from \"../models/user.js\";\
|
|
1
|
+
{"version":3,"file":"user.js","sources":["services/user.ts"],"sourceRoot":"/","sourcesContent":["/**\n * User service – profile get/update, profile picture upload URLs.\n */\nimport { TRPCError } from \"@trpc/server\";\nimport { logger } from \"../utils/logger.js\";\nimport { env } from \"../lib/config/env.js\";\nimport { findUserById, findUserProfileByUserId, upsertUserProfile } from \"../models/user.js\";\nimport { makeFilePublic } from \"../lib/googleCloudStorage.js\";\n\n/** Get user profile with display info and profile picture URLs. */\nexport async function getProfile(userId: string) {\n const user = await findUserById(userId);\n if (!user) {\n throw new TRPCError({\n code: \"NOT_FOUND\",\n message: \"User not found\",\n });\n }\n\n const userProfile = await findUserProfileByUserId(userId);\n\n return {\n id: user.id,\n username: user.username,\n profile: userProfile\n ? {\n displayName: (userProfile as any).displayName || null,\n bio: (userProfile as any).bio || null,\n location: (userProfile as any).location || null,\n website: (userProfile as any).website || null,\n profilePicture: (userProfile as any).profilePicture ?? null,\n profilePictureThumbnail: (userProfile as any).profilePictureThumbnail ?? null,\n }\n : {\n displayName: null,\n bio: null,\n location: null,\n website: null,\n profilePicture: null,\n profilePictureThumbnail: null,\n },\n };\n}\n\n/** Update user profile (display name, bio, etc.) and/or profile picture. */\nexport async function updateProfile(\n userId: string,\n input: {\n profile?: {\n displayName?: string | null;\n bio?: string | null;\n location?: string | null;\n website?: string | null;\n };\n profilePicture?: {\n filePath: string;\n fileName: string;\n fileType: string;\n fileSize: number;\n };\n dicebearAvatar?: { url: string };\n }\n) {\n let profilePictureUrl: string | null = null;\n let profilePictureThumbnail: string | null = null;\n\n if (input.profilePicture) {\n try {\n profilePictureUrl = input.profilePicture.filePath;\n profilePictureThumbnail = null;\n\n // Best-effort: make the uploaded file publicly readable so the public\n // GCS URL resolved by the Prisma extension actually works.\n await makeFilePublic(profilePictureUrl);\n } catch (error) {\n logger.error(\"Profile picture processing failed\", {\n userId,\n error: error instanceof Error ? error.message : \"Unknown error\",\n });\n throw new TRPCError({\n code: \"INTERNAL_SERVER_ERROR\",\n message: \"Failed to process profile picture. Please try again.\",\n });\n }\n }\n\n if (input.dicebearAvatar) {\n profilePictureUrl = input.dicebearAvatar.url;\n profilePictureThumbnail = null;\n }\n\n const updateData: any = {};\n if (input.profile) {\n if (input.profile.displayName !== undefined && input.profile.displayName !== null) {\n updateData.displayName = input.profile.displayName;\n }\n if (input.profile.bio !== undefined && input.profile.bio !== null) {\n updateData.bio = input.profile.bio;\n }\n if (input.profile.location !== undefined && input.profile.location !== null) {\n updateData.location = input.profile.location;\n }\n if (input.profile.website !== undefined && input.profile.website !== null) {\n updateData.website = input.profile.website;\n }\n }\n if (profilePictureUrl !== null) updateData.profilePicture = profilePictureUrl;\n if (profilePictureThumbnail !== null)\n updateData.profilePictureThumbnail = profilePictureThumbnail;\n\n const updatedProfile = await upsertUserProfile(userId, updateData);\n const user = await findUserById(userId);\n\n return {\n id: userId,\n username: user?.username || \"\",\n profile: {\n displayName: (updatedProfile as any).displayName || null,\n bio: (updatedProfile as any).bio || null,\n location: (updatedProfile as any).location || null,\n website: (updatedProfile as any).website || null,\n profilePicture: (updatedProfile as any).profilePicture ?? null,\n profilePictureThumbnail: (updatedProfile as any).profilePictureThumbnail ?? null,\n },\n };\n}\n\nexport async function getUploadUrl(\n userId: string,\n fileName: string,\n fileType: string\n) {\n try {\n const fileExtension = fileName.split(\".\").pop();\n const uniqueFilename = `${userId}-${Date.now()}.${fileExtension}`;\n const filePath = `users/${userId}/profile/${uniqueFilename}`;\n\n const backendUrl = env.BACKEND_URL || \"http://localhost:3001\";\n const uploadUrl = `${backendUrl}/api/upload/${encodeURIComponent(filePath)}`;\n\n logger.info(\"Generated upload URL\", {\n userId,\n filePath,\n fileName: uniqueFilename,\n fileType,\n uploadUrl,\n });\n\n return {\n uploadUrl,\n filePath,\n fileName: uniqueFilename,\n };\n } catch (error) {\n logger.error(\"Failed to generate upload URL\", {\n userId,\n error: error instanceof Error ? error.message : \"Unknown error\",\n });\n throw new TRPCError({\n code: \"INTERNAL_SERVER_ERROR\",\n message: \"Failed to generate upload URL\",\n });\n }\n}\n"],"names":[],"mappings":"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","debug_id":"2051f702-a4dc-5ce1-b5d3-950cb385ebd6"}
|