@studious-lms/server 1.4.9 → 1.5.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/dist/lib/config/cors.d.ts.map +1 -1
- package/dist/lib/config/cors.js +2 -4
- package/dist/lib/config/cors.js.map +1 -1
- package/dist/lib/fileUpload.d.ts.map +1 -1
- package/dist/lib/fileUpload.js +4 -5
- package/dist/lib/fileUpload.js.map +1 -1
- package/dist/models/auth.d.ts +1 -0
- package/dist/models/auth.d.ts.map +1 -1
- package/dist/models/auth.js +3 -2
- package/dist/models/auth.js.map +1 -1
- package/dist/models/comment.d.ts +0 -5
- package/dist/models/comment.d.ts.map +1 -1
- package/dist/models/conversation.d.ts +2 -1
- package/dist/models/conversation.d.ts.map +1 -1
- package/dist/models/labChat.d.ts +2 -1
- package/dist/models/labChat.d.ts.map +1 -1
- package/dist/models/message.d.ts +6 -3
- package/dist/models/message.d.ts.map +1 -1
- package/dist/models/school.d.ts +0 -22
- package/dist/models/school.d.ts.map +1 -1
- package/dist/models/school.js +2 -14
- package/dist/models/school.js.map +1 -1
- package/dist/models/worksheet.d.ts +76 -19
- package/dist/models/worksheet.d.ts.map +1 -1
- package/dist/models/worksheet.js +2 -2
- package/dist/models/worksheet.js.map +1 -1
- package/dist/pipelines/aiLabChat.js +6 -6
- package/dist/pipelines/aiLabChat.js.map +1 -1
- package/dist/pipelines/gradeWorksheet.d.ts +5 -3
- package/dist/pipelines/gradeWorksheet.d.ts.map +1 -1
- package/dist/pipelines/gradeWorksheet.js +60 -24
- package/dist/pipelines/gradeWorksheet.js.map +1 -1
- package/dist/pipelines/pdfToWorksheet.d.ts +3 -0
- package/dist/pipelines/pdfToWorksheet.d.ts.map +1 -1
- package/dist/pipelines/pdfToWorksheet.js +65 -24
- package/dist/pipelines/pdfToWorksheet.js.map +1 -1
- package/dist/routers/_app.d.ts +92 -48
- package/dist/routers/_app.d.ts.map +1 -1
- package/dist/routers/announcement.d.ts +0 -4
- package/dist/routers/announcement.d.ts.map +1 -1
- package/dist/routers/assignment.d.ts +0 -8
- package/dist/routers/assignment.d.ts.map +1 -1
- package/dist/routers/auth.d.ts +1 -0
- package/dist/routers/auth.d.ts.map +1 -1
- package/dist/routers/comment.d.ts +0 -3
- package/dist/routers/comment.d.ts.map +1 -1
- package/dist/routers/conversation.d.ts +2 -1
- package/dist/routers/conversation.d.ts.map +1 -1
- package/dist/routers/labChat.d.ts +2 -1
- package/dist/routers/labChat.d.ts.map +1 -1
- package/dist/routers/school.d.ts +6 -0
- package/dist/routers/school.d.ts.map +1 -1
- package/dist/routers/school.js +7 -2
- package/dist/routers/school.js.map +1 -1
- package/dist/routers/worksheet.d.ts +35 -7
- package/dist/routers/worksheet.d.ts.map +1 -1
- package/dist/services/auth.d.ts +1 -0
- package/dist/services/auth.d.ts.map +1 -1
- package/dist/services/comment.d.ts +0 -3
- package/dist/services/comment.d.ts.map +1 -1
- package/dist/services/conversation.d.ts +2 -1
- package/dist/services/conversation.d.ts.map +1 -1
- package/dist/services/labChat.d.ts +2 -1
- package/dist/services/labChat.d.ts.map +1 -1
- package/dist/services/labChat.js +6 -6
- package/dist/services/labChat.js.map +1 -1
- package/dist/services/message.d.ts.map +1 -1
- package/dist/services/message.js +14 -2
- package/dist/services/message.js.map +1 -1
- package/dist/services/school.d.ts +6 -0
- package/dist/services/school.d.ts.map +1 -1
- package/dist/services/school.js +71 -6
- package/dist/services/school.js.map +1 -1
- package/dist/services/worksheet.d.ts +35 -7
- package/dist/services/worksheet.d.ts.map +1 -1
- package/dist/services/worksheet.js +17 -19
- package/dist/services/worksheet.js.map +1 -1
- package/dist/utils/generateUsername.d.ts +8 -0
- package/dist/utils/generateUsername.d.ts.map +1 -0
- package/dist/utils/generateUsername.js +103 -0
- package/dist/utils/generateUsername.js.map +1 -0
- package/dist/workers/connection.d.ts +3 -0
- package/dist/workers/connection.d.ts.map +1 -0
- package/dist/workers/connection.js +33 -0
- package/dist/workers/connection.js.map +1 -0
- package/dist/workers/index.d.ts +10 -0
- package/dist/workers/index.d.ts.map +1 -0
- package/dist/workers/index.js +53 -0
- package/dist/workers/index.js.map +1 -0
- package/dist/workers/processors/pdfToWorksheet.d.ts +9 -0
- package/dist/workers/processors/pdfToWorksheet.d.ts.map +1 -0
- package/dist/workers/processors/pdfToWorksheet.js +100 -0
- package/dist/workers/processors/pdfToWorksheet.js.map +1 -0
- package/dist/workers/queues.d.ts +69 -0
- package/dist/workers/queues.d.ts.map +1 -0
- package/dist/workers/queues.js +119 -0
- package/dist/workers/queues.js.map +1 -0
- package/package.json +4 -1
- package/prisma/migrations/20260506162500_consolidate_run_job_and_unify_job_status/migration.sql +166 -0
- package/prisma/schema.prisma +465 -387
- package/src/lib/config/cors.ts +0 -2
- package/src/lib/fileUpload.ts +2 -4
- package/src/models/auth.ts +1 -0
- package/src/models/school.ts +0 -14
- package/src/models/worksheet.ts +2 -2
- package/src/pipelines/aiLabChat.ts +4 -4
- package/src/pipelines/gradeWorksheet.ts +63 -25
- package/src/pipelines/pdfToWorksheet.ts +68 -22
- package/src/routers/school.ts +5 -0
- package/src/services/labChat.ts +4 -4
- package/src/services/message.ts +13 -0
- package/src/services/school.ts +89 -6
- package/src/services/worksheet.ts +16 -18
- package/src/utils/generateUsername.ts +108 -0
- package/src/workers/connection.ts +37 -0
- package/src/workers/index.ts +61 -0
- package/src/workers/processors/pdfToWorksheet.ts +119 -0
- package/src/workers/queues.ts +159 -0
- package/tests/{globalSetup.ts → integration/globalSetup.ts} +4 -4
- package/tests/{helpers.ts → integration/helpers.ts} +2 -2
- package/tests/{pipelines → integration/pipelines}/pdfToWorksheet.test.ts +55 -43
- package/tests/{routers → integration/routers}/attendance.test.ts +1 -1
- package/tests/{routers → integration/routers}/auth.test.ts +3 -3
- package/tests/{routers → integration/routers}/class.test.ts +3 -17
- package/tests/{routers → integration/routers}/conversation.test.ts +1 -1
- package/tests/{routers → integration/routers}/event.test.ts +1 -1
- package/tests/{routers → integration/routers}/message.test.ts +1 -1
- package/tests/{routers → integration/routers}/newtonChat.test.ts +1 -1
- package/tests/{routers → integration/routers}/studentProgress.test.ts +1 -1
- package/tests/{user.test.ts → integration/routers/user.test.ts} +2 -2
- package/tests/integration/routers/worksheet.test.ts +448 -0
- package/tests/{setup.ts → integration/setup.ts} +4 -4
- package/tests/{lib → unit/lib}/cors.test.ts +1 -1
- package/tests/{middleware → unit/middleware}/security.test.ts +1 -1
- package/tests/{pipelines → unit/pipelines}/aiLabChat.test.ts +1 -1
- package/tests/{lib → unit/pipelines}/aiLabChatContract.test.ts +1 -1
- package/tests/{utils/aiLabChatPrompt.test.ts → unit/pipelines/labChatPrompt.test.ts} +2 -2
- package/tests/{utils → unit/services}/studentProgress.test.ts +5 -5
- package/tests/{utils → unit/utils}/aiUser.test.ts +1 -1
- package/tests/{utils → unit/utils}/generateInviteCode.test.ts +1 -1
- package/tests/{utils → unit/utils}/inference.test.ts +6 -6
- package/tests/{utils → unit/utils}/logger.test.ts +1 -1
- package/tests/{utils → unit/utils}/prismaErrorHandler.test.ts +1 -1
- package/tests/{utils → unit/utils}/prismaWrapper.test.ts +1 -1
- package/vitest.config.ts +11 -3
- package/vitest.unit.config.ts +10 -10
- package/tests/routers/worksheet.test.ts +0 -194
- package/tests/startup.test.ts +0 -5
- package/tests/worksheet.test.ts +0 -181
- /package/tests/{routers → integration/routers}/agenda.test.ts +0 -0
- /package/tests/{routers → integration/routers}/announcement.test.ts +0 -0
- /package/tests/{routers → integration/routers}/assignment.test.ts +0 -0
- /package/tests/{routers → integration/routers}/comment.test.ts +0 -0
- /package/tests/{routers → integration/routers}/folder.test.ts +0 -0
- /package/tests/{routers → integration/routers}/labChat.test.ts +0 -0
- /package/tests/{routers → integration/routers}/marketing.test.ts +0 -0
- /package/tests/{routers → integration/routers}/notification.test.ts +0 -0
- /package/tests/{routers → integration/routers}/search.test.ts +0 -0
- /package/tests/{routers → integration/routers}/section.test.ts +0 -0
- /package/tests/{server → unit/middleware}/rateLimit.test.ts +0 -0
package/prisma/migrations/20260506162500_consolidate_run_job_and_unify_job_status/migration.sql
ADDED
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
-- Consolidate background-job tracking onto RunJob and unify domain status.
|
|
2
|
+
--
|
|
3
|
+
-- 1. Replace the bare-bones RunJob table with a fully-typed audit row that
|
|
4
|
+
-- carries job type, status, input/result, error, attempts, timestamps.
|
|
5
|
+
-- 2. Replace the catch-all GenerationStatus enum with a single shared
|
|
6
|
+
-- JobStatus enum used by every domain row that has a user-observable
|
|
7
|
+
-- async lifecycle (Message, StudentQuestionProgress).
|
|
8
|
+
-- 3. Add a nullable runJobId FK on Message and StudentQuestionProgress so we
|
|
9
|
+
-- can trace a domain row back to the job that produced it. Operational
|
|
10
|
+
-- state (retries, errors, attempts) lives on RunJob, not on the row.
|
|
11
|
+
-- 4. Drop the unused Comment.status column.
|
|
12
|
+
|
|
13
|
+
-- ---------------------------------------------------------------------------
|
|
14
|
+
-- 1. New enum types
|
|
15
|
+
-- ---------------------------------------------------------------------------
|
|
16
|
+
|
|
17
|
+
CREATE TYPE "RunJobType" AS ENUM (
|
|
18
|
+
'PDF_TO_WORKSHEET',
|
|
19
|
+
'GRADE_WORKSHEET',
|
|
20
|
+
'AI_LAB_CHAT',
|
|
21
|
+
'AI_NEWTON_CHAT',
|
|
22
|
+
'STUDENT_PROGRESS_CHAT'
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
-- Queue-internal lifecycle. Distinct from JobStatus because PENDING (queued
|
|
26
|
+
-- but not picked up) vs RUNNING (worker actively executing) is a real
|
|
27
|
+
-- operational distinction we want when debugging.
|
|
28
|
+
CREATE TYPE "RunJobStatus" AS ENUM (
|
|
29
|
+
'PENDING',
|
|
30
|
+
'RUNNING',
|
|
31
|
+
'SUCCEEDED',
|
|
32
|
+
'FAILED',
|
|
33
|
+
'CANCELLED'
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
-- Shared UI-shaped status for domain rows. Not every row uses every value
|
|
37
|
+
-- (e.g. Message never gets NOT_STARTED) but we keep one enum to avoid an
|
|
38
|
+
-- explosion of near-duplicate types.
|
|
39
|
+
CREATE TYPE "JobStatus" AS ENUM (
|
|
40
|
+
'NOT_STARTED',
|
|
41
|
+
'PENDING',
|
|
42
|
+
'COMPLETED',
|
|
43
|
+
'FAILED',
|
|
44
|
+
'CANCELLED'
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
-- ---------------------------------------------------------------------------
|
|
48
|
+
-- 2. Replace the legacy RunJob table.
|
|
49
|
+
--
|
|
50
|
+
-- The previous schema only had `id` and `createdAt`, and was applied via
|
|
51
|
+
-- `prisma db push` (no migration history) — so any rows in it are throwaway.
|
|
52
|
+
-- We DROP IF EXISTS to handle both fresh production DBs and dev DBs that have
|
|
53
|
+
-- the old shape.
|
|
54
|
+
-- ---------------------------------------------------------------------------
|
|
55
|
+
|
|
56
|
+
DROP TABLE IF EXISTS "RunJob" CASCADE;
|
|
57
|
+
|
|
58
|
+
CREATE TABLE "RunJob" (
|
|
59
|
+
"id" TEXT NOT NULL,
|
|
60
|
+
"type" "RunJobType" NOT NULL,
|
|
61
|
+
"status" "RunJobStatus" NOT NULL DEFAULT 'PENDING',
|
|
62
|
+
"classId" TEXT,
|
|
63
|
+
"userId" TEXT,
|
|
64
|
+
"bullJobId" TEXT,
|
|
65
|
+
"input" JSONB NOT NULL,
|
|
66
|
+
"result" JSONB,
|
|
67
|
+
"error" TEXT,
|
|
68
|
+
"attempts" INTEGER NOT NULL DEFAULT 0,
|
|
69
|
+
"startedAt" TIMESTAMP(3),
|
|
70
|
+
"finishedAt" TIMESTAMP(3),
|
|
71
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
72
|
+
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
73
|
+
|
|
74
|
+
CONSTRAINT "RunJob_pkey" PRIMARY KEY ("id")
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
CREATE INDEX "RunJob_userId_type_status_idx" ON "RunJob"("userId", "type", "status");
|
|
78
|
+
CREATE INDEX "RunJob_classId_status_idx" ON "RunJob"("classId", "status");
|
|
79
|
+
CREATE INDEX "RunJob_status_createdAt_idx" ON "RunJob"("status", "createdAt");
|
|
80
|
+
|
|
81
|
+
-- ---------------------------------------------------------------------------
|
|
82
|
+
-- 2b. Track PDF source URLs on worksheets for idempotent PDF conversion.
|
|
83
|
+
-- ---------------------------------------------------------------------------
|
|
84
|
+
|
|
85
|
+
ALTER TABLE "Worksheet" ADD COLUMN "sourceUrl" TEXT;
|
|
86
|
+
|
|
87
|
+
CREATE UNIQUE INDEX "Worksheet_classId_sourceUrl_key"
|
|
88
|
+
ON "Worksheet"("classId", "sourceUrl");
|
|
89
|
+
|
|
90
|
+
-- ---------------------------------------------------------------------------
|
|
91
|
+
-- 3. Message.status: GenerationStatus -> JobStatus.
|
|
92
|
+
--
|
|
93
|
+
-- Old enum had NOT_STARTED / PENDING / GENERATING / COMPLETED / FAILED /
|
|
94
|
+
-- CANCELLED. New JobStatus drops GENERATING (never written). The old default
|
|
95
|
+
-- of NOT_STARTED is dropped: a row without an AI lifecycle now has NULL.
|
|
96
|
+
-- GENERATING is mapped to PENDING defensively in case any row carries it.
|
|
97
|
+
-- ---------------------------------------------------------------------------
|
|
98
|
+
|
|
99
|
+
ALTER TABLE "Message" ALTER COLUMN "status" DROP DEFAULT;
|
|
100
|
+
|
|
101
|
+
ALTER TABLE "Message"
|
|
102
|
+
ALTER COLUMN "status" TYPE "JobStatus"
|
|
103
|
+
USING (
|
|
104
|
+
CASE "status"::text
|
|
105
|
+
WHEN 'NOT_STARTED' THEN NULL
|
|
106
|
+
WHEN 'GENERATING' THEN 'PENDING'::"JobStatus"
|
|
107
|
+
WHEN 'PENDING' THEN 'PENDING'::"JobStatus"
|
|
108
|
+
WHEN 'COMPLETED' THEN 'COMPLETED'::"JobStatus"
|
|
109
|
+
WHEN 'FAILED' THEN 'FAILED'::"JobStatus"
|
|
110
|
+
WHEN 'CANCELLED' THEN 'CANCELLED'::"JobStatus"
|
|
111
|
+
ELSE NULL
|
|
112
|
+
END
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
-- ---------------------------------------------------------------------------
|
|
116
|
+
-- 4. StudentQuestionProgress.status: GenerationStatus -> JobStatus.
|
|
117
|
+
--
|
|
118
|
+
-- Default kept at NOT_STARTED. GENERATING -> PENDING defensively.
|
|
119
|
+
-- ---------------------------------------------------------------------------
|
|
120
|
+
|
|
121
|
+
ALTER TABLE "StudentQuestionProgress" ALTER COLUMN "status" DROP DEFAULT;
|
|
122
|
+
|
|
123
|
+
ALTER TABLE "StudentQuestionProgress"
|
|
124
|
+
ALTER COLUMN "status" TYPE "JobStatus"
|
|
125
|
+
USING (
|
|
126
|
+
CASE "status"::text
|
|
127
|
+
WHEN 'NOT_STARTED' THEN 'NOT_STARTED'::"JobStatus"
|
|
128
|
+
WHEN 'PENDING' THEN 'PENDING'::"JobStatus"
|
|
129
|
+
WHEN 'GENERATING' THEN 'PENDING'::"JobStatus"
|
|
130
|
+
WHEN 'COMPLETED' THEN 'COMPLETED'::"JobStatus"
|
|
131
|
+
WHEN 'FAILED' THEN 'FAILED'::"JobStatus"
|
|
132
|
+
WHEN 'CANCELLED' THEN 'CANCELLED'::"JobStatus"
|
|
133
|
+
ELSE NULL
|
|
134
|
+
END
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
ALTER TABLE "StudentQuestionProgress"
|
|
138
|
+
ALTER COLUMN "status" SET DEFAULT 'NOT_STARTED';
|
|
139
|
+
|
|
140
|
+
-- ---------------------------------------------------------------------------
|
|
141
|
+
-- 5. Drop the unused Comment.status column and the legacy enum.
|
|
142
|
+
-- ---------------------------------------------------------------------------
|
|
143
|
+
|
|
144
|
+
ALTER TABLE "Comment" DROP COLUMN "status";
|
|
145
|
+
|
|
146
|
+
DROP TYPE "GenerationStatus";
|
|
147
|
+
|
|
148
|
+
-- ---------------------------------------------------------------------------
|
|
149
|
+
-- 6. Add runJobId FKs and supporting indexes.
|
|
150
|
+
-- ---------------------------------------------------------------------------
|
|
151
|
+
|
|
152
|
+
ALTER TABLE "Message"
|
|
153
|
+
ADD COLUMN "runJobId" TEXT,
|
|
154
|
+
ADD CONSTRAINT "Message_runJobId_fkey"
|
|
155
|
+
FOREIGN KEY ("runJobId") REFERENCES "RunJob"("id")
|
|
156
|
+
ON DELETE SET NULL ON UPDATE CASCADE;
|
|
157
|
+
|
|
158
|
+
CREATE INDEX "Message_runJobId_idx" ON "Message"("runJobId");
|
|
159
|
+
|
|
160
|
+
ALTER TABLE "StudentQuestionProgress"
|
|
161
|
+
ADD COLUMN "runJobId" TEXT,
|
|
162
|
+
ADD CONSTRAINT "StudentQuestionProgress_runJobId_fkey"
|
|
163
|
+
FOREIGN KEY ("runJobId") REFERENCES "RunJob"("id")
|
|
164
|
+
ON DELETE SET NULL ON UPDATE CASCADE;
|
|
165
|
+
|
|
166
|
+
CREATE INDEX "StudentQuestionProgress_runJobId_idx" ON "StudentQuestionProgress"("runJobId");
|