yjp 1 жил өмнө
parent
commit
2749be2cb8

+ 36 - 23
framework/gateway/builder.go

@@ -6,13 +6,10 @@ import (
 	"time"
 )
 
-type Result struct {
-	Result map[string]any
-	Custom map[string]any
-}
-
-type RequestCallbackFunc func(c *api.Context, response *http_client.Response, err error, customResultMap map[string]any)
-type GlobalRequestCallbackFunc func(c *api.Context, request BuilderRequest, err error, historyRequests []BuilderRequest, customResultMap map[string]any)
+type RequestCallbackFunc func(c *api.Context, response *http_client.Response, customResultMap map[string]any) error
+type GlobalRequestCallbackFunc func(c *api.Context, request BuilderRequest, historyRequests []BuilderRequest, customResultMap map[string]any) error
+type ResponseSuccessFunc func(c *api.Context, historyRequests []BuilderRequest, customResultMap map[string]any)
+type ResponseErrorFunc func(c *api.Context, err error)
 
 type Builder struct {
 	router         api.Router
@@ -53,47 +50,63 @@ func (builder *Builder) Get(request *GetRequest, requestCallbackFunc RequestCall
 	return builder.addRequest(newBuilderRequestItem(request, requestCallbackFunc))
 }
 
-func (builder *Builder) RequestCallbackFunc(globalRequestCallbackFunc GlobalRequestCallbackFunc) *Builder {
+func (builder *Builder) GlobalRequestCallbackFunc(globalRequestCallbackFunc GlobalRequestCallbackFunc) *Builder {
 	copyBuilder := builder.copy()
 	copyBuilder.params.globalRequestCallbackFunc = globalRequestCallbackFunc
 	return copyBuilder
 }
 
+func (builder *Builder) ResponseSuccessFunc(responseSuccessFunc ResponseSuccessFunc) *Builder {
+	copyBuilder := builder.copy()
+	copyBuilder.params.responseSuccessFunc = responseSuccessFunc
+	return copyBuilder
+}
+
+func (builder *Builder) ResponseErrorFunc(responseErrorFunc ResponseErrorFunc) *Builder {
+	copyBuilder := builder.copy()
+	copyBuilder.params.responseErrorFunc = responseErrorFunc
+	return copyBuilder
+}
+
 func (builder *Builder) Build(middlewares ...api.Handler) {
 	copyBuilder := builder.copy()
 	copyBuilder.router.AddRoute(builder.params.httpMethod, builder.params.relativePath, append(middlewares,
 		func(c *api.Context) {
 			httpRequest := builder.httpClient.NewRequest(http_client.WithNewRequestTimeout(time.Duration(builder.httpTimeoutSec) * time.Second))
 			historyRequests := make([]BuilderRequest, 0)
-			result := Result{
-				Result: make(map[string]any),
-				Custom: make(map[string]any),
-			}
+			resultMap := make(map[string]any)
 
 			for _, requestItem := range builder.params.requestItems {
 				err := requestItem.request.Request(httpRequest)
-
-				if requestItem.requestCallbackFunc != nil {
-					requestItem.requestCallbackFunc(c, requestItem.request.Response(), err, result.Custom)
+				if err != nil {
+					builder.params.responseErrorFunc(c, err)
 					return
 				}
 
-				if builder.params.globalRequestCallbackFunc != nil {
-					builder.params.globalRequestCallbackFunc(c, requestItem.request, err, historyRequests, result.Custom)
+				if requestItem.requestCallbackFunc != nil {
+					err := requestItem.requestCallbackFunc(c, requestItem.request.Response(), resultMap)
+					if err != nil {
+						builder.params.responseErrorFunc(c, err)
+						return
+					}
+
 					continue
 				}
 
-				// TODO
-				if err != nil {
+				if builder.params.globalRequestCallbackFunc != nil {
+					err := builder.params.globalRequestCallbackFunc(c, requestItem.request, historyRequests, resultMap)
+					if err != nil {
+						builder.params.responseErrorFunc(c, err)
+						return
+					}
 
+					continue
 				}
 
 				historyRequests = append(historyRequests, requestItem.request)
-
-				return
 			}
 
-			// TODO 最终结果处理
+			builder.params.responseSuccessFunc(c, historyRequests, resultMap)
 		})...)
 }
 
@@ -105,6 +118,6 @@ func (builder *Builder) addRequest(item *builderRequestItem) *Builder {
 
 func (builder *Builder) copy() *Builder {
 	copyBuilder := newBuilder(builder.router, builder.httpClient)
-	copyBuilder.params = copyBuilder.params.copy()
+	copyBuilder.params = builder.params.copy()
 	return copyBuilder
 }

+ 38 - 0
framework/gateway/builder_params.go

@@ -1,10 +1,19 @@
 package gateway
 
+import (
+	"git.sxidc.com/go-framework/baize/framework/core/api"
+	"git.sxidc.com/go-framework/baize/framework/core/infrastructure/logger"
+	"git.sxidc.com/service-supports/fserr"
+	"net/http"
+)
+
 type builderParams struct {
 	httpMethod                string
 	relativePath              string
 	requestItems              []*builderRequestItem
 	globalRequestCallbackFunc GlobalRequestCallbackFunc
+	responseSuccessFunc       ResponseSuccessFunc
+	responseErrorFunc         ResponseErrorFunc
 }
 
 func newBuilderParams() *builderParams {
@@ -13,6 +22,33 @@ func newBuilderParams() *builderParams {
 		relativePath:              "",
 		requestItems:              make([]*builderRequestItem, 0),
 		globalRequestCallbackFunc: nil,
+		responseSuccessFunc: func(c *api.Context, historyRequests []BuilderRequest, customResultMap map[string]any) {
+			c.Status(http.StatusOK)
+
+			_, err := c.Writer.Write(historyRequests[len(historyRequests)-1].Response().Body())
+			if err != nil {
+				logger.GetInstance().Error(fserr.New(err.Error()))
+				c.AbortWithStatus(http.StatusInternalServerError)
+				return
+			}
+
+			c.Writer.Flush()
+		},
+		responseErrorFunc: func(c *api.Context, err error) {
+			if err == nil {
+				return
+			}
+
+			resp := make(map[string]any)
+			logger.GetInstance().Error(err)
+			serviceErr := fserr.ParseCode(err)
+
+			resp["success"] = false
+			resp["errCode"] = serviceErr.BusinessCode
+			resp["msg"] = serviceErr.Msg
+
+			c.JSON(http.StatusOK, resp)
+		},
 	}
 }
 
@@ -22,5 +58,7 @@ func (params *builderParams) copy() *builderParams {
 		relativePath:              params.relativePath,
 		requestItems:              params.requestItems,
 		globalRequestCallbackFunc: params.globalRequestCallbackFunc,
+		responseSuccessFunc:       params.responseSuccessFunc,
+		responseErrorFunc:         params.responseErrorFunc,
 	}
 }