重构版本状态为动态计算
- 状态不再写入数据库,改为查询时动态计算 - 每个应用的最新版 = 有效, 旧版 = 已失效 - 移除后端 status 筛选参数 - 移除前端 status 筛选器 - 移除编辑页的状态手动编辑 - 移除创建版本时自动更新旧版本状态的逻辑
This commit is contained in:
@@ -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{
|
||||
|
||||
Reference in New Issue
Block a user