instances.go 5.0 KB
Newer Older
aaronchen2k2k's avatar
aaronchen2k2k 已提交
1 2 3 4 5
package serverService

import (
	"github.com/easysoft/zendata/src/model"
	"github.com/easysoft/zendata/src/server/repo"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
6 7
	serverUtils "github.com/easysoft/zendata/src/server/utils"
	"github.com/easysoft/zendata/src/service"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
8
	constant "github.com/easysoft/zendata/src/utils/const"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
9
	fileUtils "github.com/easysoft/zendata/src/utils/file"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
10
	stringUtils "github.com/easysoft/zendata/src/utils/string"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
11
	"github.com/easysoft/zendata/src/utils/vari"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
12
	"github.com/jinzhu/gorm"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
13 14
	"gopkg.in/yaml.v3"
	"io/ioutil"
15
	"strings"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
16 17 18 19
)

type InstancesService struct {
	instancesRepo *serverRepo.InstancesRepo
aaronchen2k2k's avatar
aaronchen2k2k 已提交
20
	referRepo  *serverRepo.ReferRepo
aaronchen2k2k's avatar
aaronchen2k2k 已提交
21 22 23
	resService *ResService
}

24 25
func (s *InstancesService) List(keywords string, page int) (list []*model.ZdInstances, total int) {
	list, total, _ = s.instancesRepo.List(strings.TrimSpace(keywords), page)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
26 27 28
	return
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
29
func (s *InstancesService) Get(id int) (instances model.ZdInstances, dirs []model.Dir) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
30 31
	instances, _ = s.instancesRepo.Get(uint(id))

aaronchen2k2k's avatar
aaronchen2k2k 已提交
32
	serverUtils.GetDirs(constant.ResDirYaml, &dirs)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
33

aaronchen2k2k's avatar
aaronchen2k2k 已提交
34 35 36 37
	return
}

func (s *InstancesService) Save(instances *model.ZdInstances) (err error) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
38
	instances.Folder = serverUtils.DealWithPathSepRight(instances.Folder)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
39
	instances.Path = vari.WorkDir + instances.Folder + serverUtils.AddExt(instances.FileName, ".yaml")
40
	instances.ReferName = service.PathToName(instances.Path, constant.ResDirYaml, constant.ResTypeInstances)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
