feat: 升级hook处理逻辑
This commit is contained in:
74
router/hook.go
Normal file
74
router/hook.go
Normal file
@@ -0,0 +1,74 @@
|
||||
// Package router ...
|
||||
//
|
||||
// Description : router ...
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 2025-11-01 12:34
|
||||
package router
|
||||
|
||||
import (
|
||||
"git.zhangdeman.cn/zhangdeman/consts"
|
||||
"git.zhangdeman.cn/zhangdeman/gin/define"
|
||||
"git.zhangdeman.cn/zhangdeman/gin/logger"
|
||||
"git.zhangdeman.cn/zhangdeman/gin/util"
|
||||
pkgLogger "git.zhangdeman.cn/zhangdeman/logger"
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
// hook 执行hook逻辑
|
||||
func (s *server) hook(ctx *gin.Context, uriCfg UriConfig) {
|
||||
responseAfter, exist := ctx.Get(consts.GinLogicAfterResponseKey)
|
||||
innerContext := util.GinCtxToContext(ctx)
|
||||
if !exist || nil != responseAfter {
|
||||
// 未配置
|
||||
logger.Instance.Debug("未配置Logic执行后的hook逻辑", pkgLogger.NewLogData(innerContext, logger.RecordType, logger.CodeLogicHook, map[string]any{
|
||||
"uri": uriCfg.Path,
|
||||
"logic_after_response_key": consts.GinLogicAfterResponseKey,
|
||||
}).ToFieldList()...)
|
||||
return
|
||||
}
|
||||
isSuccess, exist := ctx.Get(consts.GinRequestSuccess)
|
||||
success := false
|
||||
if nil != isSuccess && (isSuccess == "1" || isSuccess == "true" || isSuccess.(bool)) {
|
||||
success = true
|
||||
}
|
||||
hookInstance := responseAfter.(*define.LogicAfterResponse)
|
||||
if uriCfg.HookSync {
|
||||
// 同步执行
|
||||
s.hookAfter(ctx, uriCfg, hookInstance, success)
|
||||
} else {
|
||||
// 异步执行
|
||||
go s.hookAfter(ctx, uriCfg, hookInstance, success)
|
||||
}
|
||||
}
|
||||
|
||||
func (s *server) hookAfter(ctx *gin.Context, uriCfg UriConfig, hookInstance *define.LogicAfterResponse, success bool) {
|
||||
innerContext := util.GinCtxToContext(ctx)
|
||||
defer func() {
|
||||
if err := recover(); err != nil {
|
||||
logger.Instance.Error("hook执行异常", pkgLogger.NewLogData(innerContext, logger.RecordType, logger.CodeLogicHook, map[string]any{
|
||||
"uri": uriCfg.Path,
|
||||
"logic_after_response_key": consts.GinLogicAfterResponseKey,
|
||||
"error": err.(error).Error(),
|
||||
"logic_success": success,
|
||||
}).ToFieldList()...)
|
||||
} else {
|
||||
|
||||
}
|
||||
}()
|
||||
if success {
|
||||
logger.Instance.Debug("接口Logic执行成功, 执行Hook逻辑")
|
||||
for _, itemFunc := range hookInstance.SuccessHookFuncList {
|
||||
if nil != itemFunc {
|
||||
itemFunc(ctx)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for _, itemFunc := range hookInstance.FailureHookFuncList {
|
||||
if nil != itemFunc {
|
||||
itemFunc(ctx)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user