问题描述
Skill 版本审核被驳回后,使用相同版本号重新上传会返回 HTTP 500,无法创建新的待审核版本。
复现步骤
- 发布一个非 PRIVATE 的 Skill,版本号为
1.0.0。
- 等待安全扫描完成,版本进入
PENDING_REVIEW。
- 管理员驳回审核,使版本状态变为
REJECTED。
- 使用相同 Skill 包、相同版本号
1.0.0 再次上传。
实际结果
第二次上传返回 HTTP 500:
{
"code": 500,
"msg": "An unexpected error occurred"
}
原 REJECTED 版本仍保留,未创建新的版本记录。
期望结果
如果产品语义允许驳回版本复用版本号,则应删除/替换旧的可替换版本,并创建新的待审核版本。
若不允许复用,则应返回明确的业务错误,例如“请先删除被驳回版本或使用新的版本号”,而不是 HTTP 500。
根因分析
SkillPublishService.deleteReplaceableVersionArtifacts 在覆盖非 PUBLISHED 的旧版本时,只会删除状态为 PENDING 的 review_task:
reviewTaskRepository.findBySkillVersionIdAndStatus(version.getId(), ReviewTaskStatus.PENDING)
.ifPresent(reviewTaskRepository::delete);
但审核驳回后,关联的 review_task 状态已变为 REJECTED,该记录仍通过外键引用旧 skill_version。随后删除旧版本时触发数据库外键约束异常,最终被包装为 HTTP 500。
修复建议
若保持“驳回版本可被同版本号重传覆盖”的语义,应在删除旧 skill_version 前清理该版本关联的全部 review task,而不是只删除 PENDING 状态的任务,例如使用:
reviewTaskRepository.deleteBySkillVersionIdIn(List.of(version.getId()));
同时补充回归测试:REJECTED 状态的 1.0.0 重新上传 1.0.0 后,应成功创建新的版本并进入扫描/待审核流程。
问题描述
Skill 版本审核被驳回后,使用相同版本号重新上传会返回 HTTP 500,无法创建新的待审核版本。
复现步骤
1.0.0。PENDING_REVIEW。REJECTED。1.0.0再次上传。实际结果
第二次上传返回 HTTP 500:
{ "code": 500, "msg": "An unexpected error occurred" }原 REJECTED 版本仍保留,未创建新的版本记录。
期望结果
如果产品语义允许驳回版本复用版本号,则应删除/替换旧的可替换版本,并创建新的待审核版本。
若不允许复用,则应返回明确的业务错误,例如“请先删除被驳回版本或使用新的版本号”,而不是 HTTP 500。
根因分析
SkillPublishService.deleteReplaceableVersionArtifacts 在覆盖非 PUBLISHED 的旧版本时,只会删除状态为 PENDING 的 review_task:
reviewTaskRepository.findBySkillVersionIdAndStatus(version.getId(), ReviewTaskStatus.PENDING)
.ifPresent(reviewTaskRepository::delete);
但审核驳回后,关联的 review_task 状态已变为 REJECTED,该记录仍通过外键引用旧 skill_version。随后删除旧版本时触发数据库外键约束异常,最终被包装为 HTTP 500。
修复建议
若保持“驳回版本可被同版本号重传覆盖”的语义,应在删除旧 skill_version 前清理该版本关联的全部 review task,而不是只删除 PENDING 状态的任务,例如使用:
reviewTaskRepository.deleteBySkillVersionIdIn(List.of(version.getId()));
同时补充回归测试:REJECTED 状态的 1.0.0 重新上传 1.0.0 后,应成功创建新的版本并进入扫描/待审核流程。