builder.go 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521
  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. // GetRouteWithTenantIDAndCreateUserID 创建GET网关API,会在查询参数添加租户ID和用户ID字段,字段名分别为tenantId和createUserId
  129. // 参数:
  130. // - relativePath: 该网关API的相对URL
  131. // - handler: 该网关API处理函数
  132. // - middlewares: 该网关API的中间件
  133. // 返回值: 无
  134. func (builder *Builder) GetRouteWithTenantIDAndCreateUserID(relativePath string, handler Handler, middlewares ...Handler) {
  135. builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, "tenantId", "createUserId", handler, middlewares...)
  136. }
  137. // GetRouteWithTenantIDAndDeleteUserID 创建GET网关API,会在查询参数添加租户ID和用户ID字段,字段名分别为tenantId和deleteUserId
  138. // 参数:
  139. // - relativePath: 该网关API的相对URL
  140. // - handler: 该网关API处理函数
  141. // - middlewares: 该网关API的中间件
  142. // 返回值: 无
  143. func (builder *Builder) GetRouteWithTenantIDAndDeleteUserID(relativePath string, handler Handler, middlewares ...Handler) {
  144. builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, "tenantId", "deleteUserId", handler, middlewares...)
  145. }
  146. // GetRouteWithTenantIDAndUpdateUserID 创建GET网关API,会在查询参数添加租户ID和用户ID字段,字段名分别为tenantId和updateUserId
  147. // 参数:
  148. // - relativePath: 该网关API的相对URL
  149. // - handler: 该网关API处理函数
  150. // - middlewares: 该网关API的中间件
  151. // 返回值: 无
  152. func (builder *Builder) GetRouteWithTenantIDAndUpdateUserID(relativePath string, handler Handler, middlewares ...Handler) {
  153. builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, "tenantId", "updateUserId", handler, middlewares...)
  154. }
  155. // PostRouteWithTenantID 创建POST网关API,请求Body是JsonBody,且会添加租户ID字段,字段名分别为tenantId
  156. // 参数:
  157. // - relativePath: 该网关API的相对URL
  158. // - handler: 该网关API处理函数
  159. // - middlewares: 该网关API的中间件
  160. // 返回值: 无
  161. func (builder *Builder) PostRouteWithTenantID(relativePath string, handler Handler, middlewares ...Handler) {
  162. builder.AddRouteWithTenantIDAndUserID(http.MethodPost, relativePath, "tenantId", "", handler, middlewares...)
  163. }
  164. // DeleteRouteWithTenantID 创建DELETE网关API,会在查询参数添加租户ID字段,字段名分别为tenantId
  165. // 参数:
  166. // - relativePath: 该网关API的相对URL
  167. // - handler: 该网关API处理函数
  168. // - middlewares: 该网关API的中间件
  169. // 返回值: 无
  170. func (builder *Builder) DeleteRouteWithTenantID(relativePath string, handler Handler, middlewares ...Handler) {
  171. builder.AddRouteWithTenantIDAndUserID(http.MethodDelete, relativePath, "tenantId", "", handler, middlewares...)
  172. }
  173. // PutRouteWithTenantID 创建PUT网关API,请求Body是JsonBody,且会添加租户ID字段,字段名分别为tenantId
  174. // 参数:
  175. // - relativePath: 该网关API的相对URL
  176. // - handler: 该网关API处理函数
  177. // - middlewares: 该网关API的中间件
  178. // 返回值: 无
  179. func (builder *Builder) PutRouteWithTenantID(relativePath string, handler Handler, middlewares ...Handler) {
  180. builder.AddRouteWithTenantIDAndUserID(http.MethodPut, relativePath, "tenantId", "", handler, middlewares...)
  181. }
  182. // GetRouteWithTenantID 创建GET网关API,会在查询参数添加租户ID字段,字段名分别为tenantId
  183. // 参数:
  184. // - relativePath: 该网关API的相对URL
  185. // - handler: 该网关API处理函数
  186. // - middlewares: 该网关API的中间件
  187. // 返回值: 无
  188. func (builder *Builder) GetRouteWithTenantID(relativePath string, handler Handler, middlewares ...Handler) {
  189. builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, "tenantId", "", handler, middlewares...)
  190. }
  191. // PostRouteWithUserID 创建POST网关API,请求Body是JsonBody,且会添加用户ID字段,字段名分别为userId
  192. // 参数:
  193. // - relativePath: 该网关API的相对URL
  194. // - handler: 该网关API处理函数
  195. // - middlewares: 该网关API的中间件
  196. // 返回值: 无
  197. func (builder *Builder) PostRouteWithUserID(relativePath string, handler Handler, middlewares ...Handler) {
  198. builder.AddRouteWithTenantIDAndUserID(http.MethodPost, relativePath, "", "userId", handler, middlewares...)
  199. }
  200. // PostRouteWithCreateUserID 创建POST网关API,请求Body是JsonBody,且会添加用户ID字段,字段名分别为createUserId
  201. // 参数:
  202. // - relativePath: 该网关API的相对URL
  203. // - handler: 该网关API处理函数
  204. // - middlewares: 该网关API的中间件
  205. // 返回值: 无
  206. func (builder *Builder) PostRouteWithCreateUserID(relativePath string, handler Handler, middlewares ...Handler) {
  207. builder.AddRouteWithTenantIDAndUserID(http.MethodPost, relativePath, "", "createUserId", handler, middlewares...)
  208. }
  209. // DeleteRouteWithUserID 创建DELETE网关API,会在查询参数添加用户ID字段,字段名分别为userId
  210. // 参数:
  211. // - relativePath: 该网关API的相对URL
  212. // - handler: 该网关API处理函数
  213. // - middlewares: 该网关API的中间件
  214. // 返回值: 无
  215. func (builder *Builder) DeleteRouteWithUserID(relativePath string, handler Handler, middlewares ...Handler) {
  216. builder.AddRouteWithTenantIDAndUserID(http.MethodDelete, relativePath, "", "userId", handler, middlewares...)
  217. }
  218. // DeleteRouteWithDeleteUserID 创建DELETE网关API,会在查询参数添加用户ID字段,字段名分别为deleteUserId
  219. // 参数:
  220. // - relativePath: 该网关API的相对URL
  221. // - handler: 该网关API处理函数
  222. // - middlewares: 该网关API的中间件
  223. // 返回值: 无
  224. func (builder *Builder) DeleteRouteWithDeleteUserID(relativePath string, handler Handler, middlewares ...Handler) {
  225. builder.AddRouteWithTenantIDAndUserID(http.MethodDelete, relativePath, "", "deleteUserId", handler, middlewares...)
  226. }
  227. // PutRouteWithUserID 创建PUT网关API,请求Body是JsonBody,且会添加用户ID字段,字段名分别为userId
  228. // 参数:
  229. // - relativePath: 该网关API的相对URL
  230. // - handler: 该网关API处理函数
  231. // - middlewares: 该网关API的中间件
  232. // 返回值: 无
  233. func (builder *Builder) PutRouteWithUserID(relativePath string, handler Handler, middlewares ...Handler) {
  234. builder.AddRouteWithTenantIDAndUserID(http.MethodPut, relativePath, "", "userId", handler, middlewares...)
  235. }
  236. // PutRouteWithUpdateUserID 创建PUT网关API,请求Body是JsonBody,且会添加用户ID字段,字段名分别为updateUserId
  237. // 参数:
  238. // - relativePath: 该网关API的相对URL
  239. // - handler: 该网关API处理函数
  240. // - middlewares: 该网关API的中间件
  241. // 返回值: 无
  242. func (builder *Builder) PutRouteWithUpdateUserID(relativePath string, handler Handler, middlewares ...Handler) {
  243. builder.AddRouteWithTenantIDAndUserID(http.MethodPut, relativePath, "", "updateUserId", handler, middlewares...)
  244. }
  245. // GetRouteWithUserID 创建GET网关API,会在查询参数添加用户ID字段,字段名分别为userId
  246. // 参数:
  247. // - relativePath: 该网关API的相对URL
  248. // - handler: 该网关API处理函数
  249. // - middlewares: 该网关API的中间件
  250. // 返回值: 无
  251. func (builder *Builder) GetRouteWithUserID(relativePath string, handler Handler, middlewares ...Handler) {
  252. builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, "", "userId", handler, middlewares...)
  253. }
  254. // GetRouteWithCreateUserID 创建GET网关API,会在查询参数添加用户ID字段,字段名分别为createUserId
  255. // 参数:
  256. // - relativePath: 该网关API的相对URL
  257. // - handler: 该网关API处理函数
  258. // - middlewares: 该网关API的中间件
  259. // 返回值: 无
  260. func (builder *Builder) GetRouteWithCreateUserID(relativePath string, handler Handler, middlewares ...Handler) {
  261. builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, "", "createUserId", handler, middlewares...)
  262. }
  263. // GetRouteWithDeleteUserID 创建GET网关API,会在查询参数添加用户ID字段,字段名分别为deleteUserId
  264. // 参数:
  265. // - relativePath: 该网关API的相对URL
  266. // - handler: 该网关API处理函数
  267. // - middlewares: 该网关API的中间件
  268. // 返回值: 无
  269. func (builder *Builder) GetRouteWithDeleteUserID(relativePath string, handler Handler, middlewares ...Handler) {
  270. builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, "", "deleteUserId", handler, middlewares...)
  271. }
  272. // GetRouteWithUpdateUserID 创建GET网关API,会在查询参数添加用户ID字段,字段名分别为updateUserId
  273. // 参数:
  274. // - relativePath: 该网关API的相对URL
  275. // - handler: 该网关API处理函数
  276. // - middlewares: 该网关API的中间件
  277. // 返回值: 无
  278. func (builder *Builder) GetRouteWithUpdateUserID(relativePath string, handler Handler, middlewares ...Handler) {
  279. builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, "", "updateUserId", handler, middlewares...)
  280. }
  281. // PostRouteWithTenantIDAndUserIDCommon 创建POST网关API,请求Body是JsonBody,且会添加租户ID和用户ID字段,字段名由调用者指定
  282. // 参数:
  283. // - relativePath: 该网关API的相对URL
  284. // - tenantIDField: 租户ID字段名
  285. // - userIDField: 用户ID字段名
  286. // - handler: 该网关API处理函数
  287. // - middlewares: 该网关API的中间件
  288. // 返回值: 无
  289. func (builder *Builder) PostRouteWithTenantIDAndUserIDCommon(relativePath string, tenantIDField string, userIDField string, handler Handler, middlewares ...Handler) {
  290. builder.AddRouteWithTenantIDAndUserID(http.MethodPost, relativePath, tenantIDField, userIDField, handler, middlewares...)
  291. }
  292. // DeleteRouteWithTenantIDAndUserIDCommon 创建DELETE网关API,会在查询参数添加租户ID和用户ID字段,字段名由调用者指定
  293. // 参数:
  294. // - relativePath: 该网关API的相对URL
  295. // - tenantIDField: 租户ID字段名
  296. // - userIDField: 用户ID字段名
  297. // - handler: 该网关API处理函数
  298. // - middlewares: 该网关API的中间件
  299. // 返回值: 无
  300. func (builder *Builder) DeleteRouteWithTenantIDAndUserIDCommon(relativePath string, tenantIDField string, userIDField string, handler Handler, middlewares ...Handler) {
  301. builder.AddRouteWithTenantIDAndUserID(http.MethodDelete, relativePath, tenantIDField, userIDField, handler, middlewares...)
  302. }
  303. // PutRouteWithTenantIDAndUserIDCommon 创建PUT网关API,请求Body是JsonBody,且会添加租户ID和用户ID字段,字段名由调用者指定
  304. // 参数:
  305. // - relativePath: 该网关API的相对URL
  306. // - tenantIDField: 租户ID字段名
  307. // - userIDField: 用户ID字段名
  308. // - handler: 该网关API处理函数
  309. // - middlewares: 该网关API的中间件
  310. // 返回值: 无
  311. func (builder *Builder) PutRouteWithTenantIDAndUserIDCommon(relativePath string, tenantIDField string, userIDField string, handler Handler, middlewares ...Handler) {
  312. builder.AddRouteWithTenantIDAndUserID(http.MethodPut, relativePath, tenantIDField, userIDField, handler, middlewares...)
  313. }
  314. // GetRouteWithTenantIDAndUserIDCommon 创建GET网关API,会在查询参数添加租户ID和用户ID字段,字段名由调用者指定
  315. // 参数:
  316. // - relativePath: 该网关API的相对URL
  317. // - tenantIDField: 租户ID字段名
  318. // - userIDField: 用户ID字段名
  319. // - handler: 该网关API处理函数
  320. // - middlewares: 该网关API的中间件
  321. // 返回值: 无
  322. func (builder *Builder) GetRouteWithTenantIDAndUserIDCommon(relativePath string, tenantIDField string, userIDField string, handler Handler, middlewares ...Handler) {
  323. builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, tenantIDField, userIDField, handler, middlewares...)
  324. }
  325. // PostRouteWithTenantIDCommon 创建POST网关API,请求Body是JsonBody,且会添加租户ID字段,字段名由调用者指定
  326. // 参数:
  327. // - relativePath: 该网关API的相对URL
  328. // - tenantIDField: 租户ID字段名
  329. // - handler: 该网关API处理函数
  330. // - middlewares: 该网关API的中间件
  331. // 返回值: 无
  332. func (builder *Builder) PostRouteWithTenantIDCommon(relativePath string, tenantIDField string, handler Handler, middlewares ...Handler) {
  333. builder.AddRouteWithTenantIDAndUserID(http.MethodPost, relativePath, tenantIDField, "", handler, middlewares...)
  334. }
  335. // DeleteRouteWithTenantIDCommon 创建DELETE网关API,会在查询参数添加租户ID字段,字段名由调用者指定
  336. // 参数:
  337. // - relativePath: 该网关API的相对URL
  338. // - tenantIDField: 租户ID字段名
  339. // - handler: 该网关API处理函数
  340. // - middlewares: 该网关API的中间件
  341. // 返回值: 无
  342. func (builder *Builder) DeleteRouteWithTenantIDCommon(relativePath string, tenantIDField string, handler Handler, middlewares ...Handler) {
  343. builder.AddRouteWithTenantIDAndUserID(http.MethodDelete, relativePath, tenantIDField, "", handler, middlewares...)
  344. }
  345. // PutRouteWithTenantIDCommon 创建PUT网关API,请求Body是JsonBody,且会添加租户ID字段,字段名由调用者指定
  346. // 参数:
  347. // - relativePath: 该网关API的相对URL
  348. // - tenantIDField: 租户ID字段名
  349. // - handler: 该网关API处理函数
  350. // - middlewares: 该网关API的中间件
  351. // 返回值: 无
  352. func (builder *Builder) PutRouteWithTenantIDCommon(relativePath string, tenantIDField string, handler Handler, middlewares ...Handler) {
  353. builder.AddRouteWithTenantIDAndUserID(http.MethodPut, relativePath, tenantIDField, "", handler, middlewares...)
  354. }
  355. // GetRouteWithTenantIDCommon 创建GET网关API,会在查询参数添加租户ID字段,字段名由调用者指定
  356. // 参数:
  357. // - relativePath: 该网关API的相对URL
  358. // - tenantIDField: 租户ID字段名
  359. // - handler: 该网关API处理函数
  360. // - middlewares: 该网关API的中间件
  361. // 返回值: 无
  362. func (builder *Builder) GetRouteWithTenantIDCommon(relativePath string, tenantIDField string, handler Handler, middlewares ...Handler) {
  363. builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, tenantIDField, "", handler, middlewares...)
  364. }
  365. // PostRouteWithUserIDCommon 创建POST网关API,请求Body是JsonBody,且会添加用户ID字段,字段名由调用者指定
  366. // 参数:
  367. // - relativePath: 该网关API的相对URL
  368. // - userIDField: 用户ID字段名
  369. // - handler: 该网关API处理函数
  370. // - middlewares: 该网关API的中间件
  371. // 返回值: 无
  372. func (builder *Builder) PostRouteWithUserIDCommon(relativePath string, userIDField string, handler Handler, middlewares ...Handler) {
  373. builder.AddRouteWithTenantIDAndUserID(http.MethodPost, relativePath, "", userIDField, handler, middlewares...)
  374. }
  375. // DeleteRouteWithUserIDCommon 创建DELETE网关API,会在查询参数添加用户ID字段,字段名由调用者指定
  376. // 参数:
  377. // - relativePath: 该网关API的相对URL
  378. // - userIDField: 用户ID字段名
  379. // - handler: 该网关API处理函数
  380. // - middlewares: 该网关API的中间件
  381. // 返回值: 无
  382. func (builder *Builder) DeleteRouteWithUserIDCommon(relativePath string, userIDField string, handler Handler, middlewares ...Handler) {
  383. builder.AddRouteWithTenantIDAndUserID(http.MethodDelete, relativePath, "", userIDField, handler, middlewares...)
  384. }
  385. // PutRouteWithUserIDCommon 创建PUT网关API,请求Body是JsonBody,且会添加用户ID字段,字段名由调用者指定
  386. // 参数:
  387. // - relativePath: 该网关API的相对URL
  388. // - userIDField: 用户ID字段名
  389. // - handler: 该网关API处理函数
  390. // - middlewares: 该网关API的中间件
  391. // 返回值: 无
  392. func (builder *Builder) PutRouteWithUserIDCommon(relativePath string, userIDField string, handler Handler, middlewares ...Handler) {
  393. builder.AddRouteWithTenantIDAndUserID(http.MethodPut, relativePath, "", userIDField, handler, middlewares...)
  394. }
  395. // GetRouteWithUserIDCommon 创建GET网关API,会在查询参数添加用户ID字段,字段名由调用者指定
  396. // 参数:
  397. // - relativePath: 该网关API的相对URL
  398. // - userIDField: 用户ID字段名
  399. // - handler: 该网关API处理函数
  400. // - middlewares: 该网关API的中间件
  401. // 返回值: 无
  402. func (builder *Builder) GetRouteWithUserIDCommon(relativePath string, userIDField string, handler Handler, middlewares ...Handler) {
  403. builder.AddRouteWithTenantIDAndUserID(http.MethodGet, relativePath, "", userIDField, handler, middlewares...)
  404. }
  405. // AddRoute 通用添加API函数
  406. // 参数:
  407. // - httpMethod: HTTP方法
  408. // - relativePath: 该网关API的相对URL
  409. // - handler: 该网关API处理函数
  410. // - middlewares: 该网关API的中间件
  411. // 返回值: 无
  412. func (builder *Builder) AddRoute(httpMethod string, relativePath string, handler Handler, middlewares ...Handler) {
  413. apiHandlers := make([]api.Handler, len(middlewares)+1)
  414. apiHandlers[0] = builder.formApiHandler(handler)
  415. for i, middleware := range middlewares {
  416. apiHandlers[i+1] = builder.formApiHandler(middleware)
  417. }
  418. builder.router.AddRoute(httpMethod, relativePath, apiHandlers...)
  419. }
  420. // AddRouteWithTenantIDAndUserID 通用添加API函数,会在请求参数(POST和PUT是JsonBody,GET和DELETE是查询参数)添加租户ID和用户ID字段,字段名由调用者指定
  421. // 参数:
  422. // - httpMethod: HTTP方法
  423. // - relativePath: 该网关API的相对URL
  424. // - tenantIDField: 租户ID字段名
  425. // - userIDField: 用户ID字段名
  426. // - handler: 该网关API处理函数
  427. // - middlewares: 该网关API的中间件
  428. // 返回值: 无
  429. func (builder *Builder) AddRouteWithTenantIDAndUserID(httpMethod string, relativePath string, tenantIDField string, userIDField string, handler Handler, middlewares ...Handler) {
  430. apiHandlers := make([]api.Handler, len(middlewares)+1)
  431. apiHandlers[0] = builder.formApiHandlerWithTenantIDAndUserID(httpMethod, tenantIDField, userIDField, handler)
  432. for i, middleware := range middlewares {
  433. apiHandlers[i+1] = builder.formApiHandlerWithTenantIDAndUserID(httpMethod, tenantIDField, userIDField, middleware)
  434. }
  435. builder.router.AddRoute(httpMethod, relativePath, apiHandlers...)
  436. }
  437. func (builder *Builder) formApiHandler(handler Handler) api.Handler {
  438. return func(c *api.Context) {
  439. httpRequest := builder.httpClient.NewRequest(http_client.WithNewRequestTimeout(time.Duration(builder.httpTimeoutSec) * time.Second))
  440. requestBuilder := newRequestBuilder(c, httpRequest)
  441. handler(requestBuilder)
  442. }
  443. }
  444. func (builder *Builder) formApiHandlerWithTenantIDAndUserID(httpMethod string, tenantIDParamsName string, userIDParamsName string, handler Handler) api.Handler {
  445. return func(c *api.Context) {
  446. httpRequest := builder.httpClient.NewRequest(http_client.WithNewRequestTimeout(time.Duration(builder.httpTimeoutSec) * time.Second))
  447. requestBuilder := newRequestBuilder(c, httpRequest)
  448. switch httpMethod {
  449. case http.MethodPost, http.MethodPut:
  450. err := AddJsonBodyTenantIDAndUserID(requestBuilder, tenantIDParamsName, userIDParamsName)
  451. if err != nil {
  452. panic(err)
  453. }
  454. case http.MethodDelete, http.MethodGet:
  455. err := AddQueryParamsTenantIDAndUserID(requestBuilder, tenantIDParamsName, userIDParamsName)
  456. if err != nil {
  457. panic(err)
  458. }
  459. default:
  460. panic("不支持的http方法s")
  461. }
  462. handler(requestBuilder)
  463. }
  464. }