66 lines
2.5 KiB
TypeScript
66 lines
2.5 KiB
TypeScript
import { PrismaClient } from "@prisma/client";
|
|
|
|
export const prisma = new PrismaClient();
|
|
|
|
export async function ensureDatabaseSchema() {
|
|
await prisma.$executeRawUnsafe(`
|
|
CREATE TABLE IF NOT EXISTS "DayGroup" (
|
|
"id" TEXT NOT NULL PRIMARY KEY,
|
|
"title" TEXT NOT NULL,
|
|
"order" INTEGER NOT NULL DEFAULT 0,
|
|
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
`);
|
|
|
|
await prisma.$executeRawUnsafe(`
|
|
CREATE TABLE IF NOT EXISTS "Task" (
|
|
"id" TEXT NOT NULL PRIMARY KEY,
|
|
"title" TEXT NOT NULL,
|
|
"descriptionMarkdown" TEXT NOT NULL,
|
|
"groupId" TEXT NOT NULL,
|
|
"order" INTEGER NOT NULL DEFAULT 0,
|
|
"visible" BOOLEAN NOT NULL DEFAULT true,
|
|
"starterHtml" TEXT NOT NULL DEFAULT '',
|
|
"starterCss" TEXT NOT NULL DEFAULT '',
|
|
"starterJs" TEXT NOT NULL DEFAULT '',
|
|
"referenceHtml" TEXT NOT NULL DEFAULT '',
|
|
"referenceCss" TEXT NOT NULL DEFAULT '',
|
|
"referenceJs" TEXT NOT NULL DEFAULT '',
|
|
"expectedScreenshotPath" TEXT,
|
|
"visualThreshold" REAL NOT NULL DEFAULT 0.85,
|
|
"passingScore" REAL NOT NULL DEFAULT 0.8,
|
|
"checksJson" TEXT NOT NULL DEFAULT '[]',
|
|
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
CONSTRAINT "Task_groupId_fkey" FOREIGN KEY ("groupId") REFERENCES "DayGroup" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
|
);
|
|
`);
|
|
|
|
const taskColumns = await prisma.$queryRawUnsafe<Array<{ name: string }>>(`PRAGMA table_info("Task");`);
|
|
if (!taskColumns.some((column) => column.name === "passingScore")) {
|
|
await prisma.$executeRawUnsafe(`ALTER TABLE "Task" ADD COLUMN "passingScore" REAL NOT NULL DEFAULT 0.8;`);
|
|
}
|
|
|
|
await prisma.$executeRawUnsafe(`
|
|
CREATE TABLE IF NOT EXISTS "Submission" (
|
|
"id" TEXT NOT NULL PRIMARY KEY,
|
|
"taskId" TEXT NOT NULL,
|
|
"studentName" TEXT NOT NULL,
|
|
"studentKey" TEXT NOT NULL,
|
|
"html" TEXT NOT NULL,
|
|
"css" TEXT NOT NULL,
|
|
"js" TEXT NOT NULL,
|
|
"passed" BOOLEAN NOT NULL,
|
|
"score" REAL NOT NULL,
|
|
"resultJson" TEXT NOT NULL,
|
|
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
CONSTRAINT "Submission_taskId_fkey" FOREIGN KEY ("taskId") REFERENCES "Task" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
|
);
|
|
`);
|
|
|
|
await prisma.$executeRawUnsafe(`
|
|
CREATE INDEX IF NOT EXISTS "Submission_taskId_studentKey_idx" ON "Submission" ("taskId", "studentKey");
|
|
`);
|
|
}
|