feat: 添加补丁版本基础版本选择功能

- 添加基础版本下拉选择器,仅在补丁更新类型时显示
- 添加应用和更新类型的 watch 监听,自动获取全量版本列表
- 提交时传递 base_version_id 参数
- 添加调试日志便于排查问题

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-02 22:48:22 +08:00
parent 026581ea60
commit ad58d2220e
4 changed files with 133 additions and 31 deletions
+37 -24
View File
@@ -272,6 +272,7 @@ type CreateVersionRequest struct {
CustomDownloadURL string `json:"custom_download_url"`
Description string `json:"description"`
Changelog string `json:"changelog"`
BaseVersionID *uint `json:"base_version_id"`
}
func handleCreateVersionGlobal(c *gin.Context) {
@@ -360,36 +361,47 @@ func handleCreateVersionGlobal(c *gin.Context) {
}
} else if version.UpdateType == "patch" {
// 补丁包:需要找到基础全量包并合并
var lastFullVersion model.Version
if err := database.DB.Where("application_id = ? AND update_type = ?", req.ApplicationID, "full").
Order("id DESC").First(&lastFullVersion).Error; err == nil {
version.BaseVersionID = &lastFullVersion.ID
var baseVersion model.Version
// 获取基础版本的全量包路径,如果没有则使用 FilePath
baseFullPackagePath := lastFullVersion.FullPackagePath
if baseFullPackagePath == "" {
baseFullPackagePath = lastFullVersion.FilePath
}
// 合并生成新的全量包
fullPkgPath, fullPkgSize, fullPkgHash, err := MergePatchWithFullPackage(
baseFullPackagePath,
req.FilePath,
req.ApplicationID,
)
if err != nil {
log.Printf("[ERROR] Failed to merge patch with full package: %v\n", err)
response.Error(c, 500, "合并补丁包失败: "+err.Error())
// 优先使用传入的 base_version_id
if req.BaseVersionID != nil {
if err := database.DB.Where("id = ? AND application_id = ? AND update_type = ?",
*req.BaseVersionID, req.ApplicationID, "full").First(&baseVersion).Error; err != nil {
response.Error(c, 400, "指定的基础版本不存在或不是全量版本")
return
}
version.FullPackagePath = fullPkgPath
version.FullPackageSize = fullPkgSize
version.FullPackageHash = fullPkgHash
} else {
response.Error(c, 400, "找不到基础全量包,无法创建补丁版本")
// 未指定基础版本,使用最新的全量版本
if err := database.DB.Where("application_id = ? AND update_type = ?", req.ApplicationID, "full").
Order("id DESC").First(&baseVersion).Error; err != nil {
response.Error(c, 400, "找不到基础全量包,无法创建补丁版本")
return
}
}
version.BaseVersionID = &baseVersion.ID
// 获取基础版本的全量包路径,如果没有则使用 FilePath
baseFullPackagePath := baseVersion.FullPackagePath
if baseFullPackagePath == "" {
baseFullPackagePath = baseVersion.FilePath
}
// 合并生成新的全量包
fullPkgPath, fullPkgSize, fullPkgHash, err := MergePatchWithFullPackage(
baseFullPackagePath,
req.FilePath,
req.ApplicationID,
)
if err != nil {
log.Printf("[ERROR] Failed to merge patch with full package: %v\n", err)
response.Error(c, 500, "合并补丁包失败: "+err.Error())
return
}
version.FullPackagePath = fullPkgPath
version.FullPackageSize = fullPkgSize
version.FullPackageHash = fullPkgHash
}
if err := database.DB.Create(&version).Error; err != nil {
@@ -425,6 +437,7 @@ type UpdateVersionRequest struct {
CustomDownloadURL string `json:"custom_download_url"`
Description string `json:"description"`
Changelog string `json:"changelog"`
BaseVersionID *uint `json:"base_version_id"`
}
func handleUpdateVersionGlobal(c *gin.Context) {