Initial commit

This commit is contained in:
Donny
2019-04-22 20:46:32 +08:00
commit 49ab8aadd1
25441 changed files with 4055000 additions and 0 deletions

View File

@@ -0,0 +1,65 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"business.go",
"csv.go",
"debug.go",
"direction.go",
"engine.go",
"flow.go",
"http.go",
"monitor.go",
"net.go",
"report.go",
"svg.go",
"task.go",
"token.go",
"transition.go",
],
importpath = "go-common/app/admin/main/aegis/server/http",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/admin/main/aegis/conf:go_default_library",
"//app/admin/main/aegis/model:go_default_library",
"//app/admin/main/aegis/model/business:go_default_library",
"//app/admin/main/aegis/model/common:go_default_library",
"//app/admin/main/aegis/model/middleware:go_default_library",
"//app/admin/main/aegis/model/monitor:go_default_library",
"//app/admin/main/aegis/model/net:go_default_library",
"//app/admin/main/aegis/model/svg:go_default_library",
"//app/admin/main/aegis/model/task:go_default_library",
"//app/admin/main/aegis/service:go_default_library",
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/net/http/blademaster/binding:go_default_library",
"//library/net/http/blademaster/middleware/permit:go_default_library",
"//library/net/http/blademaster/middleware/verify:go_default_library",
"//library/net/http/blademaster/render:go_default_library",
"//library/time:go_default_library",
"//library/xstr:go_default_library",
"//vendor/github.com/pkg/errors:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,174 @@
package http
import (
"strings"
"go-common/app/admin/main/aegis/model/business"
"go-common/app/admin/main/aegis/model/common"
"go-common/library/ecode"
bm "go-common/library/net/http/blademaster"
)
func preBusinss(b *business.Business) (invalid bool) {
b.Name = common.FilterBusinessName(strings.TrimSpace(b.Name))
b.Desc = strings.TrimSpace(b.Desc)
emails := strings.Split(b.Developer, ",")
if len(emails) > 5 || b.Name == "" || b.Desc == "" || b.TP <= 0 || b.TP > 4 {
invalid = true
return
}
return
}
// addBusiness .
func addBusiness(c *bm.Context) {
b := &business.Business{}
if err := c.Bind(b); err != nil {
return
}
if preBusinss(b) {
c.JSON(nil, ecode.RequestErr)
return
}
b.UID = uid(c)
c.JSON(srv.AddBusiness(c, b))
}
// updateBusiness .
func updateBusiness(c *bm.Context) {
b := &business.Business{}
if err := c.Bind(b); err != nil {
return
}
if b.ID <= 0 || preBusinss(b) {
c.JSON(nil, ecode.RequestErr)
return
}
b.UID = uid(c)
c.JSON(nil, srv.UpdateBusiness(c, b))
}
// setBusiness .
func setBusinessState(c *bm.Context) {
b := &business.Business{}
if err := c.Bind(b); err != nil {
return
}
if b.ID <= 0 {
c.JSON(nil, ecode.RequestErr)
return
}
b.UID = uid(c)
c.JSON(nil, srv.SetBusinessState(c, b))
}
// getBusiness .
func getBusiness(c *bm.Context) {
b := &business.Business{}
if err := c.Bind(b); err != nil {
return
}
if b.ID <= 0 {
c.JSON(nil, ecode.RequestErr)
return
}
res, err := srv.Business(c, b)
if err != nil {
c.JSON(nil, err)
return
}
if res == nil {
c.JSON(nil, ecode.NothingFound)
return
}
c.JSON(res, nil)
}
// getBusinessList .
func getBusinessList(c *bm.Context) {
ids := getAccessBiz(c)
res, err := srv.BusinessList(c, ids, false)
if err != nil {
c.JSON(nil, err)
return
}
if res == nil {
c.JSON(nil, ecode.NothingFound)
return
}
c.JSON(res, nil)
}
// getBusinessList .
func getBusinessEnable(c *bm.Context) {
ids := getAccessBiz(c)
res, err := srv.BusinessList(c, ids, true)
if err != nil {
c.JSON(nil, err)
return
}
c.JSON(res, nil)
}
// addBizCFG
func addBizCFG(c *bm.Context) {
b := &business.BizCFG{}
if err := c.Bind(b); err != nil {
return
}
if b.BusinessID <= 0 {
c.JSON(nil, ecode.RequestErr)
return
}
id, err := srv.AddBizCFG(c, b)
if err != nil {
httpCode(c, err.Error(), ecode.RequestErr)
return
}
c.JSON(id, nil)
}
// updateBizCFG
func updateBizCFG(c *bm.Context) {
b := &business.BizCFG{}
if err := c.Bind(b); err != nil {
return
}
if b.ID <= 0 {
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(nil, srv.UpdateBizCFG(c, b))
}
// listBizCFGs
func listBizCFGs(c *bm.Context) {
b := &business.BizCFG{}
if err := c.Bind(b); err != nil {
return
}
res, err := srv.ListBizCFGs(c, b.BusinessID)
if err != nil {
c.JSON(nil, err)
return
}
if res == nil {
c.JSON(nil, ecode.NothingFound)
return
}
c.JSON(res, nil)
}
// 保留字配置
func reserveCFG(c *bm.Context) {
opt := new(struct {
BizID int64 `form:"business_id" validate:"required"`
})
if err := c.Bind(opt); err != nil {
return
}
c.JSON(srv.ReserveCFG(c, opt.BizID))
}

View File

@@ -0,0 +1,113 @@
package http
import (
"bytes"
"encoding/csv"
"fmt"
"net/http"
"go-common/app/admin/main/aegis/model"
"go-common/library/log"
"github.com/pkg/errors"
)
// CSVContentType
var (
CSVContentType = []string{"application/csv"}
_ Render = CSV{}
)
// Render http reponse render.
type Render interface {
Render(http.ResponseWriter) error
WriteContentType(w http.ResponseWriter)
}
// CSV str.
type CSV struct {
Content []byte
Title string
}
// WriteContentType fn
func (j CSV) WriteContentType(w http.ResponseWriter) {
writeContentType(w, CSVContentType, j.Title, "csv")
}
func writeContentType(w http.ResponseWriter, value []string, title, ext string) {
header := w.Header()
if val := header["Content-Type"]; len(val) == 0 {
header["Content-Type"] = value
}
header["Content-Disposition"] = append(header["Content-Disposition"], fmt.Sprintf("attachment; filename=%s.%s", title, ext))
}
// Render (JSON) writes data with json ContentType.
func (j CSV) Render(w http.ResponseWriter) (err error) {
if _, err = w.Write(j.Content); err != nil {
err = errors.WithStack(err)
}
return
}
// FormatCSV format csv data.
func FormatCSV(records [][]string) (res []byte) {
buf := new(bytes.Buffer)
w := csv.NewWriter(buf)
for _, record := range records {
if err := w.Write(record); err != nil {
log.Error("error writing record to csv:", err)
return
}
}
w.Flush()
res = buf.Bytes()
return
}
func formatReport(wl map[string][]*model.ReportFlowItem) (data [][]string, err error) {
if len(wl) < 0 {
return
}
tab := []string{"审核员"}
for k, v := range wl {
var fields []string
fields = append(fields, k)
for _, item := range v {
fields = append(fields, fmt.Sprintf("%d/%d", item.Out, item.In))
if len(tab) != len(v)+1 {
tab = append(tab, item.Hour)
}
}
data = append(data, fields)
}
data = append([][]string{tab}, data...)
return
}
func formatReportTaskSubmit(res *model.ReportSubmitRes) (data [][]string, err error) {
if res == nil || len(res.Order) <= 0 || len(res.Header) <= 0 || len(res.Rows) <= 0 {
return
}
llen := len(res.Order)
header := make([]string, llen)
for i, k := range res.Order {
header[i] = res.Header[k]
}
data = [][]string{header}
for _, list := range res.Rows {
for _, one := range list {
fields := make([]string, llen)
for i, k := range res.Order {
fields[i] = one[k]
}
data = append(data, fields)
}
}
return
}

View File

@@ -0,0 +1,9 @@
package http
import (
bm "go-common/library/net/http/blademaster"
)
func cache(c *bm.Context) {
c.JSONMap(srv.Cache(), nil)
}

View File

@@ -0,0 +1,98 @@
package http
import (
"strconv"
"go-common/app/admin/main/aegis/model/net"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
)
func listDirection(c *bm.Context) {
pm := new(net.ListDirectionParam)
if err := c.Bind(pm); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
if pm.Sort != "desc" && pm.Sort != "asc" {
pm.Sort = "desc"
}
//direction只有在确立了flow_id/transition_id后才能选择
if pm.FlowID == 0 && pm.TransitionID == 0 {
pm.Direction = 0
}
c.JSON(srv.GetDirectionList(c, pm))
}
func showDirection(c *bm.Context) {
pm := c.Request.Form.Get("id")
id, err := strconv.ParseInt(pm, 10, 64)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(srv.ShowDirection(c, id))
}
func preDir(pm *net.DirEditParam) (invalid bool) {
if pm.Direction == net.DirInput && pm.Output != "" {
pm.Output = ""
}
invalid = pm.Order == net.DirOrderOrSplit && pm.Guard == ""
return
}
func addDirection(c *bm.Context) {
pm := new(net.DirEditParam)
if err := c.Bind(pm); err != nil || pm.NetID <= 0 {
c.JSON(nil, ecode.RequestErr)
return
}
if preDir(pm) {
c.JSON(nil, ecode.RequestErr)
return
}
admin := uid(c)
id, err, msg := srv.AddDirection(c, admin, pm)
c.JSONMap(map[string]interface{}{
"id": id,
"message": msg,
}, err)
}
func updateDirection(c *bm.Context) {
pm := new(net.DirEditParam)
if err := c.Bind(pm); err != nil || pm.ID <= 0 {
log.Error("updateDirection bind error(%+v)", err)
c.JSON(nil, ecode.RequestErr)
return
}
if preDir(pm) {
c.JSON(nil, ecode.RequestErr)
return
}
admin := uid(c)
err, msg := srv.UpdateDirection(c, admin, pm)
c.JSONMap(map[string]interface{}{
"message": msg,
}, err)
}
func switchDirection(c *bm.Context) {
pm := new(net.SwitchParam)
if err := c.Bind(pm); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
err, msg := srv.SwitchDirection(c, pm.ID, pm.Disable)
c.JSONMap(map[string]interface{}{
"message": msg,
}, err)
}

View File

@@ -0,0 +1,387 @@
package http
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"time"
"go-common/app/admin/main/aegis/model"
"go-common/app/admin/main/aegis/model/business"
"go-common/app/admin/main/aegis/model/common"
"go-common/app/admin/main/aegis/model/middleware"
"go-common/app/admin/main/aegis/model/task"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/binding"
"go-common/library/net/http/blademaster/render"
"go-common/library/xstr"
)
func listBizFlow(c *bm.Context) {
bizID := getAccessBiz(c)
flowID := getAccessFlow(c)
opt := &business.OptList{}
if err := c.Bind(opt); err != nil {
return
}
c.JSON(srv.ListBizFlow(c, opt.TP, bizID, flowID))
}
func getBizFlow(c *bm.Context) {
opt := new(struct {
BusinessID int64 `form:"business_id" validate:"required"`
})
if err := c.Bind(opt); err != nil {
return
}
c.JSON(srv.ListBizFlow(c, 0, []int64{opt.BusinessID}, nil))
}
func next(c *bm.Context) {
opt := &task.NextOptions{}
if err := c.Bind(opt); err != nil {
return
}
if opt.BusinessID == 0 || opt.FlowID == 0 {
httpCode(c, "缺少business_id或flow_id", ecode.RequestErr)
return
}
opt.BisLeader = opt.Role == task.TaskRoleLeader
c.JSON(srv.Next(c, opt))
}
func infoByTask(c *bm.Context) {
opt := new(struct {
TaskID int64 `form:"task_id" validate:"required"`
common.BaseOptions
})
if err := c.Bind(opt); err != nil {
return
}
if opt.BusinessID == 0 || opt.FlowID == 0 {
httpCode(c, "缺少business_id或flow_id", ecode.RequestErr)
return
}
c.JSON(srv.InfoTask(c, &opt.BaseOptions, opt.TaskID))
}
func listByTask(c *bm.Context) {
opt := &task.ListOptions{}
if err := c.Bind(opt); err != nil {
return
}
if opt.BusinessID == 0 || opt.FlowID == 0 {
httpCode(c, "缺少business_id或flow_id", ecode.RequestErr)
return
}
opt.BisLeader = opt.Role == task.TaskRoleLeader
infos, err := srv.ListByTask(c, opt)
c.JSONMap(map[string]interface{}{
"data": infos,
"pager": &opt.Pager,
}, err)
}
func infoByResource(c *bm.Context) {
opt := new(common.BaseOptions)
if err := c.Bind(opt); err != nil {
return
}
if opt.BusinessID == 0 || opt.OID == "" {
httpCode(c, "缺少business_id或oid", ecode.RequestErr)
return
}
info, err := srv.InfoResource(c, opt)
middleware.Response(
info,
err,
c.JSON,
&middleware.MiddleAggregate{
Cfg: srv.GetMiddlewareCache(opt.BusinessID),
Encode: true,
})
}
func listByResource(c *bm.Context) {
opt := new(model.SearchParams)
if err := c.Bind(opt); err != nil {
return
}
middleware.Request(opt, &middleware.MiddleAggregate{
Cfg: srv.GetMiddlewareCache(opt.BusinessID),
Encode: false,
})
columns, resources, operation, err := srv.ListByResource(c, opt)
c.JSONMap(map[string]interface{}{
"columns": columns,
"data": resources,
"operations": operation,
"pager": &opt.Pager,
}, err)
}
func submit(c *bm.Context) {
opt, err := parseOptions(c)
if err != nil {
if err == ecode.AegisBusinessCfgErr {
c.JSON(nil, err)
}
return
}
if opt.BusinessID == 0 || opt.FlowID == 0 || opt.OID == "" || opt.Result == nil || opt.Binds == nil || len(opt.Binds) == 0 {
httpCode(c, "business_id,flow_id,oid,result,binds不能为空", ecode.RequestErr)
return
}
if err = srv.Submit(c, opt); err == ecode.AegisNotRunInFlow {
c.JSONMap(map[string]interface{}{
"tips": "资源已被流传,本次提交无效",
}, nil)
return
}
c.JSON(nil, err)
}
func listforjump(c *bm.Context) {
opt := &common.BaseOptions{}
if err := c.Bind(opt); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(srv.FetchJumpFlowInfo(c, opt.FlowID))
}
func jump(c *bm.Context) {
opt, err := parseOptions(c)
if err != nil {
if err == ecode.AegisBusinessCfgErr {
c.JSON(nil, err)
}
return
}
if opt.BusinessID == 0 || opt.FlowID == 0 || opt.OID == "" || ((opt.Binds == nil || len(opt.Binds) == 0) && opt.NewFlowID == 0) {
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(nil, srv.JumpFlow(c, opt))
}
func batchSubmit(c *bm.Context) {
opt := &model.BatchOption{}
if err := c.Bind(opt); err != nil {
return
}
tips, err := srv.BatchSubmit(c, opt)
if err != nil {
c.JSON(tips, err)
return
}
if tips != nil && len(tips.Fail) > 0 {
log.Error("批量操作有错误 %+v", tips.Fail)
msg, _ := json.Marshal(tips.Fail)
httpCode(c, string(msg), ecode.ServerErr)
return
}
c.JSON(tips, err)
}
func add(c *bm.Context) {
opt := &model.AddOption{}
if err := c.Bind(opt); err != nil {
return
}
if opt.BusinessID == 0 || opt.NetID == 0 || opt.OID == "" {
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(nil, srv.Add(c, opt))
}
func cancel(c *bm.Context) {
opt := new(model.CancelOption)
if err := c.Bind(opt); err != nil {
return
}
c.JSON(nil, srv.Cancel(c, opt.BusinessID, opt.Oids, 399, "业务方"))
}
func cancelByOper(c *bm.Context) {
opt := new(struct {
BissinessID int64 `form:"business_id" validate:"required"`
Oids []string `form:"oids,split" validate:"required"`
})
if err := c.Bind(opt); err != nil {
return
}
uid := uid(c)
username := uname(c)
c.JSON(nil, srv.CancelByOper(c, opt.BissinessID, opt.Oids, uid, username))
}
func update(c *bm.Context) {
opt := new(model.UpdateOption)
if err := c.BindWith(opt, binding.Form); err != nil {
return
}
upParams := c.Request.Form.Get("update")
if err := json.Unmarshal([]byte(upParams), &opt.Update); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(nil, srv.Update(c, opt))
}
func upload(c *bm.Context) {
file, _, err := c.Request.FormFile("file")
if err != nil {
log.Error("FormFile err(%v)", err)
httpCode(c, fmt.Sprintf("File Upload FormFile Error:(%v)", err), ecode.RequestErr)
return
}
defer file.Close()
content, err := ioutil.ReadAll(file)
if err != nil {
log.Error(" uploadFile.ReadAll error(%v)", err)
httpCode(c, fmt.Sprintf("File ioutil.ReadAll Error:(%v)", err), ecode.RequestErr)
return
}
filetype := http.DetectContentType(content)
switch filetype {
case "image/jpeg", "image/jpg":
case "image/gif":
case "image/png":
default:
httpCode(c, fmt.Sprintf("not allow filetype(%s)", filetype), ecode.RequestErr)
log.Warn("not allow filetype(%s) ", filetype)
return
}
local, err := srv.Upload(c, "", filetype, time.Now().Unix(), content)
if err != nil {
log.Error("svc.Upload error(%v)", err)
httpCode(c, fmt.Sprintf("svc.Upload error:(%v)", err), ecode.RequestErr)
return
}
c.JSON(local, nil)
}
func parseOptions(c *bm.Context) (opt *model.SubmitOptions, err error) {
opt = &model.SubmitOptions{}
if err = c.BindWith(opt, binding.JSON); err != nil {
log.Error("parseOptions err(%v)", err)
return
}
if opt.Binds, err = xstr.SplitInts(opt.BindStr); err != nil {
log.Error("parseOptions binds err(%v)", err)
err = ecode.RequestErr
return
}
if uidi, ok := c.Get("uid"); ok {
opt.UID, _ = uidi.(int64)
}
if unamei, ok := c.Get("username"); ok {
opt.Uname, _ = unamei.(string)
}
if opt.Result != nil {
var cfg map[string]uint
if cfg, err = srv.AttributeCFG(c, opt.BusinessID); err != nil {
err = ecode.AegisBusinessCfgErr
return
} else if len(cfg) > 0 {
opt.Result.AttrSet(cfg)
}
if opt.ExtraData != nil {
if re, ok := opt.ExtraData["reason_extend"]; ok && len(fmt.Sprint(re)) > 0 {
opt.Result.RejectReason = fmt.Sprintf("[%v]%s", re, opt.Result.RejectReason)
}
}
}
return
}
func httpCode(c *bm.Context, msg string, err error) {
if c.IsAborted() {
return
}
c.Error = err
bcode := ecode.Cause(err)
if msg == "" {
msg = err.Error()
}
c.Render(http.StatusOK, render.JSON{
Code: bcode.Code(),
Message: msg,
Data: nil,
})
}
func track(c *bm.Context) {
pm := new(model.TrackParam)
if err := c.Bind(pm); err != nil {
return
}
if pm.Pn > 1 && pm.LastPageTime == "" {
c.JSON(nil, ecode.RequestErr)
return
}
data, pager, err := srv.TrackResource(c, pm)
c.JSONMap(map[string]interface{}{
"data": data,
"pager": pager,
}, err)
}
func auditLog(c *bm.Context) {
pm := new(model.SearchAuditLogParam)
if err := c.Bind(pm); err != nil {
return
}
data, pger, err := srv.SearchAuditLog(c, pm)
c.JSONMap(map[string]interface{}{
"data": data,
"pager": pger,
}, err)
}
func auditLogCSV(c *bm.Context) {
pm := new(model.SearchAuditLogParam)
csv, err := srv.SearchAuditLogCSV(c, pm)
if err != nil {
log.Error("auditLogCSV error(%v) pm(%v)", err, pm)
c.JSON(nil, err)
return
}
c.Render(http.StatusOK, CSV{
Title: "操作日志",
Content: FormatCSV(csv),
})
}
func auth(c *bm.Context) {
uid := uid(c)
auth, err := srv.Auth(c, uid)
c.JSONMap(map[string]interface{}{
"data": auth,
}, err)
}

View File

@@ -0,0 +1,99 @@
package http
import (
"strconv"
"go-common/app/admin/main/aegis/model/common"
"go-common/app/admin/main/aegis/model/net"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
)
func listFlow(c *bm.Context) {
pm := new(net.ListNetElementParam)
if err := c.Bind(pm); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
if pm.Sort != "desc" && pm.Sort != "asc" {
pm.Sort = "desc"
}
c.JSON(srv.GetFlowList(c, pm))
}
func getFlowByNet(c *bm.Context) {
pm := c.Request.Form.Get("net_id")
id, err := strconv.ParseInt(pm, 10, 64)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(srv.GetFlowByNet(c, id))
}
func showFlow(c *bm.Context) {
pm := c.Request.Form.Get("id")
id, err := strconv.ParseInt(pm, 10, 64)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(srv.ShowFlow(c, id))
}
func preFlow(pm *net.FlowEditParam) (invalid bool) {
pm.ChName = common.FilterChname(pm.ChName)
pm.Name = common.FilterName(pm.Name)
invalid = pm.ChName == "" || pm.Name == ""
return
}
func addFlow(c *bm.Context) {
pm := new(net.FlowEditParam)
if err := c.Bind(pm); err != nil || pm.NetID <= 0 {
log.Error("addFlow bind params error(%v) pm(%+v)", err, pm)
c.JSON(nil, ecode.RequestErr)
return
}
if preFlow(pm) {
c.JSON(nil, ecode.RequestErr)
return
}
admin := uid(c)
id, err, msg := srv.AddFlow(c, admin, pm)
c.JSONMap(map[string]interface{}{
"id": id,
"message": msg,
}, err)
}
func updateFlow(c *bm.Context) {
pm := new(net.FlowEditParam)
if err := c.Bind(pm); err != nil || pm.ID <= 0 {
c.JSON(nil, ecode.RequestErr)
return
}
if preFlow(pm) {
c.JSON(nil, ecode.RequestErr)
return
}
admin := uid(c)
err, msg := srv.UpdateFlow(c, admin, pm)
c.JSONMap(map[string]interface{}{"message": msg}, err)
}
func switchFlow(c *bm.Context) {
pm := new(net.SwitchParam)
if err := c.Bind(pm); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(nil, srv.SwitchFlow(c, pm.ID, pm.Disable))
}

View File

@@ -0,0 +1,231 @@
package http
import (
"net/http"
"go-common/app/admin/main/aegis/conf"
"go-common/app/admin/main/aegis/model"
"go-common/app/admin/main/aegis/service"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/middleware/permit"
"go-common/library/net/http/blademaster/middleware/verify"
)
var (
srv *service.Service
vfy *verify.Verify
authSvr *permit.Permit
)
// Init init
func Init(c *conf.Config, s *service.Service) {
srv = s
vfy = verify.New(c.Verify)
authSvr = permit.New(c.Auth)
engine := bm.DefaultServer(c.BM)
route(engine)
if err := engine.Start(); err != nil {
log.Error("bm Start error(%v)", err)
panic(err)
}
}
func route(e *bm.Engine) {
e.Ping(ping)
e.GET("/x/admin/aegis/debug/cache", perm(""), cache)
gb := e.Group("/x/admin/aegis/business", perm(""), preHandlerUser())
{
gb.GET("/view", checkBizAdmin(), getBusiness)
gb.GET("/list", checkBizAdmin(), getBusinessList)
gb.GET("/enable", checkBizBID(), getBusinessEnable)
gb.POST("/add", authSvr.Permit("AEGIS_REGISTER"), addBusiness)
gb.POST("/update", checkBizAdmin(), updateBusiness)
gb.POST("/set", checkBizAdmin(), setBusinessState)
gb.GET("config/list", listBizCFGs)
gb.GET("config/reserve", reserveCFG)
gb.POST("config/add", addBizCFG)
gb.POST("config/update", updateBizCFG)
}
gt := e.Group("/x/admin/aegis/task", perm(""), preHandlerUser(), checkTaskRole())
{
gt.POST("/delay", taskDelay)
gt.POST("/release", taskRelease)
gt.POST("/consumer/on", consumerOn)
gt.POST("/consumer/off", consumerOff)
gt.POST("/consumer/kickout", kickOut)
gt.GET("/undostat", taskUnDo)
gt.GET("/stat", taskStat)
}
gtc := e.Group("/x/admin/aegis/task/config", perm(""), preHandlerUser(), checkBizID())
{
gtc.GET("/maxweight", maxWeight)
gtc.GET("/list", configList)
gtc.POST("/delete", configDelete)
gtc.POST("/add", configAdd)
gtc.POST("/edit", configEdit)
gtc.POST("/set", configSet)
gtc.GET("/weightlog", weightlog)
}
engineTask := e.Group("/x/admin/aegis/engine", perm(""), preHandlerUser(), checkTaskRole())
{
// 任务列表操作
engineTask.GET("/task/next", checkon(), next)
engineTask.GET("/task/info", infoByTask)
engineTask.GET("/task/list", listByTask)
}
engineRsc := e.Group("/x/admin/aegis/engine", perm(""), preHandlerUser())
{
engineRsc.POST("/submit", checkBizBID(), submit)
// 任务列表下面的flow列表
engineRsc.GET("/task/listbizflow", checkAccessTask(), listBizFlow)
// 资源列表操作
engineRsc.GET("/resource/info", checkBizBID(), infoByResource)
engineRsc.GET("/resource/list", checkBizBID(), listByResource)
engineRsc.POST("/resource/batchsubmit", checkBizLeader(), batchSubmit)
//跳流程
engineRsc.GET("/resource/listforjump", checkBizBID(), listforjump)
engineRsc.POST("/resource/jump", checkBizBID(), jump)
// 封禁相关
engineRsc.POST("/forbid/img/upload", upload)
//信息追踪
engineRsc.GET("/track", checkBizBID(), track)
//操作日志
engineRsc.GET("/auditlog", checkBizBID(), auditLog)
engineRsc.GET("/auditlog/csv", checkBizBID(), auditLogCSV)
//权限查询
engineRsc.GET("/auth", auth)
//手动取消, 运营人员权限
engineRsc.GET("/cancel", checkBizOper(), cancelByOper)
}
gn := e.Group("/x/admin/aegis/net", perm(""), checkBizID())
{
gn.GET("", listNet)
gn.GET("/svg", svg)
gn.GET("/nets", getNetByBusiness)
gn.GET("/show", showNet)
gn.POST("/add", addNet)
gn.POST("/update", updateNet)
gn.POST("/switch", switchNet)
gto := gn.Group("/token")
{
gto.GET("", listToken)
gto.GET("/groups", tokenGroupByType)
gto.GET("/config", configToken)
gto.GET("/show", showToken)
gto.POST("/add", addToken)
}
gf := gn.Group("/flow")
{
gf.GET("", listFlow)
gf.GET("/flows", getFlowByNet)
gf.GET("/show", showFlow)
gf.POST("/add", addFlow)
gf.POST("/update", updateFlow)
gf.POST("/switch", switchFlow)
}
gtr := gn.Group("/transition")
{
gtr.GET("", listTransition)
gtr.GET("/trans", getTranByNet)
gtr.GET("/show", showTransition)
gtr.POST("/add", addTransition)
gtr.POST("/update", updateTransition)
gtr.POST("/switch", switchTransition)
}
gd := gn.Group("/direction")
{
gd.GET("", listDirection)
gd.GET("/show", showDirection)
gd.POST("/add", addDirection)
gd.POST("/update", updateDirection)
gd.POST("/switch", switchDirection)
}
}
rt := e.Group("/x/admin/aegis/report", perm(""), preHandlerUser(), checkBizLeader())
{
rt.GET("/task/flow", taskflow)
rt.GET("/task/flow/csv", taskflowCSV)
rt.GET("/task/submit", taskSubmit)
rt.GET("/task/submit/csv", taskSubmitCSV)
rt.GET("/business/flows", getBizFlow)
}
e.GET("/x/admin/aegis/net/token/byname", perm(""), checkBizBIDBiz(), tokenByName)
e.GET("/x/admin/aegis/task/role", perm(""), preHandlerUser(), role)
e.POST("/x/admin/aegis/task/role/flush", roleFlush)
e.GET("/x/admin/aegis/task/consumer/watch", consumerWatcher)
e.POST("/x/internal/aegis/add", gray(), add)
e.POST("/x/internal/aegis/cancel", cancel)
e.POST("/x/internal/aegis/update", update)
//监控平台
gm := e.Group("/x/admin/aegis/monitor", perm(""))
{
gm.GET("/rule/result", perm("MONITOR_RULE_READ"), monitorRuleResult) //查看监控规则结果
gm.POST("/rule/update", perm("MONITOR_RULE_EDIT"), monitorRuleUpdate) //修改监控规则
}
inter := e.Group("/x/internal/aegis", vfy.Verify)
{
inter.GET("/monitor/result/oids", monitorResultOids) //获取满足监控时间的对象id
}
}
func ping(c *bm.Context) {
if err := srv.Ping(c); err != nil {
log.Error("ping error(%v)", err)
c.AbortWithStatus(http.StatusServiceUnavailable)
}
}
func uid(c *bm.Context) int64 {
if v, exist := c.Get("uid"); exist {
return v.(int64)
}
return 0
}
func uname(c *bm.Context) string {
if v, exist := c.Get("username"); exist {
return v.(string)
}
return ""
}
func perm(per string) bm.HandlerFunc {
if srv.Debug() == "local" {
return func(ctx *bm.Context) {}
}
return authSvr.Permit(per)
}
func gray() bm.HandlerFunc {
return func(ctx *bm.Context) {
opt := &model.AddOption{}
ctx.Bind(opt)
if !srv.Gray(opt) {
log.Info("opt(%+v) not hit gray", opt)
ctx.JSON(nil, nil)
ctx.Abort()
return
}
log.Info("opt(%+v) hit gray", opt)
}
}

View File

@@ -0,0 +1,71 @@
package http
import (
"go-common/app/admin/main/aegis/model/monitor"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"strconv"
)
func monitorRuleResult(c *bm.Context) {
var (
err error
bidStr string
bid int64
res []*monitor.RuleResultData
)
bidStr = c.Request.Form.Get("bid")
if bid, err = strconv.ParseInt(bidStr, 10, 64); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
if bid == 0 {
c.JSON(nil, ecode.RequestErr)
return
}
if res, err = srv.MonitorBuzResult(c, bid); err != nil {
log.Error("srv.MonitorResult(%d) error(%v)", bid, err)
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(res, nil)
}
func monitorResultOids(c *bm.Context) {
var (
err error
idStr string
id int64
res []struct {
OID int64 `json:"oid"`
Time int `json:"time"`
}
oidMap map[int64]int
)
idStr = c.Request.Form.Get("id")
if id, err = strconv.ParseInt(idStr, 10, 64); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
if id == 0 {
c.JSON(nil, ecode.RequestErr)
return
}
if oidMap, err = srv.MonitorResultOids(c, id); err != nil {
log.Error("srv.MonitorResultOids(%d) error(%v)", id, err)
c.JSON(nil, ecode.RequestErr)
return
}
for k, v := range oidMap {
res = append(res, struct {
OID int64 `json:"oid"`
Time int `json:"time"`
}{OID: k, Time: v})
}
c.JSON(res, nil)
}
func monitorRuleUpdate(c *bm.Context) {
}

View File

@@ -0,0 +1,95 @@
package http
import (
"strconv"
"go-common/app/admin/main/aegis/model/common"
"go-common/app/admin/main/aegis/model/net"
"go-common/library/ecode"
bm "go-common/library/net/http/blademaster"
)
func listNet(c *bm.Context) {
pm := new(net.ListNetParam)
if err := c.Bind(pm); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
if pm.Sort != "desc" && pm.Sort != "asc" {
pm.Sort = "desc"
}
c.JSON(srv.GetNetList(c, pm))
}
func getNetByBusiness(c *bm.Context) {
pm := c.Request.Form.Get("business_id")
nid, err := strconv.ParseInt(pm, 10, 64)
if err != nil || nid <= 0 {
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(srv.GetNetByBusiness(c, nid))
}
func showNet(c *bm.Context) {
pm := c.Request.Form.Get("id")
nid, err := strconv.ParseInt(pm, 10, 64)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(srv.ShowNet(c, nid))
}
func addNet(c *bm.Context) {
pm := new(net.Net)
if err := c.Bind(pm); err != nil || pm.BusinessID <= 0 {
c.JSON(nil, ecode.RequestErr)
return
}
pm.ChName = common.FilterChname(pm.ChName)
if pm.ChName == "" {
c.JSON(nil, ecode.RequestErr)
return
}
pm.UID = uid(c)
id, err, msg := srv.AddNet(c, pm)
c.JSONMap(map[string]interface{}{
"id": id,
"message": msg,
}, err)
}
func updateNet(c *bm.Context) {
pm := new(net.NetEditParam)
if err := c.Bind(pm); err != nil || pm.ID <= 0 {
c.JSON(nil, ecode.RequestErr)
return
}
pm.ChName = common.FilterChname(pm.ChName)
if pm.ChName == "" {
c.JSON(nil, ecode.RequestErr)
return
}
admin := uid(c)
err, msg := srv.UpdateNet(c, admin, pm)
c.JSONMap(map[string]interface{}{
"message": msg,
}, err)
}
func switchNet(c *bm.Context) {
pm := new(net.SwitchParam)
if err := c.Bind(pm); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(nil, srv.SwitchNet(c, pm.ID, pm.Disable))
}

View File

@@ -0,0 +1,127 @@
package http
import (
"net/http"
"time"
"go-common/app/admin/main/aegis/model"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
)
func commonPre(c *bm.Context) (res map[string][]*model.ReportFlowItem, form map[string][24]*model.ReportFlowItem, err error) {
opt := new(model.OptReport)
if err = c.Bind(opt); err != nil {
return
}
if opt.UName == "debug" {
opt.Type = model.TypeTotal
opt.UName = "total"
}
return srv.ReportTaskflow(c, opt)
}
func taskflow(c *bm.Context) {
res, form, err := commonPre(c)
c.JSONMap(map[string]interface{}{
"data": res,
"form": form,
}, err)
}
func taskflowCSV(c *bm.Context) {
opt := new(model.OptReport)
if err := c.Bind(opt); err != nil {
return
}
res, _, err := commonPre(c)
if err != nil || len(res) == 0 {
c.JSON(nil, err)
}
csv, err := formatReport(res)
if err != nil {
log.Error("formatReport error(%v)", err)
c.JSON(nil, err)
return
}
c.Render(http.StatusOK, CSV{
Content: FormatCSV(csv),
Title: "任务吞吐量报表",
})
}
func tasksubmitpre(c *bm.Context, pager bool) (res *model.ReportSubmitRes, p *model.DayPager, err error) {
pm := new(model.OptReportSubmit)
if err = c.Bind(pm); err != nil {
return
}
if pm.FlowID <= 0 || pm.Bt > pm.Et || (pager && (pm.Pn > pm.Et || pm.Pn < pm.Bt)) {
err = ecode.RequestErr
return
}
//默认展示近期7天内的数据
yesterday := time.Now().Add(-24 * time.Hour).Format("2006-01-02")
if pm.Bt == "" && pm.Et == "" {
pm.Bt = time.Now().Add(-8 * 24 * time.Hour).Format("2006-01-02")
pm.Et = yesterday
} else if pm.Et == "" { //最近日期
pm.Et = yesterday
} else if pm.Bt == "" { //最远日期
pm.Bt = "2019-01-01"
}
//分页的话,默认获取第一页内容(按照日期降序排列,则为最后一日的内容)
bt := pm.Bt
et := pm.Et
if pager {
if pm.Pn == "" {
pm.Pn = et
}
pm.Et = pm.Pn
pm.Bt = pm.Pn
}
if res, err = srv.ReportTaskSubmit(c, pm); err != nil || res == nil {
return
}
//按照日期降序排列
if pager {
p = &model.DayPager{
Pn: pm.Pn,
IsLast: bt == pm.Pn,
IsFirst: et == pm.Pn,
}
}
return
}
func taskSubmit(c *bm.Context) {
res, pager, err := tasksubmitpre(c, true)
c.JSONMap(map[string]interface{}{
"data": res,
"pager": pager,
}, err)
}
func taskSubmitCSV(c *bm.Context) {
res, _, err := tasksubmitpre(c, false)
if err != nil {
c.JSON(nil, err)
return
}
csv, err := formatReportTaskSubmit(res)
if err != nil {
c.JSON(nil, err)
return
}
c.Render(http.StatusOK, CSV{
Content: FormatCSV(csv),
Title: "任务操作报表",
})
}

View File

@@ -0,0 +1,67 @@
package http
import (
"bytes"
"net/http"
modsvg "go-common/app/admin/main/aegis/model/svg"
bm "go-common/library/net/http/blademaster"
"github.com/pkg/errors"
)
// HTMLContentType
var (
HTMLContentType = []string{"text/html"}
_ Render = HTML{}
)
// HTML str.
type HTML struct {
Content []byte
Title string
}
// WriteContentType fn
func (j HTML) WriteContentType(w http.ResponseWriter) {
writeContentType(w, HTMLContentType, j.Title, "html")
}
// Render (JSON) writes data with json ContentType.
func (j HTML) Render(w http.ResponseWriter) (err error) {
if _, err = w.Write(j.Content); err != nil {
err = errors.WithStack(err)
}
return
}
func svg(c *bm.Context) {
opt := new(struct {
NetID int64 `form:"net_id" validate:"required"`
Debug int8 `form:"debug"`
})
if err := c.Bind(opt); err != nil {
return
}
var (
nv *modsvg.NetView
err error
)
if opt.Debug > 0 {
nv = modsvg.DebugSVG()
} else {
if nv, err = srv.NetSVG(c, opt.NetID); err != nil {
c.JSON(nil, err)
return
}
}
bs := bytes.NewBufferString("")
nv.Execute(c.Writer, nv.Data)
c.Render(http.StatusOK, CSV{
Content: bs.Bytes(),
Title: "流程网图",
})
}

View File

@@ -0,0 +1,515 @@
package http
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"strconv"
"strings"
"time"
"go-common/app/admin/main/aegis/model/business"
"go-common/app/admin/main/aegis/model/common"
taskmod "go-common/app/admin/main/aegis/model/task"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
libtime "go-common/library/time"
)
func taskDelay(c *bm.Context) {
opt := &taskmod.DelayOptions{}
if err := c.Bind(opt); err != nil {
return
}
err := srv.Delay(c, opt)
if err == ecode.AccessDenied || err == ecode.NothingFound {
c.JSONMap(map[string]interface{}{"tips": "任务已被他人处理,毋需延迟"}, nil)
return
}
c.JSON(nil, err)
}
func taskRelease(c *bm.Context) {
opt := &common.BaseOptions{}
if err := c.Bind(opt); err != nil {
return
}
c.JSON(srv.Release(c, opt, false))
}
func taskUnDo(c *bm.Context) {
opt := &common.BaseOptions{}
if err := c.Bind(opt); err != nil {
return
}
c.JSON(srv.UnDoStat(c, opt))
}
func taskStat(c *bm.Context) {
opt := &common.BaseOptions{}
if err := c.Bind(opt); err != nil {
return
}
c.JSON(srv.TaskStat(c, opt))
}
func consumerOn(c *bm.Context) {
opt := &common.BaseOptions{}
if err := c.Bind(opt); err != nil {
return
}
c.JSON(nil, srv.On(c, opt))
}
func consumerOff(c *bm.Context) {
opt := new(struct {
common.BaseOptions
Delay bool `form:"delay" default:"true"`
})
if err := c.Bind(opt); err != nil {
return
}
if err := srv.Off(c, &opt.BaseOptions); err != nil {
c.JSON(nil, err)
return
}
c.JSON(nil, nil)
srv.Release(c, &opt.BaseOptions, opt.Delay)
}
func kickOut(c *bm.Context) {
opt := new(struct {
common.BaseOptions
KickUID int64 `form:"kick_uid" validate:"required"`
})
if err := c.Bind(opt); err != nil {
return
}
if opt.BaseOptions.Role != taskmod.TaskRoleLeader {
httpCode(c, "组长才有权限踢人", ecode.RequestErr)
return
}
if err := srv.KickOut(c, &opt.BaseOptions, opt.KickUID); err != nil {
c.JSON(nil, err)
return
}
c.JSON(nil, nil)
srv.Release(c, &opt.BaseOptions, false)
}
func consumerWatcher(c *bm.Context) {
opt := new(struct {
BizID int64 `form:"business_id" validate:"required"`
FlowID int64 `form:"flow_id" validate:"required"`
Role int8 `form:"role"`
})
if err := c.Bind(opt); err != nil {
return
}
c.JSON(srv.Watcher(c, opt.BizID, opt.FlowID, opt.Role))
}
func configEdit(c *bm.Context) {
twc, _, err := readConfig(c)
if err != nil || twc == nil {
c.JSON(nil, ecode.RequestErr)
return
}
if twc.ID <= 0 {
httpCode(c, "id错误", ecode.RequestErr)
return
}
c.JSON(nil, srv.UpdateConfig(c, twc))
}
func configAdd(c *bm.Context) {
twc, confJSON, err := readConfig(c)
if err != nil || twc == nil {
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(nil, srv.AddConfig(c, twc, confJSON))
}
func readConfig(c *bm.Context) (tc *taskmod.Config, confJSON interface{}, err error) {
opt := &taskmod.ConfigOption{}
if err = c.Bind(opt); err != nil {
return nil, nil, err
}
switch opt.ConfType {
case taskmod.TaskConfigAssign:
type Assign struct {
Mids string `json:"mids"`
Uids string `json:"uids"`
}
confJSON = new(Assign)
case taskmod.TaskConfigRangeWeight:
confJSON = new(taskmod.RangeWeightConfig)
case taskmod.TaskConfigEqualWeight:
confJSON = new(taskmod.EqualWeightConfig)
default:
return nil, nil, ecode.RequestErr
}
tc = &taskmod.Config{
ID: opt.ID,
ConfType: opt.ConfType,
BusinessID: opt.BusinessID,
FlowID: opt.FlowID,
Description: opt.Description,
UID: opt.UID,
Uname: opt.Uname,
}
bt, _ := time.ParseInLocation(common.TimeFormat, opt.Btime, time.Local)
et, _ := time.ParseInLocation(common.TimeFormat, opt.Etime, time.Local)
if !bt.IsZero() {
tc.Btime = libtime.Time(bt.Unix())
}
if !et.IsZero() {
tc.Etime = libtime.Time(et.Unix())
}
err = jsonhelp(confJSON, []byte(opt.ConfJSON), tc)
return
}
func jsonhelp(jsonObject interface{}, bs []byte, tc *taskmod.Config) (err error) {
if err = json.Unmarshal(bs, jsonObject); err != nil {
log.Error("jsonhelp error(%v)", string(bs), err)
return
}
if bs, err = json.Marshal(jsonObject); err != nil {
log.Error("jsonhelp json.Marshal(%s) error(%v)", err)
return
}
tc.ConfJSON = string(bs)
return
}
func configList(c *bm.Context) {
qp := &taskmod.QueryParams{}
if err := c.Bind(qp); err != nil {
return
}
configs, count, err := srv.QueryConfigs(c, qp)
if err != nil {
c.JSON(nil, err)
return
}
qp.Pager.Total = int(count)
c.JSONMap(map[string]interface{}{
"pager": qp.Pager,
"data": configs,
}, nil)
}
func configDelete(c *bm.Context) {
opt := new(struct {
ID int64 `form:"id" validate:"required"`
})
if err := c.Bind(opt); err != nil {
return
}
c.JSON(nil, srv.DeleteConfig(c, opt.ID))
}
func configSet(c *bm.Context) {
opt := new(struct {
ID int64 `form:"id" validate:"required"`
State int8 `form:"state"`
})
if err := c.Bind(opt); err != nil {
return
}
c.JSON(nil, srv.SetStateConfig(c, opt.ID, opt.State))
}
func maxWeight(c *bm.Context) {
opt := &common.BaseOptions{}
if err := c.Bind(opt); err != nil {
return
}
c.JSON(srv.MaxWeight(c, opt))
}
func weightlog(c *bm.Context) {
opt := new(struct {
TaskID int64 `form:"task_id" validate:"required"`
Pn int `form:"pn" default:"1"`
Ps int `form:"ps" default:"20"`
})
if err := c.Bind(opt); err != nil {
return
}
ls, count, err := srv.WeightLog(c, opt.TaskID, opt.Pn, opt.Ps)
c.JSONMap(map[string]interface{}{
"data": ls,
"pager": common.Pager{
Pn: opt.Pn,
Ps: opt.Ps,
Total: count,
},
}, err)
}
func role(c *bm.Context) {
opt := &common.BaseOptions{}
if err := c.Bind(opt); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
opt.UID = uid(c)
opt.Uname = uname(c)
_, role, err := srv.GetRole(c, opt)
c.JSON(role, err)
}
func roleFlush(c *bm.Context) {
opt := new(struct {
Uids []int64 `form:"uids,split" validate:"required"`
BizID int64 `form:"business_id" validate:"required"`
FlowID int64 `form:"flow_id" validate:"required"`
})
if err := c.Bind(opt); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(nil, srv.FlushRole(c, opt.BizID, opt.FlowID, opt.Uids))
}
func checkTaskRole() bm.HandlerFunc {
return func(ctx *bm.Context) {
opt := &common.BaseOptions{}
if err := ctx.Bind(opt); err != nil {
ctx.Abort()
return
}
if opt.BusinessID <= 0 || opt.FlowID <= 0 {
httpCode(ctx, "缺少business_id或flow_id", ecode.RequestErr)
ctx.Abort()
return
}
if srv.Debug() == "local" {
ctx.Request.Form.Set("role", strconv.Itoa(int(taskmod.TaskRoleLeader)))
return
}
user := uid(ctx)
if srv.IsAdmin(user) {
ctx.Request.Form.Set("role", strconv.Itoa(int(taskmod.TaskRoleLeader)))
log.Info("checkTaskRole uid(%d) is admin", user)
return
}
_, role, err := srv.GetRole(ctx, opt)
if err != nil || role == 0 {
ctx.JSON(nil, ecode.AccessDenied)
ctx.Abort()
return
}
log.Info("checkTaskRole opt(%+v) role(%d)", role)
ctx.Request.Form.Set("role", fmt.Sprint(role))
}
}
//判断业务用户权限,无授权业务则报错
func checkBizRole(role string, noAdmin bool, bizID bool) bm.HandlerFunc {
return func(ctx *bm.Context) {
if srv.Debug() == "local" {
return
}
user := uid(ctx)
if srv.IsAdmin(user) {
log.Info("checkBizRole uid(%d) is admin", user)
return
}
businessID, err := srv.GetRoleBiz(ctx, user, role, noAdmin)
if err != nil || len(businessID) == 0 {
ctx.JSON(nil, ecode.AccessDenied)
ctx.Abort()
return
}
ctx.Set(business.AccessBiz, businessID)
//request business in accessed biz range
if bizID {
var biz int64
if strings.Contains(ctx.Request.Header.Get("Content-Type"), "application/json") {
var body []byte
if body, err = ioutil.ReadAll(ctx.Request.Body); err != nil {
log.Error("checkBizRole ioutil.ReadAll error(%+v)", err)
return
}
ctx.Request.Body.Close()
ctx.Request.Body = ioutil.NopCloser(bytes.NewBuffer(body))
pm := new(struct {
BusinessID int64 `json:"business_id" form:"business_id"`
})
if err = json.Unmarshal(body, pm); err != nil {
log.Error("checkBizRole json.Unmarshal error(%+v) body(%s)", err, string(body))
ctx.JSON(nil, ecode.RequestErr)
ctx.Abort()
return
}
biz = pm.BusinessID
} else {
if biz, err = strconv.ParseInt(ctx.Request.Form.Get("business_id"), 10, 64); err != nil {
log.Error("checkBizRole strconv.ParseInt(%s) error(%v)", ctx.Request.Form.Get("business_id"), err)
ctx.JSON(nil, ecode.RequestErr)
ctx.Abort()
return
}
}
exist := false
for _, item := range businessID {
if item == biz {
exist = true
break
}
}
if !exist || biz <= 0 {
ctx.JSON(nil, ecode.AccessDenied)
ctx.Abort()
return
}
}
}
}
//判断任务用户权限,无授权业务则报错
func checkAccessTask() bm.HandlerFunc {
return func(ctx *bm.Context) {
if srv.Debug() == "local" {
return
}
user := uid(ctx)
if srv.IsAdmin(user) {
log.Info("checkrole uid(%d) is admin", user)
return
}
businessID, flowID, err := srv.GetTaskBizFlows(ctx, user)
if err != nil || len(businessID) == 0 || len(flowID) == 0 {
//ctx.JSON(nil, ecode.AccessDenied)
ctx.JSON(nil, nil)
ctx.Abort()
return
}
log.Info("checkAccessTask uid(%d) can see business(%+v) flow(%+v)", user, businessID, flowID)
ctx.Set(business.AccessBiz, businessID)
ctx.Set(business.AccessFlow, flowID)
}
}
//是否为指定业务的管理员角色
func checkBizID() bm.HandlerFunc {
return checkBizRole(business.BizBIDAdmin, false, true)
}
//为哪些业务的管理员角色
func checkBizAdmin() bm.HandlerFunc {
return checkBizRole(business.BizBIDAdmin, false, false)
}
//为哪些业务的非管理员角色
func checkBizBID() bm.HandlerFunc {
return checkBizRole("", true, false)
}
func checkBizLeader() bm.HandlerFunc {
return checkBizRole("leader", true, true)
}
func checkBizOper() bm.HandlerFunc {
return checkBizRole("oper", true, true)
}
//为指定业务的非管理员角色
func checkBizBIDBiz() bm.HandlerFunc {
return checkBizRole("", true, true)
}
func getAccessBiz(c *bm.Context) (biz []int64) {
biz = []int64{}
ids, _ := c.Get(business.AccessBiz)
if ids != nil {
biz = ids.([]int64)
}
return
}
func getAccessFlow(c *bm.Context) (flowID []int64) {
flowID = []int64{}
ids, _ := c.Get(business.AccessFlow)
if ids != nil {
flowID = ids.([]int64)
}
return
}
func checkon() bm.HandlerFunc {
return func(ctx *bm.Context) {
if srv.Debug() == "local" {
return
}
opt := &common.BaseOptions{}
if err := ctx.Bind(opt); err != nil {
ctx.Abort()
return
}
if !srv.IsOn(ctx, opt) {
if err := srv.On(ctx, opt); err != nil {
ctx.JSON(nil, err)
ctx.Abort()
}
return
}
}
}
func preHandlerUser() bm.HandlerFunc {
return func(ctx *bm.Context) {
if srv.Debug() == "local" {
return
}
uidS, ok := ctx.Get("uid")
if !ok {
ctx.JSON(nil, ecode.NoLogin)
ctx.Abort()
return
}
unamei, ok := ctx.Get("username")
if !ok {
ctx.JSON(nil, ecode.NoLogin)
ctx.Abort()
return
}
ctx.Request.Form.Set("uid", fmt.Sprint(uidS))
ctx.Request.Form.Set("uname", unamei.(string))
}
}

View File

@@ -0,0 +1,99 @@
package http
import (
"strconv"
"strings"
"go-common/app/admin/main/aegis/model/common"
"go-common/app/admin/main/aegis/model/net"
"go-common/library/ecode"
bm "go-common/library/net/http/blademaster"
)
func listToken(c *bm.Context) {
pm := new(net.ListTokenParam)
if err := c.Bind(pm); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
if pm.Sort != "desc" && pm.Sort != "asc" {
pm.Sort = "desc"
}
c.JSON(srv.GetTokenList(c, pm))
}
func tokenGroupByType(c *bm.Context) {
pm := c.Request.Form.Get("net_id")
netID, err := strconv.ParseInt(pm, 10, 64)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(srv.TokenGroupByType(c, netID))
}
func tokenByName(c *bm.Context) {
name := strings.TrimSpace(c.Request.Form.Get("name"))
busIDStr := c.Request.Form.Get("business_id")
busID, err := strconv.ParseInt(busIDStr, 10, 64)
if err != nil || busID <= 0 || name == "" {
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(srv.TokenByName(c, busID, name))
}
func configToken(c *bm.Context) {
data := map[string]interface{}{
"compare": net.TokenCompareDesc,
"value_types": net.TokenValueTypeDesc,
}
c.JSONMap(data, nil)
}
func showToken(c *bm.Context) {
pm := c.Request.Form.Get("id")
id, err := strconv.ParseInt(pm, 10, 64)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(srv.ShowToken(c, id))
}
func preToken(pm *net.Token) (invalid bool) {
compare := net.GetTokenCompare(pm.Compare)
tp := net.GetTokenValueType(pm.Type)
pm.Value = strings.TrimSpace(pm.Value)
pm.ChName = common.FilterChname(pm.ChName)
pm.Name = common.FilterName(pm.Name)
if pm.ChName == "" || pm.Name == "" || compare == "" || tp == "" || pm.Value == "" {
invalid = true
}
return
}
func addToken(c *bm.Context) {
pm := new(net.Token)
if err := c.Bind(pm); err != nil || pm.NetID <= 0 {
c.JSON(nil, ecode.RequestErr)
return
}
if preToken(pm) {
c.JSON(nil, ecode.RequestErr)
return
}
pm.UID = uid(c)
id, err, msg := srv.AddToken(c, pm)
c.JSONMap(map[string]interface{}{
"id": id,
"message": msg,
}, err)
}

View File

@@ -0,0 +1,128 @@
package http
import (
"fmt"
"strconv"
"strings"
"go-common/app/admin/main/aegis/model/common"
"go-common/app/admin/main/aegis/model/net"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/http/blademaster/binding"
)
func listTransition(c *bm.Context) {
pm := new(net.ListNetElementParam)
if err := c.Bind(pm); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
if pm.Sort != "desc" && pm.Sort != "asc" {
pm.Sort = "desc"
}
c.JSON(srv.GetTransitionList(c, pm))
}
func getTranByNet(c *bm.Context) {
pm := c.Request.Form.Get("net_id")
id, err := strconv.ParseInt(pm, 10, 64)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(srv.GetTranByNet(c, id))
}
func showTransition(c *bm.Context) {
pm := c.Request.Form.Get("id")
id, err := strconv.ParseInt(pm, 10, 64)
if err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(srv.ShowTransition(c, id))
}
func preTran(pm *net.TransitionEditParam) (invalid bool) {
invalid = true
pm.Trigger = net.TriggerManual
pm.ChName = common.FilterChname(pm.ChName)
pm.Name = common.FilterName(pm.Name)
if pm.ChName == "" || pm.Name == "" || (pm.Trigger == net.TriggerManual && pm.Limit > 50) {
return
}
existBindMap := map[string]int{}
for _, item := range pm.TokenList {
item.TokenID = strings.TrimSpace(item.TokenID)
item.ChName = strings.TrimSpace(item.ChName)
if item.ID < 0 || item.TokenID == "" || item.Type == net.BindTypeFlow {
return
}
kk := fmt.Sprintf("%s_%d", item.TokenID, item.Type)
if existBindMap[kk] > 0 {
log.Error("preTran bind(%+v) duplicated in tokenid+type", item)
return
}
existBindMap[kk] = 1
}
invalid = false
return
}
func addTransition(c *bm.Context) {
pm := new(net.TransitionEditParam)
if err := c.BindWith(pm, binding.JSON); err != nil || pm.NetID <= 0 {
log.Error("addTransition bind params error(%v) body(%+v)", err, c.Request.Body)
c.JSON(nil, ecode.RequestErr)
return
}
if preTran(pm) {
c.JSON(nil, ecode.RequestErr)
return
}
admin := uid(c)
id, err, msg := srv.AddTransition(c, admin, pm)
c.JSONMap(map[string]interface{}{
"id": id,
"message": msg,
}, err)
}
func updateTransition(c *bm.Context) {
pm := new(net.TransitionEditParam)
if err := c.BindWith(pm, binding.JSON); err != nil || pm.ID <= 0 {
log.Error("updateTransition bind params error(%v) body(%+v)", err, c.Request.Body)
c.JSON(nil, ecode.RequestErr)
return
}
if preTran(pm) {
c.JSON(nil, ecode.RequestErr)
return
}
admin := uid(c)
err, msg := srv.UpdateTransition(c, admin, pm)
c.JSONMap(map[string]interface{}{
"message": msg,
}, err)
}
func switchTransition(c *bm.Context) {
pm := new(net.SwitchParam)
if err := c.Bind(pm); err != nil {
c.JSON(nil, ecode.RequestErr)
return
}
c.JSON(nil, srv.SwitchTransition(c, pm.ID, pm.Disable))
}