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