package gateway import ( "git.sxidc.com/go-framework/baize/framework/core/api" "git.sxidc.com/go-tools/utils/http_client" "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 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) RequestCallbackFunc(globalRequestCallbackFunc GlobalRequestCallbackFunc) *Builder { copyBuilder := builder.copy() copyBuilder.params.globalRequestCallbackFunc = globalRequestCallbackFunc 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), } for _, requestItem := range builder.params.requestItems { err := requestItem.request.Request(httpRequest) if requestItem.requestCallbackFunc != nil { requestItem.requestCallbackFunc(c, requestItem.request.Response(), err, result.Custom) return } if builder.params.globalRequestCallbackFunc != nil { builder.params.globalRequestCallbackFunc(c, requestItem.request, err, historyRequests, result.Custom) continue } // TODO if err != nil { } historyRequests = append(historyRequests, requestItem.request) return } // TODO 最终结果处理 })...) } 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 = copyBuilder.params.copy() return copyBuilder }