@studious-lms/server 1.12.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 -188
- package/dist/models/class.d.ts.map +1 -1
- package/dist/models/class.js +9 -3
- 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 +269 -110
- package/dist/models/comment.d.ts.map +1 -1
- package/dist/models/comment.js +3 -2
- package/dist/models/comment.js.map +1 -1
- package/dist/models/conversation.d.ts +206 -63
- package/dist/models/conversation.d.ts.map +1 -1
- package/dist/models/conversation.js +13 -2
- package/dist/models/conversation.js.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 +1023 -410
- package/dist/models/worksheet.d.ts.map +1 -1
- package/dist/models/worksheet.js +19 -7
- 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/gradeWorksheet.d.ts.map +1 -1
- package/dist/pipelines/gradeWorksheet.js +59 -14
- package/dist/pipelines/gradeWorksheet.js.map +1 -1
- 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 +2268 -1898
- 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 -28
- package/dist/routers/announcement.d.ts.map +1 -1
- package/dist/routers/announcement.js +6 -5
- package/dist/routers/announcement.js.map +1 -1
- package/dist/routers/assignment.d.ts +335 -327
- package/dist/routers/assignment.d.ts.map +1 -1
- package/dist/routers/assignment.js +4 -4
- package/dist/routers/assignment.js.map +1 -1
- package/dist/routers/attendance.d.ts +10 -10
- package/dist/routers/auth.d.ts +2 -2
- package/dist/routers/class.d.ts +170 -147
- package/dist/routers/class.d.ts.map +1 -1
- package/dist/routers/comment.d.ts +40 -16
- package/dist/routers/comment.d.ts.map +1 -1
- package/dist/routers/comment.js +6 -3
- package/dist/routers/comment.js.map +1 -1
- 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 +97 -56
- package/dist/routers/worksheet.d.ts.map +1 -1
- package/dist/routers/worksheet.js +28 -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 +36 -15
- 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 +161 -138
- package/dist/services/class.d.ts.map +1 -1
- package/dist/services/class.js +25 -4
- package/dist/services/class.js.map +1 -1
- package/dist/services/comment.d.ts +34 -16
- package/dist/services/comment.d.ts.map +1 -1
- package/dist/services/comment.js +23 -2
- package/dist/services/comment.js.map +1 -1
- package/dist/services/conversation.d.ts +17 -17
- package/dist/services/conversation.d.ts.map +1 -1
- package/dist/services/conversation.js +9 -7
- package/dist/services/conversation.js.map +1 -1
- 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 +62 -47
- 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 +39 -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 +10 -3
- package/src/models/comment.ts +1 -0
- package/src/models/conversation.ts +12 -0
- package/src/models/worksheet.ts +16 -7
- package/src/pipelines/aiLabChat.ts +54 -79
- package/src/pipelines/aiLabChatContract.ts +69 -69
- package/src/pipelines/aiNewtonChat.ts +46 -43
- package/src/pipelines/gradeWorksheet.ts +66 -15
- package/src/pipelines/labChatPrompt.ts +63 -88
- package/src/routers/_app.ts +2 -0
- package/src/routers/announcement.ts +4 -3
- package/src/routers/assignment.ts +2 -2
- package/src/routers/comment.ts +5 -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 +29 -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 +36 -14
- package/src/services/class.ts +30 -2
- package/src/services/comment.ts +22 -0
- package/src/services/conversation.ts +9 -4
- 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 +10 -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/integration/routers/conversation.test.ts +9 -7
- 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
|
@@ -14,23 +14,23 @@ export declare function postToNewtonChat(userId: string, newtonChatId: string, c
|
|
|
14
14
|
id: string;
|
|
15
15
|
username: string;
|
|
16
16
|
profile: {
|
|
17
|
-
displayName: string | null;
|
|
18
17
|
profilePicture: string | null;
|
|
18
|
+
displayName: string | null;
|
|
19
19
|
} | null;
|
|
20
20
|
};
|
|
21
21
|
attachments: {
|
|
22
22
|
path: string;
|
|
23
23
|
type: string;
|
|
24
|
-
name: string;
|
|
25
24
|
id: string;
|
|
25
|
+
name: string;
|
|
26
26
|
size: number | null;
|
|
27
27
|
uploadedAt: Date | null;
|
|
28
|
-
uploadStatus: import(".prisma/client").$Enums.UploadStatus;
|
|
29
|
-
thumbnailId: string | null;
|
|
30
28
|
thumbnail: {
|
|
31
29
|
path: string;
|
|
32
30
|
id: string;
|
|
33
31
|
} | null;
|
|
32
|
+
thumbnailId: string | null;
|
|
33
|
+
uploadStatus: import(".prisma/client").$Enums.UploadStatus;
|
|
34
34
|
}[];
|
|
35
35
|
mentionedUserIds: string[];
|
|
36
36
|
}>;
|
|
@@ -11,9 +11,9 @@ export declare function listNotifications(userId: string): Promise<({
|
|
|
11
11
|
createdAt: Date;
|
|
12
12
|
title: string;
|
|
13
13
|
content: string;
|
|
14
|
-
senderId: string | null;
|
|
15
|
-
receiverId: string;
|
|
16
14
|
read: boolean;
|
|
15
|
+
receiverId: string;
|
|
16
|
+
senderId: string | null;
|
|
17
17
|
})[]>;
|
|
18
18
|
/** Get a single notification by ID for its receiver. */
|
|
19
19
|
export declare function getNotification(userId: string, id: string): Promise<{
|
|
@@ -28,9 +28,9 @@ export declare function getNotification(userId: string, id: string): Promise<{
|
|
|
28
28
|
createdAt: Date;
|
|
29
29
|
title: string;
|
|
30
30
|
content: string;
|
|
31
|
-
senderId: string | null;
|
|
32
|
-
receiverId: string;
|
|
33
31
|
read: boolean;
|
|
32
|
+
receiverId: string;
|
|
33
|
+
senderId: string | null;
|
|
34
34
|
}>;
|
|
35
35
|
/** Send a notification to one user. */
|
|
36
36
|
export declare function sendNotification(input: {
|
|
@@ -42,16 +42,16 @@ export declare function sendNotification(input: {
|
|
|
42
42
|
createdAt: Date;
|
|
43
43
|
title: string;
|
|
44
44
|
content: string;
|
|
45
|
-
senderId: string | null;
|
|
46
|
-
receiverId: string;
|
|
47
45
|
read: boolean;
|
|
46
|
+
receiverId: string;
|
|
47
|
+
senderId: string | null;
|
|
48
48
|
}>;
|
|
49
49
|
/** Send the same notification to multiple users. */
|
|
50
50
|
export declare function sendToMultiple(input: {
|
|
51
51
|
receiverIds: string[];
|
|
52
52
|
title: string;
|
|
53
53
|
content: string;
|
|
54
|
-
}): Promise<import("
|
|
54
|
+
}): Promise<import("@prisma/client/runtime/library.js").GetBatchResult>;
|
|
55
55
|
/** Mark a notification as read for its receiver. */
|
|
56
56
|
export declare function markAsRead(userId: string, id: string): Promise<{
|
|
57
57
|
sender: {
|
|
@@ -65,8 +65,8 @@ export declare function markAsRead(userId: string, id: string): Promise<{
|
|
|
65
65
|
createdAt: Date;
|
|
66
66
|
title: string;
|
|
67
67
|
content: string;
|
|
68
|
-
senderId: string | null;
|
|
69
|
-
receiverId: string;
|
|
70
68
|
read: boolean;
|
|
69
|
+
receiverId: string;
|
|
70
|
+
senderId: string | null;
|
|
71
71
|
}>;
|
|
72
72
|
//# sourceMappingURL=notification.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notification.d.ts","sourceRoot":"/","sources":["services/notification.ts"],"names":[],"mappings":"AAYA,qCAAqC;AACrC,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM;;;;;;;;;;;;;;;MAErD;AAED,wDAAwD;AACxD,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;;;;;;;;;;;;;;;GAW/D;AAED,uCAAuC;AACvC,wBAAsB,gBAAgB,CAAC,KAAK,EAAE;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;;;;;;;;GAEA;AAED,oDAAoD;AACpD,wBAAsB,cAAc,CAAC,KAAK,EAAE;IAC1C,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB,
|
|
1
|
+
{"version":3,"file":"notification.d.ts","sourceRoot":"/","sources":["services/notification.ts"],"names":[],"mappings":"AAYA,qCAAqC;AACrC,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM;;;;;;;;;;;;;;;MAErD;AAED,wDAAwD;AACxD,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;;;;;;;;;;;;;;;GAW/D;AAED,uCAAuC;AACvC,wBAAsB,gBAAgB,CAAC,KAAK,EAAE;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;;;;;;;;GAEA;AAED,oDAAoD;AACpD,wBAAsB,cAAc,CAAC,KAAK,EAAE;IAC1C,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB,uEASA;AAED,oDAAoD;AACpD,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;;;;;;;;;;;;;;;GAW1D"}
|
|
@@ -132,14 +132,14 @@ export declare function grantPermission(grantedById: string, input: {
|
|
|
132
132
|
}): Promise<{
|
|
133
133
|
level: import(".prisma/client").$Enums.PermissionLevel;
|
|
134
134
|
id: string;
|
|
135
|
+
userId: string | null;
|
|
135
136
|
createdAt: Date;
|
|
136
137
|
schoolId: string | null;
|
|
137
|
-
|
|
138
|
+
classId: string | null;
|
|
138
139
|
departmentId: string | null;
|
|
139
140
|
folderId: string;
|
|
140
141
|
principalType: import(".prisma/client").$Enums.PermissionPrincipalType;
|
|
141
142
|
tagId: string | null;
|
|
142
|
-
classId: string | null;
|
|
143
143
|
grantedById: string;
|
|
144
144
|
}>;
|
|
145
145
|
/** Revoke a grant. Allowed for the granter or anyone with WRITE on the folder. */
|
|
@@ -149,8 +149,18 @@ export declare function revokePermission(userId: string, permissionId: string):
|
|
|
149
149
|
/** List all explicit grants on a folder. Caller must have WRITE on it. */
|
|
150
150
|
export declare function listPermissions(userId: string, folderId: string): Promise<({
|
|
151
151
|
school: {
|
|
152
|
+
id: string;
|
|
153
|
+
name: string;
|
|
154
|
+
} | null;
|
|
155
|
+
department: {
|
|
156
|
+
id: string;
|
|
152
157
|
name: string;
|
|
158
|
+
color: string | null;
|
|
159
|
+
} | null;
|
|
160
|
+
tag: {
|
|
153
161
|
id: string;
|
|
162
|
+
name: string;
|
|
163
|
+
color: string;
|
|
154
164
|
} | null;
|
|
155
165
|
user: {
|
|
156
166
|
id: string;
|
|
@@ -158,31 +168,21 @@ export declare function listPermissions(userId: string, folderId: string): Promi
|
|
|
158
168
|
email: string;
|
|
159
169
|
} | null;
|
|
160
170
|
class: {
|
|
161
|
-
name: string;
|
|
162
|
-
id: string;
|
|
163
171
|
section: string;
|
|
164
|
-
} | null;
|
|
165
|
-
department: {
|
|
166
|
-
name: string;
|
|
167
172
|
id: string;
|
|
168
|
-
color: string | null;
|
|
169
|
-
} | null;
|
|
170
|
-
tag: {
|
|
171
173
|
name: string;
|
|
172
|
-
id: string;
|
|
173
|
-
color: string;
|
|
174
174
|
} | null;
|
|
175
175
|
} & {
|
|
176
176
|
level: import(".prisma/client").$Enums.PermissionLevel;
|
|
177
177
|
id: string;
|
|
178
|
+
userId: string | null;
|
|
178
179
|
createdAt: Date;
|
|
179
180
|
schoolId: string | null;
|
|
180
|
-
|
|
181
|
+
classId: string | null;
|
|
181
182
|
departmentId: string | null;
|
|
182
183
|
folderId: string;
|
|
183
184
|
principalType: import(".prisma/client").$Enums.PermissionPrincipalType;
|
|
184
185
|
tagId: string | null;
|
|
185
|
-
classId: string | null;
|
|
186
186
|
grantedById: string;
|
|
187
187
|
})[]>;
|
|
188
188
|
//# sourceMappingURL=permissions.d.ts.map
|
|
@@ -15,13 +15,13 @@ export declare function getCurrentSchool(userId: string, schoolId?: string): Pro
|
|
|
15
15
|
activeRole: import(".prisma/client").$Enums.SchoolMembershipRole | null;
|
|
16
16
|
memberships: ({
|
|
17
17
|
school: {
|
|
18
|
-
name: string;
|
|
19
18
|
id: string;
|
|
19
|
+
createdAt: Date;
|
|
20
|
+
updatedAt: Date;
|
|
21
|
+
name: string;
|
|
20
22
|
description: string | null;
|
|
21
23
|
logoId: string | null;
|
|
22
24
|
subdomain: string | null;
|
|
23
|
-
createdAt: Date;
|
|
24
|
-
updatedAt: Date;
|
|
25
25
|
logo: {
|
|
26
26
|
path: string;
|
|
27
27
|
type: string;
|
|
@@ -31,10 +31,10 @@ export declare function getCurrentSchool(userId: string, schoolId?: string): Pro
|
|
|
31
31
|
} & {
|
|
32
32
|
status: import(".prisma/client").$Enums.SchoolMembershipStatus;
|
|
33
33
|
id: string;
|
|
34
|
+
userId: string;
|
|
34
35
|
createdAt: Date;
|
|
35
36
|
updatedAt: Date;
|
|
36
37
|
schoolId: string;
|
|
37
|
-
userId: string;
|
|
38
38
|
role: import(".prisma/client").$Enums.SchoolMembershipRole;
|
|
39
39
|
})[];
|
|
40
40
|
}>;
|
|
@@ -48,20 +48,20 @@ export declare function createSchoolRecord(userId: string, input: {
|
|
|
48
48
|
memberships: {
|
|
49
49
|
status: import(".prisma/client").$Enums.SchoolMembershipStatus;
|
|
50
50
|
id: string;
|
|
51
|
+
userId: string;
|
|
51
52
|
createdAt: Date;
|
|
52
53
|
updatedAt: Date;
|
|
53
54
|
schoolId: string;
|
|
54
|
-
userId: string;
|
|
55
55
|
role: import(".prisma/client").$Enums.SchoolMembershipRole;
|
|
56
56
|
}[];
|
|
57
57
|
} & {
|
|
58
|
-
name: string;
|
|
59
58
|
id: string;
|
|
59
|
+
createdAt: Date;
|
|
60
|
+
updatedAt: Date;
|
|
61
|
+
name: string;
|
|
60
62
|
description: string | null;
|
|
61
63
|
logoId: string | null;
|
|
62
64
|
subdomain: string | null;
|
|
63
|
-
createdAt: Date;
|
|
64
|
-
updatedAt: Date;
|
|
65
65
|
};
|
|
66
66
|
}>;
|
|
67
67
|
export declare function updateSchoolDetails(userId: string, input: {
|
|
@@ -72,8 +72,8 @@ export declare function updateSchoolDetails(userId: string, input: {
|
|
|
72
72
|
logoId?: string | null;
|
|
73
73
|
}): Promise<{
|
|
74
74
|
school: {
|
|
75
|
-
name: string;
|
|
76
75
|
id: string;
|
|
76
|
+
name: string;
|
|
77
77
|
description: string | null;
|
|
78
78
|
logoId: string | null;
|
|
79
79
|
subdomain: string | null;
|
|
@@ -93,51 +93,51 @@ export declare function getAdminOverview(userId: string, schoolId: string): Prom
|
|
|
93
93
|
pendingInvites: number;
|
|
94
94
|
};
|
|
95
95
|
recentClasses: {
|
|
96
|
-
name: string;
|
|
97
|
-
id: string;
|
|
98
|
-
subject: string;
|
|
99
|
-
color: string | null;
|
|
100
96
|
section: string;
|
|
97
|
+
id: string;
|
|
98
|
+
name: string;
|
|
101
99
|
_count: {
|
|
102
100
|
teachers: number;
|
|
103
101
|
students: number;
|
|
104
102
|
};
|
|
103
|
+
color: string | null;
|
|
104
|
+
subject: string;
|
|
105
105
|
}[];
|
|
106
106
|
recentInvites: {
|
|
107
107
|
id: string;
|
|
108
108
|
createdAt: Date;
|
|
109
109
|
email: string;
|
|
110
|
-
role: import(".prisma/client").$Enums.SchoolMembershipRole;
|
|
111
110
|
expiresAt: Date;
|
|
111
|
+
role: import(".prisma/client").$Enums.SchoolMembershipRole;
|
|
112
112
|
}[];
|
|
113
113
|
};
|
|
114
114
|
}>;
|
|
115
115
|
export declare function listClasses(userId: string, schoolId: string): Promise<{
|
|
116
116
|
classes: ({
|
|
117
|
-
_count: {
|
|
118
|
-
assignments: number;
|
|
119
|
-
teachers: number;
|
|
120
|
-
students: number;
|
|
121
|
-
};
|
|
122
117
|
teachers: {
|
|
123
118
|
id: string;
|
|
124
119
|
username: string;
|
|
125
120
|
profile: {
|
|
126
|
-
displayName: string | null;
|
|
127
121
|
profilePicture: string | null;
|
|
122
|
+
displayName: string | null;
|
|
128
123
|
profilePictureThumbnail: string | null;
|
|
129
124
|
} | null;
|
|
130
125
|
}[];
|
|
131
126
|
students: {
|
|
132
127
|
id: string;
|
|
133
128
|
}[];
|
|
129
|
+
_count: {
|
|
130
|
+
teachers: number;
|
|
131
|
+
students: number;
|
|
132
|
+
assignments: number;
|
|
133
|
+
};
|
|
134
134
|
} & {
|
|
135
|
-
|
|
135
|
+
section: string;
|
|
136
136
|
id: string;
|
|
137
|
+
name: string;
|
|
137
138
|
schoolId: string | null;
|
|
138
|
-
subject: string;
|
|
139
139
|
color: string | null;
|
|
140
|
-
|
|
140
|
+
subject: string;
|
|
141
141
|
syllabus: string | null;
|
|
142
142
|
departmentId: string | null;
|
|
143
143
|
discussionsEnabled: boolean;
|
|
@@ -173,12 +173,12 @@ export declare function createSchoolClass(userId: string, input: {
|
|
|
173
173
|
schoolId: string | null;
|
|
174
174
|
}[];
|
|
175
175
|
} & {
|
|
176
|
-
|
|
176
|
+
section: string;
|
|
177
177
|
id: string;
|
|
178
|
+
name: string;
|
|
178
179
|
schoolId: string | null;
|
|
179
|
-
subject: string;
|
|
180
180
|
color: string | null;
|
|
181
|
-
|
|
181
|
+
subject: string;
|
|
182
182
|
syllabus: string | null;
|
|
183
183
|
departmentId: string | null;
|
|
184
184
|
discussionsEnabled: boolean;
|
|
@@ -189,19 +189,19 @@ export declare function createSchoolClass(userId: string, input: {
|
|
|
189
189
|
export declare function listMembers(userId: string, schoolId: string): Promise<{
|
|
190
190
|
members: {
|
|
191
191
|
status: import(".prisma/client").$Enums.SchoolMembershipStatus;
|
|
192
|
-
id: string;
|
|
193
|
-
createdAt: Date;
|
|
194
|
-
updatedAt: Date;
|
|
195
192
|
user: {
|
|
196
193
|
id: string;
|
|
197
194
|
username: string;
|
|
198
195
|
email: string;
|
|
199
196
|
profile: {
|
|
200
|
-
displayName: string | null;
|
|
201
197
|
profilePicture: string | null;
|
|
198
|
+
displayName: string | null;
|
|
202
199
|
profilePictureThumbnail: string | null;
|
|
203
200
|
} | null;
|
|
204
201
|
};
|
|
202
|
+
id: string;
|
|
203
|
+
createdAt: Date;
|
|
204
|
+
updatedAt: Date;
|
|
205
205
|
role: import(".prisma/client").$Enums.SchoolMembershipRole;
|
|
206
206
|
}[];
|
|
207
207
|
}>;
|
|
@@ -213,10 +213,10 @@ export declare function addMember(userId: string, input: {
|
|
|
213
213
|
membership: {
|
|
214
214
|
status: import(".prisma/client").$Enums.SchoolMembershipStatus;
|
|
215
215
|
id: string;
|
|
216
|
+
userId: string;
|
|
216
217
|
createdAt: Date;
|
|
217
218
|
updatedAt: Date;
|
|
218
219
|
schoolId: string;
|
|
219
|
-
userId: string;
|
|
220
220
|
role: import(".prisma/client").$Enums.SchoolMembershipRole;
|
|
221
221
|
};
|
|
222
222
|
}>;
|
|
@@ -228,10 +228,10 @@ export declare function updateMemberRole(userId: string, input: {
|
|
|
228
228
|
membership: {
|
|
229
229
|
status: import(".prisma/client").$Enums.SchoolMembershipStatus;
|
|
230
230
|
id: string;
|
|
231
|
+
userId: string;
|
|
231
232
|
createdAt: Date;
|
|
232
233
|
updatedAt: Date;
|
|
233
234
|
schoolId: string;
|
|
234
|
-
userId: string;
|
|
235
235
|
role: import(".prisma/client").$Enums.SchoolMembershipRole;
|
|
236
236
|
};
|
|
237
237
|
}>;
|
|
@@ -247,8 +247,8 @@ export declare function listInvites(userId: string, schoolId: string): Promise<{
|
|
|
247
247
|
id: string;
|
|
248
248
|
createdAt: Date;
|
|
249
249
|
email: string;
|
|
250
|
-
role: import(".prisma/client").$Enums.SchoolMembershipRole;
|
|
251
250
|
expiresAt: Date;
|
|
251
|
+
role: import(".prisma/client").$Enums.SchoolMembershipRole;
|
|
252
252
|
acceptedAt: Date | null;
|
|
253
253
|
revokedAt: Date | null;
|
|
254
254
|
invitedBy: {
|
|
@@ -283,8 +283,8 @@ export declare function searchMembers(userId: string, schoolId: string, query: s
|
|
|
283
283
|
id: string;
|
|
284
284
|
username: string;
|
|
285
285
|
profile: {
|
|
286
|
-
displayName: string | null;
|
|
287
286
|
profilePicture: string | null;
|
|
287
|
+
displayName: string | null;
|
|
288
288
|
profilePictureThumbnail: string | null;
|
|
289
289
|
} | null;
|
|
290
290
|
schoolMemberships: {
|
|
@@ -306,34 +306,34 @@ export declare function getStudentTimeline(userId: string, input: {
|
|
|
306
306
|
id: string;
|
|
307
307
|
username: string;
|
|
308
308
|
profile: {
|
|
309
|
-
displayName: string | null;
|
|
310
309
|
profilePicture: string | null;
|
|
310
|
+
displayName: string | null;
|
|
311
311
|
} | null;
|
|
312
312
|
};
|
|
313
313
|
events: {
|
|
314
|
-
name: string | null;
|
|
315
|
-
id: string;
|
|
316
314
|
class: {
|
|
317
|
-
name: string;
|
|
318
315
|
id: string;
|
|
316
|
+
name: string;
|
|
319
317
|
color: string | null;
|
|
320
318
|
} | null;
|
|
319
|
+
id: string;
|
|
320
|
+
location: string | null;
|
|
321
|
+
name: string | null;
|
|
321
322
|
color: string | null;
|
|
322
323
|
startTime: Date;
|
|
323
324
|
endTime: Date;
|
|
324
|
-
location: string | null;
|
|
325
325
|
remarks: string | null;
|
|
326
326
|
}[];
|
|
327
327
|
assignments: {
|
|
328
328
|
type: import(".prisma/client").$Enums.AssignmentType;
|
|
329
|
-
id: string;
|
|
330
329
|
class: {
|
|
331
|
-
|
|
330
|
+
section: string;
|
|
332
331
|
id: string;
|
|
333
|
-
|
|
332
|
+
name: string;
|
|
334
333
|
color: string | null;
|
|
335
|
-
|
|
334
|
+
subject: string;
|
|
336
335
|
};
|
|
336
|
+
id: string;
|
|
337
337
|
submissions: {
|
|
338
338
|
id: string;
|
|
339
339
|
gradeReceived: number | null;
|
|
@@ -343,16 +343,16 @@ export declare function getStudentTimeline(userId: string, input: {
|
|
|
343
343
|
}[];
|
|
344
344
|
title: string;
|
|
345
345
|
dueDate: Date;
|
|
346
|
-
graded: boolean;
|
|
347
346
|
maxGrade: number | null;
|
|
347
|
+
graded: boolean;
|
|
348
348
|
weight: number;
|
|
349
349
|
}[];
|
|
350
350
|
attendance: {
|
|
351
351
|
id: string;
|
|
352
352
|
date: Date;
|
|
353
353
|
class: {
|
|
354
|
-
name: string;
|
|
355
354
|
id: string;
|
|
355
|
+
name: string;
|
|
356
356
|
color: string | null;
|
|
357
357
|
};
|
|
358
358
|
status: "PRESENT" | "LATE" | "ABSENT";
|
|
@@ -370,8 +370,8 @@ export declare function createInvite(userId: string, input: {
|
|
|
370
370
|
}): Promise<{
|
|
371
371
|
invite: {
|
|
372
372
|
school: {
|
|
373
|
-
name: string;
|
|
374
373
|
id: string;
|
|
374
|
+
name: string;
|
|
375
375
|
};
|
|
376
376
|
} & {
|
|
377
377
|
status: import(".prisma/client").$Enums.SchoolInviteStatus;
|
|
@@ -380,9 +380,9 @@ export declare function createInvite(userId: string, input: {
|
|
|
380
380
|
updatedAt: Date;
|
|
381
381
|
email: string;
|
|
382
382
|
schoolId: string;
|
|
383
|
+
expiresAt: Date;
|
|
383
384
|
role: import(".prisma/client").$Enums.SchoolMembershipRole;
|
|
384
385
|
token: string;
|
|
385
|
-
expiresAt: Date;
|
|
386
386
|
acceptedAt: Date | null;
|
|
387
387
|
revokedAt: Date | null;
|
|
388
388
|
invitedById: string;
|
|
@@ -404,9 +404,9 @@ export declare function revokeInvite(userId: string, input: {
|
|
|
404
404
|
updatedAt: Date;
|
|
405
405
|
email: string;
|
|
406
406
|
schoolId: string;
|
|
407
|
+
expiresAt: Date;
|
|
407
408
|
role: import(".prisma/client").$Enums.SchoolMembershipRole;
|
|
408
409
|
token: string;
|
|
409
|
-
expiresAt: Date;
|
|
410
410
|
acceptedAt: Date | null;
|
|
411
411
|
revokedAt: Date | null;
|
|
412
412
|
invitedById: string;
|
|
@@ -418,8 +418,8 @@ export declare function getInvite(token: string): Promise<{
|
|
|
418
418
|
email: string;
|
|
419
419
|
role: import(".prisma/client").$Enums.SchoolMembershipRole;
|
|
420
420
|
school: {
|
|
421
|
-
name: string;
|
|
422
421
|
id: string;
|
|
422
|
+
name: string;
|
|
423
423
|
};
|
|
424
424
|
expiresAt: Date;
|
|
425
425
|
};
|
|
@@ -428,10 +428,10 @@ export declare function acceptInvite(userId: string, token: string): Promise<{
|
|
|
428
428
|
membership: {
|
|
429
429
|
status: import(".prisma/client").$Enums.SchoolMembershipStatus;
|
|
430
430
|
id: string;
|
|
431
|
+
userId: string;
|
|
431
432
|
createdAt: Date;
|
|
432
433
|
updatedAt: Date;
|
|
433
434
|
schoolId: string;
|
|
434
|
-
userId: string;
|
|
435
435
|
role: import(".prisma/client").$Enums.SchoolMembershipRole;
|
|
436
436
|
};
|
|
437
437
|
}>;
|
|
@@ -17,5 +17,17 @@ export declare function searchGlobalClasses(userId: string, input: {
|
|
|
17
17
|
query: string;
|
|
18
18
|
results: SearchResult[];
|
|
19
19
|
}>;
|
|
20
|
+
/**
|
|
21
|
+
* Cross-class semantic search via pgvector.
|
|
22
|
+
* Generates an embedding for `query`, searches across all classes the user
|
|
23
|
+
* belongs to, and maps hits back to SearchResult shape.
|
|
24
|
+
*/
|
|
25
|
+
export declare function searchSemanticGlobal(userId: string, input: {
|
|
26
|
+
query: string;
|
|
27
|
+
limit?: number;
|
|
28
|
+
}): Promise<{
|
|
29
|
+
query: string;
|
|
30
|
+
results: SearchResult[];
|
|
31
|
+
}>;
|
|
20
32
|
export {};
|
|
21
33
|
//# sourceMappingURL=search.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.d.ts","sourceRoot":"/","sources":["services/search.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"/","sources":["services/search.ts"],"names":[],"mappings":"AAKA,KAAK,WAAW,GACZ,OAAO,GACP,YAAY,GACZ,OAAO,GACP,UAAU,GACV,WAAW,GACX,MAAM,GACN,cAAc,GACd,SAAS,CAAC;AAEd,KAAK,YAAY,GAAG;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACpB,CAAC;AA6CF,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE;;aA0BR,YAAY,EAAE;GA6ShD;AAYD;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE;;aAIP,YAAY,EAAE;GAgHhD"}
|
package/dist/services/search.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
|
|
2
|
-
!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]="
|
|
2
|
+
!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]="95067932-0f2f-5d5f-bd33-0e2156d5ed88")}catch(e){}}();
|
|
3
3
|
import { prisma } from "../lib/prisma.js";
|
|
4
|
+
import { generateEmbedding } from "./embedding.js";
|
|
5
|
+
import { logger } from "../utils/logger.js";
|
|
4
6
|
const SEARCH_LIMIT = 12;
|
|
5
7
|
const contains = (query) => ({
|
|
6
8
|
contains: query,
|
|
@@ -348,5 +350,121 @@ export async function searchGlobalClasses(userId, input) {
|
|
|
348
350
|
];
|
|
349
351
|
return { query, results: trimResults(results, limit) };
|
|
350
352
|
}
|
|
353
|
+
const SOURCE_TYPE_TO_SCOPE = {
|
|
354
|
+
ASSIGNMENT: "assignment",
|
|
355
|
+
WORKSHEET: "worksheet",
|
|
356
|
+
ANNOUNCEMENT: "announcement",
|
|
357
|
+
FILE: "file",
|
|
358
|
+
SECTION: "section",
|
|
359
|
+
};
|
|
360
|
+
const MIN_SIMILARITY = 0.25;
|
|
361
|
+
/**
|
|
362
|
+
* Cross-class semantic search via pgvector.
|
|
363
|
+
* Generates an embedding for `query`, searches across all classes the user
|
|
364
|
+
* belongs to, and maps hits back to SearchResult shape.
|
|
365
|
+
*/
|
|
366
|
+
export async function searchSemanticGlobal(userId, input) {
|
|
367
|
+
const query = input.query.trim().slice(0, 200);
|
|
368
|
+
if (!query) {
|
|
369
|
+
return { query, results: [] };
|
|
370
|
+
}
|
|
371
|
+
const limit = Math.min(Math.max(input.limit ?? SEARCH_LIMIT, 1), 30);
|
|
372
|
+
const memberships = await prisma.class.findMany({
|
|
373
|
+
where: {
|
|
374
|
+
OR: [
|
|
375
|
+
{ teachers: { some: { id: userId } } },
|
|
376
|
+
{ students: { some: { id: userId } } },
|
|
377
|
+
],
|
|
378
|
+
},
|
|
379
|
+
select: { id: true, name: true },
|
|
380
|
+
});
|
|
381
|
+
const allClassIds = memberships.map((cls) => cls.id);
|
|
382
|
+
if (allClassIds.length === 0) {
|
|
383
|
+
return { query, results: [] };
|
|
384
|
+
}
|
|
385
|
+
const classById = new Map(memberships.map((cls) => [cls.id, cls]));
|
|
386
|
+
let queryVector;
|
|
387
|
+
try {
|
|
388
|
+
queryVector = await generateEmbedding(query);
|
|
389
|
+
}
|
|
390
|
+
catch (err) {
|
|
391
|
+
logger.error("Semantic search embedding failed", { err });
|
|
392
|
+
return { query, results: [] };
|
|
393
|
+
}
|
|
394
|
+
const vectorStr = `[${queryVector.join(",")}]`;
|
|
395
|
+
const hits = await prisma.$queryRaw `
|
|
396
|
+
SELECT DISTINCT ON ("sourceType", "sourceId")
|
|
397
|
+
"sourceType",
|
|
398
|
+
"sourceId",
|
|
399
|
+
"classId",
|
|
400
|
+
content,
|
|
401
|
+
1 - (vector <=> ${vectorStr}::vector) as similarity
|
|
402
|
+
FROM "Embedding"
|
|
403
|
+
WHERE "classId" = ANY(${allClassIds}::text[])
|
|
404
|
+
ORDER BY "sourceType", "sourceId", vector <=> ${vectorStr}::vector
|
|
405
|
+
LIMIT ${limit * 3}
|
|
406
|
+
`;
|
|
407
|
+
const filtered = hits
|
|
408
|
+
.filter((h) => h.similarity >= MIN_SIMILARITY)
|
|
409
|
+
.sort((a, b) => b.similarity - a.similarity)
|
|
410
|
+
.slice(0, limit);
|
|
411
|
+
const results = [];
|
|
412
|
+
for (const hit of filtered) {
|
|
413
|
+
const cls = classById.get(hit.classId);
|
|
414
|
+
const className = cls?.name ?? "Class";
|
|
415
|
+
const scope = SOURCE_TYPE_TO_SCOPE[hit.sourceType];
|
|
416
|
+
if (!scope)
|
|
417
|
+
continue;
|
|
418
|
+
const snippet = hit.content.replace(/\s+/g, " ").trim().slice(0, 140);
|
|
419
|
+
let title = snippet.slice(0, 60);
|
|
420
|
+
let href = `/class/${hit.classId}`;
|
|
421
|
+
if (scope === "assignment") {
|
|
422
|
+
const assignment = await prisma.assignment.findUnique({
|
|
423
|
+
where: { id: hit.sourceId },
|
|
424
|
+
select: { title: true },
|
|
425
|
+
});
|
|
426
|
+
title = assignment?.title ?? title;
|
|
427
|
+
href = `/class/${hit.classId}/assignment/${hit.sourceId}`;
|
|
428
|
+
}
|
|
429
|
+
else if (scope === "worksheet") {
|
|
430
|
+
const worksheet = await prisma.worksheet.findUnique({
|
|
431
|
+
where: { id: hit.sourceId },
|
|
432
|
+
select: { name: true },
|
|
433
|
+
});
|
|
434
|
+
title = worksheet?.name ?? title;
|
|
435
|
+
href = `/class/${hit.classId}/worksheets`;
|
|
436
|
+
}
|
|
437
|
+
else if (scope === "announcement") {
|
|
438
|
+
href = `/class/${hit.classId}`;
|
|
439
|
+
}
|
|
440
|
+
else if (scope === "file") {
|
|
441
|
+
const file = await prisma.file.findUnique({
|
|
442
|
+
where: { id: hit.sourceId },
|
|
443
|
+
select: { name: true },
|
|
444
|
+
});
|
|
445
|
+
title = file?.name ?? title;
|
|
446
|
+
href = `/class/${hit.classId}/files`;
|
|
447
|
+
}
|
|
448
|
+
else if (scope === "section") {
|
|
449
|
+
const section = await prisma.section.findUnique({
|
|
450
|
+
where: { id: hit.sourceId },
|
|
451
|
+
select: { name: true },
|
|
452
|
+
});
|
|
453
|
+
title = section?.name ?? title;
|
|
454
|
+
href = `/class/${hit.classId}/assignments`;
|
|
455
|
+
}
|
|
456
|
+
results.push({
|
|
457
|
+
id: `semantic:${hit.sourceId}`,
|
|
458
|
+
type: scope,
|
|
459
|
+
title,
|
|
460
|
+
subtitle: `${className} · ${scope.charAt(0).toUpperCase() + scope.slice(1)}`,
|
|
461
|
+
classId: hit.classId,
|
|
462
|
+
className,
|
|
463
|
+
href,
|
|
464
|
+
matchedText: snippet,
|
|
465
|
+
});
|
|
466
|
+
}
|
|
467
|
+
return { query, results };
|
|
468
|
+
}
|
|
351
469
|
//# sourceMappingURL=search.js.map
|
|
352
|
-
//# debugId=
|
|
470
|
+
//# debugId=95067932-0f2f-5d5f-bd33-0e2156d5ed88
|