From 80fb1cdb3e021167ad50ef2aac59090f24e33d23 Mon Sep 17 00:00:00 2001 From: orosmatthew Date: Fri, 28 Apr 2023 20:06:28 -0400 Subject: [PATCH] Add problems pages --- web/prisma/schema.prisma | 9 ++ web/src/hooks.server.ts | 2 +- web/src/routes/admin/+layout.svelte | 11 ++ web/src/routes/admin/+page.svelte | 5 + .../admin/diff/[submissionId]/+page.svelte | 2 +- web/src/routes/admin/problems/+page.server.ts | 11 ++ web/src/routes/admin/problems/+page.svelte | 29 +++++ .../problems/[problemId]/+page.server.ts | 46 +++++++ .../admin/problems/[problemId]/+page.svelte | 112 ++++++++++++++++++ .../admin/problems/create/+page.server.ts | 28 +++++ .../routes/admin/problems/create/+page.svelte | 64 ++++++++++ web/src/routes/admin/reviews/+page.server.ts | 6 +- web/src/routes/admin/reviews/+page.svelte | 4 +- 13 files changed, 323 insertions(+), 6 deletions(-) create mode 100644 web/src/routes/admin/+layout.svelte create mode 100644 web/src/routes/admin/+page.svelte create mode 100644 web/src/routes/admin/problems/+page.server.ts create mode 100644 web/src/routes/admin/problems/+page.svelte create mode 100644 web/src/routes/admin/problems/[problemId]/+page.server.ts create mode 100644 web/src/routes/admin/problems/[problemId]/+page.svelte create mode 100644 web/src/routes/admin/problems/create/+page.server.ts create mode 100644 web/src/routes/admin/problems/create/+page.svelte diff --git a/web/prisma/schema.prisma b/web/prisma/schema.prisma index 592a0fc..3441c04 100644 --- a/web/prisma/schema.prisma +++ b/web/prisma/schema.prisma @@ -35,3 +35,12 @@ model Submission { actualOutput String message String? } + +model Problem { + id Int @id @default(autoincrement()) + friendlyName String + sampleInput String + sampleOutput String + realInput String + realOutput String +} diff --git a/web/src/hooks.server.ts b/web/src/hooks.server.ts index e4c008b..fa10523 100644 --- a/web/src/hooks.server.ts +++ b/web/src/hooks.server.ts @@ -24,7 +24,7 @@ export const handle = (async ({ event, resolve }) => { if (session) { removeExpiredSessions(session.userId); if (!isSessionExpired(session)) { - throw redirect(302, '/admin/reviews'); + throw redirect(302, '/admin'); } else { event.cookies.delete('token'); const res = resolve(event); diff --git a/web/src/routes/admin/+layout.svelte b/web/src/routes/admin/+layout.svelte new file mode 100644 index 0000000..6e3b094 --- /dev/null +++ b/web/src/routes/admin/+layout.svelte @@ -0,0 +1,11 @@ +
+ +
+
+ +
diff --git a/web/src/routes/admin/+page.svelte b/web/src/routes/admin/+page.svelte new file mode 100644 index 0000000..8d44d44 --- /dev/null +++ b/web/src/routes/admin/+page.svelte @@ -0,0 +1,5 @@ + + Admin Home + + +

Admin Home

diff --git a/web/src/routes/admin/diff/[submissionId]/+page.svelte b/web/src/routes/admin/diff/[submissionId]/+page.svelte index 23a5236..a1319c3 100644 --- a/web/src/routes/admin/diff/[submissionId]/+page.svelte +++ b/web/src/routes/admin/diff/[submissionId]/+page.svelte @@ -56,7 +56,7 @@ Diff -

Diff

+

Diff

Back
diff --git a/web/src/routes/admin/problems/+page.server.ts b/web/src/routes/admin/problems/+page.server.ts new file mode 100644 index 0000000..567bf2e --- /dev/null +++ b/web/src/routes/admin/problems/+page.server.ts @@ -0,0 +1,11 @@ +import { db } from '$lib/server/prisma'; +import type { PageServerLoad } from './$types'; + +export const load = (async () => { + const query = await db.problem.findMany(); + return { + problems: query.map((row) => { + return { id: row.id, friendlyName: row.friendlyName }; + }) + }; +}) satisfies PageServerLoad; diff --git a/web/src/routes/admin/problems/+page.svelte b/web/src/routes/admin/problems/+page.svelte new file mode 100644 index 0000000..9b590cb --- /dev/null +++ b/web/src/routes/admin/problems/+page.svelte @@ -0,0 +1,29 @@ + + + + Problems + + +

Problems

+ +
+
+ Create +
+
+ +{#if data.problems.length === 0} +
No problems
+{/if} +
+ {#each data.problems as problem} + {problem.friendlyName} + {/each} +
diff --git a/web/src/routes/admin/problems/[problemId]/+page.server.ts b/web/src/routes/admin/problems/[problemId]/+page.server.ts new file mode 100644 index 0000000..9f0727d --- /dev/null +++ b/web/src/routes/admin/problems/[problemId]/+page.server.ts @@ -0,0 +1,46 @@ +import { db } from '$lib/server/prisma'; +import { error, redirect } from '@sveltejs/kit'; +import type { Actions, PageServerLoad } from './$types'; + +export const load = (async ({ params }) => { + const problemId = parseInt(params.problemId); + if (isNaN(problemId)) { + throw error(400, 'Invalid request'); + } + const query = await db.problem.findUnique({ where: { id: problemId } }); + if (!query) { + throw redirect(302, '/admin/problems'); + } + return { problemData: query }; +}) satisfies PageServerLoad; + +export const actions = { + edit: async ({ params, request }) => { + const problemId = parseInt(params.problemId); + if (isNaN(problemId)) { + throw error(400, 'Invalid problem'); + } + const data = await request.formData(); + const name = data.get('name'); + const sampleInput = data.get('sampleInput'); + const sampleOutput = data.get('sampleOutput'); + const realInput = data.get('realInput'); + const realOutput = data.get('realOutput'); + if (!name || !sampleInput || !sampleOutput || !realInput || !realOutput) { + return { success: false }; + } + + await db.problem.update({ + where: { id: problemId }, + data: { + friendlyName: name.toString(), + sampleInput: sampleInput.toString(), + sampleOutput: sampleOutput.toString(), + realInput: realInput.toString(), + realOutput: realOutput.toString() + } + }); + + return { success: true }; + } +} satisfies Actions; diff --git a/web/src/routes/admin/problems/[problemId]/+page.svelte b/web/src/routes/admin/problems/[problemId]/+page.svelte new file mode 100644 index 0000000..0dd0769 --- /dev/null +++ b/web/src/routes/admin/problems/[problemId]/+page.svelte @@ -0,0 +1,112 @@ + + +

{data.problemData.friendlyName}

+
+
+ Back +
+
+ {#if !editing} + + {/if} +
+
+ +{#if form && !form.success} +
Invalid edit
+{/if} + +
+

Name

+
+
+ +
+
+

Sample Data

+
+
+
Input
+ +
+
+
Output
+ +
+
+ +

Real Data

+
+
+
Input
+ +
+
+
Output
+ +
+
+ {#if editing} +
+
+ + +
+
+ {/if} +
diff --git a/web/src/routes/admin/problems/create/+page.server.ts b/web/src/routes/admin/problems/create/+page.server.ts new file mode 100644 index 0000000..dfe03af --- /dev/null +++ b/web/src/routes/admin/problems/create/+page.server.ts @@ -0,0 +1,28 @@ +import { db } from '$lib/server/prisma'; +import type { Actions } from './$types'; + +export const actions = { + create: async ({ request }) => { + const data = await request.formData(); + const name = data.get('name'); + const sampleInput = data.get('sampleInput'); + const sampleOutput = data.get('sampleOutput'); + const realInput = data.get('realInput'); + const realOutput = data.get('realOutput'); + if (!name || !sampleInput || !sampleOutput || !realInput || !realOutput) { + return { success: false }; + } + + await db.problem.create({ + data: { + friendlyName: name.toString(), + sampleInput: sampleInput.toString(), + sampleOutput: sampleOutput.toString(), + realInput: realInput.toString(), + realOutput: realOutput.toString() + } + }); + + return { success: true }; + } +} satisfies Actions; diff --git a/web/src/routes/admin/problems/create/+page.svelte b/web/src/routes/admin/problems/create/+page.svelte new file mode 100644 index 0000000..4b6cf84 --- /dev/null +++ b/web/src/routes/admin/problems/create/+page.svelte @@ -0,0 +1,64 @@ + + + + Create Problem + + +

Create Problem

+ +
+
+ Back +
+
+ +{#if form && !form.success} +
Invalid data
+{/if} + +
+

Name

+
+
+