feat(阶段3): oj 侧端点铺开(基线提交,未经评审)
由外部 agent (Codex) 在本会话额度中断期间完成。原样提交作为基线, 后续修复单独成 commit,便于区分与回退。 覆盖 oj 侧 65 个端点,新增 9 组路由(account/achievement/ai/classroom/ content/contest/flowchart/problemset/site)与对应 Zod 契约。 已核验:tsc --noEmit 退出码 0;API 可启动;/api/problems 返回真实数据; judge 与 flowchart worker 均 ready。 未核验:权限边界与数据泄露,评审进行中。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
74
packages/contract/src/content.ts
Normal file
74
packages/contract/src/content.ts
Normal file
@@ -0,0 +1,74 @@
|
||||
import { z } from "zod"
|
||||
|
||||
import { paginatedSchema, sampleUserSchema } from "./common"
|
||||
import { submissionDetailSchema } from "./submission"
|
||||
|
||||
export const announcementSchema = z.object({
|
||||
id: z.number().int(),
|
||||
title: z.string(),
|
||||
tag: z.string(),
|
||||
content: z.string().optional(),
|
||||
top: z.boolean(),
|
||||
createdBy: sampleUserSchema,
|
||||
createTime: z.string(),
|
||||
lastUpdateTime: z.string(),
|
||||
})
|
||||
|
||||
export const announcementListSchema = paginatedSchema(announcementSchema)
|
||||
|
||||
export const messageSchema = z.object({
|
||||
id: z.number().int(),
|
||||
sender: sampleUserSchema,
|
||||
createTime: z.string(),
|
||||
message: z.string(),
|
||||
submission: submissionDetailSchema,
|
||||
})
|
||||
|
||||
export const messageListSchema = paginatedSchema(messageSchema)
|
||||
|
||||
export const createMessageRequestSchema = z.object({
|
||||
recipientId: z.number().int().positive(),
|
||||
submissionId: z.string().min(1),
|
||||
message: z.string().min(1).max(1024 * 1024),
|
||||
})
|
||||
|
||||
export const reactionKeySchema = z.enum([
|
||||
"too_easy",
|
||||
"too_hard",
|
||||
"confusing",
|
||||
"buggy",
|
||||
"learned",
|
||||
"interesting",
|
||||
"want_explain",
|
||||
])
|
||||
|
||||
export const reactionCountsSchema = z.record(reactionKeySchema, z.number().int())
|
||||
export const reactionStateSchema = z.object({
|
||||
mine: reactionKeySchema.nullable(),
|
||||
counts: reactionCountsSchema.nullable(),
|
||||
})
|
||||
|
||||
export const setReactionRequestSchema = z.object({ type: reactionKeySchema })
|
||||
|
||||
export const tutorialSummarySchema = z.object({
|
||||
id: z.number().int(),
|
||||
title: z.string(),
|
||||
})
|
||||
|
||||
export const tutorialSchema = tutorialSummarySchema.extend({
|
||||
content: z.string(),
|
||||
code: z.string().nullable(),
|
||||
isPublic: z.boolean(),
|
||||
order: z.number().int(),
|
||||
type: z.enum(["python", "c"]),
|
||||
createdBy: sampleUserSchema,
|
||||
createdAt: z.string(),
|
||||
updatedAt: z.string(),
|
||||
})
|
||||
|
||||
export const exerciseSchema = z.object({
|
||||
id: z.number().int(),
|
||||
type: z.enum(["mcq", "sort", "fill", "match", "predict", "debug", "group"]),
|
||||
data: z.record(z.string(), z.unknown()),
|
||||
order: z.number().int(),
|
||||
})
|
||||
Reference in New Issue
Block a user