refactor(契约): 前端 60 个写请求的请求体接上契约类型,前后端对不上编译期就报
Deploy / deploy (push) Canceled after 0s

- 前端 oj/api.ts、admin/api.ts、shared/api.ts 的 post / put 请求体一律 `satisfies XxxRequest`,
  只在编译期检查,不加运行时校验(和「只在三处挂运行时闸门」的规矩一致)
- 契约里的 XxxRequest 从 z.infer 改成 z.input:请求类型描述的是「客户端可以发什么」,
  带默认值的字段可以不传。后端从不用这些类型(它用 parse 出来的 data),不受影响
- 补了四个漏导出的请求类型(比赛题目排序、题单题目排序、标签分类、检查用户名)
- 接上之后对不上的几处:编辑用户的角色和题目权限经 toAdminType / toProblemPermission
  收窄,导入用户的行改成四元组,练习题数据改成 Record,格式化的语言只收后端认的四种
  (isFormatLanguage)。出题页和成就的请求体是「表单校验兜底、出站补默认值」,
  用 Partial<…> 只核键名和值的类型

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
xuyueandClaude Opus 5.5 committed 2026-10-16 15:03:58 +08:00
1 parent 309ca0ece2
commit 4dfd14f95b
18 files changed
+251 -131

No files matched your search

