diff --git a/web/prisma/schema.prisma b/web/prisma/schema.prisma index eae9959..592a0fc 100644 --- a/web/prisma/schema.prisma +++ b/web/prisma/schema.prisma @@ -28,7 +28,10 @@ enum SubmissionState { } model Submission { - id Int @id @default(autoincrement()) - state SubmissionState - message String? + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) + state SubmissionState + expectedOutput String + actualOutput String + message String? } diff --git a/web/src/routes/admin/diff/+page.server.ts b/web/src/routes/admin/diff/+page.server.ts deleted file mode 100644 index 2c949de..0000000 --- a/web/src/routes/admin/diff/+page.server.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type { PageServerLoad } from './$types'; -import * as Diff from 'diff'; - -export const load = (async () => { - let diff = Diff.createTwoFilesPatch('data', 'data', 'abc', 'abd'); - return { diff: diff }; -}) satisfies PageServerLoad; diff --git a/web/src/routes/admin/diff/[submissionId]/+page.server.ts b/web/src/routes/admin/diff/[submissionId]/+page.server.ts new file mode 100644 index 0000000..84a6ce7 --- /dev/null +++ b/web/src/routes/admin/diff/[submissionId]/+page.server.ts @@ -0,0 +1,23 @@ +import { z } from 'zod'; +import type { PageServerLoad } from './$types'; +import * as Diff from 'diff'; +import { error } from '@sveltejs/kit'; +import { db } from '$lib/server/prisma'; + +export const load = (async ({ params }) => { + const submissionId = parseInt(params.submissionId); + if (isNaN(submissionId)) { + throw error(400, 'Invalid request'); + } + const submission = await db.submission.findUnique({ where: { id: submissionId } }); + if (!submission) { + throw error(400, 'Invalid submission'); + } + let diff = Diff.createTwoFilesPatch( + 'expected', + 'actual', + submission.expectedOutput, + submission.actualOutput + ); + return { diff: diff }; +}) satisfies PageServerLoad; diff --git a/web/src/routes/admin/diff/+page.svelte b/web/src/routes/admin/diff/[submissionId]/+page.svelte similarity index 82% rename from web/src/routes/admin/diff/+page.svelte rename to web/src/routes/admin/diff/[submissionId]/+page.svelte index 5b65355..23a5236 100644 --- a/web/src/routes/admin/diff/+page.svelte +++ b/web/src/routes/admin/diff/[submissionId]/+page.svelte @@ -2,9 +2,10 @@ import { Diff2HtmlUI } from 'diff2html/lib/ui/js/diff2html-ui-base'; import 'diff2html/bundles/css/diff2html.min.css'; import { onMount } from 'svelte'; - import type { PageData } from './$types'; import type { DiffPostData } from './+server'; import { goto } from '$app/navigation'; + import type { PageData } from './$types'; + import { page } from '$app/stores'; export let data: PageData; @@ -34,22 +35,28 @@ async function onSubmitClick() { if (incorrectBtn.checked) { - let data: DiffPostData = { correct: false, message: messageText.value }; - await fetch('/admin/diff', { method: 'POST', body: JSON.stringify(data) }); + let postData: DiffPostData = { + correct: false, + message: messageText.value + }; + await fetch($page.url, { method: 'POST', body: JSON.stringify(postData) }); goto('/admin/reviews'); } else if (correctBtn.checked) { - let data: DiffPostData = { correct: true, message: messageText.value }; - await fetch('/admin/diff', { method: 'POST', body: JSON.stringify(data) }); + let postData: DiffPostData = { + correct: true, + message: messageText.value + }; + await fetch($page.url, { method: 'POST', body: JSON.stringify(postData) }); goto('/admin/reviews'); } } - Diff Test + Diff -

Diff Test

+

Diff

Back
diff --git a/web/src/routes/admin/diff/+server.ts b/web/src/routes/admin/diff/[submissionId]/+server.ts similarity index 61% rename from web/src/routes/admin/diff/+server.ts rename to web/src/routes/admin/diff/[submissionId]/+server.ts index 158fc74..e619c73 100644 --- a/web/src/routes/admin/diff/+server.ts +++ b/web/src/routes/admin/diff/[submissionId]/+server.ts @@ -1,6 +1,7 @@ import { error, json } from '@sveltejs/kit'; import type { RequestHandler } from './$types'; import { z } from 'zod'; +import { db } from '$lib/server/prisma'; const diffPostData = z.object({ correct: z.boolean(), @@ -8,12 +9,15 @@ const diffPostData = z.object({ }); export type DiffPostData = z.infer; -export const POST = (async ({ request }) => { +export const POST = (async ({ request, params }) => { + const submissionId = parseInt(params.submissionId); + if (isNaN(submissionId)) { + throw error(400, 'Invalid submission'); + } const req = diffPostData.safeParse(await request.json()); if (!req.success) { throw error(400, 'Invalid data format'); } - console.log(req.data.correct); - console.log(req.data.message); + await db.submission.delete({ where: { id: submissionId } }); return json({ success: true }); }) satisfies RequestHandler; diff --git a/web/src/routes/admin/reviews/+page.server.ts b/web/src/routes/admin/reviews/+page.server.ts index 2ed3942..f578d89 100644 --- a/web/src/routes/admin/reviews/+page.server.ts +++ b/web/src/routes/admin/reviews/+page.server.ts @@ -1,6 +1,32 @@ -import type { PageServerLoad } from './$types'; +import { db } from '$lib/server/prisma'; +import { SubmissionState } from '@prisma/client'; +import type { Actions, PageServerLoad } from './$types'; export const load = (async () => { - let reviewList = ['Team A', 'Team B', 'Team C', 'Team D', 'Team E']; - return { reviewList: reviewList }; + const query = await db.submission.findMany({ where: { state: SubmissionState.InReview } }); + query.sort((a, b) => { + return a.createdAt.valueOf() - b.createdAt.valueOf(); + }); + return { reviewList: query }; }) satisfies PageServerLoad; + +export const actions = { + submission: async ({ request }) => { + const data = await request.formData(); + const expected = data.get('expected'); + const actual = data.get('actual'); + if (!expected || !actual) { + return { success: false }; + } + if (expected.toString() === actual.toString()) { + return { success: true }; + } + await db.submission.create({ + data: { + state: SubmissionState.InReview, + expectedOutput: expected.toString(), + actualOutput: actual.toString() + } + }); + } +} satisfies Actions; diff --git a/web/src/routes/admin/reviews/+page.svelte b/web/src/routes/admin/reviews/+page.svelte index 90c2c9d..2937091 100644 --- a/web/src/routes/admin/reviews/+page.svelte +++ b/web/src/routes/admin/reviews/+page.svelte @@ -1,15 +1,47 @@ + + Reviews + +

Reviews

-Logout +Logout + +
+

For Testing Purposes - Create Fake Submission

+{#if form && !form.success} +
Invalid Submission
+{/if} +
+
+
+
Expected output (real data)
+