Feat: fast init setting

pull/48/head
zijiren233 2 years ago
parent 1622634a2a
commit 94132ec864

@ -13,38 +13,64 @@ func InitSetting(ctx context.Context) error {
} }
func initSettings(s map[string]settings.Setting) error { func initSettings(s map[string]settings.Setting) error {
settingsCache, err := db.GetSettingItemsToMap()
if err != nil {
return err
}
for _, b := range s { for _, b := range s {
s := &model.Setting{ if s, ok := settingsCache[b.Name()]; ok {
Name: b.Name(), err = b.Init(s.Value)
Value: b.DefaultString(), if err != nil {
Type: b.Type(), return err
Group: b.Group(), }
} } else {
err := db.FirstOrCreateSettingItemValue(s) s := &model.Setting{
if err != nil { Name: b.Name(),
return err Value: b.DefaultString(),
} Type: b.Type(),
err = b.Init(s.Value) Group: b.Group(),
if err != nil { }
return err err := db.FirstOrCreateSettingItemValue(s)
if err != nil {
return err
}
err = b.Init(s.Value)
if err != nil {
return err
}
} }
} }
return nil return nil
} }
func settingEqual(s *model.Setting, b settings.Setting) bool {
return s.Type == b.Type() && s.Group == b.Group() && s.Name == b.Name()
}
func initAndFixSettings(s map[string]settings.Setting) error { func initAndFixSettings(s map[string]settings.Setting) error {
settingsCache, err := db.GetSettingItemsToMap()
if err != nil {
return err
}
var (
setting *model.Setting
)
for _, b := range s { for _, b := range s {
s := &model.Setting{ if sc, ok := settingsCache[b.Name()]; ok && settingEqual(sc, b) {
Name: b.Name(), setting = sc
Value: b.DefaultString(), } else {
Type: b.Type(), setting = &model.Setting{
Group: b.Group(), Name: b.Name(),
} Value: b.DefaultString(),
err := db.FirstOrCreateSettingItemValue(s) Type: b.Type(),
if err != nil { Group: b.Group(),
return err }
err := db.FirstOrCreateSettingItemValue(setting)
if err != nil {
return err
}
} }
err = b.Init(s.Value) err = b.Init(setting.Value)
if err != nil { if err != nil {
// auto fix // auto fix
err = b.SetString(b.DefaultString()) err = b.SetString(b.DefaultString())

@ -11,6 +11,18 @@ func GetSettingItems() ([]*model.Setting, error) {
return items, err return items, err
} }
func GetSettingItemsToMap() (map[string]*model.Setting, error) {
items, err := GetSettingItems()
if err != nil {
return nil, err
}
m := make(map[string]*model.Setting)
for _, item := range items {
m[item.Name] = item
}
return m, nil
}
func GetSettingItemByName(name string) (*model.Setting, error) { func GetSettingItemByName(name string) (*model.Setting, error) {
var item model.Setting var item model.Setting
err := db.Where("name = ?", name).First(&item).Error err := db.Where("name = ?", name).First(&item).Error

Loading…
Cancel
Save