refactor(题单): 难度、状态、分数、提示、总分、百分比和 problemset_submission 表不再读写,先补默认值、下一步再删
Deploy / deploy (push) Canceled after 0s

机房和服务器共用一个库、不一定同时升级,所以分两步退役:0027 只给还非空的几列补默认值,
新代码插行不用再填、没升级的那边照旧能跑;两个站点都换上新代码后,再单独一条迁移删列删表
(要手工放行破坏性迁移,语句写在 0027 的注释里)。

进度算法随之去掉分数和百分比,判题记进度不再往 problemset_submission 写一行(从来没人读)。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
xuyueandClaude Opus 5.5 committed 2026-10-09 22:08:15 +08:00
1 parent c17f88cdbb
commit 646c57c748
10 files changed
+3952 -181

No files matched your search

+2 -25
View File
@@ -192,9 +192,6 @@ adminProblemSetRoutes.post("/problem-sets", requireTeacher, async (c) => {
description: parsed.data.description,
visible: parsed.data.visible,
...period,
// 难度、状态两列还在表里、非空,但已经不用了(见契约 admin.ts 的说明)
difficulty: "Easy",
status: "active",
createdById: c.get("user")!.id,
createTime: now,
lastUpdateTime: now,
@@ -322,14 +319,7 @@ adminProblemSetRoutes.post("/problem-sets/:id/problems", requireTeacher, async (
else {
inSet.add(problem.id)
order += 1
// 分数、提示两列还在表里但已经不用了:score 非空给 0
values.push({
problemsetId: row.id,
problemId: problem.id,
order,
isRequired: true,
score: 0,
})
values.push({ problemsetId: row.id, problemId: problem.id, order, isRequired: true })
result.added.push(problem.displayId)
}
}
@@ -400,21 +390,8 @@ adminProblemSetRoutes.delete("/problem-sets/:id/problems/:itemId", requireTeache
eq(schema.problemsetProblem.problemsetId, row.id),
),
)
.returning({
id: schema.problemsetProblem.id,
problemId: schema.problemsetProblem.problemId,
})
.returning({ id: schema.problemsetProblem.id })
if (deleted.length === 0) return failure(c, 404, "problem-not-in-set", "题目不在该题单中")
// 这道题在本题单里的提交记录也要清掉,对齐旧栈 problemset/signals.py 的 post_delete。
// 不清的话 problemset_submission 会一直攒指向已移出题单的孤儿行。
await db
.delete(schema.problemsetSubmission)
.where(
and(
eq(schema.problemsetSubmission.problemsetId, row.id),
eq(schema.problemsetSubmission.problemId, deleted[0]!.problemId),
),
)
await resyncProgress(row.id)
return success(c, null)
})
-1
View File
@@ -368,7 +368,6 @@ problemsetRoutes.post("/problem-set-progress", requireAuth, async (c) => {
const links = await tx
.select({
problemId: schema.problemsetProblem.problemId,
score: schema.problemsetProblem.score,
isRequired: schema.problemsetProblem.isRequired,
})
.from(schema.problemsetProblem)