builder.go 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. package gateway
  2. import (
  3. "git.sxidc.com/go-framework/baize/framework/core/api"
  4. "git.sxidc.com/go-tools/utils/http_client"
  5. "net/http"
  6. "time"
  7. )
  8. type Handler func(requestBuilder *RequestBuilder)
  9. type Builder struct {
  10. router api.Router
  11. httpClient *http_client.Client
  12. httpTimeoutSec int64
  13. }
  14. func newBuilder(router api.Router, httpClient *http_client.Client, httpTimeoutSec int64, middlewares ...Handler) *Builder {
  15. builder := &Builder{
  16. router: router,
  17. httpClient: httpClient,
  18. httpTimeoutSec: httpTimeoutSec,
  19. }
  20. apiMiddlewares := make([]api.Handler, len(middlewares))
  21. for i, middleware := range middlewares {
  22. apiMiddlewares[i] = builder.formApiHandler(middleware)
  23. }
  24. builder.router.AddMiddlewares(apiMiddlewares...)
  25. return builder
  26. }
  27. func (builder *Builder) PostRoute(relativePath string, handler Handler, middlewares ...Handler) {
  28. builder.AddRoute(http.MethodPost, relativePath, handler, middlewares...)
  29. }
  30. func (builder *Builder) DeleteRoute(relativePath string, handler Handler, middlewares ...Handler) {
  31. builder.AddRoute(http.MethodDelete, relativePath, handler, middlewares...)
  32. }
  33. func (builder *Builder) PutRoute(relativePath string, handler Handler, middlewares ...Handler) {
  34. builder.AddRoute(http.MethodPut, relativePath, handler, middlewares...)
  35. }
  36. func (builder *Builder) GetRoute(relativePath string, handler Handler, middlewares ...Handler) {
  37. builder.AddRoute(http.MethodGet, relativePath, handler, middlewares...)
  38. }
  39. func (builder *Builder) PostRouteWithTenantIDAndUserID(relativePath string, handler Handler, middlewares ...Handler) {
  40. builder.AddRouteWithTenantIDAndUserID(http.MethodPost, relativePath, "tenantId", "userId", handler, middlewares...)
  41. }
  42. func (builder *Builder) DeleteRouteWithTenantIDAndUserID(relativePath string, handler Handler, middlewares ...Handler) {
  43. builder.AddRouteWithTenantIDAndUserID(http.MethodDelete, relativePath, "tenantId", "userId", handler, middlewares...)
  44. }
  45. func (builder *Builder) PutRouteWithTenantIDAndUserID(relativePath string, handler Handler, middlewares ...Handler) {
  46. builder.AddRouteWithTenantIDAndUserID(http.MethodPut, relativePath, "tenantId", "userId", handler, middlewares...)
  47. }
  48. func (builder *Builder) GetRouteWithTenantIDAndUserID(relativePath string, handler Handler, middlewares ...Handler) {
  49. builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, "tenantId", "userId", handler, middlewares...)
  50. }
  51. func (builder *Builder) PostRouteWithTenantID(relativePath string, handler Handler, middlewares ...Handler) {
  52. builder.AddRouteWithTenantIDAndUserID(http.MethodPost, relativePath, "tenantId", "", handler, middlewares...)
  53. }
  54. func (builder *Builder) DeleteRouteWithTenantID(relativePath string, handler Handler, middlewares ...Handler) {
  55. builder.AddRouteWithTenantIDAndUserID(http.MethodDelete, relativePath, "tenantId", "", handler, middlewares...)
  56. }
  57. func (builder *Builder) PutRouteWithTenantID(relativePath string, handler Handler, middlewares ...Handler) {
  58. builder.AddRouteWithTenantIDAndUserID(http.MethodPut, relativePath, "tenantId", "", handler, middlewares...)
  59. }
  60. func (builder *Builder) GetRouteWithTenantID(relativePath string, handler Handler, middlewares ...Handler) {
  61. builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, "tenantId", "", handler, middlewares...)
  62. }
  63. func (builder *Builder) PostRouteWithUserID(relativePath string, handler Handler, middlewares ...Handler) {
  64. builder.AddRouteWithTenantIDAndUserID(http.MethodPost, relativePath, "", "userId", handler, middlewares...)
  65. }
  66. func (builder *Builder) DeleteRouteWithUserID(relativePath string, handler Handler, middlewares ...Handler) {
  67. builder.AddRouteWithTenantIDAndUserID(http.MethodDelete, relativePath, "", "userId", handler, middlewares...)
  68. }
  69. func (builder *Builder) PutRouteWithUserID(relativePath string, handler Handler, middlewares ...Handler) {
  70. builder.AddRouteWithTenantIDAndUserID(http.MethodPut, relativePath, "", "userId", handler, middlewares...)
  71. }
  72. func (builder *Builder) GetRouteWithUserID(relativePath string, handler Handler, middlewares ...Handler) {
  73. builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, "", "userId", handler, middlewares...)
  74. }
  75. func (builder *Builder) PostRouteWithTenantIDAndUserIDCommon(relativePath string, tenantIDField string, userIDField string, handler Handler, middlewares ...Handler) {
  76. builder.AddRouteWithTenantIDAndUserID(http.MethodPost, relativePath, tenantIDField, "userId", handler, middlewares...)
  77. }
  78. func (builder *Builder) DeleteRouteWithTenantIDAndUserIDCommon(relativePath string, tenantIDField string, userIDField string, handler Handler, middlewares ...Handler) {
  79. builder.AddRouteWithTenantIDAndUserID(http.MethodDelete, relativePath, tenantIDField, userIDField, handler, middlewares...)
  80. }
  81. func (builder *Builder) PutRouteWithTenantIDAndUserIDCommon(relativePath string, tenantIDField string, userIDField string, handler Handler, middlewares ...Handler) {
  82. builder.AddRouteWithTenantIDAndUserID(http.MethodPut, relativePath, tenantIDField, userIDField, handler, middlewares...)
  83. }
  84. func (builder *Builder) GetRouteWithTenantIDAndUserIDCommon(relativePath string, tenantIDField string, userIDField string, handler Handler, middlewares ...Handler) {
  85. builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, tenantIDField, userIDField, handler, middlewares...)
  86. }
  87. func (builder *Builder) PostRouteWithTenantIDCommon(relativePath string, tenantIDField string, handler Handler, middlewares ...Handler) {
  88. builder.AddRouteWithTenantIDAndUserID(http.MethodPost, relativePath, tenantIDField, "", handler, middlewares...)
  89. }
  90. func (builder *Builder) DeleteRouteWithTenantIDCommon(relativePath string, tenantIDField string, handler Handler, middlewares ...Handler) {
  91. builder.AddRouteWithTenantIDAndUserID(http.MethodDelete, relativePath, tenantIDField, "", handler, middlewares...)
  92. }
  93. func (builder *Builder) PutRouteWithTenantIDCommon(relativePath string, tenantIDField string, handler Handler, middlewares ...Handler) {
  94. builder.AddRouteWithTenantIDAndUserID(http.MethodPut, relativePath, tenantIDField, "", handler, middlewares...)
  95. }
  96. func (builder *Builder) GetRouteWithTenantIDCommon(relativePath string, tenantIDField string, handler Handler, middlewares ...Handler) {
  97. builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, tenantIDField, "", handler, middlewares...)
  98. }
  99. func (builder *Builder) PostRouteWithUserIDCommon(relativePath string, userIDField string, handler Handler, middlewares ...Handler) {
  100. builder.AddRouteWithTenantIDAndUserID(http.MethodPost, relativePath, "", userIDField, handler, middlewares...)
  101. }
  102. func (builder *Builder) DeleteRouteWithUserIDCommon(relativePath string, userIDField string, handler Handler, middlewares ...Handler) {
  103. builder.AddRouteWithTenantIDAndUserID(http.MethodDelete, relativePath, "", userIDField, handler, middlewares...)
  104. }
  105. func (builder *Builder) PutRouteWithUserIDCommon(relativePath string, userIDField string, handler Handler, middlewares ...Handler) {
  106. builder.AddRouteWithTenantIDAndUserID(http.MethodPut, relativePath, "", userIDField, handler, middlewares...)
  107. }
  108. func (builder *Builder) GetRouteWithUserIDCommon(relativePath string, userIDField string, handler Handler, middlewares ...Handler) {
  109. builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, "", userIDField, handler, middlewares...)
  110. }
  111. func (builder *Builder) AddRoute(httpMethod string, relativePath string, handler Handler, middlewares ...Handler) {
  112. apiHandlers := make([]api.Handler, len(middlewares)+1)
  113. apiHandlers[0] = builder.formApiHandler(handler)
  114. for i, middleware := range middlewares {
  115. apiHandlers[i+1] = builder.formApiHandler(middleware)
  116. }
  117. builder.router.AddRoute(httpMethod, relativePath, apiHandlers...)
  118. }
  119. func (builder *Builder) AddRouteWithTenantIDAndUserID(httpMethod string, relativePath string, tenantIDField string, userIDField string, handler Handler, middlewares ...Handler) {
  120. apiHandlers := make([]api.Handler, len(middlewares)+1)
  121. apiHandlers[0] = builder.formApiHandlerWithTenantIDAndUserID(httpMethod, tenantIDField, userIDField, handler)
  122. for i, middleware := range middlewares {
  123. apiHandlers[i+1] = builder.formApiHandlerWithTenantIDAndUserID(httpMethod, tenantIDField, userIDField, middleware)
  124. }
  125. builder.router.AddRoute(httpMethod, relativePath, apiHandlers...)
  126. }
  127. func (builder *Builder) formApiHandler(handler Handler) api.Handler {
  128. return func(c *api.Context) {
  129. httpRequest := builder.httpClient.NewRequest(http_client.WithNewRequestTimeout(time.Duration(builder.httpTimeoutSec) * time.Second))
  130. requestBuilder := newRequestBuilder(c, httpRequest)
  131. handler(requestBuilder)
  132. }
  133. }
  134. func (builder *Builder) formApiHandlerWithTenantIDAndUserID(httpMethod string, tenantIDParamsName string, userIDParamsName string, handler Handler) api.Handler {
  135. return func(c *api.Context) {
  136. httpRequest := builder.httpClient.NewRequest(http_client.WithNewRequestTimeout(time.Duration(builder.httpTimeoutSec) * time.Second))
  137. requestBuilder := newRequestBuilder(c, httpRequest)
  138. switch httpMethod {
  139. case http.MethodPost, http.MethodPut:
  140. err := AddJsonBodyTenantIDAndUserID(requestBuilder, tenantIDParamsName, userIDParamsName)
  141. if err != nil {
  142. panic(err)
  143. }
  144. case http.MethodDelete, http.MethodGet:
  145. err := AddQueryParamsTenantIDAndUserID(requestBuilder, tenantIDParamsName, userIDParamsName)
  146. if err != nil {
  147. panic(err)
  148. }
  149. default:
  150. panic("不支持的http方法s")
  151. }
  152. handler(requestBuilder)
  153. }
  154. }