package gateway import ( "git.sxidc.com/go-framework/baize/framework/core/api" "git.sxidc.com/go-tools/utils/http_client" "time" ) 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 httpClient *http_client.Client httpTimeoutSec int64 params *builderParams } func newBuilder(router api.Router, httpClient *http_client.Client) *Builder { return &Builder{ router: router, httpClient: httpClient, 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 RequestCallbackFunc) *Builder { return builder.addRequest(newBuilderRequestItem(request, requestCallbackFunc)) } func (builder *Builder) Delete(request *DeleteRequest, requestCallbackFunc RequestCallbackFunc) *Builder { return builder.addRequest(newBuilderRequestItem(request, requestCallbackFunc)) } func (builder *Builder) Put(request *PutRequest, requestCallbackFunc RequestCallbackFunc) *Builder { return builder.addRequest(newBuilderRequestItem(request, requestCallbackFunc)) } func (builder *Builder) Get(request *GetRequest, requestCallbackFunc RequestCallbackFunc) *Builder { return builder.addRequest(newBuilderRequestItem(request, requestCallbackFunc)) } 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) resultMap := make(map[string]any) for _, requestItem := range builder.params.requestItems { err := requestItem.request.Request(httpRequest) if err != nil { builder.params.responseErrorFunc(c, err) return } if requestItem.requestCallbackFunc != nil { err := requestItem.requestCallbackFunc(c, requestItem.request.Response(), resultMap) if err != nil { builder.params.responseErrorFunc(c, err) return } continue } 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) } builder.params.responseSuccessFunc(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) copyBuilder.params = builder.params.copy() return copyBuilder }