go-common/app/interface/main/mcn/server/http/http_base.go
2019-04-22 18:49:16 +08:00

200 lines
5.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}