go-common/app/admin/main/config/service/config.go

921 lines
24 KiB
Go
Raw Normal View History

2019-04-22 10:49:16 +00:00
package service
import (
"bufio"
"bytes"
"context"
"database/sql"
"path/filepath"
"strconv"
"strings"
"go-common/app/admin/main/config/model"
"go-common/app/admin/main/config/pkg/lint"
"go-common/library/ecode"
"go-common/library/log"
"github.com/jinzhu/gorm"
)
func lintConfig(filename, content string) error {
ext := strings.TrimLeft(filepath.Ext(filename), ".")
err := lint.Lint(ext, bytes.NewBufferString(content))
if err != nil && err != lint.ErrLintNotExists {
return ecode.Error(ecode.RequestErr, err.Error())
}
return nil
}
// CreateConf create config.
func (s *Service) CreateConf(conf *model.Config, treeID int64, env, zone string, skiplint bool) error {
// lint config
if !skiplint {
if err := lintConfig(conf.Name, conf.Comment); err != nil {
return err
}
}
app, err := s.AppByTree(treeID, env, zone)
if err != nil {
return err
}
conf.AppID = app.ID
if _, err := s.configIng(conf.Name, app.ID); err == nil { // judge config is configIng
return ecode.TargetBlocked
}
return s.dao.DB.Create(conf).Error
}
// LintConfig lint config file
func (s *Service) LintConfig(filename, content string) ([]lint.LineErr, error) {
ext := strings.TrimLeft(filepath.Ext(filename), ".")
err := lint.Lint(ext, bytes.NewBufferString(content))
if err == nil || err == lint.ErrLintNotExists {
return make([]lint.LineErr, 0), nil
}
lintErr, ok := err.(lint.Error)
if !ok {
return nil, lintErr
}
return []lint.LineErr(lintErr), nil
}
// UpdateConfValue update config state.
func (s *Service) UpdateConfValue(conf *model.Config, skiplint bool) (err error) {
// lint config
if !skiplint {
if err := lintConfig(conf.Name, conf.Comment); err != nil {
return err
}
}
var confDB *model.Config
if confDB, err = s.Config(conf.ID); err != nil {
return
}
if confDB.State == model.ConfigIng { //judge config is configIng.
if conf.Mtime != confDB.Mtime {
err = ecode.TargetBlocked
return
}
conf.Mtime = 0
err = s.dao.DB.Model(&model.Config{State: model.ConfigIng}).Updates(conf).Error
return
}
if _, err = s.configIng(confDB.Name, confDB.AppID); err == nil {
err = ecode.TargetBlocked
return
}
if err == sql.ErrNoRows || err == ecode.NothingFound {
conf.ID = 0
conf.AppID = confDB.AppID
conf.Name = confDB.Name
if conf.From == 0 {
conf.From = confDB.From
}
conf.Mtime = 0
return s.dao.DB.Create(conf).Error
}
return
}
// UpdateConfState update config state.
func (s *Service) UpdateConfState(ID int64) (err error) {
err = s.dao.DB.Model(&model.Config{ID: ID}).Update("state", model.ConfigEnd).Error
return
}
// ConfigsByIDs get Config by IDs.
func (s *Service) ConfigsByIDs(ids []int64) (confs []*model.Config, err error) {
if err = s.dao.DB.Select("id,app_id,name,`from`,state,mark,operator,ctime,mtime,is_delete").Where(ids).Find(&confs).Error; err != nil {
log.Error("ConfigsByIDs(%v) error(%v)", ids, err)
if err == sql.ErrNoRows {
err = nil
}
}
return
}
// ConfigsByAppName get configs by app name.
func (s *Service) ConfigsByAppName(appName, env, zone string, treeID int64, state int8) (confs []*model.Config, err error) {
var app *model.App
if app, err = s.AppByTree(treeID, env, zone); err != nil {
if err == ecode.NothingFound {
err = s.CreateApp(appName, env, zone, treeID)
return
}
}
if state != 0 {
err = s.dao.DB.Select("id,app_id,name,`from`,state,mark,operator,is_delete,ctime,mtime").Where("app_id = ? and state =?", app.ID, state).Order("id desc").Find(&confs).Error
} else {
err = s.dao.DB.Select("id,app_id,name,`from`,state,mark,operator,is_delete,ctime,mtime").Where("app_id = ? ", app.ID).Order("id desc").Find(&confs).Error
}
if err != nil {
if err == sql.ErrNoRows {
err = nil
}
}
return
}
// ConfigsByAppID configs by app ID.
func (s *Service) ConfigsByAppID(appID int64, state int8) (confs []*model.Config, err error) {
if state != 0 {
err = s.dao.DB.Select("id,app_id,name,`from`,state,mark,operator,is_delete,ctime,mtime").Where("app_id = ? and state =?", appID, state).Order("id desc").Find(&confs).Error
} else {
err = s.dao.DB.Select("id,app_id,name,`from`,state,mark,operator,is_delete,ctime,mtime").Where("app_id = ? ", appID).Order("id desc").Find(&confs).Error
}
if err != nil {
if err == sql.ErrNoRows {
err = nil
}
}
return
}
//ConfigSearchApp configSearchApp.
func (s *Service) ConfigSearchApp(ctx context.Context, appName, env, zone, like string, buildID, treeID int64) (searchs []*model.ConfigSearch, err error) {
var (
app *model.App
builds []*model.Build
tags []*model.Tag
confs []*model.Config
tagIDs []int64
confIDs []int64
)
if app, err = s.AppByTree(treeID, env, zone); err != nil {
return
}
if builds, err = s.BuildsByApp(app.ID); err != nil {
return
}
if len(builds) == 0 {
return
}
for _, build := range builds {
tagIDs = append(tagIDs, build.TagID)
}
if err = s.dao.DB.Where("id in(?)", tagIDs).Find(&tags).Error; err != nil {
log.Error("tagsByIDs(%v) error(%v)", tagIDs, err)
if err == sql.ErrNoRows {
err = nil
}
return
}
tmp := make(map[int64]struct{})
for _, tag := range tags {
tmpIDs := strings.Split(tag.ConfigIDs, ",")
for _, tmpID := range tmpIDs {
var id int64
if id, err = strconv.ParseInt(tmpID, 10, 64); err != nil {
log.Error("strconv.ParseInt() error(%v)", err)
return
}
if _, ok := tmp[id]; !ok {
tmp[id] = struct{}{}
confIDs = append(confIDs, id)
}
}
}
if err = s.dao.DB.Where("id in (?) AND comment like(?) ", confIDs, "%"+like+"%").Find(&confs).Error; err != nil {
log.Error("confsByIDs(%v) error(%v)", confIDs, err)
if err == sql.ErrNoRows {
err = nil
}
return
}
for _, conf := range confs {
search := new(model.ConfigSearch)
search.App = appName
for _, tag := range tags {
tmpIDs := strings.Split(tag.ConfigIDs, ",")
for _, tmpID := range tmpIDs {
var id int64
if id, err = strconv.ParseInt(tmpID, 10, 64); err != nil {
log.Error("strconv.ParseInt() error(%v)", err)
return
}
if id != conf.ID { //judge config is in build.
continue
}
for _, build := range builds {
if build.ID == tag.BuildID {
search.Builds = append(search.Builds, build.Name)
}
}
}
}
//generate comment.
search.ConfValues = genComments(conf.Comment, like)
search.ConfID = conf.ID
search.Mark = conf.Mark
search.ConfName = conf.Name
searchs = append(searchs, search)
}
return
}
//ConfigSearchAll configSearchAll.
func (s *Service) ConfigSearchAll(ctx context.Context, env, zone, like string, nodes *model.CacheData) (searchs []*model.ConfigSearch, err error) {
var (
apps []*model.App
builds []*model.Build
tags []*model.Tag
confs []*model.Config
names []string
appIDs []int64
tagIDs []int64
configIDs []int64
)
searchs = make([]*model.ConfigSearch, 0)
if len(nodes.Data) == 0 {
return
}
for _, node := range nodes.Data {
names = append(names, node.Path)
}
if err = s.dao.DB.Where("env =? and zone =? and name in(?)", env, zone, names).Find(&apps).Error; err != nil {
log.Error("AppList() find apps() error(%v)", err)
if err == sql.ErrNoRows {
err = nil
}
return
}
for _, app := range apps {
appIDs = append(appIDs, app.ID)
}
if err = s.dao.DB.Where("app_id in(?) ", appIDs).Find(&builds).Error; err != nil {
log.Error("BuildsByAppIDs(%v) error(%v)", appIDs, err)
if err == sql.ErrNoRows {
err = nil
}
return
}
for _, build := range builds {
tagIDs = append(tagIDs, build.TagID)
}
if err = s.dao.DB.Where("id in(?)", tagIDs).Find(&tags).Error; err != nil {
log.Error("tagsByIDs(%v) error(%v)", tagIDs, err)
if err == sql.ErrNoRows {
err = nil
}
return
}
tmp := make(map[int64]struct{})
for _, tag := range tags {
tmpIDs := strings.Split(tag.ConfigIDs, ",")
for _, tmpID := range tmpIDs {
var id int64
if id, err = strconv.ParseInt(tmpID, 10, 64); err != nil {
log.Error("strconv.ParseInt() error(%v)", err)
return
}
if _, ok := tmp[id]; !ok {
tmp[id] = struct{}{}
configIDs = append(configIDs, id)
}
}
}
if err = s.dao.DB.Where("id in (?) and comment like(?) ", configIDs, "%"+like+"%").Find(&confs).Error; err != nil {
log.Error("confsByIDs(%v) error(%v)", configIDs, err)
if err == sql.ErrNoRows {
err = nil
}
return
}
if len(confs) == 0 {
return
}
// convert confs to confSearch.
for _, conf := range confs {
search := new(model.ConfigSearch)
for _, app := range apps {
if app.ID == conf.AppID {
search.App = app.Name
search.TreeID = app.TreeID
}
}
for _, tag := range tags {
tmpIDs := strings.Split(tag.ConfigIDs, ",")
for _, tmpID := range tmpIDs {
var id int64
if id, err = strconv.ParseInt(tmpID, 10, 64); err != nil {
log.Error("strconv.ParseInt() error(%v)", err)
return
}
if id != conf.ID { //judge config is in build.
continue
}
for _, build := range builds {
if build.ID == tag.BuildID {
search.Builds = append(search.Builds, build.Name)
}
}
}
}
//generate comment.
search.ConfValues = genComments(conf.Comment, like)
search.ConfID = conf.ID
search.Mark = conf.Mark
search.ConfName = conf.Name
searchs = append(searchs, search)
}
return
}
func genComments(comment, like string) (comments []string) {
var (
line []byte
l, cur []byte
err error
)
wbuf := new(bytes.Buffer)
rbuf := bufio.NewReader(strings.NewReader(comment))
for {
l = line
if line, _, err = rbuf.ReadLine(); err != nil {
break
}
if bytes.Contains(line, []byte(like)) {
cur = line
wbuf.Write(l)
wbuf.WriteString("\n")
wbuf.Write(cur)
wbuf.WriteString("\n")
line, _, _ = rbuf.ReadLine()
wbuf.Write(line)
wbuf.WriteString("\n")
comments = append(comments, wbuf.String())
wbuf.Reset()
}
}
return
}
//Configs configs.
func (s *Service) Configs(appName, env, zone string, buildID, treeID int64) (res *model.ConfigRes, err error) {
var (
allConfs []*model.Config
buildConfs []*model.Config
lastConfs []*model.Config
app *model.App
build *model.Build
)
if app, err = s.AppByTree(treeID, env, zone); err != nil {
if err == ecode.NothingFound {
err = s.CreateApp(appName, env, zone, treeID)
return
}
}
if allConfs, err = s.ConfigsByAppID(app.ID, 0); err != nil {
return
}
if buildID != 0 {
if build, err = s.Build(buildID); err != nil {
return
}
if build.AppID != app.ID {
err = ecode.NothingFound
return
}
tagID := build.TagID
if tagID == 0 {
return
}
if buildConfs, err = s.ConfigsByTagID(tagID); err != nil {
return
}
if lastConfs, err = s.LastBuildConfigConfigs(build.AppID, buildID); err != nil {
if err != ecode.NothingFound {
return
}
err = nil
}
}
tmpMap := make(map[string]struct{})
res = new(model.ConfigRes)
for _, conf := range allConfs {
if _, ok := tmpMap[conf.Name]; ok {
continue
}
//new common
if conf.From > 0 {
conf.NewCommon, _ = s.NewCommon(conf.From)
}
tmpMap[conf.Name] = struct{}{}
var bool bool
for _, bconf := range buildConfs {
//new common
if bconf.From > 0 {
bconf.NewCommon, _ = s.NewCommon(bconf.From)
}
if bconf.Name == conf.Name {
if bconf.ID != conf.ID {
if conf.IsDelete != 1 {
res.BuildNewFile = append(res.BuildNewFile, conf)
}
}
bf := &model.BuildFile{Config: bconf}
if bf.IsDelete == 0 {
res.BuildFiles = append(res.BuildFiles, bf)
}
for _, lconf := range lastConfs {
if lconf.Name == bconf.Name {
if lconf.ID != bconf.ID {
bf.LastConf = lconf
}
}
}
bool = true
break
}
}
if !bool {
if conf.IsDelete != 1 {
res.Files = append(res.Files, conf)
}
continue
}
}
return
}
// NewCommon get new common id
func (s *Service) NewCommon(from int64) (new int64, err error) {
common := &model.CommonConf{}
newCommon := &model.CommonConf{}
if err = s.dao.DB.First(&common, from).Error; err != nil {
log.Error("NewCommon.First.from(%d) error(%v)", from, err)
return
}
if err = s.dao.DB.Where("team_id = ? and name = ? and state = 2", common.TeamID, common.Name).Order("id desc").First(&newCommon).Error; err != nil {
log.Error("NewCommon.Order.First.common(%v) error(%v)", common, err)
return
}
new = newCommon.ID
return
}
//ConfigRefs configRefs.
func (s *Service) ConfigRefs(appName, env, zone string, buildID, treeID int64) (res []*model.ConfigRefs, err error) {
var (
allConfs []*model.Config
buildConfs []*model.Config
num int
ok bool
ref *model.ConfigRefs
)
if allConfs, err = s.ConfigsByAppName(appName, env, zone, treeID, model.ConfigEnd); err != nil {
return
}
if buildID != 0 {
if buildConfs, err = s.ConfigsByBuildID(buildID); err != nil {
return
}
}
tmpMap := make(map[string]int)
refs := make(map[string]*model.ConfigRefs)
for _, conf := range allConfs {
if num, ok = tmpMap[conf.Name]; !ok {
ref = new(model.ConfigRefs)
refs[conf.Name] = ref
tmpMap[conf.Name] = num
} else {
ref = refs[conf.Name]
}
if num <= 5 {
ref.Configs = append(ref.Configs, &model.ConfigRef{ID: conf.ID, Mark: conf.Mark})
tmpMap[conf.Name] = num + 1
}
if ref.Ref != nil {
continue
}
for _, bconf := range buildConfs {
if bconf.Name == conf.Name {
ref.Ref = &model.ConfigRef{ID: bconf.ID, Mark: bconf.Mark}
break
}
}
}
for k, v := range refs {
v.Name = k
res = append(res, v)
}
return
}
// ConfigsByBuildID get configs by build ID.
func (s *Service) ConfigsByBuildID(buildID int64) (confs []*model.Config, err error) {
var (
build *model.Build
)
if build, err = s.Build(buildID); err != nil {
return
}
tagID := build.TagID
if tagID == 0 {
return
}
return s.ConfigsByTagID(tagID)
}
// LastBuildConfigs get configs by build ID.
func (s *Service) LastBuildConfigs(appID, buildID int64) (confs []*model.Config, err error) {
var (
tag *model.Tag
ids []int64
id int64
)
if tag, err = s.LastTagByAppBuild(appID, buildID); err != nil {
return
}
confIDs := tag.ConfigIDs
if len(confIDs) == 0 {
return
}
tmpIDs := strings.Split(confIDs, ",")
for _, tmpID := range tmpIDs {
if id, err = strconv.ParseInt(tmpID, 10, 64); err != nil {
log.Error("strconv.ParseInt(%s) error(%v)", tmpID, err)
return
}
ids = append(ids, id)
}
return s.ConfigsByIDs(ids)
}
// LastBuildConfigConfigs get configs by build ID.
func (s *Service) LastBuildConfigConfigs(appID, buildID int64) (confs []*model.Config, err error) {
var (
tag *model.Tag
ids []int64
id int64
tmps []*model.Config
cids []int64
lastIDS []int64
)
if tag, err = s.TagByAppBuild(appID, buildID); err != nil {
return
}
confIDs := tag.ConfigIDs
if len(confIDs) == 0 {
return
}
tmpIDs := strings.Split(confIDs, ",")
for _, tmpID := range tmpIDs {
if id, err = strconv.ParseInt(tmpID, 10, 64); err != nil {
log.Error("strconv.ParseInt(%s) error(%v)", tmpID, err)
return
}
ids = append(ids, id)
}
tmps, err = s.ConfigsByIDs(ids)
if err != nil {
log.Error("LastBuildConfigConfigs ids(%v) error(%v)", ids, err)
return
}
for _, val := range tmps {
cs, err := s.ConfigList(val.AppID, val.Name)
if err == nil {
cids = nil
csloop:
for _, vv := range cs {
for _, vvv := range ids {
if vvv == vv.ID {
continue csloop
}
}
cids = append(cids, vv.ID)
}
if configID, err := s.TagByAppBuildLastConfig(appID, buildID, tag.ID, cids); err == nil {
lastIDS = append(lastIDS, configID)
}
}
}
return s.ConfigsByIDs(lastIDS)
}
// ConfigList ...
func (s *Service) ConfigList(appID int64, name string) (confs []*model.Config, err error) {
if err = s.dao.DB.Where("app_id = ? and name = ?", appID, name).Order("id desc").Find(&confs).Error; err != nil {
log.Error("ConfigList appid(%v) name(%v) error(%v)", appID, name, err)
}
return
}
// ConfigsByTagID get configs by tag id.
func (s *Service) ConfigsByTagID(tagID int64) (confs []*model.Config, err error) {
var (
tag *model.Tag
ids []int64
id int64
)
if tag, err = s.Tag(tagID); err != nil {
return
}
confIDs := tag.ConfigIDs
if len(confIDs) == 0 {
err = ecode.NothingFound
return
}
tmpIDs := strings.Split(confIDs, ",")
for _, tmpID := range tmpIDs {
if id, err = strconv.ParseInt(tmpID, 10, 64); err != nil {
log.Error("strconv.ParseInt(%s) error(%v)", tmpID, err)
return
}
ids = append(ids, id)
}
return s.ConfigsByIDs(ids)
}
//Config get Config by Config ID.
func (s *Service) Config(ID int64) (conf *model.Config, err error) {
conf = new(model.Config)
err = s.dao.DB.First(&conf, ID).Error
return
}
func (s *Service) configIng(name string, appID int64) (conf *model.Config, err error) {
conf = new(model.Config)
if err = s.dao.DB.Select("id").Where("name = ? and app_id = ? and state=?", name, appID, model.ConfigIng).First(&conf).Error; err != nil {
log.Error("configIng(%v) error(%v)", name, err)
if err == sql.ErrNoRows {
err = ecode.NothingFound
}
}
return
}
//Value get value by Config ID.
func (s *Service) Value(ID int64) (conf *model.Config, err error) {
conf = new(model.Config)
if err = s.dao.DB.First(&conf, ID).Error; err != nil {
log.Error("Value() error(%v)", err)
}
return
}
//ConfigsByTree get Config by Config name.
func (s *Service) ConfigsByTree(treeID int64, env, zone, name string) (confs []*model.Config, err error) {
var app *model.App
if app, err = s.AppByTree(treeID, env, zone); err != nil {
return
}
if err = s.dao.DB.Order("id desc").Limit(10).Find(&confs, "name = ? and app_id = ?", name, app.ID).Error; err != nil {
if err == sql.ErrNoRows {
err = nil
}
return
}
return
}
// NamesByAppTree get configs by app name.
func (s *Service) NamesByAppTree(appName, env, zone string, treeID int64) (names []string, err error) {
var (
app *model.App
confs []*model.Config
)
if app, err = s.AppByTree(treeID, env, zone); err != nil {
if err == ecode.NothingFound {
err = s.CreateApp(appName, env, zone, treeID)
return
}
}
if err = s.dao.DB.Select("name").Where("app_id = ?", app.ID).Order("id desc").Group("name").Find(&confs).Error; err != nil {
log.Error("NamesByAppName(%v) error(%v)", app.ID, err)
if err == sql.ErrNoRows {
err = nil
}
return
}
for _, conf := range confs {
names = append(names, conf.Name)
}
return
}
//Diff get value by Config ID.
func (s *Service) Diff(ID, BuildID int64) (data *model.Config, err error) {
var tmpID int64
var idArr []string
conf := new(model.Config)
if err = s.dao.DB.First(&conf, ID).Error; err != nil {
log.Error("Diff() config_id(%v) error(%v)", ID, err)
return
}
config := []*model.Config{}
if err = s.dao.DB.Where("`app_id` = ? and `name` = ? and `state` = 2", conf.AppID, conf.Name).Order("id desc").Find(&config).Error; err != nil {
log.Error("Diff() app_id(%v) name(%v) error(%v)", conf.AppID, conf.Name, err)
return
}
build := &model.Build{}
if err = s.dao.DB.First(build, BuildID).Error; err != nil && err != gorm.ErrRecordNotFound {
log.Error("Diff() build_id(%v) error(%v)", BuildID, err)
return
}
err = nil
if build.ID > 0 {
tag := &model.Tag{}
if err = s.dao.DB.First(tag, build.TagID).Error; err != nil {
log.Error("Diff() tag_id(%v) error(%v)", build.TagID, err)
return
}
idArr = strings.Split(tag.ConfigIDs, ",")
}
if len(idArr) > 0 {
for _, val := range config {
for _, vv := range idArr {
tmpID, _ = strconv.ParseInt(vv, 10, 64)
if tmpID == val.ID {
data = val
return
}
}
}
}
for _, val2 := range config {
if val2.ID < ID {
data = val2
return
}
}
data = conf
return
}
//ConfigDel config is delete.
func (s *Service) ConfigDel(ID int64) (err error) {
conf := &model.Config{}
if err = s.dao.DB.First(conf, ID).Error; err != nil {
log.Error("ConfigDel first id(%v) error(%v)", ID, err)
return
}
confs := []*model.Config{}
if err = s.dao.DB.Where("app_id = ? and name = ?", conf.AppID, conf.Name).Find(&confs).Error; err != nil {
log.Error("ConfigDel find error(%v)", err)
return
}
build := []*model.Build{}
if err = s.dao.DB.Where("app_id = ?", conf.AppID).Find(&build).Error; err != nil {
log.Error("ConfigDel find app_id(%v) error(%v)", conf.AppID, err)
return
}
for _, val := range build {
tag := &model.Tag{}
if err = s.dao.DB.Where("id = ?", val.TagID).First(tag).Error; err != nil {
log.Error("ConfigDel first tag_id(%v) error(%v)", val.TagID, err)
return
}
arr := strings.Split(tag.ConfigIDs, ",")
for _, vv := range arr {
for _, vvv := range confs {
if vv == strconv.FormatInt(vvv.ID, 10) {
err = ecode.NothingFound
return
}
}
}
}
ups := map[string]interface{}{
"is_delete": 1,
"state": 2,
}
if err = s.dao.DB.Model(conf).Where("id = ?", ID).Updates(ups).Error; err != nil {
log.Error("ConfigDel updates error(%v)", err)
}
return
}
//BuildConfigInfos configRefs.
func (s *Service) BuildConfigInfos(appName, env, zone string, buildID, treeID int64) (res map[string][]*model.ConfigRefs, err error) {
var (
allConfs []*model.Config
buildConfs []*model.Config
num int
ok bool
ref *model.ConfigRefs
)
if allConfs, err = s.ConfigsByAppName(appName, env, zone, treeID, model.ConfigEnd); err != nil {
return
}
if buildID != 0 {
if buildConfs, err = s.ConfigsByBuildID(buildID); err != nil {
return
}
}
tmpMap := make(map[string]int)
tmpBuildConfs := make(map[string]map[int64]struct{})
refs := make(map[string]*model.ConfigRefs)
for _, conf := range allConfs {
if num, ok = tmpMap[conf.Name]; !ok {
ref = new(model.ConfigRefs)
refs[conf.Name] = ref
tmpMap[conf.Name] = num
} else {
ref = refs[conf.Name]
}
if num <= 20 {
ref.Configs = append(ref.Configs, &model.ConfigRef{ID: conf.ID, Mark: conf.Mark, IsDelete: conf.IsDelete})
tmpMap[conf.Name] = num + 1
if tmpBuildConfs[conf.Name] == nil {
tmpBuildConfs[conf.Name] = make(map[int64]struct{})
}
tmpBuildConfs[conf.Name][conf.ID] = struct{}{}
} else {
for _, bconf := range buildConfs {
if bconf.Name == conf.Name {
if _, ok = tmpBuildConfs[conf.Name][bconf.ID]; !ok {
tmpBuildConfs[conf.Name][bconf.ID] = struct{}{}
ref.Configs = append(ref.Configs, &model.ConfigRef{ID: bconf.ID, Mark: bconf.Mark, IsDelete: bconf.IsDelete})
}
break
}
}
}
if ref.Ref != nil {
continue
}
for _, bconf := range buildConfs {
if bconf.Name == conf.Name {
ref.Ref = &model.ConfigRef{ID: bconf.ID, Mark: bconf.Mark, IsDelete: bconf.IsDelete}
break
}
}
}
res = make(map[string][]*model.ConfigRefs)
var tp int64
var IsDelete int64
capacity := len(refs)
res["new"] = make([]*model.ConfigRefs, 0, capacity)
res["nothing"] = make([]*model.ConfigRefs, 0, capacity)
res["notused"] = make([]*model.ConfigRefs, 0, capacity)
for k, v := range refs {
v.Name = k
IsDelete = 0
for i, tv := range v.Configs {
if tv.IsDelete == 1 && tv.ID > IsDelete {
IsDelete = tv.ID
v.Configs = v.Configs[:i]
}
}
v.DeleteMAX = IsDelete
if len(v.Configs) == 0 {
continue
}
if v.Ref != nil {
tp = 0
for _, vv := range v.Configs {
if vv.ID > v.Ref.ID {
tp = vv.ID
}
}
if tp > 0 {
res["new"] = append(res["new"], v)
} else {
res["nothing"] = append(res["nothing"], v)
}
} else {
res["notused"] = append(res["notused"], v)
}
}
return
}
// GetConfigs ...
func (s *Service) GetConfigs(ids []int64, name string) (configs []*model.Config, err error) {
if err = s.dao.DB.Where("name = ? AND id in (?)", name, ids).Find(&configs).Error; err != nil {
log.Error("GetConfigs error(%v)", err)
}
return
}
// GetConfig ...
func (s *Service) GetConfig(ids []int64, name string) (config *model.Config, err error) {
config = new(model.Config)
if err = s.dao.DB.Where("name = ? AND id in (?)", name, ids).First(config).Error; err != nil {
log.Error("GetConfigs error(%v)", err)
}
return
}