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  }