Skip to content

[Bug](publish): re-uploading a rejected version with the same version returns 500 #596

Description

@Phil-OSophy-42

问题描述

Skill 版本审核被驳回后,使用相同版本号重新上传会返回 HTTP 500,无法创建新的待审核版本。

复现步骤

  1. 发布一个非 PRIVATE 的 Skill,版本号为 1.0.0
  2. 等待安全扫描完成,版本进入 PENDING_REVIEW
  3. 管理员驳回审核,使版本状态变为 REJECTED
  4. 使用相同 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 后,应成功创建新的版本并进入扫描/待审核流程。

Metadata

Metadata

Assignees

No one assigned

    Labels

    effort/l大改动或高风险改动,需要 maintainer 负责 / Large or risky change requiring maintainer ownership.priority/p2中优先级 / Medium priority triage bucket.triage/needs-info需要补充更多信息后才能分流 / Issue needs more detail before it can be routed.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions