Build Phase 2 judge vertical slice

This commit is contained in:
2026-08-06 22:42:39 -06:00
parent e6329ecabb
commit ec274419c3
41 changed files with 2945 additions and 669 deletions

View File

@@ -0,0 +1,39 @@
import { z } from "zod"
export const loginRequestSchema = z.object({
username: z.string().trim().min(1).max(150),
password: z.string().min(1).max(1024),
})
export const sessionUserSchema = z.object({
id: z.number().int(),
username: z.string(),
email: z.string().nullable(),
adminType: z.string(),
problemPermission: z.string(),
createTime: z.string().nullable(),
lastLogin: z.string().nullable(),
openApi: z.boolean(),
isDisabled: z.boolean(),
className: z.string().nullable(),
})
export const userProfileSchema = z.object({
id: z.number().int(),
user: sessionUserSchema,
realName: z.string().nullable(),
acmProblemsStatus: z.record(z.string(), z.unknown()),
avatar: z.string(),
blog: z.string().nullable(),
mood: z.string().nullable(),
github: z.string().nullable(),
school: z.string().nullable(),
major: z.string().nullable(),
language: z.string().nullable(),
acceptedNumber: z.number().int(),
submissionNumber: z.number().int(),
})
export type LoginRequest = z.infer<typeof loginRequestSchema>
export type SessionUser = z.infer<typeof sessionUserSchema>
export type UserProfile = z.infer<typeof userProfileSchema>

View File

@@ -1 +1,3 @@
export * from "./auth"
export * from "./problem"
export * from "./submission"

View File

@@ -11,3 +11,50 @@ export const problemSummarySchema = z.object({
})
export type ProblemSummary = z.infer<typeof problemSummarySchema>
export const problemDetailSchema = z.object({
id: z.number().int(),
_id: z.string(),
title: z.string(),
description: z.string(),
inputDescription: z.string(),
outputDescription: z.string(),
samples: z.array(
z.object({
input: z.string(),
output: z.string(),
}),
),
hint: z.string().nullable(),
languages: z.array(z.string()),
template: z.record(z.string(), z.string()),
createTime: z.string(),
lastUpdateTime: z.string().nullable(),
timeLimit: z.number().int(),
memoryLimit: z.number().int(),
difficulty: z.string(),
source: z.string().nullable(),
prompt: z.string().nullable(),
submissionNumber: z.number().int(),
acceptedNumber: z.number().int(),
statisticInfo: z.record(z.string(), z.unknown()),
shareSubmission: z.boolean(),
contestId: z.number().int().nullable(),
tags: z.array(z.string()),
createdBy: z.object({
id: z.number().int(),
username: z.string(),
realName: z.string().nullable(),
}),
myStatus: z.number().int().nullable(),
myFailedCount: z.number().int(),
allowFlowchart: z.boolean(),
showFlowchart: z.boolean(),
mermaidCode: z.string().nullable(),
flowchartData: z.record(z.string(), z.unknown()).nullable(),
flowchartHint: z.string().nullable(),
sqlConfig: z.record(z.string(), z.unknown()).nullable(),
sqlDisplay: z.record(z.string(), z.unknown()).nullable(),
})
export type ProblemDetail = z.infer<typeof problemDetailSchema>

View File

@@ -0,0 +1,63 @@
import { z } from "zod"
export const judgeStatusSchema = z.union([
z.literal(-2),
z.literal(-1),
z.literal(0),
z.literal(1),
z.literal(2),
z.literal(3),
z.literal(4),
z.literal(5),
z.literal(6),
z.literal(7),
z.literal(8),
z.literal(10),
])
export const createSubmissionRequestSchema = z.object({
problemId: z.number().int().positive(),
language: z.string().min(1).max(32),
code: z.string().min(1).max(1024 * 1024),
contestId: z.number().int().positive().optional(),
})
export const createSubmissionResponseSchema = z.object({
submissionId: z.string(),
})
export const submissionDetailSchema = z.object({
id: z.string(),
createTime: z.string(),
userId: z.number().int(),
username: z.string(),
code: z.string(),
result: judgeStatusSchema,
info: z.unknown(),
language: z.string(),
shared: z.boolean(),
statisticInfo: z.record(z.string(), z.unknown()),
ip: z.string().nullable(),
contestId: z.number().int().nullable(),
problemId: z.number().int(),
showLink: z.boolean(),
canUnshare: z.boolean(),
})
export const submissionUpdateSchema = z.object({
type: z.literal("submission_update"),
submission_id: z.string(),
result: judgeStatusSchema,
status: z.enum(["pending", "judging", "finished", "error"]),
time_cost: z.number().optional(),
memory_cost: z.number().optional(),
score: z.number().optional(),
err_info: z.string().optional(),
})
export type JudgeStatus = z.infer<typeof judgeStatusSchema>
export type CreateSubmissionRequest = z.infer<
typeof createSubmissionRequestSchema
>
export type SubmissionDetail = z.infer<typeof submissionDetailSchema>
export type SubmissionUpdate = z.infer<typeof submissionUpdateSchema>