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.
387 lines
8.6 KiB
387 lines
8.6 KiB
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) |
|
}
|
|
|