@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
package/dist/lib/config/env.d.ts
CHANGED
|
@@ -3,6 +3,12 @@ declare const envSchema: z.ZodObject<{
|
|
|
3
3
|
NODE_ENV: z.ZodDefault<z.ZodEnum<["development", "production", "test"]>>;
|
|
4
4
|
PORT: z.ZodDefault<z.ZodEffects<z.ZodString, number, string>>;
|
|
5
5
|
DATABASE_URL: z.ZodString;
|
|
6
|
+
/**
|
|
7
|
+
* Optional BullMQ key prefix. Defaults to `bull:<NODE_ENV>` (see
|
|
8
|
+
* `getBullPrefix`). Set explicitly to isolate queues when multiple
|
|
9
|
+
* databases share one Redis instance (e.g. several devs on one Upstash).
|
|
10
|
+
*/
|
|
11
|
+
BULL_PREFIX: z.ZodOptional<z.ZodString>;
|
|
6
12
|
} & {
|
|
7
13
|
NEXT_PUBLIC_APP_URL: z.ZodDefault<z.ZodString>;
|
|
8
14
|
CORS_ALLOWED_ORIGINS: z.ZodOptional<z.ZodString>;
|
|
@@ -50,6 +56,7 @@ declare const envSchema: z.ZodObject<{
|
|
|
50
56
|
PUSHER_KEY: string;
|
|
51
57
|
PUSHER_SECRET: string;
|
|
52
58
|
PUSHER_CLUSTER: string;
|
|
59
|
+
BULL_PREFIX?: string | undefined;
|
|
53
60
|
CORS_ALLOWED_ORIGINS?: string | undefined;
|
|
54
61
|
CORS_ALLOWED_ORIGIN_PATTERNS?: string | undefined;
|
|
55
62
|
SENTRY_DSN?: string | undefined;
|
|
@@ -75,6 +82,7 @@ declare const envSchema: z.ZodObject<{
|
|
|
75
82
|
NODE_ENV?: "test" | "development" | "production" | undefined;
|
|
76
83
|
LOG_MODE?: "normal" | "verbose" | "quiet" | undefined;
|
|
77
84
|
PORT?: string | undefined;
|
|
85
|
+
BULL_PREFIX?: string | undefined;
|
|
78
86
|
NEXT_PUBLIC_APP_URL?: string | undefined;
|
|
79
87
|
CORS_ALLOWED_ORIGINS?: string | undefined;
|
|
80
88
|
CORS_ALLOWED_ORIGIN_PATTERNS?: string | undefined;
|
|
@@ -92,6 +100,12 @@ declare const envSchema: z.ZodObject<{
|
|
|
92
100
|
NODE_ENV: z.ZodDefault<z.ZodEnum<["development", "production", "test"]>>;
|
|
93
101
|
PORT: z.ZodDefault<z.ZodEffects<z.ZodString, number, string>>;
|
|
94
102
|
DATABASE_URL: z.ZodString;
|
|
103
|
+
/**
|
|
104
|
+
* Optional BullMQ key prefix. Defaults to `bull:<NODE_ENV>` (see
|
|
105
|
+
* `getBullPrefix`). Set explicitly to isolate queues when multiple
|
|
106
|
+
* databases share one Redis instance (e.g. several devs on one Upstash).
|
|
107
|
+
*/
|
|
108
|
+
BULL_PREFIX: z.ZodOptional<z.ZodString>;
|
|
95
109
|
} & {
|
|
96
110
|
NEXT_PUBLIC_APP_URL: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
97
111
|
CORS_ALLOWED_ORIGINS: z.ZodOptional<z.ZodString>;
|
|
@@ -138,6 +152,7 @@ declare const envSchema: z.ZodObject<{
|
|
|
138
152
|
PUSHER_KEY: string;
|
|
139
153
|
PUSHER_SECRET: string;
|
|
140
154
|
PUSHER_CLUSTER: string;
|
|
155
|
+
BULL_PREFIX?: string | undefined;
|
|
141
156
|
CORS_ALLOWED_ORIGINS?: string | undefined;
|
|
142
157
|
CORS_ALLOWED_ORIGIN_PATTERNS?: string | undefined;
|
|
143
158
|
SENTRY_DSN?: string | undefined;
|
|
@@ -152,6 +167,7 @@ declare const envSchema: z.ZodObject<{
|
|
|
152
167
|
NODE_ENV?: "test" | "development" | "production" | undefined;
|
|
153
168
|
LOG_MODE?: "normal" | "verbose" | "quiet" | undefined;
|
|
154
169
|
PORT?: string | undefined;
|
|
170
|
+
BULL_PREFIX?: string | undefined;
|
|
155
171
|
NEXT_PUBLIC_APP_URL?: string | undefined;
|
|
156
172
|
CORS_ALLOWED_ORIGINS?: string | undefined;
|
|
157
173
|
CORS_ALLOWED_ORIGIN_PATTERNS?: string | undefined;
|
|
@@ -197,6 +213,7 @@ export declare const env: {
|
|
|
197
213
|
PUSHER_KEY: string;
|
|
198
214
|
PUSHER_SECRET: string;
|
|
199
215
|
PUSHER_CLUSTER: string;
|
|
216
|
+
BULL_PREFIX?: string | undefined;
|
|
200
217
|
CORS_ALLOWED_ORIGINS?: string | undefined;
|
|
201
218
|
CORS_ALLOWED_ORIGIN_PATTERNS?: string | undefined;
|
|
202
219
|
SENTRY_DSN?: string | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.d.ts","sourceRoot":"/","sources":["lib/config/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"/","sources":["lib/config/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAyGxB,QAAA,MAAM,SAAS;;;;IApEb;;;;OAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;IA8BH,qGAAqG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAlCrG;;;;OAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgE6C,CAAC;AA2CnD,eAAO,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAgB,CAAC;AAGjC,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAC"}
|
package/dist/lib/config/env.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
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]="8e7c7480-b0bc-5778-9502-7fd6d8f4dae8")}catch(e){}}();
|
|
3
3
|
import { z } from 'zod';
|
|
4
4
|
import dotenv from 'dotenv';
|
|
5
5
|
import { resolve } from 'path';
|
|
@@ -28,6 +28,12 @@ const baseSchema = z.object({
|
|
|
28
28
|
NODE_ENV: z.enum(['development', 'production', 'test']).default('development'),
|
|
29
29
|
PORT: z.string().transform(Number).default('3001'),
|
|
30
30
|
DATABASE_URL: z.string().url('DATABASE_URL must be a valid URL'),
|
|
31
|
+
/**
|
|
32
|
+
* Optional BullMQ key prefix. Defaults to `bull:<NODE_ENV>` (see
|
|
33
|
+
* `getBullPrefix`). Set explicitly to isolate queues when multiple
|
|
34
|
+
* databases share one Redis instance (e.g. several devs on one Upstash).
|
|
35
|
+
*/
|
|
36
|
+
BULL_PREFIX: z.string().optional(),
|
|
31
37
|
});
|
|
32
38
|
// Production/development schema with all required vars
|
|
33
39
|
const fullSchema = baseSchema.extend({
|
|
@@ -128,4 +134,4 @@ function validateEnv() {
|
|
|
128
134
|
// Export validated environment variables
|
|
129
135
|
export const env = validateEnv();
|
|
130
136
|
//# sourceMappingURL=env.js.map
|
|
131
|
-
//# debugId=
|
|
137
|
+
//# debugId=8e7c7480-b0bc-5778-9502-7fd6d8f4dae8
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.js","sources":["lib/config/env.ts"],"sourceRoot":"/","sourcesContent":["import { z } from 'zod';\nimport dotenv from 'dotenv';\nimport { resolve } from 'path';\nimport { logger } from '../../utils/logger.js';\nimport { isValidCorsOriginPatternList } from './cors.js';\n\n// Determine which env file to load based on NODE_ENV\nconst nodeEnv = process.env.NODE_ENV || 'development';\nconst envFileMap: Record<string, string> = {\n test: '.env.test',\n development: '.env.development',\n production: '.env.production',\n};\n\n// Load the appropriate env file\nconst envFile = envFileMap[nodeEnv] || '.env';\nconst envPath = resolve(process.cwd(), envFile);\n\n// Load environment variables from the correct file\n// First load .env (base), then override with environment-specific file\ndotenv.config(); // Load .env first (base config)\ndotenv.config({ path: envPath, override: true }); // Override with env-specific\n\nconst isTest = nodeEnv === 'test';\nconst isProduction = nodeEnv === 'production';\n\nconst corsAllowedOriginsSchema = z.string().optional();\nconst corsAllowedOriginPatternsSchema = z.string().optional().refine(\n isValidCorsOriginPatternList,\n { message: 'CORS_ALLOWED_ORIGIN_PATTERNS must contain valid regex patterns' }\n);\n\n// Base schema with required vars for all environments\nconst baseSchema = z.object({\n NODE_ENV: z.enum(['development', 'production', 'test']).default('development'),\n PORT: z.string().transform(Number).default('3001'),\n DATABASE_URL: z.string().url('DATABASE_URL must be a valid URL'),\n});\n\n// Production/development schema with all required vars\nconst fullSchema = baseSchema.extend({\n NEXT_PUBLIC_APP_URL: z.string().url().default('http://localhost:3000'),\n CORS_ALLOWED_ORIGINS: corsAllowedOriginsSchema,\n CORS_ALLOWED_ORIGIN_PATTERNS: corsAllowedOriginPatternsSchema,\n BACKEND_URL: z.string().url().default('http://localhost:3001'),\n SENTRY_DSN: z.string().url().optional(),\n EMAIL_HOST: z.string().min(1, 'EMAIL_HOST is required'),\n EMAIL_PORT: z.string().transform(Number).default('587'),\n EMAIL_USER: z.string().email('EMAIL_USER must be a valid email'),\n EMAIL_PASS: z.string().min(1, 'EMAIL_PASS is required'),\n EMAIL_DRY_RUN: z.string().optional().default('false'),\n GOOGLE_CLOUD_PROJECT_ID: z.string().min(1, 'GOOGLE_CLOUD_PROJECT_ID is required'),\n GOOGLE_CLOUD_CLIENT_EMAIL: z.string().email('GOOGLE_CLOUD_CLIENT_EMAIL must be a valid email'),\n GOOGLE_CLOUD_PRIVATE_KEY: z.string().min(1, 'GOOGLE_CLOUD_PRIVATE_KEY is required'),\n GOOGLE_CLOUD_BUCKET_NAME: z.string().min(1, 'GOOGLE_CLOUD_BUCKET_NAME is required'),\n PUSHER_APP_ID: z.string().min(1, 'PUSHER_APP_ID is required'),\n PUSHER_KEY: z.string().min(1, 'PUSHER_KEY is required'),\n PUSHER_SECRET: z.string().min(1, 'PUSHER_SECRET is required'),\n PUSHER_CLUSTER: z.string().min(1, 'PUSHER_CLUSTER is required'),\n PUSHER_AUTH_COOKIE_NAME: z.string().optional(), // Cookie name for session token (default: 'token')\n REDIS_URL: z.string().url().optional(), // Redis connection URL (e.g. redis://localhost:6379)\n INFERENCE_API_KEY: z.string().optional(),\n INFERENCE_API_BASE_URL: z.string().url().optional(),\n OPENAI_API_KEY: z.string().optional(),\n LOG_MODE: z.enum(['normal', 'verbose', 'quiet']).default('normal'),\n /** Comma/whitespace-separated user UUIDs allowed to call `admin.*` tRPC (required in production). */\n ADMIN_PANEL_USER_IDS: z.string().optional(),\n});\n\n// Test schema - only require what's needed for tests\nconst testSchema = baseSchema.extend({\n NEXT_PUBLIC_APP_URL: z.string().url().optional().default('http://localhost:3000'),\n CORS_ALLOWED_ORIGINS: corsAllowedOriginsSchema,\n CORS_ALLOWED_ORIGIN_PATTERNS: corsAllowedOriginPatternsSchema,\n BACKEND_URL: z.string().url().optional().default('http://localhost:3001'),\n SENTRY_DSN: z.string().url().optional(),\n EMAIL_HOST: z.string().optional().default('smtp.test.com'),\n EMAIL_PORT: z.string().transform(Number).default('587'),\n EMAIL_USER: z.string().email().optional().default('test@test.com'),\n EMAIL_PASS: z.string().optional().default('test'),\n EMAIL_DRY_RUN: z.string().optional().default('false'),\n GOOGLE_CLOUD_PROJECT_ID: z.string().optional().default('test-project'),\n GOOGLE_CLOUD_CLIENT_EMAIL: z.string().email().optional().default('test@test.iam.gserviceaccount.com'),\n GOOGLE_CLOUD_PRIVATE_KEY: z.string().optional().default('test-key'),\n GOOGLE_CLOUD_BUCKET_NAME: z.string().optional().default('test-bucket'),\n PUSHER_APP_ID: z.string().optional().default('test-app-id'),\n PUSHER_KEY: z.string().optional().default('test-key'),\n PUSHER_SECRET: z.string().optional().default('test-secret'),\n PUSHER_CLUSTER: z.string().optional().default('us2'),\n PUSHER_AUTH_COOKIE_NAME: z.string().optional(),\n REDIS_URL: z.string().url().optional(),\n INFERENCE_API_KEY: z.string().optional(),\n OPENAI_API_KEY: z.string().optional(),\n INFERENCE_API_BASE_URL: z.string().url().optional(),\n LOG_MODE: z.enum(['normal', 'verbose', 'quiet']).default('quiet'),\n ADMIN_PANEL_USER_IDS: z.string().optional(),\n});\n\n// Use test schema in test mode, full schema otherwise\nconst envSchema = isTest ? testSchema : fullSchema;\n\n// Validate environment variables\nfunction validateEnv() {\n try {\n const parsed = envSchema.parse(process.env);\n \n // Only exit on validation failure in production\n if (isProduction && !parsed.DATABASE_URL) {\n logger.error('DATABASE_URL is required in production');\n process.exit(1);\n }\n \n return parsed;\n } catch (error) {\n if (error instanceof z.ZodError) {\n const missingVars = error.errors.map(err => ({\n path: err.path.join('.'),\n message: err.message,\n }));\n \n logger.error('Environment variable validation failed', {\n envFile,\n missingVars,\n });\n \n // Only exit in production - in test/dev, log warning but continue\n if (isProduction) {\n logger.error(`Please check your ${envFile} file and ensure all required variables are set.`);\n process.exit(1);\n } else {\n logger.warn('Continuing with defaults - some features may not work correctly', {\n envFile,\n });\n // Return parsed with defaults for non-production\n return envSchema.parse({ ...process.env });\n }\n }\n throw error;\n }\n}\n\n// Export validated environment variables\nexport const env = validateEnv();\n\n// Type-safe environment access\nexport type Env = z.infer<typeof envSchema>;\n"],"names":[],"mappings":"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","debug_id":"ac21f4cb-a073-586b-bd9f-72518bdb04f2"}
|
|
1
|
+
{"version":3,"file":"env.js","sources":["lib/config/env.ts"],"sourceRoot":"/","sourcesContent":["import { z } from 'zod';\nimport dotenv from 'dotenv';\nimport { resolve } from 'path';\nimport { logger } from '../../utils/logger.js';\nimport { isValidCorsOriginPatternList } from './cors.js';\n\n// Determine which env file to load based on NODE_ENV\nconst nodeEnv = process.env.NODE_ENV || 'development';\nconst envFileMap: Record<string, string> = {\n test: '.env.test',\n development: '.env.development',\n production: '.env.production',\n};\n\n// Load the appropriate env file\nconst envFile = envFileMap[nodeEnv] || '.env';\nconst envPath = resolve(process.cwd(), envFile);\n\n// Load environment variables from the correct file\n// First load .env (base), then override with environment-specific file\ndotenv.config(); // Load .env first (base config)\ndotenv.config({ path: envPath, override: true }); // Override with env-specific\n\nconst isTest = nodeEnv === 'test';\nconst isProduction = nodeEnv === 'production';\n\nconst corsAllowedOriginsSchema = z.string().optional();\nconst corsAllowedOriginPatternsSchema = z.string().optional().refine(\n isValidCorsOriginPatternList,\n { message: 'CORS_ALLOWED_ORIGIN_PATTERNS must contain valid regex patterns' }\n);\n\n// Base schema with required vars for all environments\nconst baseSchema = z.object({\n NODE_ENV: z.enum(['development', 'production', 'test']).default('development'),\n PORT: z.string().transform(Number).default('3001'),\n DATABASE_URL: z.string().url('DATABASE_URL must be a valid URL'),\n /**\n * Optional BullMQ key prefix. Defaults to `bull:<NODE_ENV>` (see\n * `getBullPrefix`). Set explicitly to isolate queues when multiple\n * databases share one Redis instance (e.g. several devs on one Upstash).\n */\n BULL_PREFIX: z.string().optional(),\n});\n\n// Production/development schema with all required vars\nconst fullSchema = baseSchema.extend({\n NEXT_PUBLIC_APP_URL: z.string().url().default('http://localhost:3000'),\n CORS_ALLOWED_ORIGINS: corsAllowedOriginsSchema,\n CORS_ALLOWED_ORIGIN_PATTERNS: corsAllowedOriginPatternsSchema,\n BACKEND_URL: z.string().url().default('http://localhost:3001'),\n SENTRY_DSN: z.string().url().optional(),\n EMAIL_HOST: z.string().min(1, 'EMAIL_HOST is required'),\n EMAIL_PORT: z.string().transform(Number).default('587'),\n EMAIL_USER: z.string().email('EMAIL_USER must be a valid email'),\n EMAIL_PASS: z.string().min(1, 'EMAIL_PASS is required'),\n EMAIL_DRY_RUN: z.string().optional().default('false'),\n GOOGLE_CLOUD_PROJECT_ID: z.string().min(1, 'GOOGLE_CLOUD_PROJECT_ID is required'),\n GOOGLE_CLOUD_CLIENT_EMAIL: z.string().email('GOOGLE_CLOUD_CLIENT_EMAIL must be a valid email'),\n GOOGLE_CLOUD_PRIVATE_KEY: z.string().min(1, 'GOOGLE_CLOUD_PRIVATE_KEY is required'),\n GOOGLE_CLOUD_BUCKET_NAME: z.string().min(1, 'GOOGLE_CLOUD_BUCKET_NAME is required'),\n PUSHER_APP_ID: z.string().min(1, 'PUSHER_APP_ID is required'),\n PUSHER_KEY: z.string().min(1, 'PUSHER_KEY is required'),\n PUSHER_SECRET: z.string().min(1, 'PUSHER_SECRET is required'),\n PUSHER_CLUSTER: z.string().min(1, 'PUSHER_CLUSTER is required'),\n PUSHER_AUTH_COOKIE_NAME: z.string().optional(), // Cookie name for session token (default: 'token')\n REDIS_URL: z.string().url().optional(), // Redis connection URL (e.g. redis://localhost:6379)\n INFERENCE_API_KEY: z.string().optional(),\n INFERENCE_API_BASE_URL: z.string().url().optional(),\n OPENAI_API_KEY: z.string().optional(),\n LOG_MODE: z.enum(['normal', 'verbose', 'quiet']).default('normal'),\n /** Comma/whitespace-separated user UUIDs allowed to call `admin.*` tRPC (required in production). */\n ADMIN_PANEL_USER_IDS: z.string().optional(),\n});\n\n// Test schema - only require what's needed for tests\nconst testSchema = baseSchema.extend({\n NEXT_PUBLIC_APP_URL: z.string().url().optional().default('http://localhost:3000'),\n CORS_ALLOWED_ORIGINS: corsAllowedOriginsSchema,\n CORS_ALLOWED_ORIGIN_PATTERNS: corsAllowedOriginPatternsSchema,\n BACKEND_URL: z.string().url().optional().default('http://localhost:3001'),\n SENTRY_DSN: z.string().url().optional(),\n EMAIL_HOST: z.string().optional().default('smtp.test.com'),\n EMAIL_PORT: z.string().transform(Number).default('587'),\n EMAIL_USER: z.string().email().optional().default('test@test.com'),\n EMAIL_PASS: z.string().optional().default('test'),\n EMAIL_DRY_RUN: z.string().optional().default('false'),\n GOOGLE_CLOUD_PROJECT_ID: z.string().optional().default('test-project'),\n GOOGLE_CLOUD_CLIENT_EMAIL: z.string().email().optional().default('test@test.iam.gserviceaccount.com'),\n GOOGLE_CLOUD_PRIVATE_KEY: z.string().optional().default('test-key'),\n GOOGLE_CLOUD_BUCKET_NAME: z.string().optional().default('test-bucket'),\n PUSHER_APP_ID: z.string().optional().default('test-app-id'),\n PUSHER_KEY: z.string().optional().default('test-key'),\n PUSHER_SECRET: z.string().optional().default('test-secret'),\n PUSHER_CLUSTER: z.string().optional().default('us2'),\n PUSHER_AUTH_COOKIE_NAME: z.string().optional(),\n REDIS_URL: z.string().url().optional(),\n INFERENCE_API_KEY: z.string().optional(),\n OPENAI_API_KEY: z.string().optional(),\n INFERENCE_API_BASE_URL: z.string().url().optional(),\n LOG_MODE: z.enum(['normal', 'verbose', 'quiet']).default('quiet'),\n ADMIN_PANEL_USER_IDS: z.string().optional(),\n});\n\n// Use test schema in test mode, full schema otherwise\nconst envSchema = isTest ? testSchema : fullSchema;\n\n// Validate environment variables\nfunction validateEnv() {\n try {\n const parsed = envSchema.parse(process.env);\n \n // Only exit on validation failure in production\n if (isProduction && !parsed.DATABASE_URL) {\n logger.error('DATABASE_URL is required in production');\n process.exit(1);\n }\n \n return parsed;\n } catch (error) {\n if (error instanceof z.ZodError) {\n const missingVars = error.errors.map(err => ({\n path: err.path.join('.'),\n message: err.message,\n }));\n \n logger.error('Environment variable validation failed', {\n envFile,\n missingVars,\n });\n \n // Only exit in production - in test/dev, log warning but continue\n if (isProduction) {\n logger.error(`Please check your ${envFile} file and ensure all required variables are set.`);\n process.exit(1);\n } else {\n logger.warn('Continuing with defaults - some features may not work correctly', {\n envFile,\n });\n // Return parsed with defaults for non-production\n return envSchema.parse({ ...process.env });\n }\n }\n throw error;\n }\n}\n\n// Export validated environment variables\nexport const env = validateEnv();\n\n// Type-safe environment access\nexport type Env = z.infer<typeof envSchema>;\n"],"names":[],"mappings":"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","debug_id":"8e7c7480-b0bc-5778-9502-7fd6d8f4dae8"}
|
|
@@ -23,4 +23,14 @@ export declare function objectExists(bucketName: string, objectPath: string): Pr
|
|
|
23
23
|
* @param destPath The GCS path for the destination
|
|
24
24
|
*/
|
|
25
25
|
export declare function copyFile(sourcePath: string, destPath: string): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Returns the public URL for a GCS object.
|
|
28
|
+
* The object must be publicly readable (via ACL or bucket-level IAM).
|
|
29
|
+
*/
|
|
30
|
+
export declare function getPublicUrl(filePath: string): string;
|
|
31
|
+
/**
|
|
32
|
+
* Best-effort attempt to make a GCS object publicly readable.
|
|
33
|
+
* Silently ignores errors (e.g. uniform bucket-level access enabled).
|
|
34
|
+
*/
|
|
35
|
+
export declare function makeFilePublic(filePath: string): Promise<void>;
|
|
26
36
|
//# sourceMappingURL=googleCloudStorage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"googleCloudStorage.d.ts","sourceRoot":"/","sources":["lib/googleCloudStorage.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,MAAM,wCAAgD,CAAC;AAQpE;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,GAAG,OAAgB,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAsB7H;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUhE;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAW3F;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUlF"}
|
|
1
|
+
{"version":3,"file":"googleCloudStorage.d.ts","sourceRoot":"/","sources":["lib/googleCloudStorage.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,MAAM,wCAAgD,CAAC;AAQpE;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,GAAG,OAAgB,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAsB7H;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUhE;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAW3F;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUlF;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOpE"}
|
|
@@ -1,5 +1,5 @@
|
|
|
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]="5b9f797d-c400-5f88-a430-a238ef4acbac")}catch(e){}}();
|
|
3
3
|
import { Storage } from '@google-cloud/storage';
|
|
4
4
|
import { TRPCError } from '@trpc/server';
|
|
5
5
|
import { env } from './config/env.js';
|
|
@@ -94,5 +94,25 @@ export async function copyFile(sourcePath, destPath) {
|
|
|
94
94
|
});
|
|
95
95
|
}
|
|
96
96
|
}
|
|
97
|
+
/**
|
|
98
|
+
* Returns the public URL for a GCS object.
|
|
99
|
+
* The object must be publicly readable (via ACL or bucket-level IAM).
|
|
100
|
+
*/
|
|
101
|
+
export function getPublicUrl(filePath) {
|
|
102
|
+
return `https://storage.googleapis.com/${env.GOOGLE_CLOUD_BUCKET_NAME}/${filePath}`;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Best-effort attempt to make a GCS object publicly readable.
|
|
106
|
+
* Silently ignores errors (e.g. uniform bucket-level access enabled).
|
|
107
|
+
*/
|
|
108
|
+
export async function makeFilePublic(filePath) {
|
|
109
|
+
try {
|
|
110
|
+
await bucket.file(filePath).makePublic();
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
// Bucket may use uniform access or already have a public IAM policy – either way, the
|
|
114
|
+
// public URL will work if the bucket allows it; nothing to do here.
|
|
115
|
+
}
|
|
116
|
+
}
|
|
97
117
|
//# sourceMappingURL=googleCloudStorage.js.map
|
|
98
|
-
//# debugId=
|
|
118
|
+
//# debugId=5b9f797d-c400-5f88-a430-a238ef4acbac
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"googleCloudStorage.js","sources":["lib/googleCloudStorage.ts"],"sourceRoot":"/","sourcesContent":["\nimport { Storage } from '@google-cloud/storage';\nimport { TRPCError } from '@trpc/server';\nimport { env } from './config/env.js';\n\nconst storage = new Storage({\n projectId: env.GOOGLE_CLOUD_PROJECT_ID,\n credentials: {\n client_email: env.GOOGLE_CLOUD_CLIENT_EMAIL,\n private_key: env.GOOGLE_CLOUD_PRIVATE_KEY?.replace(/\\\\n/g, '\\n'),\n },\n});\n\nexport const bucket = storage.bucket(env.GOOGLE_CLOUD_BUCKET_NAME!);\n\n// Short expiration time for signed URLs (5 minutes)\nconst SIGNED_URL_EXPIRATION = 5 * 60 * 1000;\n\n// DEPRECATED: This function is no longer used - files are uploaded directly to GCS\n// The backend proxy upload endpoint in index.ts handles direct uploads\n\n/**\n * Gets a signed URL for a file\n * @param filePath The path of the file in the bucket\n * @returns The signed URL\n */\nexport async function getSignedUrl(filePath: string, action: 'read' | 'write' = 'read', contentType?: string): Promise<string> {\n try {\n const options: any = {\n version: 'v4',\n action: action,\n expires: Date.now() + SIGNED_URL_EXPIRATION,\n };\n\n // For write operations, add content type if provided\n if (action === 'write' && contentType) {\n options.contentType = contentType;\n }\n\n const [url] = await bucket.file(filePath).getSignedUrl(options);\n return url;\n } catch (error) {\n console.error('Error getting signed URL:', error);\n throw new TRPCError({\n code: 'INTERNAL_SERVER_ERROR',\n message: 'Failed to get signed URL',\n });\n }\n}\n\n/**\n * Deletes a file from Google Cloud Storage\n * @param filePath The path of the file to delete\n */\nexport async function deleteFile(filePath: string): Promise<void> {\n try {\n await bucket.file(filePath).delete();\n } catch (error) {\n console.error('Error deleting file from Google Cloud Storage:', error);\n throw new TRPCError({\n code: 'INTERNAL_SERVER_ERROR',\n message: 'Failed to delete file from storage',\n });\n }\n}\n\n/**\n * Checks if an object exists in Google Cloud Storage\n * @param bucketName The name of the bucket (unused, uses default bucket)\n * @param objectPath The path of the object to check\n * @returns Promise<boolean> True if the object exists, false otherwise\n */\nexport async function objectExists(bucketName: string, objectPath: string): Promise<boolean> {\n try {\n const [exists] = await bucket.file(objectPath).exists();\n return exists;\n } catch (error) {\n console.error('Error checking if object exists in Google Cloud Storage:', error);\n throw new TRPCError({\n code: 'INTERNAL_SERVER_ERROR',\n message: 'Failed to check object existence',\n });\n }\n}\n\n/**\n * Copies a file within the same bucket to a new path\n * @param sourcePath The GCS path of the source file\n * @param destPath The GCS path for the destination\n */\nexport async function copyFile(sourcePath: string, destPath: string): Promise<void> {\n try {\n await bucket.file(sourcePath).copy(destPath);\n } catch (error) {\n console.error('Error copying file in Google Cloud Storage:', error);\n throw new TRPCError({\n code: 'INTERNAL_SERVER_ERROR',\n message: 'Failed to copy file in storage',\n });\n }\n} "],"names":[],"mappings":"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","debug_id":"
|
|
1
|
+
{"version":3,"file":"googleCloudStorage.js","sources":["lib/googleCloudStorage.ts"],"sourceRoot":"/","sourcesContent":["\nimport { Storage } from '@google-cloud/storage';\nimport { TRPCError } from '@trpc/server';\nimport { env } from './config/env.js';\n\nconst storage = new Storage({\n projectId: env.GOOGLE_CLOUD_PROJECT_ID,\n credentials: {\n client_email: env.GOOGLE_CLOUD_CLIENT_EMAIL,\n private_key: env.GOOGLE_CLOUD_PRIVATE_KEY?.replace(/\\\\n/g, '\\n'),\n },\n});\n\nexport const bucket = storage.bucket(env.GOOGLE_CLOUD_BUCKET_NAME!);\n\n// Short expiration time for signed URLs (5 minutes)\nconst SIGNED_URL_EXPIRATION = 5 * 60 * 1000;\n\n// DEPRECATED: This function is no longer used - files are uploaded directly to GCS\n// The backend proxy upload endpoint in index.ts handles direct uploads\n\n/**\n * Gets a signed URL for a file\n * @param filePath The path of the file in the bucket\n * @returns The signed URL\n */\nexport async function getSignedUrl(filePath: string, action: 'read' | 'write' = 'read', contentType?: string): Promise<string> {\n try {\n const options: any = {\n version: 'v4',\n action: action,\n expires: Date.now() + SIGNED_URL_EXPIRATION,\n };\n\n // For write operations, add content type if provided\n if (action === 'write' && contentType) {\n options.contentType = contentType;\n }\n\n const [url] = await bucket.file(filePath).getSignedUrl(options);\n return url;\n } catch (error) {\n console.error('Error getting signed URL:', error);\n throw new TRPCError({\n code: 'INTERNAL_SERVER_ERROR',\n message: 'Failed to get signed URL',\n });\n }\n}\n\n/**\n * Deletes a file from Google Cloud Storage\n * @param filePath The path of the file to delete\n */\nexport async function deleteFile(filePath: string): Promise<void> {\n try {\n await bucket.file(filePath).delete();\n } catch (error) {\n console.error('Error deleting file from Google Cloud Storage:', error);\n throw new TRPCError({\n code: 'INTERNAL_SERVER_ERROR',\n message: 'Failed to delete file from storage',\n });\n }\n}\n\n/**\n * Checks if an object exists in Google Cloud Storage\n * @param bucketName The name of the bucket (unused, uses default bucket)\n * @param objectPath The path of the object to check\n * @returns Promise<boolean> True if the object exists, false otherwise\n */\nexport async function objectExists(bucketName: string, objectPath: string): Promise<boolean> {\n try {\n const [exists] = await bucket.file(objectPath).exists();\n return exists;\n } catch (error) {\n console.error('Error checking if object exists in Google Cloud Storage:', error);\n throw new TRPCError({\n code: 'INTERNAL_SERVER_ERROR',\n message: 'Failed to check object existence',\n });\n }\n}\n\n/**\n * Copies a file within the same bucket to a new path\n * @param sourcePath The GCS path of the source file\n * @param destPath The GCS path for the destination\n */\nexport async function copyFile(sourcePath: string, destPath: string): Promise<void> {\n try {\n await bucket.file(sourcePath).copy(destPath);\n } catch (error) {\n console.error('Error copying file in Google Cloud Storage:', error);\n throw new TRPCError({\n code: 'INTERNAL_SERVER_ERROR',\n message: 'Failed to copy file in storage',\n });\n }\n}\n\n/**\n * Returns the public URL for a GCS object.\n * The object must be publicly readable (via ACL or bucket-level IAM).\n */\nexport function getPublicUrl(filePath: string): string {\n return `https://storage.googleapis.com/${env.GOOGLE_CLOUD_BUCKET_NAME}/${filePath}`;\n}\n\n/**\n * Best-effort attempt to make a GCS object publicly readable.\n * Silently ignores errors (e.g. uniform bucket-level access enabled).\n */\nexport async function makeFilePublic(filePath: string): Promise<void> {\n try {\n await bucket.file(filePath).makePublic();\n } catch {\n // Bucket may use uniform access or already have a public IAM policy – either way, the\n // public URL will work if the bucket allows it; nothing to do here.\n }\n} "],"names":[],"mappings":"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","debug_id":"5b9f797d-c400-5f88-a430-a238ef4acbac"}
|
package/dist/lib/prisma.d.ts
CHANGED
|
@@ -1,20 +1,119 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
declare const prismaClientSingleton: () => import("@prisma/client/runtime/library.js").DynamicClientExtensionThis<import(".prisma/client").Prisma.TypeMap<import("@prisma/client/runtime/library.js").InternalArgs & {
|
|
2
|
+
result: {
|
|
3
|
+
userProfile: {
|
|
4
|
+
profilePicture: () => {
|
|
5
|
+
needs: {
|
|
6
|
+
profilePicture: true;
|
|
7
|
+
};
|
|
8
|
+
compute(profile: {
|
|
9
|
+
profilePicture: string | null;
|
|
10
|
+
}): string | null;
|
|
11
|
+
};
|
|
12
|
+
profilePictureThumbnail: () => {
|
|
13
|
+
needs: {
|
|
14
|
+
profilePictureThumbnail: true;
|
|
15
|
+
};
|
|
16
|
+
compute(profile: {
|
|
17
|
+
profilePictureThumbnail: string | null;
|
|
18
|
+
}): string | null;
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
model: {};
|
|
23
|
+
query: {};
|
|
24
|
+
client: {};
|
|
25
|
+
}, {}>, import(".prisma/client").Prisma.TypeMapCb<{
|
|
3
26
|
datasources: {
|
|
4
27
|
db: {
|
|
5
28
|
url: string;
|
|
6
29
|
};
|
|
7
30
|
};
|
|
8
|
-
}
|
|
31
|
+
}>, {
|
|
32
|
+
result: {
|
|
33
|
+
userProfile: {
|
|
34
|
+
profilePicture: () => {
|
|
35
|
+
needs: {
|
|
36
|
+
profilePicture: true;
|
|
37
|
+
};
|
|
38
|
+
compute(profile: {
|
|
39
|
+
profilePicture: string | null;
|
|
40
|
+
}): string | null;
|
|
41
|
+
};
|
|
42
|
+
profilePictureThumbnail: () => {
|
|
43
|
+
needs: {
|
|
44
|
+
profilePictureThumbnail: true;
|
|
45
|
+
};
|
|
46
|
+
compute(profile: {
|
|
47
|
+
profilePictureThumbnail: string | null;
|
|
48
|
+
}): string | null;
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
model: {};
|
|
53
|
+
query: {};
|
|
54
|
+
client: {};
|
|
55
|
+
}>;
|
|
9
56
|
declare global {
|
|
10
57
|
var prisma: undefined | ReturnType<typeof prismaClientSingleton>;
|
|
11
58
|
}
|
|
12
|
-
export declare const prisma:
|
|
59
|
+
export declare const prisma: import("@prisma/client/runtime/library.js").DynamicClientExtensionThis<import(".prisma/client").Prisma.TypeMap<import("@prisma/client/runtime/library.js").InternalArgs & {
|
|
60
|
+
result: {
|
|
61
|
+
userProfile: {
|
|
62
|
+
profilePicture: () => {
|
|
63
|
+
needs: {
|
|
64
|
+
profilePicture: true;
|
|
65
|
+
};
|
|
66
|
+
compute(profile: {
|
|
67
|
+
profilePicture: string | null;
|
|
68
|
+
}): string | null;
|
|
69
|
+
};
|
|
70
|
+
profilePictureThumbnail: () => {
|
|
71
|
+
needs: {
|
|
72
|
+
profilePictureThumbnail: true;
|
|
73
|
+
};
|
|
74
|
+
compute(profile: {
|
|
75
|
+
profilePictureThumbnail: string | null;
|
|
76
|
+
}): string | null;
|
|
77
|
+
};
|
|
78
|
+
};
|
|
79
|
+
};
|
|
80
|
+
model: {};
|
|
81
|
+
query: {};
|
|
82
|
+
client: {};
|
|
83
|
+
}, {}>, import(".prisma/client").Prisma.TypeMapCb<{
|
|
13
84
|
datasources: {
|
|
14
85
|
db: {
|
|
15
86
|
url: string;
|
|
16
87
|
};
|
|
17
88
|
};
|
|
18
|
-
}
|
|
89
|
+
}>, {
|
|
90
|
+
result: {
|
|
91
|
+
userProfile: {
|
|
92
|
+
profilePicture: () => {
|
|
93
|
+
needs: {
|
|
94
|
+
profilePicture: true;
|
|
95
|
+
};
|
|
96
|
+
compute(profile: {
|
|
97
|
+
profilePicture: string | null;
|
|
98
|
+
}): string | null;
|
|
99
|
+
};
|
|
100
|
+
profilePictureThumbnail: () => {
|
|
101
|
+
needs: {
|
|
102
|
+
profilePictureThumbnail: true;
|
|
103
|
+
};
|
|
104
|
+
compute(profile: {
|
|
105
|
+
profilePictureThumbnail: string | null;
|
|
106
|
+
}): string | null;
|
|
107
|
+
};
|
|
108
|
+
};
|
|
109
|
+
};
|
|
110
|
+
model: {};
|
|
111
|
+
query: {};
|
|
112
|
+
client: {};
|
|
113
|
+
}>;
|
|
114
|
+
/** The concrete (extended) Prisma client type used throughout the app. */
|
|
115
|
+
export type AppPrismaClient = typeof prisma;
|
|
116
|
+
/** Transaction client type compatible with the extended Prisma client. */
|
|
117
|
+
export type AppTransactionClient = Omit<AppPrismaClient, '$connect' | '$disconnect' | '$on' | '$transaction' | '$use' | '$extends'>;
|
|
19
118
|
export {};
|
|
20
119
|
//# sourceMappingURL=prisma.d.ts.map
|
package/dist/lib/prisma.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prisma.d.ts","sourceRoot":"/","sources":["lib/prisma.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"prisma.d.ts","sourceRoot":"/","sources":["lib/prisma.ts"],"names":[],"mappings":"AA6CA,QAAA,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyB1B,CAAC;AAGF,OAAO,CAAC,MAAM,CAAC;IACb,IAAI,MAAM,EAAE,SAAS,GAAG,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC;CAClE;AAED,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAA+C,CAAC;AAUnE,0EAA0E;AAC1E,MAAM,MAAM,eAAe,GAAG,OAAO,MAAM,CAAC;AAE5C,0EAA0E;AAC1E,MAAM,MAAM,oBAAoB,GAAG,IAAI,CACrC,eAAe,EACf,UAAU,GAAG,aAAa,GAAG,KAAK,GAAG,cAAc,GAAG,MAAM,GAAG,UAAU,CAC1E,CAAC"}
|
package/dist/lib/prisma.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
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]="e971bd6c-3e2e-527d-a123-23cd55dc5e79")}catch(e){}}();
|
|
3
3
|
import { PrismaClient } from '@prisma/client';
|
|
4
4
|
import { env } from './config/env.js';
|
|
5
5
|
const getLogLevel = () => {
|
|
@@ -30,6 +30,20 @@ const getDatabaseUrl = () => {
|
|
|
30
30
|
return env.DATABASE_URL;
|
|
31
31
|
}
|
|
32
32
|
};
|
|
33
|
+
/**
|
|
34
|
+
* Resolve a profile-picture value stored in the DB to a browser-loadable URL.
|
|
35
|
+
* - `null` / empty → `null`
|
|
36
|
+
* - already an HTTP URL (e.g. dicebear) → returned as-is
|
|
37
|
+
* - raw GCS object path → converted to a public GCS URL
|
|
38
|
+
*/
|
|
39
|
+
function resolveProfilePictureUrl(raw) {
|
|
40
|
+
if (!raw)
|
|
41
|
+
return null;
|
|
42
|
+
if (raw.startsWith('http'))
|
|
43
|
+
return raw;
|
|
44
|
+
const bucket = env.GOOGLE_CLOUD_BUCKET_NAME;
|
|
45
|
+
return `https://storage.googleapis.com/${bucket}/${raw}`;
|
|
46
|
+
}
|
|
33
47
|
const prismaClientSingleton = () => {
|
|
34
48
|
return new PrismaClient({
|
|
35
49
|
datasources: {
|
|
@@ -37,6 +51,23 @@ const prismaClientSingleton = () => {
|
|
|
37
51
|
url: getDatabaseUrl(),
|
|
38
52
|
},
|
|
39
53
|
},
|
|
54
|
+
}).$extends({
|
|
55
|
+
result: {
|
|
56
|
+
userProfile: {
|
|
57
|
+
profilePicture: {
|
|
58
|
+
needs: { profilePicture: true },
|
|
59
|
+
compute(profile) {
|
|
60
|
+
return resolveProfilePictureUrl(profile.profilePicture);
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
profilePictureThumbnail: {
|
|
64
|
+
needs: { profilePictureThumbnail: true },
|
|
65
|
+
compute(profile) {
|
|
66
|
+
return resolveProfilePictureUrl(profile.profilePictureThumbnail);
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
},
|
|
40
71
|
});
|
|
41
72
|
};
|
|
42
73
|
export const prisma = globalThis.prisma ?? prismaClientSingleton();
|
|
@@ -47,4 +78,4 @@ process.on('beforeExit', async () => {
|
|
|
47
78
|
await prisma.$disconnect();
|
|
48
79
|
});
|
|
49
80
|
//# sourceMappingURL=prisma.js.map
|
|
50
|
-
//# debugId=
|
|
81
|
+
//# debugId=e971bd6c-3e2e-527d-a123-23cd55dc5e79
|
package/dist/lib/prisma.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prisma.js","sources":["lib/prisma.ts"],"sourceRoot":"/","sourcesContent":["import { PrismaClient } from '@prisma/client';\nimport { env } from './config/env.js';\n\nconst getLogLevel = () => {\n switch (env.NODE_ENV) {\n case 'development':\n return ['query', 'error', 'warn'];\n case 'production':\n return ['error'];\n default:\n return ['error'];\n }\n}\n\nconst getDatabaseUrl = () => {\n try {\n const url = new URL(env.DATABASE_URL);\n // Reduce per-instance DB pressure in hosted/serverless environments.\n if (env.NODE_ENV === 'production') {\n if (!url.searchParams.has('connection_limit')) {\n url.searchParams.set('connection_limit', '1');\n }\n if (!url.searchParams.has('pool_timeout')) {\n url.searchParams.set('pool_timeout', '20');\n }\n }\n return url.toString();\n } catch {\n return env.DATABASE_URL;\n }\n};\n\nconst prismaClientSingleton = () => {\n return new PrismaClient({\n datasources: {\n db: {\n url: getDatabaseUrl(),\n },\n },\n });\n};\n\n// Prevent multiple instances of Prisma Client in development\ndeclare global {\n var prisma: undefined | ReturnType<typeof prismaClientSingleton>;\n}\n\nexport const prisma = globalThis.prisma ?? prismaClientSingleton();\n\nif (env.NODE_ENV !== 'production') {\n globalThis.prisma = prisma;\n}\n\nprocess.on('beforeExit', async () => {\n await prisma.$disconnect();\n})
|
|
1
|
+
{"version":3,"file":"prisma.js","sources":["lib/prisma.ts"],"sourceRoot":"/","sourcesContent":["import { PrismaClient } from '@prisma/client';\nimport { env } from './config/env.js';\n\nconst getLogLevel = () => {\n switch (env.NODE_ENV) {\n case 'development':\n return ['query', 'error', 'warn'];\n case 'production':\n return ['error'];\n default:\n return ['error'];\n }\n}\n\nconst getDatabaseUrl = () => {\n try {\n const url = new URL(env.DATABASE_URL);\n // Reduce per-instance DB pressure in hosted/serverless environments.\n if (env.NODE_ENV === 'production') {\n if (!url.searchParams.has('connection_limit')) {\n url.searchParams.set('connection_limit', '1');\n }\n if (!url.searchParams.has('pool_timeout')) {\n url.searchParams.set('pool_timeout', '20');\n }\n }\n return url.toString();\n } catch {\n return env.DATABASE_URL;\n }\n};\n\n/**\n * Resolve a profile-picture value stored in the DB to a browser-loadable URL.\n * - `null` / empty → `null`\n * - already an HTTP URL (e.g. dicebear) → returned as-is\n * - raw GCS object path → converted to a public GCS URL\n */\nfunction resolveProfilePictureUrl(raw: string | null): string | null {\n if (!raw) return null;\n if (raw.startsWith('http')) return raw;\n const bucket = env.GOOGLE_CLOUD_BUCKET_NAME;\n return `https://storage.googleapis.com/${bucket}/${raw}`;\n}\n\nconst prismaClientSingleton = () => {\n return new PrismaClient({\n datasources: {\n db: {\n url: getDatabaseUrl(),\n },\n },\n }).$extends({\n result: {\n userProfile: {\n profilePicture: {\n needs: { profilePicture: true },\n compute(profile) {\n return resolveProfilePictureUrl(profile.profilePicture);\n },\n },\n profilePictureThumbnail: {\n needs: { profilePictureThumbnail: true },\n compute(profile) {\n return resolveProfilePictureUrl(profile.profilePictureThumbnail);\n },\n },\n },\n },\n });\n};\n\n// Prevent multiple instances of Prisma Client in development\ndeclare global {\n var prisma: undefined | ReturnType<typeof prismaClientSingleton>;\n}\n\nexport const prisma = globalThis.prisma ?? prismaClientSingleton();\n\nif (env.NODE_ENV !== 'production') {\n globalThis.prisma = prisma;\n}\n\nprocess.on('beforeExit', async () => {\n await prisma.$disconnect();\n});\n\n/** The concrete (extended) Prisma client type used throughout the app. */\nexport type AppPrismaClient = typeof prisma;\n\n/** Transaction client type compatible with the extended Prisma client. */\nexport type AppTransactionClient = Omit<\n AppPrismaClient,\n '$connect' | '$disconnect' | '$on' | '$transaction' | '$use' | '$extends'\n>;"],"names":[],"mappings":";;AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAEtC,MAAM,WAAW,GAAG,GAAG,EAAE;IACvB,QAAQ,GAAG,CAAC,QAAQ,EAAE,CAAC;QACrB,KAAK,aAAa;YAChB,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACpC,KAAK,YAAY;YACf,OAAO,CAAC,OAAO,CAAC,CAAC;QACnB;YACE,OAAO,CAAC,OAAO,CAAC,CAAC;IACrB,CAAC;AACH,CAAC,CAAA;AAED,MAAM,cAAc,GAAG,GAAG,EAAE;IAC1B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACtC,qEAAqE;QACrE,IAAI,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;YAClC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBAC9C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;YAChD,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;gBAC1C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC,YAAY,CAAC;IAC1B,CAAC;AACH,CAAC,CAAC;AAEF;;;;;GAKG;AACH,SAAS,wBAAwB,CAAC,GAAkB;IAClD,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,GAAG,CAAC;IACvC,MAAM,MAAM,GAAG,GAAG,CAAC,wBAAwB,CAAC;IAC5C,OAAO,kCAAkC,MAAM,IAAI,GAAG,EAAE,CAAC;AAC3D,CAAC;AAED,MAAM,qBAAqB,GAAG,GAAG,EAAE;IACjC,OAAO,IAAI,YAAY,CAAC;QACtB,WAAW,EAAE;YACX,EAAE,EAAE;gBACF,GAAG,EAAE,cAAc,EAAE;aACtB;SACF;KACF,CAAC,CAAC,QAAQ,CAAC;QACV,MAAM,EAAE;YACN,WAAW,EAAE;gBACX,cAAc,EAAE;oBACd,KAAK,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE;oBAC/B,OAAO,CAAC,OAAO;wBACb,OAAO,wBAAwB,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;oBAC1D,CAAC;iBACF;gBACD,uBAAuB,EAAE;oBACvB,KAAK,EAAE,EAAE,uBAAuB,EAAE,IAAI,EAAE;oBACxC,OAAO,CAAC,OAAO;wBACb,OAAO,wBAAwB,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;oBACnE,CAAC;iBACF;aACF;SACF;KACF,CAAC,CAAC;AACL,CAAC,CAAC;AAOF,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,IAAI,qBAAqB,EAAE,CAAC;AAEnE,IAAI,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;IAClC,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC;AAC7B,CAAC;AAED,OAAO,CAAC,EAAE,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE;IAClC,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;AAC7B,CAAC,CAAC,CAAC","debug_id":"e971bd6c-3e2e-527d-a123-23cd55dc5e79"}
|
package/dist/models/agenda.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/** @returns Personal events (no class) for user in date range. */
|
|
2
|
-
export declare function findPersonalEvents(userId: string, rangeStart: Date, rangeEnd: Date): import("
|
|
2
|
+
export declare function findPersonalEvents(userId: string, rangeStart: Date, rangeEnd: Date): import("@prisma/client/runtime/library.js").PrismaPromise<({
|
|
3
3
|
class: {
|
|
4
|
-
|
|
4
|
+
section: string;
|
|
5
5
|
id: string;
|
|
6
|
+
name: string;
|
|
6
7
|
schoolId: string | null;
|
|
7
|
-
subject: string;
|
|
8
8
|
color: string | null;
|
|
9
|
-
|
|
9
|
+
subject: string;
|
|
10
10
|
syllabus: string | null;
|
|
11
11
|
departmentId: string | null;
|
|
12
12
|
discussionsEnabled: boolean;
|
|
@@ -18,10 +18,12 @@ export declare function findPersonalEvents(userId: string, rangeStart: Date, ran
|
|
|
18
18
|
id: string;
|
|
19
19
|
createdAt: Date | null;
|
|
20
20
|
classId: string;
|
|
21
|
-
modifiedAt: Date | null;
|
|
22
21
|
title: string;
|
|
23
|
-
instructions: string;
|
|
24
22
|
dueDate: Date;
|
|
23
|
+
maxGrade: number | null;
|
|
24
|
+
eventId: string | null;
|
|
25
|
+
instructions: string;
|
|
26
|
+
modifiedAt: Date | null;
|
|
25
27
|
teacherId: string;
|
|
26
28
|
acceptFiles: boolean;
|
|
27
29
|
acceptExtendedResponse: boolean;
|
|
@@ -30,35 +32,33 @@ export declare function findPersonalEvents(userId: string, rangeStart: Date, ran
|
|
|
30
32
|
aiPolicyLevel: number;
|
|
31
33
|
sectionId: string | null;
|
|
32
34
|
graded: boolean;
|
|
33
|
-
maxGrade: number | null;
|
|
34
35
|
weight: number;
|
|
35
36
|
inProgress: boolean;
|
|
36
37
|
template: boolean;
|
|
37
|
-
eventId: string | null;
|
|
38
38
|
markSchemeId: string | null;
|
|
39
39
|
order: number | null;
|
|
40
40
|
gradingBoundaryId: string | null;
|
|
41
41
|
}[];
|
|
42
42
|
} & {
|
|
43
|
-
name: string | null;
|
|
44
43
|
id: string;
|
|
45
44
|
userId: string | null;
|
|
45
|
+
location: string | null;
|
|
46
|
+
name: string | null;
|
|
46
47
|
color: string | null;
|
|
47
48
|
classId: string | null;
|
|
48
49
|
startTime: Date;
|
|
49
50
|
endTime: Date;
|
|
50
|
-
location: string | null;
|
|
51
51
|
remarks: string | null;
|
|
52
52
|
})[]>;
|
|
53
53
|
/** @returns Class events for user's classes in date range. */
|
|
54
|
-
export declare function findClassEvents(userId: string, rangeStart: Date, rangeEnd: Date): import("
|
|
54
|
+
export declare function findClassEvents(userId: string, rangeStart: Date, rangeEnd: Date): import("@prisma/client/runtime/library.js").PrismaPromise<({
|
|
55
55
|
class: {
|
|
56
|
-
|
|
56
|
+
section: string;
|
|
57
57
|
id: string;
|
|
58
|
+
name: string;
|
|
58
59
|
schoolId: string | null;
|
|
59
|
-
subject: string;
|
|
60
60
|
color: string | null;
|
|
61
|
-
|
|
61
|
+
subject: string;
|
|
62
62
|
syllabus: string | null;
|
|
63
63
|
departmentId: string | null;
|
|
64
64
|
discussionsEnabled: boolean;
|
|
@@ -70,10 +70,12 @@ export declare function findClassEvents(userId: string, rangeStart: Date, rangeE
|
|
|
70
70
|
id: string;
|
|
71
71
|
createdAt: Date | null;
|
|
72
72
|
classId: string;
|
|
73
|
-
modifiedAt: Date | null;
|
|
74
73
|
title: string;
|
|
75
|
-
instructions: string;
|
|
76
74
|
dueDate: Date;
|
|
75
|
+
maxGrade: number | null;
|
|
76
|
+
eventId: string | null;
|
|
77
|
+
instructions: string;
|
|
78
|
+
modifiedAt: Date | null;
|
|
77
79
|
teacherId: string;
|
|
78
80
|
acceptFiles: boolean;
|
|
79
81
|
acceptExtendedResponse: boolean;
|
|
@@ -82,24 +84,22 @@ export declare function findClassEvents(userId: string, rangeStart: Date, rangeE
|
|
|
82
84
|
aiPolicyLevel: number;
|
|
83
85
|
sectionId: string | null;
|
|
84
86
|
graded: boolean;
|
|
85
|
-
maxGrade: number | null;
|
|
86
87
|
weight: number;
|
|
87
88
|
inProgress: boolean;
|
|
88
89
|
template: boolean;
|
|
89
|
-
eventId: string | null;
|
|
90
90
|
markSchemeId: string | null;
|
|
91
91
|
order: number | null;
|
|
92
92
|
gradingBoundaryId: string | null;
|
|
93
93
|
}[];
|
|
94
94
|
} & {
|
|
95
|
-
name: string | null;
|
|
96
95
|
id: string;
|
|
97
96
|
userId: string | null;
|
|
97
|
+
location: string | null;
|
|
98
|
+
name: string | null;
|
|
98
99
|
color: string | null;
|
|
99
100
|
classId: string | null;
|
|
100
101
|
startTime: Date;
|
|
101
102
|
endTime: Date;
|
|
102
|
-
location: string | null;
|
|
103
103
|
remarks: string | null;
|
|
104
104
|
})[]>;
|
|
105
105
|
//# sourceMappingURL=agenda.d.ts.map
|