From 027f87167cb703df42820d8567b16eb1e2d43945 Mon Sep 17 00:00:00 2001 From: orosmatthew Date: Sat, 29 Apr 2023 11:42:35 -0400 Subject: [PATCH] Add scoreboard and teams --- web/prisma/schema.prisma | 7 +- web/src/routes/admin/+layout.svelte | 2 + .../routes/admin/scoreboard/+page.server.ts | 17 ++++ web/src/routes/admin/scoreboard/+page.svelte | 62 ++++++++++++ web/src/routes/admin/teams/+page.server.ts | 50 ++++++++++ web/src/routes/admin/teams/+page.svelte | 97 +++++++++++++++++++ 6 files changed, 234 insertions(+), 1 deletion(-) create mode 100644 web/src/routes/admin/scoreboard/+page.server.ts create mode 100644 web/src/routes/admin/scoreboard/+page.svelte create mode 100644 web/src/routes/admin/teams/+page.server.ts create mode 100644 web/src/routes/admin/teams/+page.svelte diff --git a/web/prisma/schema.prisma b/web/prisma/schema.prisma index 3441c04..9b44bd2 100644 --- a/web/prisma/schema.prisma +++ b/web/prisma/schema.prisma @@ -38,9 +38,14 @@ model Submission { model Problem { id Int @id @default(autoincrement()) - friendlyName String + friendlyName String @unique sampleInput String sampleOutput String realInput String realOutput String } + +model Team { + id Int @id @default(autoincrement()) + name String @unique +} diff --git a/web/src/routes/admin/+layout.svelte b/web/src/routes/admin/+layout.svelte index 6e3b094..46d3860 100644 --- a/web/src/routes/admin/+layout.svelte +++ b/web/src/routes/admin/+layout.svelte @@ -3,6 +3,8 @@
  • Home
  • Reviews
  • Problems
  • +
  • Scoreboard
  • +
  • Teams
  • Logout
  • diff --git a/web/src/routes/admin/scoreboard/+page.server.ts b/web/src/routes/admin/scoreboard/+page.server.ts new file mode 100644 index 0000000..f6a555c --- /dev/null +++ b/web/src/routes/admin/scoreboard/+page.server.ts @@ -0,0 +1,17 @@ +import { db } from '$lib/server/prisma'; +import type { PageServerLoad } from './$types'; + +export const load = (async () => { + const timestamp = new Date(); + const problems = await db.problem.findMany(); + const teams = await db.team.findMany(); + return { + timestamp: timestamp, + problems: problems.map((row) => { + return { friendlyName: row.friendlyName }; + }), + teams: teams.map((row) => { + return { name: row.name }; + }) + }; +}) satisfies PageServerLoad; diff --git a/web/src/routes/admin/scoreboard/+page.svelte b/web/src/routes/admin/scoreboard/+page.svelte new file mode 100644 index 0000000..afac11b --- /dev/null +++ b/web/src/routes/admin/scoreboard/+page.svelte @@ -0,0 +1,62 @@ + + + + Admin Scoreboard + + +

    Admin Scoreboard

    + +
    +
    + {#if updating} +
    + {/if} + Last Updated: {data.timestamp.toLocaleTimeString()} +
    +
    + + + + + + {#each data.problems as problem} + + {/each} + + + + + + {#each data.teams as team} + + + {#each data.problems as _} + + {/each} + + + + {/each} + +
    Team Name{problem.friendlyName}Total CorrectTotal Points
    {team.name}-/-00
    diff --git a/web/src/routes/admin/teams/+page.server.ts b/web/src/routes/admin/teams/+page.server.ts new file mode 100644 index 0000000..3c6f69d --- /dev/null +++ b/web/src/routes/admin/teams/+page.server.ts @@ -0,0 +1,50 @@ +import { db } from '$lib/server/prisma'; +import type { Actions, PageServerLoad } from './$types'; + +export const load = (async () => { + const teams = await db.team.findMany(); + teams.sort((a, b) => { + if (a.name < b.name) { + return -1; + } + if (a.name > b.name) { + return 1; + } + return 0; + }); + return { + teams: teams.map((row) => { + return { id: row.id, name: row.name }; + }) + }; +}) satisfies PageServerLoad; + +export const actions = { + add: async ({ request }) => { + const data = await request.formData(); + const name = data.get('name'); + if (!name) { + return { success: false }; + } + try { + await db.team.create({ data: { name: name.toString() } }); + } catch { + return { success: false }; + } + return { success: true }; + }, + delete: async ({ request }) => { + const data = await request.formData(); + const teamId = data.get('teamId'); + if (!teamId) { + return { success: false }; + } + const teamIdNum = parseInt(teamId.toString()); + try { + await db.team.delete({ where: { id: teamIdNum } }); + } catch { + return { success: false }; + } + return { success: true }; + } +} satisfies Actions; diff --git a/web/src/routes/admin/teams/+page.svelte b/web/src/routes/admin/teams/+page.svelte new file mode 100644 index 0000000..2f64e8d --- /dev/null +++ b/web/src/routes/admin/teams/+page.svelte @@ -0,0 +1,97 @@ + + + + Teams + + +

    Teams

    + +{#if form && !form.success} +
    Invalid action
    +{/if} + +
    +
    + {#if !deleting} + + {:else} + + {/if} + {#if !adding} + + {/if} +
    +
    + +{#if adding} +
    +
    Name
    + +
    +
    + + +
    +
    +
    +{/if} + +
    + {#each data.teams as team} +
    +
    +
    + {team.name} +
    +
    + {#if deleting} +
    +
    + + +
    +
    + {/if} +
    +
    +
    + {/each} +