chroe: remove soft delete logical code #20
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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,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 {
|
||||
|
||||
@@ -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 配置
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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{})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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获取绑定
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user