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