41 42 43 44 45 46

	if instances.ID == 0 {
		err = s.Create(instances)
	} else {
		err = s.Update(instances)
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
47
	s.updateYaml(instances.ID)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65

	return
}
func (s *InstancesService) Create(instances *model.ZdInstances) (err error) {
	err = s.instancesRepo.Create(instances)

	return
}
func (s *InstancesService) Update(instances *model.ZdInstances) (err error) {
	var old model.ZdInstances
	old, err = s.instancesRepo.Get(instances.ID)
	if err == gorm.ErrRecordNotFound {
		return
	}
	if instances.Path != old.Path {
		fileUtils.RemoveExist(old.Path)
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
66 67
	err = s.instancesRepo.Update(instances)

aaronchen2k2k's avatar
aaronchen2k2k 已提交
68 69 70 71
	return
}

func (s *InstancesService) Remove(id int) (err error) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
72 73 74
	var old model.ZdInstances
	old, err = s.instancesRepo.Get(uint(id))
	if err == gorm.ErrRecordNotFound {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
75 76 77
		return
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
78
	fileUtils.RemoveExist(old.Path)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
79
	err = s.instancesRepo.Remove(uint(id))
aaronchen2k2k's avatar
aaronchen2k2k 已提交
80 81 82
	return
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
83 84 85 86 87 88 89 90 91 92
func (s *InstancesService) updateYaml(id uint) (err error) {
	var po model.ZdInstances
	po, _ = s.instancesRepo.Get(id)

	s.genYaml(&po)
	err = s.instancesRepo.UpdateYaml(po)
	fileUtils.WriteFile(po.Path, po.Yaml)

	return
}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
93
func (s *InstancesService) genYaml(instances *model.ZdInstances) (str string) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
94 95 96 97 98
	//items, err := s.instancesRepo.GetItems(instances.ID)
	//if err != nil {
	//	return
	//}
	//
aaronchen2k2k's avatar
aaronchen2k2k 已提交
99
	//yamlObj := model.ResInstances{}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
100 101 102 103 104 105 106 107 108 109 110
	//s.instancesRepo.GenInst(*instances, &yamlObj)
	//
	//for _, item := range items {
	//	inst := instancesItemToResInstForExport(*item)
	//
	//	yamlObj.Instances = append(yamlObj.Instances, inst)
	//}

	root := s.GetItemTree(instances.ID)
	for _, item := range root.Fields {
		instances.Instances = append(instances.Instances, *item)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
111
	}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
112
	bytes, _ := yaml.Marshal(instances)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
113
	instances.Yaml = stringUtils.ConvertYamlStringToMapFormat(bytes)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
114 115 116 117

	return
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
118 119 120 121
func (s *InstancesService) Sync(files []model.ResFile) {
	list := s.instancesRepo.ListAll()

	mp := map[string]*model.ZdInstances{}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
122
	for _, item := range list {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
123
		mp[item.Path] = item
aaronchen2k2k's avatar
aaronchen2k2k 已提交
124 125
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
126 127 128 129 130 131 132
	for _, fi := range files {
		_, found := mp[fi.Path]
		if !found { // no record
			s.SyncToDB(fi)
		} else if fi.UpdatedAt.Unix() > mp[fi.Path].UpdatedAt.Unix() { // db is old
			s.instancesRepo.Remove(mp[fi.Path].ID)
			s.SyncToDB(fi)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
133 134 135 136 137
		}
	}

	return
}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
138 139 140 141 142 143 144 145 146 147 148

func (s *InstancesService) SyncToDB(file model.ResFile) (err error) {
	content, _ := ioutil.ReadFile(file.Path)
	yamlContent := stringUtils.ReplaceSpecialChars(content)
	po := model.ZdInstances{}
	err = yaml.Unmarshal(yamlContent, &po)

	po.Title = file.Title
	po.Desc = file.Desc
	po.Path = file.Path
	po.Folder = serverUtils.GetRelativePath(po.Path)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
149
	if strings.Index(po.Path, constant.ResDirYaml) > -1 {
150
		po.ReferName = service.PathToName(po.Path, constant.ResDirYaml, constant.ResTypeInstances)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
151
	} else {
152
		po.ReferName = service.PathToName(po.Path, constant.ResDirUsers, constant.ResTypeInstances)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
153 154
	}
	po.FileName = fileUtils.GetFileName(po.Path)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
155 156 157 158 159 160 161 162 163 164 165
	po.Yaml = string(content)

	s.instancesRepo.Create(&po)

	for i, item := range po.Instances {
		item.Ord = i + 1
		s.saveItemToDB(&item, 0, po.ID)
	}

	return
}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
166
func (s *InstancesService) saveItemToDB(item *model.ZdInstancesItem, parentID, instancesID uint) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
167 168 169 170
	if item.Instance != "" { // instance node
		item.Field = item.Instance
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
171 172
	item.InstancesID = instancesID
	item.ParentID = parentID
aaronchen2k2k's avatar
aaronchen2k2k 已提交
173 174 175 176 177 178 179
	if item.Type == "" {
		item.Type = constant.FieldTypeList
	}
	if item.Mode == "" {
		item.Mode = constant.ModeParallel
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
180 181
	s.instancesRepo.SaveItem(item)

aaronchen2k2k's avatar
aaronchen2k2k 已提交
182 183
	for i, child := range item.Fields {
		child.Ord = i + 1
aaronchen2k2k's avatar
aaronchen2k2k 已提交
184 185 186
		s.saveItemToDB(child, item.ID, instancesID)
	}
}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
187

aaronchen2k2k's avatar
aaronchen2k2k 已提交
188 189
func NewInstancesService(instancesRepo *serverRepo.InstancesRepo, referRepo *serverRepo.ReferRepo) *InstancesService {
	return &InstancesService{instancesRepo: instancesRepo, referRepo: referRepo}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
190
}