+44 -41
View File
@@ -1118,7 +1118,7 @@ export type AchievementMetric = z.infer<typeof achievementMetricSchema>
export type AdminProblem = z.infer<typeof adminProblemSchema>
export type AdminProblemListItem = z.infer<typeof adminProblemListItemSchema>
export type AdminProblemList = z.infer<typeof adminProblemListSchema>
export type CreateProblemRequest = z.infer<typeof createProblemRequestSchema>
export type CreateProblemRequest = z.input<typeof createProblemRequestSchema>
export type AdminContest = z.infer<typeof adminContestSchema>
export type AdminContestList = z.infer<typeof adminContestListSchema>
@@ -1153,67 +1153,70 @@ export type BatchProblemTagResponse = z.infer<typeof batchProblemTagResponseSche
export type SqlTestCaseScript = z.infer<typeof sqlTestCaseScriptSchema>
export type GenerateSqlTestCaseResponse = z.infer<typeof generateSqlTestCaseResponseSchema>
export type TestCaseFiles = z.infer<typeof testCaseFilesSchema>
export type AstCheckRequest = z.infer<typeof astCheckRequestSchema>
export type AstCheckRequest = z.input<typeof astCheckRequestSchema>
export type AstCheckResponse = z.infer<typeof astCheckResponseSchema>
export type GenerateTestInputsRequest = z.infer<typeof generateTestInputsRequestSchema>
export type GenerateTestInputsRequest = z.input<typeof generateTestInputsRequestSchema>
export type GenerateTestInputsResponse = z.infer<typeof generateTestInputsResponseSchema>
export type AdminAnnouncementList = z.infer<typeof adminAnnouncementListSchema>
export type CreateAnnouncementRequest = z.infer<typeof createAnnouncementRequestSchema>
export type UpdateAnnouncementRequest = z.infer<typeof updateAnnouncementRequestSchema>
export type CreateAnnouncementRequest = z.input<typeof createAnnouncementRequestSchema>
export type UpdateAnnouncementRequest = z.input<typeof updateAnnouncementRequestSchema>
export type TutorialType = z.infer<typeof tutorialTypeSchema>
export type AdminTutorial = z.infer<typeof adminTutorialSchema>
export type AdminTutorialListItem = z.infer<typeof adminTutorialListItemSchema>
export type AdminTutorialGroups = z.infer<typeof adminTutorialGroupsSchema>
export type AdminTutorialProblem = z.infer<typeof adminTutorialProblemSchema>
export type TutorialProblemCandidate = z.infer<typeof tutorialProblemCandidateSchema>
export type SetTutorialProblemsRequest = z.infer<typeof setTutorialProblemsRequestSchema>
export type ReorderTutorialsRequest = z.infer<typeof reorderTutorialsRequestSchema>
export type RenameTutorialProjectRequest = z.infer<typeof renameTutorialProjectRequestSchema>
export type CreateTutorialRequest = z.infer<typeof createTutorialRequestSchema>
export type UpdateTutorialRequest = z.infer<typeof updateTutorialRequestSchema>
export type SetTutorialVisibilityRequest = z.infer<typeof setTutorialVisibilityRequestSchema>
export type SetTutorialProblemsRequest = z.input<typeof setTutorialProblemsRequestSchema>
export type ReorderTutorialsRequest = z.input<typeof reorderTutorialsRequestSchema>
export type RenameTutorialProjectRequest = z.input<typeof renameTutorialProjectRequestSchema>
export type CreateTutorialRequest = z.input<typeof createTutorialRequestSchema>
export type UpdateTutorialRequest = z.input<typeof updateTutorialRequestSchema>
export type SetTutorialVisibilityRequest = z.input<typeof setTutorialVisibilityRequestSchema>
export type ExerciseType = z.infer<typeof exerciseTypeSchema>
export type AdminExercise = z.infer<typeof adminExerciseSchema>
export type CreateExerciseRequest = z.infer<typeof createExerciseRequestSchema>
export type UpdateExerciseRequest = z.infer<typeof updateExerciseRequestSchema>
export type CreateExerciseRequest = z.input<typeof createExerciseRequestSchema>
export type UpdateExerciseRequest = z.input<typeof updateExerciseRequestSchema>
export type ToggleAiReportPinResponse = z.infer<typeof toggleAiReportPinResponseSchema>
export type AchievementOperator = z.infer<typeof achievementOperatorSchema>
export type CreateAchievementRequest = z.infer<typeof createAchievementRequestSchema>
export type UpdateAchievementRequest = z.infer<typeof updateAchievementRequestSchema>
export type UpdateUserRequest = z.infer<typeof updateUserRequestSchema>
export type ImportUsersRequest = z.infer<typeof importUsersRequestSchema>
export type DeleteUsersRequest = z.infer<typeof deleteUsersRequestSchema>
export type CreateAchievementRequest = z.input<typeof createAchievementRequestSchema>
export type UpdateAchievementRequest = z.input<typeof updateAchievementRequestSchema>
export type UpdateUserRequest = z.input<typeof updateUserRequestSchema>
export type ImportUsersRequest = z.input<typeof importUsersRequestSchema>
export type DeleteUsersRequest = z.input<typeof deleteUsersRequestSchema>
export type ResetPasswordResponse = z.infer<typeof resetPasswordResponseSchema>
export type UpdateWebsiteConfigRequest = z.infer<typeof updateWebsiteConfigRequestSchema>
export type UpdateJudgeServerRequest = z.infer<typeof updateJudgeServerRequestSchema>
export type UpdateWebsiteConfigRequest = z.input<typeof updateWebsiteConfigRequestSchema>
export type UpdateJudgeServerRequest = z.input<typeof updateJudgeServerRequestSchema>
export type UploadImageResponse = z.infer<typeof uploadImageResponseSchema>
export type CreateContestRequest = z.infer<typeof createContestRequestSchema>
export type UpdateContestRequest = z.infer<typeof updateContestRequestSchema>
export type UpdateAcmHelperRequest = z.infer<typeof updateAcmHelperRequestSchema>
export type CreateContestRequest = z.input<typeof createContestRequestSchema>
export type UpdateContestRequest = z.input<typeof updateContestRequestSchema>
export type UpdateAcmHelperRequest = z.input<typeof updateAcmHelperRequestSchema>
export type AdminProblemSet = z.infer<typeof adminProblemSetSchema>
export type AdminProblemSetList = z.infer<typeof adminProblemSetListSchema>
export type CreateProblemSetRequest = z.infer<typeof createProblemSetRequestSchema>
export type UpdateProblemSetRequest = z.infer<typeof updateProblemSetRequestSchema>
export type CreateProblemSetRequest = z.input<typeof createProblemSetRequestSchema>
export type UpdateProblemSetRequest = z.input<typeof updateProblemSetRequestSchema>
export type AdminProblemSetProblem = z.infer<typeof adminProblemSetProblemSchema>
export type AddProblemsToSetRequest = z.infer<typeof addProblemsToSetRequestSchema>
export type AddProblemsToSetRequest = z.input<typeof addProblemsToSetRequestSchema>
export type AddProblemsToSetResult = z.infer<typeof addProblemsToSetResultSchema>
export type ReorderProblemSetProblemsRequest = z.infer<
export type UpdateProblemInSetRequest = z.input<typeof updateProblemInSetRequestSchema>
export type AdminProblemSetBadge = z.infer<typeof adminProblemSetBadgeSchema>
export type CreateProblemSetBadgeRequest = z.input<typeof createProblemSetBadgeRequestSchema>
export type UpdateProblemSetBadgeRequest = z.input<typeof updateProblemSetBadgeRequestSchema>
export type RenameTagRequest = z.input<typeof renameTagRequestSchema>
export type BatchProblemTagRequest = z.input<typeof batchProblemTagRequestSchema>
export type BatchProblemVisibleRequest = z.input<typeof batchProblemVisibleRequestSchema>
export type GenerateFlowchartRequest = z.input<typeof generateFlowchartRequestSchema>
export type GenerateFlowchartResponse = z.infer<typeof generateFlowchartResponseSchema>
export type UpdateProblemRequest = z.input<typeof updateProblemRequestSchema>
export type MakeProblemPublicRequest = z.input<typeof makeProblemPublicRequestSchema>
export type AddContestProblemRequest = z.input<typeof addContestProblemRequestSchema>
export type ReorderContestProblemsRequest = z.input<typeof reorderContestProblemsRequestSchema>
export type ReorderProblemSetProblemsRequest = z.input<
typeof reorderProblemSetProblemsRequestSchema
>
export type UpdateProblemInSetRequest = z.infer<typeof updateProblemInSetRequestSchema>
export type AdminProblemSetBadge = z.infer<typeof adminProblemSetBadgeSchema>
export type CreateProblemSetBadgeRequest = z.infer<typeof createProblemSetBadgeRequestSchema>
export type UpdateProblemSetBadgeRequest = z.infer<typeof updateProblemSetBadgeRequestSchema>
export type RenameTagRequest = z.infer<typeof renameTagRequestSchema>
export type BatchProblemTagRequest = z.infer<typeof batchProblemTagRequestSchema>
export type BatchProblemVisibleRequest = z.infer<typeof batchProblemVisibleRequestSchema>
export type GenerateFlowchartRequest = z.infer<typeof generateFlowchartRequestSchema>
export type GenerateFlowchartResponse = z.infer<typeof generateFlowchartResponseSchema>
export type UpdateProblemRequest = z.infer<typeof updateProblemRequestSchema>
export type MakeProblemPublicRequest = z.infer<typeof makeProblemPublicRequestSchema>
export type AddContestProblemRequest = z.infer<typeof addContestProblemRequestSchema>
export type SetTagCategoryRequest = z.input<typeof setTagCategoryRequestSchema>
export type CheckUsernamesRequest = z.input<typeof checkUsernamesRequestSchema>
export type TestCaseEntry = z.infer<typeof testCaseEntrySchema>
export type UploadTestCaseResponse = z.infer<typeof uploadTestCaseResponseSchema>
export type SqlPreviewRequest = z.infer<typeof sqlPreviewRequestSchema>
export type GenerateSqlTestCaseRequest = z.infer<typeof generateSqlTestCaseRequestSchema>
export type SqlPreviewRequest = z.input<typeof sqlPreviewRequestSchema>
export type GenerateSqlTestCaseRequest = z.input<typeof generateSqlTestCaseRequestSchema>