重构版本状态为动态计算

- 状态不再写入数据库,改为查询时动态计算
- 每个应用的最新版 = 有效, 旧版 = 已失效
- 移除后端 status 筛选参数
- 移除前端 status 筛选器
- 移除编辑页的状态手动编辑
- 移除创建版本时自动更新旧版本状态的逻辑
This commit is contained in:
2026-05-08 16:40:02 +08:00
parent e2ebb6e46e
commit 01ca9e3df1
3 changed files with 28 additions and 47 deletions
+27 -12
View File
@@ -43,7 +43,6 @@ func handleGetAllVersions(c *gin.Context) {
applicationIDFilter := c.Query("application_id")
updateStrategyFilter := c.Query("update_strategy")
updateMethodFilter := c.Query("update_method")
statusFilter := c.Query("status")
searchFilter := c.Query("search")
var total int64
@@ -86,9 +85,6 @@ func handleGetAllVersions(c *gin.Context) {
if updateMethodFilter != "" {
countQuery = countQuery.Where("update_method = ?", updateMethodFilter)
}
if statusFilter != "" {
countQuery = countQuery.Where("status = ?", statusFilter)
}
if searchFilter != "" {
searchLower := strings.ToLower(searchFilter)
countQuery = countQuery.Where("LOWER(version) LIKE ? OR LOWER(description) LIKE ?", "%"+searchLower+"%", "%"+searchLower+"%")
@@ -105,9 +101,6 @@ func handleGetAllVersions(c *gin.Context) {
if updateMethodFilter != "" {
query = query.Where("update_method = ?", updateMethodFilter)
}
if statusFilter != "" {
query = query.Where("status = ?", statusFilter)
}
if searchFilter != "" {
searchLower := strings.ToLower(searchFilter)
query = query.Where("LOWER(version) LIKE ? OR LOWER(description) LIKE ?", "%"+searchLower+"%", "%"+searchLower+"%")
@@ -134,6 +127,17 @@ func handleGetAllVersions(c *gin.Context) {
log.Printf("[DEBUG] Version %d: ID=%d, ApplicationID=%d, Version=%s\n", i, v.ID, v.ApplicationID, v.Version)
}
latestVersionIDs := make(map[uint]uint)
var latestIDs []uint
database.DB.Model(&model.Version{}).
Where("application_id IN ?", appIDs).
Select("MAX(id)").
Group("application_id").
Pluck("MAX(id)", &latestIDs)
for _, id := range latestIDs {
latestVersionIDs[id] = id
}
type VersionWithAppName struct {
model.Version
ApplicationName string `json:"application_name"`
@@ -143,6 +147,11 @@ func handleGetAllVersions(c *gin.Context) {
for i, v := range versions {
appName := appNameMap[v.ApplicationID]
log.Printf("[DEBUG] Mapping version %d: ApplicationID=%d -> AppName=%s\n", i, v.ApplicationID, appName)
if _, isLatest := latestVersionIDs[v.ID]; isLatest {
v.Status = "active"
} else {
v.Status = "superseded"
}
result[i] = VersionWithAppName{
Version: v,
ApplicationName: appName,
@@ -178,6 +187,16 @@ func handleGetVersionByID(c *gin.Context) {
return
}
var latestID uint
database.DB.Model(&model.Version{}).
Where("application_id = ?", version.ApplicationID).
Select("MAX(id)").
Scan(&latestID)
computedStatus := "superseded"
if version.ID == latestID {
computedStatus = "active"
}
response.Success(c, gin.H{
"id": version.ID,
"application_id": version.ApplicationID,
@@ -192,7 +211,7 @@ func handleGetVersionByID(c *gin.Context) {
"update_method": version.UpdateMethod,
"min_version": version.MinVersion,
"changelog": version.Changelog,
"status": version.Status,
"status": computedStatus,
"base_version_id": version.BaseVersionID,
"files": version.Files,
"created_at": version.CreatedAt,
@@ -271,10 +290,6 @@ func handleCreateVersionGlobal(c *gin.Context) {
return
}
database.DB.Model(&model.Version{}).
Where("application_id = ? AND id != ? AND status = ?", req.ApplicationID, version.ID, "active").
Update("status", "superseded")
userIDPtr := &userID
versionIDPtr := &version.ID
service.CreateLog(service.LogParams{