Files
mayfly-go/server/pkg/req/req_ctx.go

121 lines
2.7 KiB
Go
Raw Normal View History

2023-01-14 16:29:52 +08:00
package req
2021-03-24 17:18:39 +08:00
import (
"io"
"mayfly-go/pkg/ginx"
"mayfly-go/pkg/model"
"mayfly-go/pkg/utils/assert"
2021-04-21 10:22:09 +08:00
"time"
2021-04-16 15:10:07 +08:00
"github.com/gin-gonic/gin"
2021-03-24 17:18:39 +08:00
)
2021-04-16 15:10:07 +08:00
// 处理函数
2023-01-14 16:29:52 +08:00
type HandlerFunc func(*Ctx)
2021-04-16 15:10:07 +08:00
2023-01-14 16:29:52 +08:00
type Ctx struct {
Conf *Conf // 请求配置
GinCtx *gin.Context // gin context
LoginAccount *model.LoginAccount // 登录账号信息只有校验token后才会有值
ReqParam any // 请求参数,主要用于记录日志
ResData any // 响应结果
Err any // 请求错误
timed int64 // 执行时间
2021-03-24 17:18:39 +08:00
}
2023-01-14 16:29:52 +08:00
func (rc *Ctx) Handle(handler HandlerFunc) {
2021-04-16 15:10:07 +08:00
ginCtx := rc.GinCtx
defer func() {
if err := recover(); err != nil {
rc.Err = err
2021-04-16 15:10:07 +08:00
ginx.ErrorRes(ginCtx, err)
}
// 应用所有请求后置处理器
ApplyHandlerInterceptor(afterHandlers, rc)
2021-04-16 15:10:07 +08:00
}()
assert.IsTrue(ginCtx != nil, "ginContext == nil")
2021-04-16 15:10:07 +08:00
// 默认为不记录请求参数可在handler回调函数中覆盖赋值
2023-01-14 16:29:52 +08:00
rc.ReqParam = nil
2021-04-16 15:10:07 +08:00
// 默认响应结果为nil可在handler中赋值
rc.ResData = nil
// 调用请求前所有处理器
err := ApplyHandlerInterceptor(beforeHandlers, rc)
2021-04-16 15:10:07 +08:00
if err != nil {
panic(err)
}
2021-04-21 10:22:09 +08:00
begin := time.Now()
2021-04-16 15:10:07 +08:00
handler(rc)
rc.timed = time.Since(begin).Milliseconds()
if rc.Conf == nil || !rc.Conf.noRes {
ginx.SuccessRes(ginCtx, rc.ResData)
2021-03-24 17:18:39 +08:00
}
}
2023-01-14 16:29:52 +08:00
func (rc *Ctx) Download(reader io.Reader, filename string) {
ginx.Download(rc.GinCtx, reader, filename)
2021-03-24 17:18:39 +08:00
}
func (rc *Ctx) WithConf(conf *Conf) *Ctx {
rc.Conf = conf
return rc
2021-04-16 15:10:07 +08:00
}
// 设置请求上下文需要的权限信息
func (rc *Ctx) WithRequiredPermission(permission *Permission) *Ctx {
if rc.Conf == nil {
rc.Conf = new(Conf)
}
rc.Conf.requiredPermission = permission
return rc
2021-03-24 17:18:39 +08:00
}
// 设置请求日志信息
func (rc *Ctx) WithLog(logInfo *LogInfo) *Ctx {
if rc.Conf == nil {
rc.Conf = new(Conf)
}
rc.Conf.logInfo = logInfo
return rc
}
func (rc *Ctx) GetLogInfo() *LogInfo {
return rc.Conf.logInfo
2021-06-09 16:58:57 +08:00
}
func NewCtxWithGin(g *gin.Context) *Ctx {
return &Ctx{GinCtx: g}
2021-03-24 17:18:39 +08:00
}
// 处理器拦截器函数
2023-01-14 16:29:52 +08:00
type HandlerInterceptorFunc func(*Ctx) error
type HandlerInterceptors []HandlerInterceptorFunc
var (
beforeHandlers HandlerInterceptors
afterHandlers HandlerInterceptors
)
// 使用前置处理器函数
func UseBeforeHandlerInterceptor(b HandlerInterceptorFunc) {
beforeHandlers = append(beforeHandlers, b)
}
// 使用后置处理器函数
func UseAfterHandlerInterceptor(b HandlerInterceptorFunc) {
afterHandlers = append(afterHandlers, b)
}
// 应用指定处理器拦截器,如果有一个错误则直接返回错误
func ApplyHandlerInterceptor(his HandlerInterceptors, rc *Ctx) any {
for _, handler := range his {
if err := handler(rc); err != nil {
return err
}
}
return nil
}