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  }