package gateway import ( "git.sxidc.com/go-framework/baize/framework/core/api" "git.sxidc.com/go-tools/utils/http_client" "time" ) type RequestParamsBindCallback func(c *api.Context) type RequestCallback func(c *api.Context, response *http_client.Response, resultMap map[string]any) error type GlobalRequestCallback func(c *api.Context, request BuilderRequest, historyRequests []BuilderRequest, resultMap map[string]any) error type ResponseSuccessCallback func(c *api.Context, historyRequests []BuilderRequest, resultMap map[string]any) type ResponseErrorCallback func(c *api.Context, err error) type Builder struct { router api.Router httpClient *http_client.Client httpTimeoutSec int64 params *builderParams } func newBuilder(router api.Router, httpClient *http_client.Client, httpTimeoutSec int64) *Builder { return &Builder{ router: router, httpClient: httpClient, httpTimeoutSec: httpTimeoutSec, params: newBuilderParams(), } } func (builder *Builder) Url(httpMethod string, relativePath string) *Builder { copyBuilder := builder.copy() copyBuilder.params.httpMethod = httpMethod copyBuilder.params.relativePath = relativePath return copyBuilder } func (builder *Builder) Post(request *PostRequest, requestCallbackFunc RequestCallback) *Builder { return builder.addRequest(newBuilderRequestItem(request, requestCallbackFunc)) } func (builder *Builder) PostStruct(request *PostRequest, requestCallbackFunc RequestCallback) *Builder { return builder.addRequest(newBuilderRequestItem(request, requestCallbackFunc)) } func (builder *Builder) Delete(request *DeleteRequest, requestCallbackFunc RequestCallback) *Builder { return builder.addRequest(newBuilderRequestItem(request, requestCallbackFunc)) } func (builder *Builder) Put(request *PutRequest, requestCallbackFunc RequestCallback) *Builder { return builder.addRequest(newBuilderRequestItem(request, requestCallbackFunc)) } func (builder *Builder) Get(request *GetRequest, requestCallbackFunc RequestCallback) *Builder { return builder.addRequest(newBuilderRequestItem(request, requestCallbackFunc)) } func (builder *Builder) GlobalRequestParamsBindCallback(requestParamsBindCallback RequestParamsBindCallback) *Builder { copyBuilder := builder.copy() copyBuilder.params.requestParamsBindCallback = requestParamsBindCallback return copyBuilder } func (builder *Builder) GlobalRequestCallback(globalRequestCallback GlobalRequestCallback) *Builder { copyBuilder := builder.copy() copyBuilder.params.globalRequestCallback = globalRequestCallback return copyBuilder } func (builder *Builder) ResponseSuccessCallback(responseSuccessCallback ResponseSuccessCallback) *Builder { copyBuilder := builder.copy() copyBuilder.params.responseSuccessCallback = responseSuccessCallback return copyBuilder } func (builder *Builder) ResponseErrorCallback(responseErrorCallback ResponseErrorCallback) *Builder { copyBuilder := builder.copy() copyBuilder.params.responseErrorCallback = responseErrorCallback 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) { if builder.params.requestParamsBindCallback != nil { builder.params.requestParamsBindCallback(c) } httpRequest := builder.httpClient.NewRequest(http_client.WithNewRequestTimeout(time.Duration(builder.httpTimeoutSec) * time.Second)) historyRequests := make([]BuilderRequest, 0) resultMap := make(map[string]any) for _, requestItem := range builder.params.requestItems { err := requestItem.request.Request(c, httpRequest, historyRequests, resultMap) if err != nil { builder.params.responseErrorCallback(c, err) return } if requestItem.requestCallbackFunc != nil { err := requestItem.requestCallbackFunc(c, requestItem.request.Response(), resultMap) if err != nil { builder.params.responseErrorCallback(c, err) return } continue } if builder.params.globalRequestCallback != nil { err := builder.params.globalRequestCallback(c, requestItem.request, historyRequests, resultMap) if err != nil { builder.params.responseErrorCallback(c, err) return } continue } historyRequests = append(historyRequests, requestItem.request) } builder.params.responseSuccessCallback(c, historyRequests, resultMap) })...) } func (builder *Builder) addRequest(item *builderRequestItem) *Builder { copyBuilder := builder.copy() copyBuilder.params.requestItems = append(copyBuilder.params.requestItems, item) return copyBuilder } func (builder *Builder) copy() *Builder { copyBuilder := newBuilder(builder.router, builder.httpClient, builder.httpTimeoutSec) copyBuilder.params = builder.params.copy() return copyBuilder }