1Panel/agent/app/repo/script.go

80 lines
1.8 KiB
Go

package repo
import (
"github.com/1Panel-dev/1Panel/agent/app/model"
"github.com/1Panel-dev/1Panel/agent/global"
)
type ScriptRepo struct{}
type IScriptRepo interface {
Get(opts ...DBOption) (model.ScriptLibrary, error)
List(opts ...DBOption) ([]model.ScriptLibrary, error)
SyncAll(data []model.ScriptLibrary) error
}
func NewIScriptRepo() IScriptRepo {
return &ScriptRepo{}
}
func (u *ScriptRepo) Get(opts ...DBOption) (model.ScriptLibrary, error) {
var script model.ScriptLibrary
db := global.DB
if global.IsMaster {
db = global.CoreDB
}
for _, opt := range opts {
db = opt(db)
}
err := db.First(&script).Error
return script, err
}
func (u *ScriptRepo) List(opts ...DBOption) ([]model.ScriptLibrary, error) {
var ops []model.ScriptLibrary
if global.IsMaster {
db := global.CoreDB.Model(&model.ScriptLibrary{})
for _, opt := range opts {
db = opt(db)
}
err := db.Where("is_interactive = ?", false).Find(&ops).Error
return ops, err
}
db := global.DB.Model(&model.ScriptLibrary{})
for _, opt := range opts {
db = opt(db)
}
err := db.Find(&ops).Error
return ops, err
}
func (u *ScriptRepo) SyncAll(data []model.ScriptLibrary) error {
tx := global.DB.Begin()
var oldScripts []model.ScriptLibrary
_ = tx.Where("1 = 1").Find(&oldScripts).Error
oldScriptMap := make(map[string]uint)
for _, item := range oldScripts {
oldScriptMap[item.Name] = item.ID
}
for _, item := range data {
if val, ok := oldScriptMap[item.Name]; ok {
item.ID = val
delete(oldScriptMap, item.Name)
} else {
item.ID = 0
}
if err := tx.Model(model.ScriptLibrary{}).Where("id = ?", item.ID).Save(&item).Error; err != nil {
tx.Rollback()
return err
}
}
for _, val := range oldScriptMap {
if err := tx.Where("id = ?", val).Delete(&model.ScriptLibrary{}).Error; err != nil {
tx.Rollback()
return err
}
}
tx.Commit()
return nil
}