go-common/app/admin/main/config/http/config.go
2019-04-22 18:49:16 +08:00

618 lines
16 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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))
}