Commit 9bcad46d authored by wycers's avatar wycers
Browse files

feedback content

parent b5fd4597
Loading
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
-- AlterTable
ALTER TABLE `SubmissionFeedback` ADD COLUMN `content` JSON NOT NULL;
+1 −0
Original line number Diff line number Diff line
@@ -223,6 +223,7 @@ model SubmissionFeedback {
  score           Int
  description     String @db.Text
  descriptionHTML String @db.Text
  content         Json   @default("[]")

  submission   Submission @relation(fields: [submissionId], references: [id])
  submissionId Int        @unique
+0 −1
Original line number Diff line number Diff line
@@ -4,7 +4,6 @@ import { log } from '$lib/server/log';
import { redirect, type Handle } from '@sveltejs/kit';

export const handle: Handle = async ({ event, resolve }) => {
	log.info(event.url.origin);
	const sessionId = event.cookies.get(lucia.sessionCookieName);
	if (!sessionId) {
		event.locals.user = null;
+17 −7
Original line number Diff line number Diff line
@@ -4,8 +4,6 @@ import { TaskStatus } from '@prisma/client'
import { error, json } from '@sveltejs/kit'
import _ from 'lodash'
import { z } from 'zod'
import { AnsiUp } from "ansi_up"
const ansi_up = new AnsiUp();


const schema = z.discriminatedUnion('status', [
@@ -112,7 +110,13 @@ export const PUT = async ({ request, params }) => {
                data: {
                    score: res.score,
                    description: "Compile Error",
                    descriptionHTML: ansi_up.ansi_to_html(res.compile.message),
                    descriptionHTML: "",
                    content: [
                        {
                            type: "ansi",
                            value: res.compile.message
                        }
                    ],
                    tasks: {
                        connect: [
                            {
@@ -144,10 +148,16 @@ export const PUT = async ({ request, params }) => {
            data: {
                score: res.score,
                description: res.status,
                descriptionHTML: JSON.stringify(_.entries(res.testcaseResult).map(([key, v]) => {
                descriptionHTML: "",
                content: [
                    {
                        type: "testcases",
                        value: _.entries(res.testcaseResult).map(([key, v]) => {
                            const { input, output, userOutput, userError, ...data } = v
                            return data
                })),
                        })
                    }
                ],
                tasks: {
                    connect: [
                        {
+55 −36
Original line number Diff line number Diff line
<script lang="ts" context="module">
	import { AnsiUp } from 'ansi_up';
	const ansi_up = new AnsiUp();
</script>

<script lang="ts">
	import * as Avatar from '$lib/components/ui/avatar';
	import * as Alert from '$lib/components/ui/alert';
@@ -14,6 +19,14 @@
	const { submission } = data;
	const { submitter, problem, feedback, task } = submission;
	const schema = z
		.discriminatedUnion('type', [
			z.object({
				type: z.literal('ansi'),
				value: z.string()
			}),
			z.object({
				type: z.literal('testcases'),
				value: z
					.object({
						status: z.string(),
						score: z.number(),
@@ -32,9 +45,11 @@
							})
							.or(z.string())
					})
					.array()
			})
		])
		.array();
	const result = schema.safeParse(JSON.parse(feedback?.descriptionHTML || '{}'));
	console.log(result);
	const result = schema.safeParse(feedback?.content || '[]');
</script>

<div class="h-full px-4 py-6 lg:px-8">
@@ -97,15 +112,21 @@
				<span class="text-sm text-muted-foreground">Submitted at {submission.createdAt} </span>
			</div>
		</div>
		{#if _.isNil(feedback)}
		{#if _.isNil(feedback) || !result.success}
			<Alert.Root>
				<Alert.Title>No submission feedback yet</Alert.Title>
				<!-- <Alert.Description></Alert.Description> -->
			</Alert.Root>
		{:else if result.success}
		{:else}
			<div>Score: {feedback.score}</div>
			{@const testcases = result.data}

			{#each result.data as item}
				{#if item.type === 'ansi'}
					<code class="whitespace-pre">
						{@html ansi_up.ansi_to_html(item.value)}
					</code>
				{:else}
					{@const testcases = item.value}
					<Accordion.Root>
						{#each testcases as testcase, i}
							<Accordion.Item value={`${i}`}>
@@ -116,10 +137,8 @@
							</Accordion.Item>
						{/each}
					</Accordion.Root>
		{:else}
			<code class="whitespace-pre">
				{@html feedback.descriptionHTML}
			</code>
				{/if}
			{/each}
		{/if}

		<div class="rounded border">
Loading