builder.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461
  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. // Handler 网关API处理函数
  9. type Handler func(requestBuilder *RequestBuilder)
  10. // Builder 网关API构建器
  11. type Builder struct {
  12. router api.Router
  13. httpClient *http_client.Client
  14. httpTimeoutSec int64
  15. }
  16. func newBuilder(router api.Router, httpClient *http_client.Client, httpTimeoutSec int64, middlewares ...Handler) *Builder {
  17. builder := &Builder{
  18. router: router,
  19. httpClient: httpClient,
  20. httpTimeoutSec: httpTimeoutSec,
  21. }
  22. apiMiddlewares := make([]api.Handler, len(middlewares))
  23. for i, middleware := range middlewares {
  24. apiMiddlewares[i] = builder.formApiHandler(middleware)
  25. }
  26. builder.router.AddMiddlewares(apiMiddlewares...)
  27. return builder
  28. }
  29. // PostRoute 创建POST网关API
  30. // 参数:
  31. // - relativePath: 该网关API的相对URL
  32. // - handler: 该网关API处理函数
  33. // - middlewares: 该网关API的中间件
  34. // 返回值: 无
  35. func (builder *Builder) PostRoute(relativePath string, handler Handler, middlewares ...Handler) {
  36. builder.AddRoute(http.MethodPost, relativePath, handler, middlewares...)
  37. }
  38. // DeleteRoute 创建DELETE网关API
  39. // 参数:
  40. // - relativePath: 该网关API的相对URL
  41. // - handler: 该网关API处理函数
  42. // - middlewares: 该网关API的中间件
  43. // 返回值: 无
  44. func (builder *Builder) DeleteRoute(relativePath string, handler Handler, middlewares ...Handler) {
  45. builder.AddRoute(http.MethodDelete, relativePath, handler, middlewares...)
  46. }
  47. // PutRoute 创建PUT网关API
  48. // 参数:
  49. // - relativePath: 该网关API的相对URL
  50. // - handler: 该网关API处理函数
  51. // - middlewares: 该网关API的中间件
  52. // 返回值: 无
  53. func (builder *Builder) PutRoute(relativePath string, handler Handler, middlewares ...Handler) {
  54. builder.AddRoute(http.MethodPut, relativePath, handler, middlewares...)
  55. }
  56. // GetRoute 创建GET网关API
  57. // 参数:
  58. // - relativePath: 该网关API的相对URL
  59. // - handler: 该网关API处理函数
  60. // - middlewares: 该网关API的中间件
  61. // 返回值: 无
  62. func (builder *Builder) GetRoute(relativePath string, handler Handler, middlewares ...Handler) {
  63. builder.AddRoute(http.MethodGet, relativePath, handler, middlewares...)
  64. }
  65. // PostRouteWithTenantIDAndUserID 创建POST网关API,请求Body是JsonBody,且会添加租户ID和用户ID字段,字段名分别为tenantId和userId
  66. // 参数:
  67. // - relativePath: 该网关API的相对URL
  68. // - handler: 该网关API处理函数
  69. // - middlewares: 该网关API的中间件
  70. // 返回值: 无
  71. func (builder *Builder) PostRouteWithTenantIDAndUserID(relativePath string, handler Handler, middlewares ...Handler) {
  72. builder.AddRouteWithTenantIDAndUserID(http.MethodPost, relativePath, "tenantId", "userId", handler, middlewares...)
  73. }
  74. // PostRouteWithTenantIDAndCreateUserID 创建POST网关API,请求Body是JsonBody,且会添加租户ID和用户ID字段,字段名分别为tenantId和createUserId
  75. // 参数:
  76. // - relativePath: 该网关API的相对URL
  77. // - handler: 该网关API处理函数
  78. // - middlewares: 该网关API的中间件
  79. // 返回值: 无
  80. func (builder *Builder) PostRouteWithTenantIDAndCreateUserID(relativePath string, handler Handler, middlewares ...Handler) {
  81. builder.AddRouteWithTenantIDAndUserID(http.MethodPost, relativePath, "tenantId", "createUserId", handler, middlewares...)
  82. }
  83. // DeleteRouteWithTenantIDAndUserID 创建DELETE网关API,会在查询参数添加租户ID和用户ID字段,字段名分别为tenantId和userId
  84. // 参数:
  85. // - relativePath: 该网关API的相对URL
  86. // - handler: 该网关API处理函数
  87. // - middlewares: 该网关API的中间件
  88. // 返回值: 无
  89. func (builder *Builder) DeleteRouteWithTenantIDAndUserID(relativePath string, handler Handler, middlewares ...Handler) {
  90. builder.AddRouteWithTenantIDAndUserID(http.MethodDelete, relativePath, "tenantId", "userId", handler, middlewares...)
  91. }
  92. // DeleteRouteWithTenantIDAndDeleteUserID 创建DELETE网关API,会在查询参数添加租户ID和用户ID字段,字段名分别为tenantId和deleteUserId
  93. // 参数:
  94. // - relativePath: 该网关API的相对URL
  95. // - handler: 该网关API处理函数
  96. // - middlewares: 该网关API的中间件
  97. // 返回值: 无
  98. func (builder *Builder) DeleteRouteWithTenantIDAndDeleteUserID(relativePath string, handler Handler, middlewares ...Handler) {
  99. builder.AddRouteWithTenantIDAndUserID(http.MethodDelete, relativePath, "tenantId", "deleteUserId", handler, middlewares...)
  100. }
  101. // PutRouteWithTenantIDAndUserID 创建PUT网关API,请求Body是JsonBody,且会添加租户ID和用户ID字段,字段名分别为tenantId和userId
  102. // 参数:
  103. // - relativePath: 该网关API的相对URL
  104. // - handler: 该网关API处理函数
  105. // - middlewares: 该网关API的中间件
  106. // 返回值: 无
  107. func (builder *Builder) PutRouteWithTenantIDAndUserID(relativePath string, handler Handler, middlewares ...Handler) {
  108. builder.AddRouteWithTenantIDAndUserID(http.MethodPut, relativePath, "tenantId", "userId", handler, middlewares...)
  109. }
  110. // PutRouteWithTenantIDAndUpdateUserID 创建PUT网关API,请求Body是JsonBody,且会添加租户ID和用户ID字段,字段名分别为tenantId和updateUserId
  111. // 参数:
  112. // - relativePath: 该网关API的相对URL
  113. // - handler: 该网关API处理函数
  114. // - middlewares: 该网关API的中间件
  115. // 返回值: 无
  116. func (builder *Builder) PutRouteWithTenantIDAndUpdateUserID(relativePath string, handler Handler, middlewares ...Handler) {
  117. builder.AddRouteWithTenantIDAndUserID(http.MethodPut, relativePath, "tenantId", "updateUserId", handler, middlewares...)
  118. }
  119. // GetRouteWithTenantIDAndUserID 创建GET网关API,会在查询参数添加租户ID和用户ID字段,字段名分别为tenantId和userId
  120. // 参数:
  121. // - relativePath: 该网关API的相对URL
  122. // - handler: 该网关API处理函数
  123. // - middlewares: 该网关API的中间件
  124. // 返回值: 无
  125. func (builder *Builder) GetRouteWithTenantIDAndUserID(relativePath string, handler Handler, middlewares ...Handler) {
  126. builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, "tenantId", "userId", handler, middlewares...)
  127. }
  128. // PostRouteWithTenantID 创建POST网关API,请求Body是JsonBody,且会添加租户ID字段,字段名分别为tenantId
  129. // 参数:
  130. // - relativePath: 该网关API的相对URL
  131. // - handler: 该网关API处理函数
  132. // - middlewares: 该网关API的中间件
  133. // 返回值: 无
  134. func (builder *Builder) PostRouteWithTenantID(relativePath string, handler Handler, middlewares ...Handler) {
  135. builder.AddRouteWithTenantIDAndUserID(http.MethodPost, relativePath, "tenantId", "", handler, middlewares...)
  136. }
  137. // DeleteRouteWithTenantID 创建DELETE网关API,会在查询参数添加租户ID字段,字段名分别为tenantId
  138. // 参数:
  139. // - relativePath: 该网关API的相对URL
  140. // - handler: 该网关API处理函数
  141. // - middlewares: 该网关API的中间件
  142. // 返回值: 无
  143. func (builder *Builder) DeleteRouteWithTenantID(relativePath string, handler Handler, middlewares ...Handler) {
  144. builder.AddRouteWithTenantIDAndUserID(http.MethodDelete, relativePath, "tenantId", "", handler, middlewares...)
  145. }
  146. // PutRouteWithTenantID 创建PUT网关API,请求Body是JsonBody,且会添加租户ID字段,字段名分别为tenantId
  147. // 参数:
  148. // - relativePath: 该网关API的相对URL
  149. // - handler: 该网关API处理函数
  150. // - middlewares: 该网关API的中间件
  151. // 返回值: 无
  152. func (builder *Builder) PutRouteWithTenantID(relativePath string, handler Handler, middlewares ...Handler) {
  153. builder.AddRouteWithTenantIDAndUserID(http.MethodPut, relativePath, "tenantId", "", handler, middlewares...)
  154. }
  155. // GetRouteWithTenantID 创建GET网关API,会在查询参数添加租户ID字段,字段名分别为tenantId
  156. // 参数:
  157. // - relativePath: 该网关API的相对URL
  158. // - handler: 该网关API处理函数
  159. // - middlewares: 该网关API的中间件
  160. // 返回值: 无
  161. func (builder *Builder) GetRouteWithTenantID(relativePath string, handler Handler, middlewares ...Handler) {
  162. builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, "tenantId", "", handler, middlewares...)
  163. }
  164. // PostRouteWithUserID 创建POST网关API,请求Body是JsonBody,且会添加用户ID字段,字段名分别为userId
  165. // 参数:
  166. // - relativePath: 该网关API的相对URL
  167. // - handler: 该网关API处理函数
  168. // - middlewares: 该网关API的中间件
  169. // 返回值: 无
  170. func (builder *Builder) PostRouteWithUserID(relativePath string, handler Handler, middlewares ...Handler) {
  171. builder.AddRouteWithTenantIDAndUserID(http.MethodPost, relativePath, "", "userId", handler, middlewares...)
  172. }
  173. // PostRouteWithCreateUserID 创建POST网关API,请求Body是JsonBody,且会添加用户ID字段,字段名分别为createUserId
  174. // 参数:
  175. // - relativePath: 该网关API的相对URL
  176. // - handler: 该网关API处理函数
  177. // - middlewares: 该网关API的中间件
  178. // 返回值: 无
  179. func (builder *Builder) PostRouteWithCreateUserID(relativePath string, handler Handler, middlewares ...Handler) {
  180. builder.AddRouteWithTenantIDAndUserID(http.MethodPost, relativePath, "", "createUserId", handler, middlewares...)
  181. }
  182. // DeleteRouteWithUserID 创建DELETE网关API,会在查询参数添加用户ID字段,字段名分别为userId
  183. // 参数:
  184. // - relativePath: 该网关API的相对URL
  185. // - handler: 该网关API处理函数
  186. // - middlewares: 该网关API的中间件
  187. // 返回值: 无
  188. func (builder *Builder) DeleteRouteWithUserID(relativePath string, handler Handler, middlewares ...Handler) {
  189. builder.AddRouteWithTenantIDAndUserID(http.MethodDelete, relativePath, "", "userId", handler, middlewares...)
  190. }
  191. // DeleteRouteWithDeleteUserID 创建DELETE网关API,会在查询参数添加用户ID字段,字段名分别为deleteUserId
  192. // 参数:
  193. // - relativePath: 该网关API的相对URL
  194. // - handler: 该网关API处理函数
  195. // - middlewares: 该网关API的中间件
  196. // 返回值: 无
  197. func (builder *Builder) DeleteRouteWithDeleteUserID(relativePath string, handler Handler, middlewares ...Handler) {
  198. builder.AddRouteWithTenantIDAndUserID(http.MethodDelete, relativePath, "", "deleteUserId", handler, middlewares...)
  199. }
  200. // PutRouteWithUserID 创建PUT网关API,请求Body是JsonBody,且会添加用户ID字段,字段名分别为userId
  201. // 参数:
  202. // - relativePath: 该网关API的相对URL
  203. // - handler: 该网关API处理函数
  204. // - middlewares: 该网关API的中间件
  205. // 返回值: 无
  206. func (builder *Builder) PutRouteWithUserID(relativePath string, handler Handler, middlewares ...Handler) {
  207. builder.AddRouteWithTenantIDAndUserID(http.MethodPut, relativePath, "", "userId", handler, middlewares...)
  208. }
  209. // PutRouteWithUpdateUserID 创建PUT网关API,请求Body是JsonBody,且会添加用户ID字段,字段名分别为updateUserId
  210. // 参数:
  211. // - relativePath: 该网关API的相对URL
  212. // - handler: 该网关API处理函数
  213. // - middlewares: 该网关API的中间件
  214. // 返回值: 无
  215. func (builder *Builder) PutRouteWithUpdateUserID(relativePath string, handler Handler, middlewares ...Handler) {
  216. builder.AddRouteWithTenantIDAndUserID(http.MethodPut, relativePath, "", "updateUserId", handler, middlewares...)
  217. }
  218. // GetRouteWithUserID 创建GET网关API,会在查询参数添加用户ID字段,字段名分别为userId
  219. // 参数:
  220. // - relativePath: 该网关API的相对URL
  221. // - handler: 该网关API处理函数
  222. // - middlewares: 该网关API的中间件
  223. // 返回值: 无
  224. func (builder *Builder) GetRouteWithUserID(relativePath string, handler Handler, middlewares ...Handler) {
  225. builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, "", "userId", handler, middlewares...)
  226. }
  227. // PostRouteWithTenantIDAndUserIDCommon 创建POST网关API,请求Body是JsonBody,且会添加租户ID和用户ID字段,字段名由调用者指定
  228. // 参数:
  229. // - relativePath: 该网关API的相对URL
  230. // - tenantIDField: 租户ID字段名
  231. // - userIDField: 用户ID字段名
  232. // - handler: 该网关API处理函数
  233. // - middlewares: 该网关API的中间件
  234. // 返回值: 无
  235. func (builder *Builder) PostRouteWithTenantIDAndUserIDCommon(relativePath string, tenantIDField string, userIDField string, handler Handler, middlewares ...Handler) {
  236. builder.AddRouteWithTenantIDAndUserID(http.MethodPost, relativePath, tenantIDField, userIDField, handler, middlewares...)
  237. }
  238. // DeleteRouteWithTenantIDAndUserIDCommon 创建DELETE网关API,会在查询参数添加租户ID和用户ID字段,字段名由调用者指定
  239. // 参数:
  240. // - relativePath: 该网关API的相对URL
  241. // - tenantIDField: 租户ID字段名
  242. // - userIDField: 用户ID字段名
  243. // - handler: 该网关API处理函数
  244. // - middlewares: 该网关API的中间件
  245. // 返回值: 无
  246. func (builder *Builder) DeleteRouteWithTenantIDAndUserIDCommon(relativePath string, tenantIDField string, userIDField string, handler Handler, middlewares ...Handler) {
  247. builder.AddRouteWithTenantIDAndUserID(http.MethodDelete, relativePath, tenantIDField, userIDField, handler, middlewares...)
  248. }
  249. // PutRouteWithTenantIDAndUserIDCommon 创建PUT网关API,请求Body是JsonBody,且会添加租户ID和用户ID字段,字段名由调用者指定
  250. // 参数:
  251. // - relativePath: 该网关API的相对URL
  252. // - tenantIDField: 租户ID字段名
  253. // - userIDField: 用户ID字段名
  254. // - handler: 该网关API处理函数
  255. // - middlewares: 该网关API的中间件
  256. // 返回值: 无
  257. func (builder *Builder) PutRouteWithTenantIDAndUserIDCommon(relativePath string, tenantIDField string, userIDField string, handler Handler, middlewares ...Handler) {
  258. builder.AddRouteWithTenantIDAndUserID(http.MethodPut, relativePath, tenantIDField, userIDField, handler, middlewares...)
  259. }
  260. // GetRouteWithTenantIDAndUserIDCommon 创建GET网关API,会在查询参数添加租户ID和用户ID字段,字段名由调用者指定
  261. // 参数:
  262. // - relativePath: 该网关API的相对URL
  263. // - tenantIDField: 租户ID字段名
  264. // - userIDField: 用户ID字段名
  265. // - handler: 该网关API处理函数
  266. // - middlewares: 该网关API的中间件
  267. // 返回值: 无
  268. func (builder *Builder) GetRouteWithTenantIDAndUserIDCommon(relativePath string, tenantIDField string, userIDField string, handler Handler, middlewares ...Handler) {
  269. builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, tenantIDField, userIDField, handler, middlewares...)
  270. }
  271. // PostRouteWithTenantIDCommon 创建POST网关API,请求Body是JsonBody,且会添加租户ID字段,字段名由调用者指定
  272. // 参数:
  273. // - relativePath: 该网关API的相对URL
  274. // - tenantIDField: 租户ID字段名
  275. // - handler: 该网关API处理函数
  276. // - middlewares: 该网关API的中间件
  277. // 返回值: 无
  278. func (builder *Builder) PostRouteWithTenantIDCommon(relativePath string, tenantIDField string, handler Handler, middlewares ...Handler) {
  279. builder.AddRouteWithTenantIDAndUserID(http.MethodPost, relativePath, tenantIDField, "", handler, middlewares...)
  280. }
  281. // DeleteRouteWithTenantIDCommon 创建DELETE网关API,会在查询参数添加租户ID字段,字段名由调用者指定
  282. // 参数:
  283. // - relativePath: 该网关API的相对URL
  284. // - tenantIDField: 租户ID字段名
  285. // - handler: 该网关API处理函数
  286. // - middlewares: 该网关API的中间件
  287. // 返回值: 无
  288. func (builder *Builder) DeleteRouteWithTenantIDCommon(relativePath string, tenantIDField string, handler Handler, middlewares ...Handler) {
  289. builder.AddRouteWithTenantIDAndUserID(http.MethodDelete, relativePath, tenantIDField, "", handler, middlewares...)
  290. }
  291. // PutRouteWithTenantIDCommon 创建PUT网关API,请求Body是JsonBody,且会添加租户ID字段,字段名由调用者指定
  292. // 参数:
  293. // - relativePath: 该网关API的相对URL
  294. // - tenantIDField: 租户ID字段名
  295. // - handler: 该网关API处理函数
  296. // - middlewares: 该网关API的中间件
  297. // 返回值: 无
  298. func (builder *Builder) PutRouteWithTenantIDCommon(relativePath string, tenantIDField string, handler Handler, middlewares ...Handler) {
  299. builder.AddRouteWithTenantIDAndUserID(http.MethodPut, relativePath, tenantIDField, "", handler, middlewares...)
  300. }
  301. // GetRouteWithTenantIDCommon 创建GET网关API,会在查询参数添加租户ID字段,字段名由调用者指定
  302. // 参数:
  303. // - relativePath: 该网关API的相对URL
  304. // - tenantIDField: 租户ID字段名
  305. // - handler: 该网关API处理函数
  306. // - middlewares: 该网关API的中间件
  307. // 返回值: 无
  308. func (builder *Builder) GetRouteWithTenantIDCommon(relativePath string, tenantIDField string, handler Handler, middlewares ...Handler) {
  309. builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, tenantIDField, "", handler, middlewares...)
  310. }
  311. // PostRouteWithUserIDCommon 创建POST网关API,请求Body是JsonBody,且会添加用户ID字段,字段名由调用者指定
  312. // 参数:
  313. // - relativePath: 该网关API的相对URL
  314. // - userIDField: 用户ID字段名
  315. // - handler: 该网关API处理函数
  316. // - middlewares: 该网关API的中间件
  317. // 返回值: 无
  318. func (builder *Builder) PostRouteWithUserIDCommon(relativePath string, userIDField string, handler Handler, middlewares ...Handler) {
  319. builder.AddRouteWithTenantIDAndUserID(http.MethodPost, relativePath, "", userIDField, handler, middlewares...)
  320. }
  321. // DeleteRouteWithUserIDCommon 创建DELETE网关API,会在查询参数添加用户ID字段,字段名由调用者指定
  322. // 参数:
  323. // - relativePath: 该网关API的相对URL
  324. // - userIDField: 用户ID字段名
  325. // - handler: 该网关API处理函数
  326. // - middlewares: 该网关API的中间件
  327. // 返回值: 无
  328. func (builder *Builder) DeleteRouteWithUserIDCommon(relativePath string, userIDField string, handler Handler, middlewares ...Handler) {
  329. builder.AddRouteWithTenantIDAndUserID(http.MethodDelete, relativePath, "", userIDField, handler, middlewares...)
  330. }
  331. // PutRouteWithUserIDCommon 创建PUT网关API,请求Body是JsonBody,且会添加用户ID字段,字段名由调用者指定
  332. // 参数:
  333. // - relativePath: 该网关API的相对URL
  334. // - userIDField: 用户ID字段名
  335. // - handler: 该网关API处理函数
  336. // - middlewares: 该网关API的中间件
  337. // 返回值: 无
  338. func (builder *Builder) PutRouteWithUserIDCommon(relativePath string, userIDField string, handler Handler, middlewares ...Handler) {
  339. builder.AddRouteWithTenantIDAndUserID(http.MethodPut, relativePath, "", userIDField, handler, middlewares...)
  340. }
  341. // GetRouteWithUserIDCommon 创建GET网关API,会在查询参数添加用户ID字段,字段名由调用者指定
  342. // 参数:
  343. // - relativePath: 该网关API的相对URL
  344. // - userIDField: 用户ID字段名
  345. // - handler: 该网关API处理函数
  346. // - middlewares: 该网关API的中间件
  347. // 返回值: 无
  348. func (builder *Builder) GetRouteWithUserIDCommon(relativePath string, userIDField string, handler Handler, middlewares ...Handler) {
  349. builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, "", userIDField, handler, middlewares...)
  350. }
  351. // AddRoute 通用添加API函数
  352. // 参数:
  353. // - httpMethod: HTTP方法
  354. // - relativePath: 该网关API的相对URL
  355. // - handler: 该网关API处理函数
  356. // - middlewares: 该网关API的中间件
  357. // 返回值: 无
  358. func (builder *Builder) AddRoute(httpMethod string, relativePath string, handler Handler, middlewares ...Handler) {
  359. apiHandlers := make([]api.Handler, len(middlewares)+1)
  360. apiHandlers[0] = builder.formApiHandler(handler)
  361. for i, middleware := range middlewares {
  362. apiHandlers[i+1] = builder.formApiHandler(middleware)
  363. }
  364. builder.router.AddRoute(httpMethod, relativePath, apiHandlers...)
  365. }
  366. // AddRouteWithTenantIDAndUserID 通用添加API函数,会在请求参数(POST和PUT是JsonBody,GET和DELETE是查询参数)添加租户ID和用户ID字段,字段名由调用者指定
  367. // 参数:
  368. // - httpMethod: HTTP方法
  369. // - relativePath: 该网关API的相对URL
  370. // - tenantIDField: 租户ID字段名
  371. // - userIDField: 用户ID字段名
  372. // - handler: 该网关API处理函数
  373. // - middlewares: 该网关API的中间件
  374. // 返回值: 无
  375. func (builder *Builder) AddRouteWithTenantIDAndUserID(httpMethod string, relativePath string, tenantIDField string, userIDField string, handler Handler, middlewares ...Handler) {
  376. apiHandlers := make([]api.Handler, len(middlewares)+1)
  377. apiHandlers[0] = builder.formApiHandlerWithTenantIDAndUserID(httpMethod, tenantIDField, userIDField, handler)
  378. for i, middleware := range middlewares {
  379. apiHandlers[i+1] = builder.formApiHandlerWithTenantIDAndUserID(httpMethod, tenantIDField, userIDField, middleware)
  380. }
  381. builder.router.AddRoute(httpMethod, relativePath, apiHandlers...)
  382. }
  383. func (builder *Builder) formApiHandler(handler Handler) api.Handler {
  384. return func(c *api.Context) {
  385. httpRequest := builder.httpClient.NewRequest(http_client.WithNewRequestTimeout(time.Duration(builder.httpTimeoutSec) * time.Second))
  386. requestBuilder := newRequestBuilder(c, httpRequest)
  387. handler(requestBuilder)
  388. }
  389. }
  390. func (builder *Builder) formApiHandlerWithTenantIDAndUserID(httpMethod string, tenantIDParamsName string, userIDParamsName string, handler Handler) api.Handler {
  391. return func(c *api.Context) {
  392. httpRequest := builder.httpClient.NewRequest(http_client.WithNewRequestTimeout(time.Duration(builder.httpTimeoutSec) * time.Second))
  393. requestBuilder := newRequestBuilder(c, httpRequest)
  394. switch httpMethod {
  395. case http.MethodPost, http.MethodPut:
  396. err := AddJsonBodyTenantIDAndUserID(requestBuilder, tenantIDParamsName, userIDParamsName)
  397. if err != nil {
  398. panic(err)
  399. }
  400. case http.MethodDelete, http.MethodGet:
  401. err := AddQueryParamsTenantIDAndUserID(requestBuilder, tenantIDParamsName, userIDParamsName)
  402. if err != nil {
  403. panic(err)
  404. }
  405. default:
  406. panic("不支持的http方法s")
  407. }
  408. handler(requestBuilder)
  409. }
  410. }