292 lines
6.8 KiB
Go
292 lines
6.8 KiB
Go
package http
|
|
|
|
import (
|
|
"context"
|
|
"strings"
|
|
|
|
"go-common/app/admin/main/apm/conf"
|
|
"go-common/app/admin/main/apm/model/canal"
|
|
"go-common/app/admin/main/apm/model/user"
|
|
"go-common/library/ecode"
|
|
"go-common/library/log"
|
|
bm "go-common/library/net/http/blademaster"
|
|
)
|
|
|
|
const (
|
|
_upsertMasterInfo = "INSERT INTO master_info (addr,remark,leader,cluster) VALUES (?,?,?,?) ON DUPLICATE KEY UPDATE remark=?,leader=?,cluster=?"
|
|
)
|
|
|
|
//canalList get canalinfo list
|
|
func canalList(c *bm.Context) {
|
|
var err error
|
|
v := new(canal.ListReq)
|
|
if err = c.Bind(v); err != nil {
|
|
return
|
|
}
|
|
data, _ := apmSvc.ProcessCanalList(c, v)
|
|
|
|
c.JSON(data, nil)
|
|
|
|
}
|
|
|
|
//canalList get canalinfo add
|
|
func canalAdd(c *bm.Context) {
|
|
|
|
v := new(canal.Canal)
|
|
var err error
|
|
if err = c.Bind(v); err != nil {
|
|
return
|
|
}
|
|
username := name(c)
|
|
err = apmSvc.ApplyAdd(c, v, username)
|
|
if err != nil {
|
|
c.JSON(nil, err)
|
|
return
|
|
}
|
|
|
|
c.JSON(nil, err)
|
|
}
|
|
|
|
//canalList get canalinfo edit
|
|
func canalEdit(c *bm.Context) {
|
|
v := new(canal.EditReq)
|
|
var err error
|
|
if err = c.Bind(v); err != nil {
|
|
return
|
|
}
|
|
username := name(c)
|
|
if err = apmSvc.ApplyEdit(c, v, username); err != nil {
|
|
c.JSON(nil, err)
|
|
return
|
|
}
|
|
c.JSON(nil, err)
|
|
}
|
|
|
|
//canalDelete 根据addr查询对应id进行软删除
|
|
func canalDelete(c *bm.Context) {
|
|
var err error
|
|
v := new(canal.ScanReq)
|
|
if err = c.Bind(v); err != nil {
|
|
return
|
|
}
|
|
username := name(c)
|
|
if err = apmSvc.ApplyDelete(c, v, username); err != nil {
|
|
c.JSON(nil, err)
|
|
return
|
|
}
|
|
c.JSON(nil, err)
|
|
}
|
|
|
|
//canalScanByAddrFromConfig 根据Addr查询对应有效的配置
|
|
func canalScanByAddrFromConfig(c *bm.Context) {
|
|
var confData *canal.Results
|
|
cookie := c.Request.Header.Get("Cookie")
|
|
v := new(canal.ScanReq)
|
|
var err error
|
|
if err = c.Bind(v); err != nil {
|
|
return
|
|
}
|
|
username := name(c)
|
|
if confData, err = apmSvc.GetScanInfo(c, v, username, cookie); err != nil {
|
|
c.JSON(nil, err)
|
|
return
|
|
}
|
|
c.JSON(confData, nil)
|
|
}
|
|
|
|
func canalApplyList(c *bm.Context) {
|
|
v := new(canal.ListReq)
|
|
var err error
|
|
if err = c.Bind(v); err != nil {
|
|
return
|
|
}
|
|
data, err := apmSvc.ProcessApplyList(c, v)
|
|
if err != nil {
|
|
c.JSON(nil, err)
|
|
return
|
|
}
|
|
|
|
c.JSON(data, nil)
|
|
}
|
|
|
|
//canalApplyDetailToConfig is
|
|
func canalApplyDetailToConfig(c *bm.Context) {
|
|
var (
|
|
username string
|
|
err error
|
|
v = new(canal.ConfigReq)
|
|
cookie = c.Request.Header.Get("Cookie")
|
|
)
|
|
if u, err := c.Request.Cookie("username"); err == nil {
|
|
username = u.Value
|
|
} else {
|
|
username = "third"
|
|
}
|
|
if err = c.Bind(v); err != nil {
|
|
return
|
|
}
|
|
//judge legal params
|
|
f := strings.Contains(v.Addr, ":")
|
|
if !f {
|
|
log.Error("canalApplyAdd addr not standard error(%v)", err)
|
|
c.JSON(nil, ecode.CanalAddrFmtErr)
|
|
return
|
|
}
|
|
if v.User != "" && v.Password != "" {
|
|
if err = apmSvc.CheckMaster(c, v); err != nil {
|
|
c.JSON(nil, err)
|
|
return
|
|
}
|
|
}
|
|
if err = apmSvc.ProcessCanalInfo(c, v, username); err != nil {
|
|
c.JSON(nil, err)
|
|
return
|
|
}
|
|
if err = apmSvc.ProcessConfigInfo(c, v, cookie, username); err != nil {
|
|
c.JSON(nil, err)
|
|
return
|
|
}
|
|
go apmSvc.SendWechatMessage(context.Background(), v.Addr, canal.TypeMap[canal.TypeApply], "", username, v.Mark, conf.Conf.Canal.Reviewer)
|
|
|
|
c.JSON(nil, err)
|
|
}
|
|
|
|
//canalApplyConfigEdit is
|
|
func canalApplyConfigEdit(c *bm.Context) {
|
|
cookie := c.Request.Header.Get("Cookie")
|
|
v := new(canal.ConfigReq)
|
|
if err := c.Bind(v); err != nil {
|
|
return
|
|
}
|
|
ap := &canal.Apply{}
|
|
err := apmSvc.DBCanal.Model(&canal.Apply{}).Select("`operator`").Where("addr=?", v.Addr).Find(ap).Error
|
|
if err != nil {
|
|
log.Error("no apply error", err)
|
|
err = ecode.CanalAddrNotFound
|
|
c.JSON(nil, err)
|
|
return
|
|
}
|
|
username := name(c)
|
|
err = apmSvc.Permit(c, username, user.CanalView)
|
|
err0 := apmSvc.Permit(c, username, user.CanalEdit)
|
|
|
|
if err != nil || (username != ap.Operator && err0 != nil) {
|
|
log.Error("permit(%v, %s,%s)", username, err)
|
|
c.JSON(nil, ecode.AccessDenied)
|
|
return
|
|
}
|
|
if v.User != "" && v.Password != "" {
|
|
if err = apmSvc.CheckMaster(c, v); err != nil {
|
|
c.JSON(nil, err)
|
|
return
|
|
}
|
|
}
|
|
if err0 != nil {
|
|
v = &canal.ConfigReq{
|
|
Addr: v.Addr,
|
|
MonitorPeriod: v.MonitorPeriod,
|
|
Databases: v.Databases,
|
|
Project: v.Project,
|
|
Leader: v.Leader,
|
|
Mark: v.Mark,
|
|
}
|
|
}
|
|
//judge legal params
|
|
f := strings.Contains(v.Addr, ":")
|
|
if !f {
|
|
log.Error("canalApplyAdd addr not standard error(%v)", err)
|
|
c.JSON(nil, ecode.CanalAddrFmtErr)
|
|
return
|
|
}
|
|
if err = apmSvc.ProcessCanalInfo(c, v, username); err != nil {
|
|
c.JSON(nil, err)
|
|
return
|
|
}
|
|
if err = apmSvc.ProcessConfigInfo(c, v, cookie, username); err != nil {
|
|
c.JSON(nil, err)
|
|
return
|
|
}
|
|
|
|
c.JSON(nil, err)
|
|
}
|
|
|
|
//canalAddrAll get canal all addr info
|
|
func canalAddrAll(c *bm.Context) {
|
|
var (
|
|
list []string
|
|
items []*canal.Canal
|
|
)
|
|
err := apmSvc.DBCanal.Model(&canal.Canal{}).Where("is_delete= 0").Select("`addr`").Scan(&items).Error
|
|
if err != nil {
|
|
log.Error("canalAddrAll get addr error(%v)", err)
|
|
c.JSON(nil, err)
|
|
return
|
|
}
|
|
|
|
for _, v := range items {
|
|
list = append(list, v.Addr)
|
|
}
|
|
|
|
c.JSON(list, nil)
|
|
}
|
|
|
|
// canal 审核
|
|
func canalApplyApprovalProcess(c *bm.Context) {
|
|
var (
|
|
err error
|
|
)
|
|
cookie := c.Request.Header.Get("Cookie")
|
|
res := map[string]interface{}{}
|
|
v := new(struct {
|
|
ID int `form:"id" validate:"required"`
|
|
State int8 `form:"state" validate:"required"`
|
|
})
|
|
if err = c.Bind(v); err != nil {
|
|
return
|
|
}
|
|
username := name(c)
|
|
apply := &canal.Apply{}
|
|
if err = apmSvc.DBCanal.Where("id = ?", v.ID).First(apply).Error; err != nil {
|
|
log.Error("canalApplyApprovalProcess id error(%v)", err)
|
|
c.JSON(nil, err)
|
|
return
|
|
}
|
|
if !(apply.State == 1 || apply.State == 2) {
|
|
log.Error("canalApplyApprovalProcess apply.state error(%v)", apply.State)
|
|
res["message"] = "只有申请中和打回才可审核"
|
|
c.JSONMap(res, ecode.RequestErr)
|
|
return
|
|
}
|
|
if !(v.State == 2 || v.State == 3 || v.State == 4) {
|
|
log.Error("canalApplyApprovalProcess v.state error(%v)", v.State)
|
|
res["message"] = "state值范围2,3,4"
|
|
c.JSONMap(res, ecode.RequestErr)
|
|
return
|
|
}
|
|
ups := map[string]interface{}{
|
|
"state": v.State,
|
|
}
|
|
if v.State == 3 && apply.State != 3 {
|
|
if err = apmSvc.UpdateProcessTag(c, apply.ConfID, cookie); err != nil {
|
|
log.Error("apmSvc.UpdateProcessTag error(%v)", apply.ID)
|
|
c.JSON(nil, err)
|
|
return
|
|
}
|
|
if err = apmSvc.DBCanal.Exec(_upsertMasterInfo, apply.Addr, apply.Remark, apply.Leader, apply.Cluster, apply.Remark, apply.Leader, apply.Cluster).Error; err != nil {
|
|
log.Error("canalProcess update master_info error(%v)", err)
|
|
c.JSONMap(nil, err)
|
|
return
|
|
}
|
|
}
|
|
// 更新apply
|
|
if err = apmSvc.DBCanal.Model(apply).Where("id = ?", apply.ID).Update(ups).Error; err != nil {
|
|
log.Error("canalApplyApprovalProcess update error(%v)", apply.ID)
|
|
res["message"] = "修改状态失败"
|
|
c.JSONMap(res, err)
|
|
return
|
|
}
|
|
go apmSvc.SendWechatMessage(context.Background(), apply.Addr, canal.TypeMap[canal.TypeReview], canal.TypeMap[v.State], username, "", []string{apply.Operator})
|
|
|
|
c.JSON(nil, err)
|
|
}
|