| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- 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)
- }
- }
|