200 lines
5.4 KiB
Go
200 lines
5.4 KiB
Go
package http
|
||
|
||
import (
|
||
"context"
|
||
|
||
"go-common/app/interface/main/mcn/conf"
|
||
"go-common/app/interface/main/mcn/model/mcnmodel"
|
||
"go-common/library/ecode"
|
||
"go-common/library/log"
|
||
"go-common/library/net/http/blademaster"
|
||
)
|
||
|
||
// func bmHTTPErrorWithMsg(c *blademaster.Context, err error, msg string) {
|
||
// 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,
|
||
// })
|
||
// }
|
||
|
||
// service的函数原型
|
||
type serviceFunc func(context context.Context, arg interface{}) (res interface{}, err error)
|
||
|
||
// response writer
|
||
type responseWriter func(c *blademaster.Context, arg interface{}, res interface{}, err error)
|
||
|
||
type argParser func(c *blademaster.Context, arg interface{}) (err error)
|
||
|
||
func argGetParser(c *blademaster.Context, arg interface{}) (err error) {
|
||
err = c.Bind(arg)
|
||
return
|
||
}
|
||
|
||
// argPostJSONParser .
|
||
// func argPostJSONParser(c *blademaster.Context, arg interface{}) (err error) {
|
||
// respBody, _ := ioutil.ReadAll(c.Request.Body)
|
||
// if err = json.Unmarshal(respBody, arg); err != nil {
|
||
// log.Error("json unmarshal fail, err=%v", err)
|
||
// return
|
||
// }
|
||
// if err = binding.Validator.ValidateStruct(arg); err != nil {
|
||
// log.Error("binding.Validator.ValidateStruct(%+v) error(%+v)", arg, err)
|
||
// }
|
||
// return
|
||
// }
|
||
|
||
func jsonWriter(c *blademaster.Context, arg interface{}, res interface{}, err error) {
|
||
c.JSON(res, err)
|
||
}
|
||
|
||
// func csvWriter(c *blademaster.Context, arg interface{}, res interface{}, err error) {
|
||
// formater, ok := res.(model.CsvFormatter)
|
||
// if !ok {
|
||
// log.Error("res cannot convert CsvFommater, res type=%s", reflect.TypeOf(res).Name())
|
||
// c.String(ecode.ServerErr.Code(), "res cannot convert CsvFommater")
|
||
// return
|
||
// }
|
||
|
||
// c.Writer.Header().Set("Content-Type", "application/csv")
|
||
// c.Writer.Header().Set("Content-Disposition", fmt.Sprintf("attachment;filename=\"%s\"", formater.GetFileName()))
|
||
|
||
// var buf = &bytes.Buffer{}
|
||
// var csvWriter = csv.NewWriter(buf)
|
||
// formater.ToCsv(csvWriter)
|
||
// csvWriter.Flush()
|
||
// c.Writer.Write(buf.Bytes())
|
||
// }
|
||
|
||
// func decideWriter(c *blademaster.Context, arg interface{}, res interface{}, err error) {
|
||
// var writer responseWriter
|
||
// var decider, ok = arg.(model.ExportArgInterface)
|
||
// if ok {
|
||
// switch decider.ExportFormat() {
|
||
// case "json":
|
||
// writer = jsonWriter
|
||
// case "csv":
|
||
// writer = csvWriter
|
||
// }
|
||
// }
|
||
|
||
// if writer != nil {
|
||
// writer(c, arg, res, err)
|
||
// } else {
|
||
// jsonWriter(c, arg, res, err)
|
||
// }
|
||
// }
|
||
|
||
type preBindFuncType func(*blademaster.Context) error
|
||
type preHandleFuncType func(*blademaster.Context, interface{}) error
|
||
|
||
func httpGenerateFunc(arg interface{}, sfunc serviceFunc, description string, parser argParser, writer responseWriter, preBindFuncs []preBindFuncType, preHandleFuncs []preHandleFuncType) func(*blademaster.Context) {
|
||
return func(c *blademaster.Context) {
|
||
var res interface{}
|
||
var err error
|
||
//var errMsg string
|
||
exitswitch:
|
||
switch {
|
||
default:
|
||
for _, f := range preBindFuncs {
|
||
err = f(c)
|
||
if err != nil {
|
||
break exitswitch
|
||
}
|
||
}
|
||
if err = parser(c, arg); err != nil {
|
||
log.Error("%s, request argument bind fail, err=%v", description, err)
|
||
//errMsg = fmt.Sprintf("wrong argument, %s", err.Error())
|
||
err = ecode.RequestErr
|
||
break
|
||
}
|
||
for _, f := range preHandleFuncs {
|
||
err = f(c, arg)
|
||
if err != nil {
|
||
break exitswitch
|
||
}
|
||
}
|
||
var scoreRes, e = sfunc(c, arg)
|
||
err = e
|
||
if e != nil {
|
||
//errMsg = err.Error()
|
||
log.Error("%s query fail, req=%+v, err=%+v", description, arg, err)
|
||
break
|
||
}
|
||
log.Info("%s query ok, req=%+v, result=%+v", description, arg, scoreRes)
|
||
res = scoreRes
|
||
}
|
||
if err != nil {
|
||
//bmHTTPErrorWithMsg(c, err, errMsg)
|
||
if c.IsAborted() {
|
||
return
|
||
}
|
||
c.JSON(nil, err)
|
||
} else {
|
||
writer(c, arg, res, err)
|
||
}
|
||
}
|
||
}
|
||
|
||
func httpGetFunc(arg interface{}, sfunc serviceFunc, description string, preBindFuncs []preBindFuncType, preHandleFunc []preHandleFuncType) func(*blademaster.Context) {
|
||
return httpGetFuncWithWriter(arg, sfunc, description, jsonWriter, preBindFuncs, preHandleFunc)
|
||
}
|
||
|
||
func httpGetFuncWithWriter(arg interface{}, sfunc serviceFunc, description string, writer responseWriter, preBindFuncs []preBindFuncType, preHandleFunc []preHandleFuncType) func(*blademaster.Context) {
|
||
return httpGenerateFunc(arg, sfunc, description, argGetParser, writer, preBindFuncs, preHandleFunc)
|
||
}
|
||
|
||
func getMid(bc *blademaster.Context) int64 {
|
||
mid, exists := bc.Get("mid")
|
||
if !exists {
|
||
return 0
|
||
}
|
||
realmid, ok := mid.(int64)
|
||
if !ok {
|
||
return 0
|
||
}
|
||
return realmid
|
||
}
|
||
|
||
// 根据cookie中的mid来设置请求中的mid,请求的arg必需是mcnmodel.CookieMidInterface
|
||
func getCookieMid(c *blademaster.Context, arg interface{}) preBindFuncType {
|
||
return func(c *blademaster.Context) (err error) {
|
||
var cookieInterface, ok = arg.(mcnmodel.CookieMidInterface)
|
||
if !ok || cookieInterface == nil {
|
||
return nil
|
||
}
|
||
var mid = getMid(c)
|
||
if mid == 0 {
|
||
err = ecode.AccessDenied
|
||
return
|
||
}
|
||
cookieInterface.SetMid(mid)
|
||
|
||
return
|
||
}
|
||
}
|
||
|
||
func cheatReq(c *blademaster.Context, arg interface{}) (err error) {
|
||
var mid = getMid(c)
|
||
if mid == 0 {
|
||
return
|
||
}
|
||
if conf.Conf.Other.IsWhiteList(mid) {
|
||
var cheatInterface, ok = arg.(mcnmodel.CheatInterface)
|
||
if ok && cheatInterface != nil {
|
||
if cheatInterface.Cheat() {
|
||
log.Warn("cheat happend, uri=%s, req=%+v", c.Request.RequestURI, arg)
|
||
}
|
||
}
|
||
}
|
||
return
|
||
}
|