Initial commit

This commit is contained in:
2026-07-03 07:55:10 +03:00
commit 66cbd8d88a
25 changed files with 10746 additions and 0 deletions
+65
View File
@@ -0,0 +1,65 @@
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");
`);
}