bilibili-backup/app/admin/main/config/http/config.go

618 lines
16 KiB
Go
Raw Permalink Normal View History

2019-04-22 10:59:20 +08:00
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))
}