You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
617 lines
16 KiB
617 lines
16 KiB
package http |
|
|
|
import ( |
|
"encoding/json" |
|
"fmt" |
|
"go-common/app/admin/main/config/model" |
|
"go-common/library/ecode" |
|
"go-common/library/log" |
|
bm "go-common/library/net/http/blademaster" |
|
"go-common/library/time" |
|
"strconv" |
|
"strings" |
|
|
|
"github.com/jinzhu/gorm" |
|
) |
|
|
|
func createConfig(c *bm.Context) { |
|
res := map[string]interface{}{} |
|
v := new(model.CreateConfigReq) |
|
err := c.Bind(v) |
|
if err != nil { |
|
return |
|
} |
|
user := user(c) |
|
if _, err = svr.AuthApp(c, user, c.Request.Header.Get("Cookie"), v.TreeID); err != nil { |
|
res["message"] = "服务树权限不足" |
|
c.JSONMap(res, err) |
|
return |
|
} |
|
conf := &model.Config{} |
|
conf.Operator = user |
|
conf.Name = v.Name |
|
conf.Mark = v.Mark |
|
conf.Comment = v.Comment |
|
conf.State = v.State |
|
conf.From = v.From |
|
c.JSON(nil, svr.CreateConf(conf, v.TreeID, v.Env, v.Zone, v.SkipLint)) |
|
} |
|
|
|
func lintConfig(c *bm.Context) { |
|
var req struct { |
|
Name string `form:"name" validate:"required"` |
|
Comment string `form:"comment" validate:"required"` |
|
} |
|
if err := c.Bind(&req); err != nil { |
|
// ignore error |
|
return |
|
} |
|
c.JSON(svr.LintConfig(req.Name, req.Comment)) |
|
} |
|
|
|
func updateConfValue(c *bm.Context) { |
|
res := map[string]interface{}{} |
|
v := new(model.UpdateConfValueReq) |
|
err := c.Bind(v) |
|
if err != nil { |
|
return |
|
} |
|
user := user(c) |
|
if _, err = svr.AuthApps(c, user, c.Request.Header.Get("Cookie")); err != nil { |
|
res["message"] = "服务树权限不足" |
|
c.JSONMap(res, err) |
|
return |
|
} |
|
conf := &model.Config{} |
|
conf.Name = v.Name |
|
conf.ID = v.ID |
|
conf.Operator = user |
|
conf.Mark = v.Mark |
|
conf.Comment = v.Comment |
|
conf.State = v.State |
|
conf.Mtime = time.Time(v.Mtime) |
|
var configs *model.Config |
|
configs, err = svr.Value(v.ID) |
|
if err != nil { |
|
res["message"] = "未找到源文件" |
|
c.JSONMap(res, err) |
|
return |
|
} |
|
if v.NewCommon > 0 { |
|
common := &model.CommonConf{} |
|
common2 := &model.CommonConf{} |
|
if err = svr.DB.Where("id = ?", configs.From).First(common).Error; err != nil { |
|
res["message"] = "未找到公共源文件" |
|
c.JSONMap(res, err) |
|
return |
|
} |
|
if err = svr.DB.Where("team_id = ? and name = ? and state = 2 and id = ?", common.TeamID, common.Name, v.NewCommon).Order("id desc").First(common2).Error; err != nil { |
|
res["message"] = "未找到最新的公共文件" |
|
c.JSONMap(res, err) |
|
return |
|
} |
|
conf.From = v.NewCommon |
|
} |
|
//验证是否最新源文件 |
|
newConfig := &model.Config{} |
|
if err = svr.DB.Where("app_id = ? and name = ?", configs.AppID, configs.Name).Order("id desc").First(newConfig).Error; err != nil { |
|
res["message"] = "未找到最新文件" |
|
c.JSONMap(res, err) |
|
return |
|
} |
|
//默认验证ignore 0 |
|
if newConfig.ID != v.ID && v.Ignore == 0 && user != newConfig.Operator { |
|
err = ecode.ConfigNotNow |
|
res["message"] = fmt.Sprintf("当前源文件:(%d)有最新源文件版本(%d)操作人:%s是否继续提交?", v.ID, newConfig.ID, newConfig.Operator) |
|
c.JSONMap(res, err) |
|
return |
|
} |
|
c.JSON(nil, svr.UpdateConfValue(conf, v.SkipLint)) |
|
} |
|
|
|
func value(c *bm.Context) { |
|
res := map[string]interface{}{} |
|
v := new(model.ValueReq) |
|
err := c.Bind(v) |
|
if err != nil { |
|
return |
|
} |
|
var TreeID int64 |
|
TreeID, err = svr.ConfigGetTreeID(v.ConfigID) |
|
if err != nil { |
|
res["message"] = "未找到tree_id" |
|
c.JSONMap(res, err) |
|
return |
|
} |
|
if _, err = svr.AuthApp(c, user(c), c.Request.Header.Get("Cookie"), TreeID); err != nil { |
|
res["message"] = "服务树权限不足" |
|
c.JSONMap(res, err) |
|
return |
|
} |
|
c.JSON(svr.Value(v.ConfigID)) |
|
} |
|
|
|
func configsByBuildID(c *bm.Context) { |
|
res := map[string]interface{}{} |
|
v := new(model.ConfigsByBuildIDReq) |
|
err := c.Bind(v) |
|
if err != nil { |
|
return |
|
} |
|
if _, err = svr.AuthApps(c, user(c), c.Request.Header.Get("Cookie")); err != nil { |
|
res["message"] = "服务树权限不足" |
|
c.JSONMap(res, err) |
|
return |
|
} |
|
c.JSON(svr.ConfigsByBuildID(v.BuildID)) |
|
} |
|
|
|
func configsByTagID(c *bm.Context) { |
|
res := map[string]interface{}{} |
|
v := new(model.ConfigsByTagIDReq) |
|
err := c.Bind(v) |
|
if err != nil { |
|
return |
|
} |
|
if _, err = svr.AuthApps(c, user(c), c.Request.Header.Get("Cookie")); err != nil { |
|
res["message"] = "服务树权限不足" |
|
c.JSONMap(res, err) |
|
return |
|
} |
|
c.JSON(svr.ConfigsByTagID(v.TagID)) |
|
} |
|
|
|
func configsByAppName(c *bm.Context) { |
|
res := map[string]interface{}{} |
|
v := new(model.ConfigsByAppNameReq) |
|
err := c.Bind(v) |
|
if err != nil { |
|
return |
|
} |
|
if _, err = svr.AuthApp(c, user(c), c.Request.Header.Get("Cookie"), v.TreeID); err != nil { |
|
res["message"] = "服务树权限不足" |
|
c.JSONMap(res, err) |
|
return |
|
} |
|
c.JSON(svr.ConfigsByAppName(v.AppName, v.Env, v.Zone, v.TreeID, 0)) |
|
} |
|
|
|
func configSearchAll(c *bm.Context) { |
|
res := map[string]interface{}{} |
|
v := new(model.ConfigSearchAllReq) |
|
err := c.Bind(v) |
|
if err != nil { |
|
return |
|
} |
|
nodes, err := svr.AuthApps(c, user(c), c.Request.Header.Get("Cookie")) |
|
if err != nil { |
|
res["message"] = "服务树权限不足" |
|
c.JSONMap(res, err) |
|
return |
|
} |
|
c.JSON(svr.ConfigSearchAll(c, v.Env, v.Zone, v.Like, nodes)) |
|
} |
|
|
|
func configSearchApp(c *bm.Context) { |
|
res := map[string]interface{}{} |
|
v := new(model.ConfigSearchAppReq) |
|
err := c.Bind(v) |
|
if err != nil { |
|
return |
|
} |
|
if _, err = svr.AuthApp(c, user(c), c.Request.Header.Get("Cookie"), v.TreeID); err != nil { |
|
res["message"] = "服务树权限不足" |
|
c.JSONMap(res, err) |
|
return |
|
} |
|
c.JSON(svr.ConfigSearchApp(c, v.AppName, v.Env, v.Zone, v.Like, v.BuildID, v.TreeID)) |
|
} |
|
|
|
func configsByName(c *bm.Context) { |
|
res := map[string]interface{}{} |
|
v := new(model.ConfigsByNameReq) |
|
err := c.Bind(v) |
|
if err != nil { |
|
return |
|
} |
|
if _, err = svr.AuthApp(c, user(c), c.Request.Header.Get("Cookie"), v.TreeID); err != nil { |
|
res["message"] = "服务树权限不足" |
|
c.JSONMap(res, err) |
|
return |
|
} |
|
c.JSON(svr.ConfigsByTree(v.TreeID, v.Env, v.Zone, v.Name)) |
|
} |
|
|
|
func configs(c *bm.Context) { |
|
res := map[string]interface{}{} |
|
v := new(model.ConfigsReq) |
|
err := c.Bind(v) |
|
if err != nil { |
|
return |
|
} |
|
if _, err = svr.AuthApp(c, user(c), c.Request.Header.Get("Cookie"), v.TreeID); err != nil { |
|
res["message"] = "服务树权限不足" |
|
c.JSONMap(res, err) |
|
return |
|
} |
|
c.JSON(svr.Configs(v.AppName, v.Env, v.Zone, v.BuildID, v.TreeID)) |
|
} |
|
|
|
func configRefs(c *bm.Context) { |
|
res := map[string]interface{}{} |
|
v := new(model.ConfigRefsReq) |
|
err := c.Bind(v) |
|
if err != nil { |
|
return |
|
} |
|
if _, err = svr.AuthApp(c, user(c), c.Request.Header.Get("Cookie"), v.TreeID); err != nil { |
|
res["message"] = "服务树权限不足" |
|
c.JSONMap(res, err) |
|
return |
|
} |
|
c.JSON(svr.ConfigRefs(v.AppName, v.Env, v.Zone, v.BuildID, v.TreeID)) |
|
} |
|
|
|
func namesByAppName(c *bm.Context) { |
|
res := map[string]interface{}{} |
|
v := new(model.NamesByAppNameReq) |
|
err := c.Bind(v) |
|
if err != nil { |
|
return |
|
} |
|
if _, err = svr.AuthApp(c, user(c), c.Request.Header.Get("Cookie"), v.TreeID); err != nil { |
|
res["message"] = "服务树权限不足" |
|
c.JSONMap(res, err) |
|
return |
|
} |
|
c.JSON(svr.NamesByAppTree(v.AppName, v.Env, v.Zone, v.TreeID)) |
|
} |
|
|
|
func diff(c *bm.Context) { |
|
res := map[string]interface{}{} |
|
v := new(model.DiffReq) |
|
err := c.Bind(v) |
|
if err != nil { |
|
return |
|
} |
|
if _, err = svr.AuthApps(c, user(c), c.Request.Header.Get("Cookie")); err != nil { |
|
res["message"] = "服务树权限不足" |
|
c.JSONMap(res, err) |
|
return |
|
} |
|
c.JSON(svr.Diff(v.ConfigID, v.BuildID)) |
|
} |
|
|
|
func configDel(c *bm.Context) { |
|
res := map[string]interface{}{} |
|
v := new(model.ConfigDelReq) |
|
err := c.Bind(v) |
|
if err != nil { |
|
return |
|
} |
|
if _, err = svr.AuthApps(c, user(c), c.Request.Header.Get("Cookie")); err != nil { |
|
res["message"] = "服务树权限不足" |
|
c.JSONMap(res, err) |
|
return |
|
} |
|
c.JSON(nil, svr.ConfigDel(v.ConfigID)) |
|
} |
|
|
|
func configBuildInfos(c *bm.Context) { |
|
res := map[string]interface{}{} |
|
v := new(model.ConfigBuildInfosReq) |
|
err := c.Bind(v) |
|
if err != nil { |
|
return |
|
} |
|
if _, err = svr.AuthApp(c, user(c), c.Request.Header.Get("Cookie"), v.TreeID); err != nil { |
|
res["message"] = "服务树权限不足" |
|
c.JSONMap(res, err) |
|
return |
|
} |
|
c.JSON(svr.BuildConfigInfos(v.AppName, v.Env, v.Zone, v.BuildID, v.TreeID)) |
|
} |
|
|
|
func configUpdate(c *bm.Context) { |
|
res := map[string]interface{}{} |
|
v := new(model.ConfigUpdateReq) |
|
err := c.Bind(v) |
|
if err != nil { |
|
return |
|
} |
|
app := &model.App{} |
|
if err = svr.DB.Where("name = ? and env = ? and zone = ? and tree_id = ? and token = ?", v.AppName, v.Env, v.Zone, v.TreeID, v.Token).First(app).Error; err != nil { |
|
res["message"] = "参数不正确,未找到该服务" |
|
c.JSONMap(res, err) |
|
return |
|
} |
|
var obj []map[string]string |
|
err = json.Unmarshal([]byte(v.Data), &obj) |
|
tx := svr.DB.Begin() |
|
for _, val := range obj { |
|
if len(val["name"]) > 0 { |
|
config := &model.Config{} |
|
if err = tx.Where("app_id = ? and name = ? and state = 1", app.ID, val["name"]).First(config).Error; err != nil { |
|
if err != gorm.ErrRecordNotFound { |
|
c.JSON(nil, err) |
|
tx.Rollback() |
|
return |
|
} |
|
} else { |
|
//把老的更新了再加新的 |
|
ups := map[string]interface{}{ |
|
"state": 2, |
|
} |
|
if err = tx.Model(&model.App{}).Where("id = ? ", config.ID).Updates(ups).Error; err != nil { |
|
c.JSON(nil, err) |
|
tx.Rollback() |
|
return |
|
} |
|
} |
|
//加新的 |
|
m := &model.Config{ |
|
AppID: app.ID, |
|
Name: val["name"], |
|
Comment: val["comment"], |
|
State: 2, |
|
Mark: val["mark"], |
|
Operator: v.User, |
|
} |
|
db := tx.Create(m) |
|
if err = db.Error; err != nil { |
|
res["message"] = "创建失败" |
|
c.JSONMap(res, err) |
|
tx.Rollback() |
|
return |
|
} |
|
} else { |
|
c.JSON(nil, ecode.RequestErr) |
|
tx.Rollback() |
|
return |
|
} |
|
} |
|
tx.Commit() |
|
c.JSON(nil, err) |
|
} |
|
|
|
func tagUpdate(c *bm.Context) { |
|
res := map[string]interface{}{} |
|
v := new(model.TagUpdateReq) |
|
err := c.Bind(v) |
|
if err != nil { |
|
return |
|
} |
|
if len(strings.TrimSpace(v.Build)) == 0 { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
app := &model.App{} |
|
if err = svr.DB.Where("name = ? and env = ? and zone = ? and tree_id = ? and token = ?", v.AppName, v.Env, v.Zone, v.TreeID, v.Token).First(app).Error; err != nil { |
|
res["message"] = "参数不正确,未找到该服务" |
|
c.JSONMap(res, err) |
|
return |
|
} |
|
confs := []*model.Config{} |
|
tags := &model.Tag{} |
|
tag := &model.Tag{} |
|
build := &model.Build{} |
|
tagConfigs := []*model.Config{} |
|
var in []string |
|
var in2 []string |
|
var nameString string |
|
tmp := make(map[string]struct{}) |
|
if v.ConfigIDs == "" && v.Names == "" { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} else if v.Names != "" { |
|
in = strings.Split(v.Names, ",") |
|
if err = svr.DB.Select("max(id) as id,name").Where("app_id = ? and state = 2 and is_delete = 0 and name in (?)", app.ID, in).Group("name").Find(&confs).Error; err != nil { |
|
res["message"] = "未找到发版文件" |
|
c.JSONMap(res, err) |
|
return |
|
} |
|
for _, vv := range confs { |
|
if len(nameString) > 0 { |
|
nameString = nameString + "," |
|
} |
|
nameString = nameString + strconv.FormatInt(vv.ID, 10) |
|
} |
|
tag.ConfigIDs = nameString |
|
} else if v.ConfigIDs != "" { |
|
in = strings.Split(v.ConfigIDs, ",") |
|
if err = svr.DB.Where("app_id = ? and state = 2 and is_delete = 0 and id in (?)", app.ID, in).Find(&confs).Error; err != nil { |
|
res["message"] = "未找到发版文件" |
|
c.JSONMap(res, err) |
|
return |
|
} |
|
tag.ConfigIDs = v.ConfigIDs |
|
} |
|
if v.Names != "" && v.Increment == 1 { |
|
if err = svr.DB.Where("app_id = ? and name = ?", app.ID, v.Build).Order("id desc").First(build).Error; err != nil { |
|
res["message"] = "未找到对应的build" |
|
c.JSONMap(res, err) |
|
return |
|
} |
|
if err = svr.DB.Where("app_id = ? and build_id = ?", app.ID, build.ID).Order("id desc").First(tags).Error; err != nil { |
|
res["message"] = "未找到对应的tag" |
|
c.JSONMap(res, err) |
|
return |
|
} |
|
in2 = strings.Split(tags.ConfigIDs, ",") |
|
if err = svr.DB.Where("app_id = ? and state = 2 and id in (?)", app.ID, in2).Find(&tagConfigs).Error; err != nil { |
|
res["message"] = "未找到tag中的文件" |
|
c.JSONMap(res, err) |
|
return |
|
} |
|
for _, vv := range tagConfigs { |
|
tss := 0 |
|
for _, vvv := range confs { |
|
if vv.Name == vvv.Name { |
|
tss = 1 |
|
} |
|
} |
|
if tss != 1 { |
|
if len(nameString) > 0 { |
|
nameString = nameString + "," |
|
} |
|
nameString = nameString + strconv.FormatInt(vv.ID, 10) |
|
} |
|
} |
|
tag.ConfigIDs = nameString |
|
} else { |
|
if len(confs) != len(in) { |
|
res["message"] = "发版数据不符" |
|
c.JSONMap(res, ecode.RequestErr) |
|
return |
|
} |
|
for _, vv := range confs { |
|
if _, ok := tmp[vv.Name]; !ok { |
|
tmp[vv.Name] = struct{}{} |
|
} |
|
} |
|
if len(tmp) != len(confs) { |
|
res["message"] = "有重复的文件名" |
|
c.JSONMap(res, ecode.RequestErr) |
|
return |
|
} |
|
} |
|
tag.Operator = v.User |
|
tag.Mark = v.Mark |
|
if v.Force == 1 { |
|
tag.Force = 1 |
|
} |
|
c.JSON(nil, svr.UpdateTag(c, v.TreeID, v.Env, v.Zone, v.Build, tag)) |
|
} |
|
|
|
func canalTagUpdate(c *bm.Context) { |
|
res := map[string]interface{}{} |
|
v := new(model.CanalTagUpdateReq) |
|
err := c.Bind(v) |
|
if err != nil { |
|
return |
|
} |
|
if v.Force != 1 { |
|
v.Force = 0 |
|
} |
|
if len(strings.TrimSpace(v.Build)) == 0 { |
|
c.JSON(nil, ecode.RequestErr) |
|
return |
|
} |
|
app := &model.App{} |
|
if err = svr.DB.Where("name = ? and env = ? and zone = ? and tree_id = ? and token = ?", v.AppName, v.Env, v.Zone, v.TreeID, v.Token).First(app).Error; err != nil { |
|
res["message"] = "参数不正确,未找到该服务" |
|
c.JSONMap(res, err) |
|
return |
|
} |
|
confs := []*model.Config{} |
|
configs := []*model.Config{} |
|
tags := &model.Tag{} |
|
tag := &model.Tag{} |
|
build := &model.Build{} |
|
tagConfigs := []*model.Config{} |
|
var in []string |
|
var in2 []string |
|
var nameString string |
|
tmp := make(map[string]struct{}) |
|
in = strings.Split(v.ConfigIDs, ",") |
|
if err = svr.DB.Where("app_id = ? and state = 2 and id in(?)", app.ID, in).Find(&configs).Error; err != nil { |
|
res["message"] = "未找到文件" |
|
c.JSONMap(res, err) |
|
return |
|
} |
|
if len(configs) != len(in) { |
|
res["message"] = fmt.Sprintf("数据不匹配,传的数据为(%v)条,查到的数据为(%v)条,app_id(%v),config_ids(%v),in(%v)", len(in), len(configs), app.ID, v.ConfigIDs, in) |
|
err = ecode.RequestErr |
|
c.JSONMap(res, err) |
|
return |
|
} |
|
if err = svr.DB.Where("app_id = ? and name = ?", app.ID, v.Build).Order("id desc").First(build).Error; err != nil { |
|
res["message"] = "未找到对应的build" |
|
c.JSONMap(res, err) |
|
return |
|
} |
|
if err = svr.DB.Where("app_id = ? and build_id = ?", app.ID, build.ID).Order("id desc").First(tags).Error; err != nil { |
|
res["message"] = "未找到对应的tag" |
|
c.JSONMap(res, err) |
|
return |
|
} |
|
in2 = strings.Split(tags.ConfigIDs, ",") |
|
if err = svr.DB.Where("app_id = ? and state = 2 and id in (?)", app.ID, in2).Find(&tagConfigs).Error; err != nil { |
|
res["message"] = "未找到tag中的文件" |
|
c.JSONMap(res, err) |
|
return |
|
} |
|
if err = svr.DB.Select("id,app_id,name,`from`,state,mark,operator,ctime,mtime").Where(in2).Find(&confs).Error; err != nil { |
|
log.Error("ConfigsByIDs(%v) error(%v)", in2, err) |
|
res["message"] = "config文件未找到" |
|
c.JSONMap(res, err) |
|
return |
|
} |
|
for _, val := range confs { |
|
for _, vv := range configs { |
|
if val.Name == vv.Name { |
|
if len(nameString) > 0 { |
|
nameString = nameString + "," |
|
} |
|
nameString = nameString + strconv.FormatInt(vv.ID, 10) |
|
tmp[vv.Name] = struct{}{} |
|
} |
|
} |
|
if _, ok := tmp[val.Name]; !ok { |
|
if len(nameString) > 0 { |
|
nameString = nameString + "," |
|
} |
|
nameString = nameString + strconv.FormatInt(val.ID, 10) |
|
} |
|
} |
|
for _, val := range configs { |
|
if _, ok := tmp[val.Name]; !ok { |
|
if len(nameString) > 0 { |
|
nameString = nameString + "," |
|
} |
|
nameString = nameString + strconv.FormatInt(val.ID, 10) |
|
} |
|
} |
|
tag.ConfigIDs = nameString |
|
tag.Operator = v.User |
|
tag.Mark = v.Mark |
|
tag.Force = v.Force |
|
c.JSON(nil, svr.UpdateTag(c, v.TreeID, v.Env, v.Zone, v.Build, tag)) |
|
} |
|
|
|
func canalConfigCreate(c *bm.Context) { |
|
res := map[string]interface{}{} |
|
v := new(model.CanalConfigCreateReq) |
|
err := c.Bind(v) |
|
if err != nil { |
|
return |
|
} |
|
if err = svr.CanalCheckToken(v.AppName, v.Env, v.Zone, v.Token); err != nil { |
|
res["message"] = "未找到数据" |
|
c.JSONMap(res, err) |
|
return |
|
} |
|
conf := &model.Config{} |
|
conf.Operator = v.User |
|
conf.Name = v.Name |
|
conf.Mark = v.Mark |
|
conf.Comment = v.Comment |
|
conf.State = v.State |
|
conf.From = v.From |
|
c.JSON(nil, svr.CreateConf(conf, v.TreeID, v.Env, v.Zone, true)) |
|
} |
|
|
|
func canalNameConfigs(c *bm.Context) { |
|
res := map[string]interface{}{} |
|
v := new(model.CanalNameConfigsReq) |
|
err := c.Bind(v) |
|
if err != nil { |
|
return |
|
} |
|
if err = svr.CanalCheckToken(v.AppName, v.Env, v.Zone, v.Token); err != nil { |
|
res["message"] = "未找到数据" |
|
c.JSONMap(res, err) |
|
return |
|
} |
|
c.JSON(svr.ConfigsByTree(v.TreeID, v.Env, v.Zone, v.Name)) |
|
}
|
|
|