chroe: remove soft delete logical code #20

This commit is contained in:
duorameng
2026-04-09 09:41:57 +08:00
parent b011018a2c
commit 8974e6c13d
12 changed files with 39 additions and 63 deletions
-4
View File
@@ -2,8 +2,6 @@ package models
import (
"github.com/engigu/baihu-panel/internal/constant"
"gorm.io/gorm"
)
// Agent 远程执行代理
@@ -25,7 +23,6 @@ type Agent struct {
Enabled bool `json:"enabled" gorm:"default:true"` // 是否启用
CreatedAt LocalTime `json:"created_at"`
UpdatedAt LocalTime `json:"updated_at"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
}
func (Agent) TableName() string {
@@ -43,7 +40,6 @@ type AgentToken struct {
Enabled bool `json:"enabled" gorm:"default:true"` // 是否启用
CreatedAt LocalTime `json:"created_at"`
UpdatedAt LocalTime `json:"updated_at"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
}
func (AgentToken) TableName() string {
+1 -4
View File
@@ -2,8 +2,6 @@ package models
import (
"github.com/engigu/baihu-panel/internal/constant"
"gorm.io/gorm"
)
// EnvironmentVariable represents an environment variable
@@ -18,7 +16,7 @@ type EnvironmentVariable struct {
UserID string `json:"user_id" gorm:"size:20;index"`
CreatedAt LocalTime `json:"created_at"`
UpdatedAt LocalTime `json:"updated_at"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
}
func (EnvironmentVariable) TableName() string {
@@ -33,7 +31,6 @@ type Script struct {
UserID string `json:"user_id" gorm:"size:20;index"`
CreatedAt LocalTime `json:"created_at"`
UpdatedAt LocalTime `json:"updated_at"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
}
func (Script) TableName() string {
-2
View File
@@ -2,7 +2,6 @@ package models
import (
"github.com/engigu/baihu-panel/internal/constant"
"gorm.io/gorm"
)
type Language struct {
@@ -14,7 +13,6 @@ type Language struct {
InstalledAt *LocalTime `json:"installed_at"`
CreatedAt LocalTime `json:"created_at"`
UpdatedAt LocalTime `json:"updated_at"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
}
func (Language) TableName() string {
-3
View File
@@ -2,8 +2,6 @@ package models
import (
"github.com/engigu/baihu-panel/internal/constant"
"gorm.io/gorm"
)
// NotifyBinding 事件绑定表
@@ -16,7 +14,6 @@ type NotifyBinding struct {
Extra BigText `json:"extra"` // 额外配置(如是否开启日志推送等,对应 BindingExtra 结构)
CreatedAt LocalTime `json:"created_at"`
UpdatedAt LocalTime `json:"updated_at"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
}
// BindingExtra 存储在 Extra 字段中的 JSON 配置
-3
View File
@@ -2,8 +2,6 @@ package models
import (
"github.com/engigu/baihu-panel/internal/constant"
"gorm.io/gorm"
)
// NotifyWay 消息推送渠道
@@ -15,7 +13,6 @@ type NotifyWay struct {
Enabled bool `json:"enabled" gorm:"default:true;index"`
CreatedAt LocalTime `json:"created_at"`
UpdatedAt LocalTime `json:"updated_at"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
}
func (NotifyWay) TableName() string {
-3
View File
@@ -5,8 +5,6 @@ import (
"encoding/json"
"fmt"
"github.com/engigu/baihu-panel/internal/constant"
"gorm.io/gorm"
)
// TaskLanguages 自定义语言配置列表类型,处理 JSON 序列化
@@ -98,7 +96,6 @@ type Task struct {
RepoTaskID string `json:"repo_task_id" gorm:"size:20;index"` // 所属的仓库任务 ID
CreatedAt LocalTime `json:"created_at"`
UpdatedAt LocalTime `json:"updated_at"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
}
func (Task) TableName() string {
-3
View File
@@ -2,8 +2,6 @@ package models
import (
"github.com/engigu/baihu-panel/internal/constant"
"gorm.io/gorm"
)
// User represents a system user
@@ -16,7 +14,6 @@ type User struct {
TokenVersion int `json:"-" gorm:"default:1"` // 用于 JWT 失效校验
CreatedAt LocalTime `json:"created_at"`
UpdatedAt LocalTime `json:"updated_at"`
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`
}
func (User) TableName() string {
+1 -1
View File
@@ -220,7 +220,7 @@ func (s *AgentService) Delete(id string) error {
return &ServiceError{Message: "该 Agent 下还有关联任务,无法删除"}
}
return database.DB.Unscoped().Where("id = ?", id).Delete(&models.Agent{}).Error
return database.DB.Where("id = ?", id).Delete(&models.Agent{}).Error
}
// GetByID 根据 ID 获取 Agent
+3 -3
View File
@@ -109,7 +109,7 @@ func (s *AppLogService) Clear(category string) error {
if category != "" {
query = query.Where("category = ?", category)
}
return query.Unscoped().Delete(&models.AppLog{}).Error
return query.Delete(&models.AppLog{}).Error
}
func (s *AppLogService) GetRetentionConfigs() map[string]LogRetentionConfig {
@@ -146,7 +146,7 @@ func (s *AppLogService) CleanUp() {
if cfg.Days > 0 {
deadline := time.Now().AddDate(0, 0, -cfg.Days)
database.DB.Unscoped().Where("category = ? AND created_at < ?", cat, deadline).Delete(&models.AppLog{})
database.DB.Where("category = ? AND created_at < ?", cat, deadline).Delete(&models.AppLog{})
}
if cfg.MaxCount > 0 {
@@ -157,7 +157,7 @@ func (s *AppLogService) CleanUp() {
var ids []string
database.DB.Model(&models.AppLog{}).Where("category = ?", cat).Order("created_at asc").Limit(int(deleteCount)).Pluck("id", &ids)
if len(ids) > 0 {
database.DB.Unscoped().Where("id IN ?", ids).Delete(&models.AppLog{})
database.DB.Where("id IN ?", ids).Delete(&models.AppLog{})
}
}
}
+28 -31
View File
@@ -43,30 +43,27 @@ type tableConfig struct {
func (s *BackupService) getTableConfigs() []tableConfig {
return []tableConfig{
{"users.json", s.exportTable(&[]models.User{}, true), s.restoreTable(&[]models.User{})},
{"tasks.json", s.exportTable(&[]models.Task{}, true), s.restoreTable(&[]models.Task{})},
{"task_logs.json", s.exportTable(&[]models.TaskLog{}, false), s.restoreTable(&[]models.TaskLog{})},
{"envs.json", s.exportTable(&[]models.EnvironmentVariable{}, true), s.restoreTable(&[]models.EnvironmentVariable{})},
{"scripts.json", s.exportTable(&[]models.Script{}, true), s.restoreTable(&[]models.Script{})},
{"users.json", s.exportTable(&[]models.User{}), s.restoreTable(&[]models.User{})},
{"tasks.json", s.exportTable(&[]models.Task{}), s.restoreTable(&[]models.Task{})},
{"task_logs.json", s.exportTable(&[]models.TaskLog{}), s.restoreTable(&[]models.TaskLog{})},
{"envs.json", s.exportTable(&[]models.EnvironmentVariable{}), s.restoreTable(&[]models.EnvironmentVariable{})},
{"scripts.json", s.exportTable(&[]models.Script{}), s.restoreTable(&[]models.Script{})},
{"settings.json", s.exportSettings, s.restoreSettings},
{"send_stats.json", s.exportTable(&[]models.SendStats{}, false), s.restoreTable(&[]models.SendStats{})},
{"send_stats.json", s.exportTable(&[]models.SendStats{}), s.restoreTable(&[]models.SendStats{})},
{"agents.json", s.exportTable(&[]models.Agent{}, true), s.restoreTable(&[]models.Agent{})},
{"tokens.json", s.exportTable(&[]models.AgentToken{}, true), s.restoreTable(&[]models.AgentToken{})},
{"languages.json", s.exportTable(&[]models.Language{}, true), s.restoreTable(&[]models.Language{})},
{"deps.json", s.exportTable(&[]models.Dependency{}, true), s.restoreTable(&[]models.Dependency{})},
{"notify_ways.json", s.exportTable(&[]models.NotifyWay{}, true), s.restoreTable(&[]models.NotifyWay{})},
{"notify_bindings.json", s.exportTable(&[]models.NotifyBinding{}, true), s.restoreTable(&[]models.NotifyBinding{})},
{"app_logs.json", s.exportTable(&[]models.AppLog{}, false), s.restoreTable(&[]models.AppLog{})},
{"agents.json", s.exportTable(&[]models.Agent{}), s.restoreTable(&[]models.Agent{})},
{"tokens.json", s.exportTable(&[]models.AgentToken{}), s.restoreTable(&[]models.AgentToken{})},
{"languages.json", s.exportTable(&[]models.Language{}), s.restoreTable(&[]models.Language{})},
{"deps.json", s.exportTable(&[]models.Dependency{}), s.restoreTable(&[]models.Dependency{})},
{"notify_ways.json", s.exportTable(&[]models.NotifyWay{}), s.restoreTable(&[]models.NotifyWay{})},
{"notify_bindings.json", s.exportTable(&[]models.NotifyBinding{}), s.restoreTable(&[]models.NotifyBinding{})},
{"app_logs.json", s.exportTable(&[]models.AppLog{}), s.restoreTable(&[]models.AppLog{})},
}
}
func (s *BackupService) exportTable(modelPtr any, unscoped bool) func(io.Writer) error {
func (s *BackupService) exportTable(modelPtr any) func(io.Writer) error {
return func(w io.Writer) error {
db := database.DB
if unscoped {
db = db.Unscoped()
}
if _, err := w.Write([]byte("[\n")); err != nil {
return err
@@ -222,21 +219,21 @@ func (s *BackupService) Restore(zipPath string) error {
// 开启全局事务
err = database.DB.Transaction(func(tx *gorm.DB) error {
// 1. 清空现有数据(物理删除)
tx.Unscoped().Where("1=1").Delete(&models.User{})
tx.Unscoped().Where("1=1").Delete(&models.Task{})
tx.Unscoped().Where("1=1").Delete(&models.TaskLog{})
tx.Unscoped().Where("1=1").Delete(&models.EnvironmentVariable{})
tx.Unscoped().Where("1=1").Delete(&models.Script{})
tx.Unscoped().Where("section != ?", BackupSection).Delete(&models.Setting{})
tx.Unscoped().Where("1=1").Delete(&models.SendStats{})
tx.Where("1=1").Delete(&models.User{})
tx.Where("1=1").Delete(&models.Task{})
tx.Where("1=1").Delete(&models.TaskLog{})
tx.Where("1=1").Delete(&models.EnvironmentVariable{})
tx.Where("1=1").Delete(&models.Script{})
tx.Where("section != ?", BackupSection).Delete(&models.Setting{})
tx.Where("1=1").Delete(&models.SendStats{})
tx.Unscoped().Where("1=1").Delete(&models.Agent{})
tx.Unscoped().Where("1=1").Delete(&models.AgentToken{})
tx.Unscoped().Where("1=1").Delete(&models.Language{})
tx.Unscoped().Where("1=1").Delete(&models.Dependency{})
tx.Unscoped().Where("1=1").Delete(&models.NotifyWay{})
tx.Unscoped().Where("1=1").Delete(&models.NotifyBinding{})
tx.Unscoped().Where("1=1").Delete(&models.AppLog{})
tx.Where("1=1").Delete(&models.Agent{})
tx.Where("1=1").Delete(&models.AgentToken{})
tx.Where("1=1").Delete(&models.Language{})
tx.Where("1=1").Delete(&models.Dependency{})
tx.Where("1=1").Delete(&models.NotifyWay{})
tx.Where("1=1").Delete(&models.NotifyBinding{})
tx.Where("1=1").Delete(&models.AppLog{})
// 2. 依次恢复每个表
for _, cfg := range configs {
+4 -4
View File
@@ -131,12 +131,12 @@ func (s *NotificationService) DeleteChannel(id string) error {
}
// 删除渠道
if err := database.DB.Unscoped().Where("id = ?", id).Delete(&models.NotifyWay{}).Error; err != nil {
if err := database.DB.Where("id = ?", id).Delete(&models.NotifyWay{}).Error; err != nil {
return err
}
// 同时清理事件绑定中引用此渠道的配置
if err := database.DB.Unscoped().Where("way_id = ?", id).Delete(&models.NotifyBinding{}).Error; err != nil {
if err := database.DB.Where("way_id = ?", id).Delete(&models.NotifyBinding{}).Error; err != nil {
logger.Errorf("[Notify] 清理事件绑定失败: %v", err)
}
@@ -178,7 +178,7 @@ func (s *NotificationService) BatchSaveBindings(bindingType, dataID string, bind
return database.DB.Transaction(func(tx *gorm.DB) error {
// 如果指定了 dataID,先清理该对象的所有现有绑定
if dataID != "" {
if err := tx.Unscoped().Where("type = ? AND data_id = ?", bindingType, dataID).Delete(&models.NotifyBinding{}).Error; err != nil {
if err := tx.Where("type = ? AND data_id = ?", bindingType, dataID).Delete(&models.NotifyBinding{}).Error; err != nil {
return err
}
}
@@ -198,7 +198,7 @@ func (s *NotificationService) BatchSaveBindings(bindingType, dataID string, bind
// DeleteBinding 删除事件绑定
func (s *NotificationService) DeleteBinding(id string) error {
return database.DB.Unscoped().Where("id = ?", id).Delete(&models.NotifyBinding{}).Error
return database.DB.Where("id = ?", id).Delete(&models.NotifyBinding{}).Error
}
// GetBindingsByEvent 根据事件类型和数据ID获取绑定
+2 -2
View File
@@ -143,7 +143,7 @@ func (ts *TaskService) DeleteTask(id string) bool {
// 同时删除关联的通知推送设置
database.DB.Where("type = ? AND data_id = ?", constant.BindingTypeTask, id).Delete(&models.NotifyBinding{})
result := database.DB.Unscoped().Where("id = ?", id).Delete(&models.Task{})
result := database.DB.Where("id = ?", id).Delete(&models.Task{})
return result.RowsAffected > 0
}
@@ -151,6 +151,6 @@ func (ts *TaskService) BatchDeleteTasks(ids []string) int64 {
// 同时删除关联的通知推送设置
database.DB.Where("type = ? AND data_id IN ?", constant.BindingTypeTask, ids).Delete(&models.NotifyBinding{})
result := database.DB.Unscoped().Where("id IN ?", ids).Delete(&models.Task{})
result := database.DB.Where("id IN ?", ids).Delete(&models.Task{})
return result.RowsAffected
}