Build Phase 2 judge vertical slice
This commit is contained in:
39
packages/contract/src/auth.ts
Normal file
39
packages/contract/src/auth.ts
Normal 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>
|
||||
@@ -1 +1,3 @@
|
||||
export * from "./auth"
|
||||
export * from "./problem"
|
||||
export * from "./submission"
|
||||
|
||||
@@ -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>
|
||||
|
||||
63
packages/contract/src/submission.ts
Normal file
63
packages/contract/src/submission.ts
Normal 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>
|
||||
Reference in New Issue
Block a user