package gateway import ( "git.sxidc.com/go-framework/baize/framework/core/api" "git.sxidc.com/go-tools/utils/http_client" "net/http" "time" ) type Handler func(requestBuilder *RequestBuilder) type Builder struct { router api.Router httpClient *http_client.Client httpTimeoutSec int64 } func newBuilder(router api.Router, httpClient *http_client.Client, httpTimeoutSec int64, middlewares ...Handler) *Builder { builder := &Builder{ router: router, httpClient: httpClient, httpTimeoutSec: httpTimeoutSec, } apiMiddlewares := make([]api.Handler, len(middlewares)) for i, middleware := range middlewares { apiMiddlewares[i] = builder.formApiHandler(middleware) } builder.router.AddMiddlewares(apiMiddlewares...) return builder } func (builder *Builder) PostRoute(relativePath string, handler Handler, middlewares ...Handler) { builder.AddRoute(http.MethodPost, relativePath, handler, middlewares...) } func (builder *Builder) DeleteRoute(relativePath string, handler Handler, middlewares ...Handler) { builder.AddRoute(http.MethodDelete, relativePath, handler, middlewares...) } func (builder *Builder) PutRoute(relativePath string, handler Handler, middlewares ...Handler) { builder.AddRoute(http.MethodPut, relativePath, handler, middlewares...) } func (builder *Builder) GetRoute(relativePath string, handler Handler, middlewares ...Handler) { builder.AddRoute(http.MethodGet, relativePath, handler, middlewares...) } func (builder *Builder) PostRouteWithTenantIDAndUserID(relativePath string, handler Handler, middlewares ...Handler) { builder.AddRouteWithTenantIDAndUserID(http.MethodPost, relativePath, "tenantId", "userId", handler, middlewares...) } func (builder *Builder) DeleteRouteWithTenantIDAndUserID(relativePath string, handler Handler, middlewares ...Handler) { builder.AddRouteWithTenantIDAndUserID(http.MethodDelete, relativePath, "tenantId", "userId", handler, middlewares...) } func (builder *Builder) PutRouteWithTenantIDAndUserID(relativePath string, handler Handler, middlewares ...Handler) { builder.AddRouteWithTenantIDAndUserID(http.MethodPut, relativePath, "tenantId", "userId", handler, middlewares...) } func (builder *Builder) GetRouteWithTenantIDAndUserID(relativePath string, handler Handler, middlewares ...Handler) { builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, "tenantId", "userId", handler, middlewares...) } func (builder *Builder) PostRouteWithTenantID(relativePath string, handler Handler, middlewares ...Handler) { builder.AddRouteWithTenantIDAndUserID(http.MethodPost, relativePath, "tenantId", "", handler, middlewares...) } func (builder *Builder) DeleteRouteWithTenantID(relativePath string, handler Handler, middlewares ...Handler) { builder.AddRouteWithTenantIDAndUserID(http.MethodDelete, relativePath, "tenantId", "", handler, middlewares...) } func (builder *Builder) PutRouteWithTenantID(relativePath string, handler Handler, middlewares ...Handler) { builder.AddRouteWithTenantIDAndUserID(http.MethodPut, relativePath, "tenantId", "", handler, middlewares...) } func (builder *Builder) GetRouteWithTenantID(relativePath string, handler Handler, middlewares ...Handler) { builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, "tenantId", "", handler, middlewares...) } func (builder *Builder) PostRouteWithUserID(relativePath string, handler Handler, middlewares ...Handler) { builder.AddRouteWithTenantIDAndUserID(http.MethodPost, relativePath, "", "userId", handler, middlewares...) } func (builder *Builder) DeleteRouteWithUserID(relativePath string, handler Handler, middlewares ...Handler) { builder.AddRouteWithTenantIDAndUserID(http.MethodDelete, relativePath, "", "userId", handler, middlewares...) } func (builder *Builder) PutRouteWithUserID(relativePath string, handler Handler, middlewares ...Handler) { builder.AddRouteWithTenantIDAndUserID(http.MethodPut, relativePath, "", "userId", handler, middlewares...) } func (builder *Builder) GetRouteWithUserID(relativePath string, handler Handler, middlewares ...Handler) { builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, "", "userId", handler, middlewares...) } func (builder *Builder) PostRouteWithTenantIDAndUserIDCommon(relativePath string, tenantIDField string, userIDField string, handler Handler, middlewares ...Handler) { builder.AddRouteWithTenantIDAndUserID(http.MethodPost, relativePath, tenantIDField, "userId", handler, middlewares...) } func (builder *Builder) DeleteRouteWithTenantIDAndUserIDCommon(relativePath string, tenantIDField string, userIDField string, handler Handler, middlewares ...Handler) { builder.AddRouteWithTenantIDAndUserID(http.MethodDelete, relativePath, tenantIDField, userIDField, handler, middlewares...) } func (builder *Builder) PutRouteWithTenantIDAndUserIDCommon(relativePath string, tenantIDField string, userIDField string, handler Handler, middlewares ...Handler) { builder.AddRouteWithTenantIDAndUserID(http.MethodPut, relativePath, tenantIDField, userIDField, handler, middlewares...) } func (builder *Builder) GetRouteWithTenantIDAndUserIDCommon(relativePath string, tenantIDField string, userIDField string, handler Handler, middlewares ...Handler) { builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, tenantIDField, userIDField, handler, middlewares...) } func (builder *Builder) PostRouteWithTenantIDCommon(relativePath string, tenantIDField string, handler Handler, middlewares ...Handler) { builder.AddRouteWithTenantIDAndUserID(http.MethodPost, relativePath, tenantIDField, "", handler, middlewares...) } func (builder *Builder) DeleteRouteWithTenantIDCommon(relativePath string, tenantIDField string, handler Handler, middlewares ...Handler) { builder.AddRouteWithTenantIDAndUserID(http.MethodDelete, relativePath, tenantIDField, "", handler, middlewares...) } func (builder *Builder) PutRouteWithTenantIDCommon(relativePath string, tenantIDField string, handler Handler, middlewares ...Handler) { builder.AddRouteWithTenantIDAndUserID(http.MethodPut, relativePath, tenantIDField, "", handler, middlewares...) } func (builder *Builder) GetRouteWithTenantIDCommon(relativePath string, tenantIDField string, handler Handler, middlewares ...Handler) { builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, tenantIDField, "", handler, middlewares...) } func (builder *Builder) PostRouteWithUserIDCommon(relativePath string, userIDField string, handler Handler, middlewares ...Handler) { builder.AddRouteWithTenantIDAndUserID(http.MethodPost, relativePath, "", userIDField, handler, middlewares...) } func (builder *Builder) DeleteRouteWithUserIDCommon(relativePath string, userIDField string, handler Handler, middlewares ...Handler) { builder.AddRouteWithTenantIDAndUserID(http.MethodDelete, relativePath, "", userIDField, handler, middlewares...) } func (builder *Builder) PutRouteWithUserIDCommon(relativePath string, userIDField string, handler Handler, middlewares ...Handler) { builder.AddRouteWithTenantIDAndUserID(http.MethodPut, relativePath, "", userIDField, handler, middlewares...) } func (builder *Builder) GetRouteWithUserIDCommon(relativePath string, userIDField string, handler Handler, middlewares ...Handler) { builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, "", userIDField, handler, middlewares...) } func (builder *Builder) AddRoute(httpMethod string, relativePath string, handler Handler, middlewares ...Handler) { apiHandlers := make([]api.Handler, len(middlewares)+1) apiHandlers[0] = builder.formApiHandler(handler) for i, middleware := range middlewares { apiHandlers[i+1] = builder.formApiHandler(middleware) } builder.router.AddRoute(httpMethod, relativePath, apiHandlers...) } func (builder *Builder) AddRouteWithTenantIDAndUserID(httpMethod string, relativePath string, tenantIDField string, userIDField string, handler Handler, middlewares ...Handler) { apiHandlers := make([]api.Handler, len(middlewares)+1) apiHandlers[0] = builder.formApiHandlerWithTenantIDAndUserID(httpMethod, tenantIDField, userIDField, handler) for i, middleware := range middlewares { apiHandlers[i+1] = builder.formApiHandlerWithTenantIDAndUserID(httpMethod, tenantIDField, userIDField, middleware) } builder.router.AddRoute(httpMethod, relativePath, apiHandlers...) } func (builder *Builder) formApiHandler(handler Handler) api.Handler { return func(c *api.Context) { httpRequest := builder.httpClient.NewRequest(http_client.WithNewRequestTimeout(time.Duration(builder.httpTimeoutSec) * time.Second)) requestBuilder := newRequestBuilder(c, httpRequest) handler(requestBuilder) } } func (builder *Builder) formApiHandlerWithTenantIDAndUserID(httpMethod string, tenantIDParamsName string, userIDParamsName string, handler Handler) api.Handler { return func(c *api.Context) { httpRequest := builder.httpClient.NewRequest(http_client.WithNewRequestTimeout(time.Duration(builder.httpTimeoutSec) * time.Second)) requestBuilder := newRequestBuilder(c, httpRequest) switch httpMethod { case http.MethodPost, http.MethodPut: err := AddJsonBodyTenantIDAndUserID(requestBuilder, tenantIDParamsName, userIDParamsName) if err != nil { panic(err) } case http.MethodDelete, http.MethodGet: err := AddQueryParamsTenantIDAndUserID(requestBuilder, tenantIDParamsName, userIDParamsName) if err != nil { panic(err) } default: panic("不支持的http方法s") } handler(requestBuilder) } }