From 4b644e272eb5871b604a84d3345c1678e054aa78 Mon Sep 17 00:00:00 2001 From: duorameng <2997944583@qq.com> Date: Sat, 18 Apr 2026 13:04:53 +0800 Subject: [PATCH] chore: trt to fix restore bool val #70 --- internal/controllers/agent_controller.go | 8 ++++---- internal/controllers/env_controller.go | 6 +++--- internal/controllers/task_controller.go | 2 +- internal/models/agent.go | 4 ++-- internal/models/env.go | 4 ++-- internal/models/notify_way.go | 2 +- internal/models/task.go | 2 +- internal/models/vo/agent_vo.go | 5 +++-- internal/models/vo/sys_vo.go | 5 +++-- internal/models/vo/task_vo.go | 3 ++- internal/services/agent_service.go | 14 +++++++------- internal/services/env_service.go | 14 +++++++------- internal/services/notification_service.go | 10 +++++----- internal/services/tasks/executor_service.go | 6 +++--- internal/services/tasks/ql_repo_parser.go | 4 ++-- internal/services/tasks/task_service.go | 4 ++-- internal/utils/pointer.go | 14 ++++++++++++++ 17 files changed, 62 insertions(+), 45 deletions(-) create mode 100644 internal/utils/pointer.go diff --git a/internal/controllers/agent_controller.go b/internal/controllers/agent_controller.go index ede7e08..0f15160 100644 --- a/internal/controllers/agent_controller.go +++ b/internal/controllers/agent_controller.go @@ -72,7 +72,7 @@ func (c *AgentController) Update(ctx *gin.Context) { utils.NotFound(ctx, "Agent 不存在") return } - wasEnabled := oldAgent.Enabled + wasEnabled := utils.DerefBool(oldAgent.Enabled, true) if err := c.agentService.Update(id, req.Name, req.Description, req.Enabled); err != nil { utils.ServerError(ctx, err.Error()) @@ -233,7 +233,7 @@ func (c *AgentController) GetTasks(ctx *gin.Context) { return } - if !agent.Enabled { + if !utils.DerefBool(agent.Enabled, true) { utils.Forbidden(ctx, "Agent 已禁用") return } @@ -259,7 +259,7 @@ func (c *AgentController) ReportResult(ctx *gin.Context) { return } - if !agent.Enabled { + if !utils.DerefBool(agent.Enabled, true) { utils.Forbidden(ctx, "Agent 已禁用") return } @@ -393,7 +393,7 @@ func (c *AgentController) WSConnect(ctx *gin.Context) { logger.Infof("[AgentWS] 注册成功: Agent #%s, isNew=%v", agent.ID, isNewAgent) } - if !agent.Enabled { + if !utils.DerefBool(agent.Enabled, true) { c.wsManager.RecordConnectFail(ip) logger.Warnf("[AgentWS] Agent #%s 已禁用, IP=%s", agent.ID, ip) ctx.JSON(http.StatusForbidden, gin.H{"error": "Agent 已禁用"}) diff --git a/internal/controllers/env_controller.go b/internal/controllers/env_controller.go index eba9f04..e81bd82 100644 --- a/internal/controllers/env_controller.go +++ b/internal/controllers/env_controller.go @@ -183,15 +183,15 @@ func (ec *EnvController) UpdateEnvVar(c *gin.Context) { hidden := existing.Hidden if req.Hidden != nil { - hidden = *req.Hidden + hidden = req.Hidden } enabled := existing.Enabled if req.Enabled != nil { - enabled = *req.Enabled + enabled = req.Enabled } - envVar := ec.envService.UpdateEnvVar(id, req.Name, req.Value, req.Remark, req.Type, hidden, enabled) + envVar := ec.envService.UpdateEnvVar(id, req.Name, req.Value, req.Remark, req.Type, utils.DerefBool(hidden, true), utils.DerefBool(enabled, true)) if envVar == nil { utils.NotFound(c, "环境变量不存在") return diff --git a/internal/controllers/task_controller.go b/internal/controllers/task_controller.go index 59f7285..e5ba995 100644 --- a/internal/controllers/task_controller.go +++ b/internal/controllers/task_controller.go @@ -287,7 +287,7 @@ func (tc *TaskController) UpdateTask(c *gin.Context) { } } else { // 本地任务 - if task.Enabled { + if utils.DerefBool(task.Enabled, true) { tc.executorService.AddCronTask(task) } else { tc.executorService.RemoveCronTask(task.ID) diff --git a/internal/models/agent.go b/internal/models/agent.go index a213309..e9741d8 100644 --- a/internal/models/agent.go +++ b/internal/models/agent.go @@ -20,7 +20,7 @@ type Agent struct { OS string `json:"os" gorm:"size:20"` // 操作系统 Arch string `json:"arch" gorm:"size:20"` // 架构 ForceUpdate bool `json:"force_update" gorm:"default:false"` // 强制更新标志 - Enabled bool `json:"enabled" gorm:"default:true"` // 是否启用 + Enabled *bool `json:"enabled" gorm:"default:true"` // 是否启用 CreatedAt LocalTime `json:"created_at"` UpdatedAt LocalTime `json:"updated_at"` } @@ -37,7 +37,7 @@ type AgentToken struct { MaxUses int `json:"max_uses" gorm:"default:0"` // 最大使用次数,0 表示无限制 UsedCount int `json:"used_count" gorm:"default:0"` // 已使用次数 ExpiresAt *LocalTime `json:"expires_at"` // 过期时间,null 表示永不过期 - Enabled bool `json:"enabled" gorm:"default:true"` // 是否启用 + Enabled *bool `json:"enabled" gorm:"default:true"` // 是否启用 CreatedAt LocalTime `json:"created_at"` UpdatedAt LocalTime `json:"updated_at"` } diff --git a/internal/models/env.go b/internal/models/env.go index 1ec6475..cc46116 100644 --- a/internal/models/env.go +++ b/internal/models/env.go @@ -11,8 +11,8 @@ type EnvironmentVariable struct { Value BigText `json:"value"` Remark string `json:"remark" gorm:"size:500"` Type string `json:"type" gorm:"size:20;default:'normal'"` - Hidden bool `json:"hidden" gorm:"default:true"` - Enabled bool `json:"enabled" gorm:"default:true"` + Hidden *bool `json:"hidden" gorm:"default:true"` + Enabled *bool `json:"enabled" gorm:"default:true"` UserID string `json:"user_id" gorm:"size:20;index"` CreatedAt LocalTime `json:"created_at"` UpdatedAt LocalTime `json:"updated_at"` diff --git a/internal/models/notify_way.go b/internal/models/notify_way.go index 4565068..3d17058 100644 --- a/internal/models/notify_way.go +++ b/internal/models/notify_way.go @@ -10,7 +10,7 @@ type NotifyWay struct { Name string `json:"name" gorm:"size:100;not null"` Type string `json:"type" gorm:"size:50;not null;index"` Config BigText `json:"config"` - Enabled bool `json:"enabled" gorm:"default:true;index"` + Enabled *bool `json:"enabled" gorm:"default:true;index"` CreatedAt LocalTime `json:"created_at"` UpdatedAt LocalTime `json:"updated_at"` } diff --git a/internal/models/task.go b/internal/models/task.go index 39f00b9..e1379c7 100644 --- a/internal/models/task.go +++ b/internal/models/task.go @@ -86,7 +86,7 @@ type Task struct { RetryCount int `json:"retry_count" gorm:"default:0"` // 失败重试次数 RetryInterval int `json:"retry_interval" gorm:"default:0"` // 失败重试间隔(秒) RandomRange int `json:"random_range" gorm:"default:0"` // 随机延迟范围(秒) - Enabled bool `json:"enabled" gorm:"default:true"` + Enabled *bool `json:"enabled" gorm:"default:true"` RunningGo BigText `json:"running_go"` // 正在运行的 go routine id 数组 (JSON) RuntimeEnvs []string `json:"-" gorm:"-"` // 运行时环境变量(非持久化) RuntimeSecrets []string `json:"-" gorm:"-"` // 运行时安全机密(非持久化) diff --git a/internal/models/vo/agent_vo.go b/internal/models/vo/agent_vo.go index 54f3d54..bc05e34 100644 --- a/internal/models/vo/agent_vo.go +++ b/internal/models/vo/agent_vo.go @@ -2,6 +2,7 @@ package vo import ( "github.com/engigu/baihu-panel/internal/models" + "github.com/engigu/baihu-panel/internal/utils" ) // AgentVO 代理视图对象 @@ -42,7 +43,7 @@ func ToAgentVO(agent *models.Agent) *AgentVO { OS: agent.OS, Arch: agent.Arch, ForceUpdate: agent.ForceUpdate, - Enabled: agent.Enabled, + Enabled: utils.DerefBool(agent.Enabled, true), CreatedAt: agent.CreatedAt, UpdatedAt: agent.UpdatedAt, } @@ -93,7 +94,7 @@ func ToAgentTokenVO(token *models.AgentToken) *AgentTokenVO { MaxUses: token.MaxUses, UsedCount: token.UsedCount, ExpiresAt: token.ExpiresAt, - Enabled: token.Enabled, + Enabled: utils.DerefBool(token.Enabled, true), CreatedAt: token.CreatedAt, } } diff --git a/internal/models/vo/sys_vo.go b/internal/models/vo/sys_vo.go index 12f1af4..2a2d66b 100644 --- a/internal/models/vo/sys_vo.go +++ b/internal/models/vo/sys_vo.go @@ -3,6 +3,7 @@ package vo import ( "github.com/engigu/baihu-panel/internal/constant" "github.com/engigu/baihu-panel/internal/models" + "github.com/engigu/baihu-panel/internal/utils" ) // UserVO 用户视图对象 @@ -58,8 +59,8 @@ func ToEnvVO(env *models.EnvironmentVariable) *EnvVO { Value: val, Remark: env.Remark, Type: env.Type, - Hidden: env.Hidden, - Enabled: env.Enabled, + Hidden: utils.DerefBool(env.Hidden, true), + Enabled: utils.DerefBool(env.Enabled, true), CreatedAt: env.CreatedAt, UpdatedAt: env.UpdatedAt, } diff --git a/internal/models/vo/task_vo.go b/internal/models/vo/task_vo.go index 9f074ab..1661fb7 100644 --- a/internal/models/vo/task_vo.go +++ b/internal/models/vo/task_vo.go @@ -3,6 +3,7 @@ package vo import ( "github.com/engigu/baihu-panel/internal/executor" "github.com/engigu/baihu-panel/internal/models" + "github.com/engigu/baihu-panel/internal/utils" ) // TaskVO 任务视图对象 @@ -53,7 +54,7 @@ func ToTaskVO(task *models.Task) *TaskVO { Languages: task.Languages, AgentID: task.AgentID, RepoTaskID: task.RepoTaskID, - Enabled: task.Enabled, + Enabled: utils.DerefBool(task.Enabled, true), RetryCount: task.RetryCount, RetryInterval: task.RetryInterval, RandomRange: task.RandomRange, diff --git a/internal/services/agent_service.go b/internal/services/agent_service.go index dcc629d..fee2e4e 100644 --- a/internal/services/agent_service.go +++ b/internal/services/agent_service.go @@ -54,7 +54,7 @@ func (s *AgentService) CreateToken(remark string, maxUses int, expiresAt *time.T Remark: remark, MaxUses: maxUses, ExpiresAt: expires, - Enabled: true, + Enabled: utils.BoolPtr(true), } if err := database.DB.Create(agentToken).Error; err != nil { @@ -85,7 +85,7 @@ func (s *AgentService) ValidateToken(token string) (*models.AgentToken, error) { return nil, &ServiceError{Message: "无效的令牌"} } - if !agentToken.Enabled { + if !utils.DerefBool(agentToken.Enabled, true) { return nil, &ServiceError{Message: "令牌已禁用"} } @@ -147,7 +147,7 @@ func (s *AgentService) RegisterByToken(token string, machineID string, ip string IP: ip, Status: constant.AgentStatusOnline, LastSeen: &now, - Enabled: true, + Enabled: utils.BoolPtr(true), } if err := database.DB.Create(agent).Error; err != nil { @@ -190,7 +190,7 @@ func (s *AgentService) Register(req *models.AgentRegisterRequest, ip string) (*m IP: ip, Status: constant.AgentStatusOnline, LastSeen: &now, - Enabled: true, + Enabled: utils.BoolPtr(true), } if err := database.DB.Create(agent).Error; err != nil { @@ -207,7 +207,7 @@ func (s *AgentService) Update(id string, name, description string, enabled bool) return database.DB.Model(&models.Agent{}).Where("id = ?", id).Updates(map[string]interface{}{ "name": name, "description": description, - "enabled": enabled, + "enabled": &enabled, }).Error } @@ -272,7 +272,7 @@ func (s *AgentService) Heartbeat(token, ip, version, buildTime, hostname, osType return nil, &ServiceError{Message: "无效的 Token"} } - if !agent.Enabled { + if !utils.DerefBool(agent.Enabled, true) { return nil, &ServiceError{Message: "Agent 已禁用"} } @@ -355,7 +355,7 @@ func (s *AgentService) GetTasks(agentID string) []models.AgentTask { Languages: []map[string]string(task.Languages), RandomRange: task.RandomRange, Secrets: secrets, - Enabled: task.Enabled, + Enabled: utils.DerefBool(task.Enabled, true), } } diff --git a/internal/services/env_service.go b/internal/services/env_service.go index 22444a9..6d163dc 100644 --- a/internal/services/env_service.go +++ b/internal/services/env_service.go @@ -30,8 +30,8 @@ func (es *EnvService) CreateEnvVar(name, value, remark, envType string, hidden, Value: models.BigText(value), Remark: remark, Type: envType, - Hidden: hidden, - Enabled: enabled, + Hidden: &hidden, + Enabled: &enabled, UserID: userID, CreatedAt: models.Now(), UpdatedAt: models.Now(), @@ -99,8 +99,8 @@ func (es *EnvService) UpdateEnvVar(id string, name, value, remark, envType strin "value": models.BigText(value), "remark": remark, "type": envType, - "hidden": hidden, - "enabled": enabled, + "hidden": &hidden, + "enabled": &enabled, } database.DB.Model(&env).Updates(updates) return &env @@ -224,7 +224,7 @@ func (es *EnvService) formatEnvVars(envs []models.EnvironmentVariable) []string } value := string(env.Value) - if !env.Enabled { + if !utils.DerefBool(env.Enabled, true) { value = "" } @@ -266,13 +266,13 @@ func (es *EnvService) formatEnvVarsAndSecrets(envs []models.EnvironmentVariable) if env.Type == constant.EnvTypeSecret { if decValue, err := utils.Decrypt(value); err == nil { value = decValue - if env.Enabled && value != "" { + if utils.DerefBool(env.Enabled, true) && value != "" { secrets = append(secrets, value) } } } - if !env.Enabled { + if !utils.DerefBool(env.Enabled, true) { value = "" } diff --git a/internal/services/notification_service.go b/internal/services/notification_service.go index aeb4e71..9cf898e 100644 --- a/internal/services/notification_service.go +++ b/internal/services/notification_service.go @@ -104,7 +104,7 @@ func (s *NotificationService) SaveChannel(channel NotifyChannel) error { Name: channel.Name, Type: channel.Type, Config: models.BigText(configJSON), - Enabled: channel.Enabled, + Enabled: utils.BoolPtr(channel.Enabled), } return database.DB.Create(notifyWay).Error } @@ -114,7 +114,7 @@ func (s *NotificationService) SaveChannel(channel NotifyChannel) error { "name": channel.Name, "type": channel.Type, "config": models.BigText(configJSON), - "enabled": channel.Enabled, + "enabled": &channel.Enabled, } return database.DB.Model(&models.NotifyWay{}).Where("id = ?", channel.ID).Updates(updates).Error } @@ -282,7 +282,7 @@ func (s *NotificationService) SendByChannelID(channelID string, msg *NotifyMessa return &NotifyResult{Success: false, Error: "渠道不存在"} } - if !notifyWay.Enabled { + if !utils.DerefBool(notifyWay.Enabled, true) { return &NotifyResult{Success: false, Error: "渠道已禁用"} } @@ -295,7 +295,7 @@ func (s *NotificationService) SendByChannelID(channelID string, msg *NotifyMessa ID: notifyWay.ID, Name: notifyWay.Name, Type: notifyWay.Type, - Enabled: notifyWay.Enabled, + Enabled: utils.DerefBool(notifyWay.Enabled, true), Config: config, } return s.SendToChannel(ch, msg) @@ -533,7 +533,7 @@ func (s *NotificationService) getChannelsInternal() []NotifyChannel { ID: nw.ID, Name: nw.Name, Type: nw.Type, - Enabled: nw.Enabled, + Enabled: utils.DerefBool(nw.Enabled, true), CreatedAt: nw.CreatedAt, Config: config, }) diff --git a/internal/services/tasks/executor_service.go b/internal/services/tasks/executor_service.go index 1e3b7c7..e9322bb 100644 --- a/internal/services/tasks/executor_service.go +++ b/internal/services/tasks/executor_service.go @@ -370,7 +370,7 @@ func (es *ExecutorService) HandleTaskRetry(task *models.Task, req *executor.Exec es.scheduler.EnqueueDelayed(time.Duration(task.RetryInterval)*time.Second, func() *executor.ExecutionRequest { latestTask := es.taskService.GetTaskByID(task.ID) - if latestTask == nil || !latestTask.Enabled { + if latestTask == nil || !utils.DerefBool(latestTask.Enabled, true) { return nil } @@ -536,7 +536,7 @@ func (es *ExecutorService) loadCronTasks() { tasks := es.taskService.GetTasks() count := 0 for _, task := range tasks { - if !task.Enabled { + if !utils.DerefBool(task.Enabled, true) { continue } @@ -875,7 +875,7 @@ func (es *ExecutorService) ExecuteRemoteForScheduler(task *models.Task, logID st if res.Error != nil || res.RowsAffected == 0 { return nil, fmt.Errorf("Agent #%s 不存在", agentID) } - if !agent.Enabled { + if !utils.DerefBool(agent.Enabled, true) { return nil, fmt.Errorf("Agent #%s 已禁用", agentID) } if es.agentWSManager == nil { diff --git a/internal/services/tasks/ql_repo_parser.go b/internal/services/tasks/ql_repo_parser.go index fb7384a..74a0615 100644 --- a/internal/services/tasks/ql_repo_parser.go +++ b/internal/services/tasks/ql_repo_parser.go @@ -311,7 +311,7 @@ func ParseRepoScriptsAndAddCron(es *ExecutorService, taskID string, logWriter io } database.DB.Save(&existing) - if existing.Enabled && es != nil { + if utils.DerefBool(existing.Enabled, true) && es != nil { es.AddCronTask(&existing) } log("[更新] 任务: %s (%s)", taskName, filename) @@ -329,7 +329,7 @@ func ParseRepoScriptsAndAddCron(es *ExecutorService, taskID string, logWriter io Languages: repoTask.Languages, Timeout: repoTask.Timeout, Config: models.BigText(defaultTaskConfig), - Enabled: true, + Enabled: utils.BoolPtr(true), WorkDir: displayWorkDir, SourceID: sourceID, RepoTaskID: repoTask.ID, diff --git a/internal/services/tasks/task_service.go b/internal/services/tasks/task_service.go index d8baae0..e0a9421 100644 --- a/internal/services/tasks/task_service.go +++ b/internal/services/tasks/task_service.go @@ -44,7 +44,7 @@ func (ts *TaskService) CreateTask(name, command, schedule string, timeout int, w Envs: models.BigText(envs), Languages: languages, AgentID: agentID, - Enabled: true, + Enabled: utils.BoolPtr(true), RetryCount: retryCount, RetryInterval: retryInterval, RandomRange: randomRange, @@ -113,7 +113,7 @@ func (ts *TaskService) UpdateTask(id string, name, command, schedule string, tim task.WorkDir = workDir task.CleanConfig = cleanConfig task.Envs = models.BigText(envs) - task.Enabled = enabled + task.Enabled = &enabled task.AgentID = agentID task.Languages = languages task.Config = models.BigText(config) diff --git a/internal/utils/pointer.go b/internal/utils/pointer.go new file mode 100644 index 0000000..6bee81e --- /dev/null +++ b/internal/utils/pointer.go @@ -0,0 +1,14 @@ +package utils + +// BoolPtr returns a pointer to the bool value +func BoolPtr(b bool) *bool { + return &b +} + +// DerefBool returns the value of the bool pointer or default if nil +func DerefBool(b *bool, defaultVal bool) bool { + if b == nil { + return defaultVal + } + return *b +}