github.com/easysoft/zendata@v0.0.0-20240513203326-705bd5a7fd67/internal/server/service/config.go (about) 1 package serverService 2 3 import ( 4 "os" 5 "regexp" 6 "strings" 7 8 "github.com/easysoft/zendata/internal/pkg/domain" 9 "github.com/easysoft/zendata/internal/pkg/service" 10 11 consts "github.com/easysoft/zendata/internal/pkg/const" 12 "github.com/easysoft/zendata/internal/pkg/helper" 13 "github.com/easysoft/zendata/internal/pkg/model" 14 serverRepo "github.com/easysoft/zendata/internal/server/repo" 15 serverUtils "github.com/easysoft/zendata/internal/server/utils" 16 fileUtils "github.com/easysoft/zendata/pkg/utils/file" 17 "github.com/easysoft/zendata/pkg/utils/vari" 18 "gopkg.in/yaml.v3" 19 "gorm.io/gorm" 20 ) 21 22 type ConfigService struct { 23 ConfigRepo *serverRepo.ConfigRepo `inject:""` 24 ResService *ResService `inject:""` 25 SectionRepo *serverRepo.SectionRepo `inject:""` 26 27 SectionService *SectionService `inject:""` 28 RangeService *service.RangeService `inject:""` 29 } 30 31 func (s *ConfigService) List(keywords string, page int) (list []*model.ZdConfig, total int) { 32 list, total, _ = s.ConfigRepo.List(strings.TrimSpace(keywords), page) 33 return 34 } 35 36 func (s *ConfigService) Get(id int) (config model.ZdConfig, dirs []domain.Dir) { 37 if id > 0 { 38 config, _ = s.ConfigRepo.Get(uint(id)) 39 } 40 41 serverUtils.GetDirs(consts.ResDirYaml, &dirs) 42 43 return 44 } 45 46 func (s *ConfigService) Save(config *model.ZdConfig) (err error) { 47 config.Folder = serverUtils.DealWithPathSepRight(config.Folder) 48 config.Path = vari.WorkDir + config.Folder + serverUtils.AddExt(config.FileName, ".yaml") 49 config.ReferName = helper.PathToName(config.Path, consts.ResDirYaml, consts.ResTypeConfig) 50 51 if config.ID == 0 { 52 err = s.Create(config) 53 } else { 54 err = s.Update(config) 55 } 56 57 return 58 } 59 60 func (s *ConfigService) Create(config *model.ZdConfig) (err error) { 61 err = s.ConfigRepo.Create(config) 62 s.updateYaml(config.ID) 63 64 return 65 } 66 67 func (s *ConfigService) Update(config *model.ZdConfig) (err error) { 68 var old model.ZdConfig 69 old, err = s.ConfigRepo.Get(config.ID) 70 if err == gorm.ErrRecordNotFound { 71 return 72 } 73 if config.Path != old.Path { 74 fileUtils.RemoveExist(old.Path) 75 } 76 77 err = s.ConfigRepo.Update(config) 78 s.updateYaml(config.ID) 79 80 return 81 } 82 83 func (s *ConfigService) Remove(id int) (err error) { 84 var old model.ZdConfig 85 old, err = s.ConfigRepo.Get(uint(id)) 86 if err == gorm.ErrRecordNotFound { 87 return 88 } 89 90 fileUtils.RemoveExist(old.Path) 91 err = s.ConfigRepo.Remove(uint(id)) 92 93 return 94 } 95 96 func (s *ConfigService) updateYaml(id uint) (err error) { 97 var po model.ZdConfig 98 po, _ = s.ConfigRepo.Get(id) 99 100 s.genYaml(&po) 101 err = s.ConfigRepo.UpdateYaml(po) 102 fileUtils.WriteFile(po.Path, po.Yaml) 103 104 return 105 } 106 func (s *ConfigService) genYaml(config *model.ZdConfig) (str string) { 107 yamlObj := domain.ResConfig{} 108 s.ConfigRepo.GenConfigRes(*config, &yamlObj) 109 110 bytes, _ := yaml.Marshal(yamlObj) 111 config.Yaml = helper.ConvertYamlStringToMapFormat(bytes) 112 113 return 114 } 115 116 func (s *ConfigService) Sync(files []domain.ResFile) (err error) { 117 list := s.ConfigRepo.ListAll() 118 119 mp := map[string]*model.ZdConfig{} 120 for _, item := range list { 121 mp[item.Path] = item 122 } 123 124 for _, fi := range files { 125 _, found := mp[fi.Path] 126 //logUtils.PrintTo(fi.UpdatedAt.OpenApiDataTypeString() + ", " + mp[fi.Path].UpdatedAt.OpenApiDataTypeString()) 127 if !found { // no record 128 s.SyncToDB(fi) 129 } else if fi.UpdatedAt.Unix() > mp[fi.Path].UpdatedAt.Unix() { // db is old 130 s.ConfigRepo.Remove(mp[fi.Path].ID) 131 s.SyncToDB(fi) 132 } else { // db is new 133 134 } 135 } 136 137 return 138 } 139 func (s *ConfigService) SyncToDB(fi domain.ResFile) (err error) { 140 content, _ := os.ReadFile(fi.Path) 141 yamlContent := helper.ReplaceSpecialChars(content) 142 143 po := model.ZdConfig{} 144 err = yaml.Unmarshal(yamlContent, &po) 145 146 po.Title = fi.Title 147 po.Desc = fi.Desc 148 po.Path = fi.Path 149 po.Folder = serverUtils.GetRelativePath(po.Path) 150 if strings.Index(po.Path, vari.WorkDir+consts.ResDirYaml) > -1 { 151 po.ReferName = helper.PathToName(po.Path, consts.ResDirYaml, consts.ResTypeConfig) 152 } else { 153 po.ReferName = helper.PathToName(po.Path, consts.ResDirUsers, consts.ResTypeConfig) 154 } 155 po.FileName = fileUtils.GetFileName(po.Path) 156 po.Yaml = string(content) 157 158 reg := regexp.MustCompile(`\t`) 159 if reg.MatchString(po.Prefix) { 160 po.Prefix = strings.ReplaceAll(po.Prefix, "\t", `\t`) 161 po.Prefix = `"` + po.Prefix + `"` 162 } 163 164 s.ConfigRepo.Create(&po) 165 166 rangeSections := s.RangeService.ParseRangeProperty(po.Range) 167 for i, rangeSection := range rangeSections { 168 s.SectionService.SaveFieldSectionToDB(rangeSection, i, po.ID, "config") 169 } 170 171 return 172 } 173 174 func (s *ConfigService) GConfigItemTree(configId int) (root model.ZdRangesItem) { 175 root.ID = 0 176 root.Field = "字段" 177 178 item := model.ZdRangesItem{ParentID: root.ID, Field: "配置"} 179 item.ID = uint(configId) 180 root.Fields = append(root.Fields, &item) 181 182 return 183 }