diff --git a/web/prisma/schema.prisma b/web/prisma/schema.prisma index 9b44bd2..56842ae 100644 --- a/web/prisma/schema.prisma +++ b/web/prisma/schema.prisma @@ -8,10 +8,10 @@ datasource db { } model User { - id Int @id @default(autoincrement()) - username String @unique - password String - sessions Session[] + id Int @id @default(autoincrement()) + username String @unique + password String + Submission Session[] } model Session { @@ -31,21 +31,26 @@ model Submission { id Int @id @default(autoincrement()) createdAt DateTime @default(now()) state SubmissionState - expectedOutput String actualOutput String message String? + team Team @relation(fields: [teamId], references: [id]) + teamId Int + problem Problem @relation(fields: [problemId], references: [id]) + problemId Int } model Problem { - id Int @id @default(autoincrement()) - friendlyName String @unique + id Int @id @default(autoincrement()) + friendlyName String @unique sampleInput String sampleOutput String realInput String realOutput String + Submission Submission[] } model Team { - id Int @id @default(autoincrement()) - name String @unique + id Int @id @default(autoincrement()) + name String @unique + Submission Submission[] } diff --git a/web/src/routes/+layout.svelte b/web/src/routes/+layout.svelte index f906b51..889ad09 100644 --- a/web/src/routes/+layout.svelte +++ b/web/src/routes/+layout.svelte @@ -1,5 +1,9 @@ diff --git a/web/src/routes/admin/diff/[submissionId]/+page.server.ts b/web/src/routes/admin/diff/[submissionId]/+page.server.ts index e9d404c..7b1cc88 100644 --- a/web/src/routes/admin/diff/[submissionId]/+page.server.ts +++ b/web/src/routes/admin/diff/[submissionId]/+page.server.ts @@ -12,10 +12,14 @@ export const load = (async ({ params }) => { if (!submission) { throw redirect(302, '/admin/reviews'); } + const problem = await db.problem.findUnique({ where: { id: submission.problemId } }); + if (!problem) { + throw error(500, 'Invalid problem'); + } let diff = Diff.createTwoFilesPatch( 'expected', 'actual', - submission.expectedOutput, + problem.realOutput, submission.actualOutput ); return { diff: diff }; diff --git a/web/src/routes/admin/reviews/+page.server.ts b/web/src/routes/admin/reviews/+page.server.ts index 45e9bd8..a32fcc9 100644 --- a/web/src/routes/admin/reviews/+page.server.ts +++ b/web/src/routes/admin/reviews/+page.server.ts @@ -3,13 +3,18 @@ import { SubmissionState } from '@prisma/client'; import type { Actions, PageServerLoad } from './$types'; export const load = (async () => { - const query = await db.submission.findMany({ where: { state: SubmissionState.InReview } }); - query.sort((a, b) => { - return a.createdAt.valueOf() - b.createdAt.valueOf(); - }); + const submissions = await db.submission.findMany({ where: { state: SubmissionState.InReview } }); + const teams = await db.team.findMany(); + const problems = await db.problem.findMany(); return { - reviewList: query.map((row) => { + reviewList: submissions.map((row) => { return { id: row.id, createdAt: row.createdAt }; + }), + teams: teams.map((row) => { + return { id: row.id, name: row.name }; + }), + problems: problems.map((row) => { + return { id: row.id, name: row.friendlyName }; }) }; }) satisfies PageServerLoad; @@ -17,20 +22,32 @@ export const load = (async () => { export const actions = { submission: async ({ request }) => { const data = await request.formData(); - const expected = data.get('expected'); + const teamId = data.get('teamId'); + const problemId = data.get('problemId'); const actual = data.get('actual'); - if (!expected || !actual) { + if (!teamId || !problemId || !actual) { return { success: false }; } - if (expected.toString() === actual.toString()) { + const problemIdInt = parseInt(problemId.toString()); + const teamIdInt = parseInt(teamId.toString()); + if (isNaN(problemIdInt) || isNaN(teamIdInt)) { + return { success: false }; + } + const problem = await db.problem.findUnique({ where: { id: problemIdInt } }); + if (!problem) { + return { success: false }; + } + if (problem.realOutput === actual.toString()) { return { success: true }; } await db.submission.create({ data: { state: SubmissionState.InReview, - expectedOutput: expected.toString(), - actualOutput: actual.toString() + actualOutput: actual.toString(), + teamId: teamIdInt, + problemId: problemIdInt } }); + return { success: true }; } } satisfies Actions; diff --git a/web/src/routes/admin/reviews/+page.svelte b/web/src/routes/admin/reviews/+page.svelte index 4a700ef..7d33b26 100644 --- a/web/src/routes/admin/reviews/+page.svelte +++ b/web/src/routes/admin/reviews/+page.svelte @@ -4,6 +4,9 @@ export let data: PageData; export let form: ActionData; + + let selectedTeam: (typeof data.teams)[0] | null; + let selectedProblem: (typeof data.problems)[0] | null; @@ -30,15 +33,55 @@ {/if}
-
-
Expected output (real data)
-