entity_crud.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494
  1. package entity_crud
  2. import (
  3. "git.sxidc.com/go-framework/baize/framework/core/api"
  4. "git.sxidc.com/go-framework/baize/framework/gateway"
  5. "git.sxidc.com/go-tools/utils/http_client"
  6. "git.sxidc.com/go-tools/utils/template"
  7. "github.com/iancoleman/strcase"
  8. "net/http"
  9. )
  10. func BindSimple(builder *gateway.Builder, params *Simple, opts ...any) {
  11. globalOptions := new(GlobalOptions)
  12. createOptions := new(CreateOptions)
  13. deleteOptions := new(DeleteOptions)
  14. updateOptions := new(UpdateOptions)
  15. queryOptions := new(QueryOptions)
  16. getByIDOptions := new(GetByIDOptions)
  17. for _, opt := range opts {
  18. switch o := opt.(type) {
  19. case GlobalOption:
  20. o(globalOptions)
  21. case CreateOption:
  22. o(createOptions)
  23. case DeleteOption:
  24. o(deleteOptions)
  25. case UpdateOption:
  26. o(updateOptions)
  27. case QueryOption:
  28. o(queryOptions)
  29. case GetByIDOption:
  30. o(getByIDOptions)
  31. default:
  32. continue
  33. }
  34. }
  35. params.globalOptions = globalOptions
  36. params.createOptions = createOptions
  37. params.deleteOptions = deleteOptions
  38. params.updateOptions = updateOptions
  39. params.queryOptions = queryOptions
  40. params.getByIDOptions = getByIDOptions
  41. params.bind(builder)
  42. }
  43. type Simple struct {
  44. // 除去后缀的服务URL,如http://localhost:8080/example/api/v1
  45. ServiceVersionedUrl string
  46. // 领域名称
  47. DomainCamelName string
  48. // 可选配置项,通过WithXXX配置
  49. globalOptions *GlobalOptions
  50. createOptions *CreateOptions
  51. deleteOptions *DeleteOptions
  52. updateOptions *UpdateOptions
  53. queryOptions *QueryOptions
  54. getByIDOptions *GetByIDOptions
  55. }
  56. func (simple *Simple) bind(builder *gateway.Builder) {
  57. globalOptions := simple.globalOptions
  58. createOptions := simple.createOptions
  59. deleteOptions := simple.deleteOptions
  60. updateOptions := simple.updateOptions
  61. queryOptions := simple.queryOptions
  62. getByIDOptions := simple.getByIDOptions
  63. domainPath := "/" + strcase.ToLowerCamel(template.Id(simple.DomainCamelName))
  64. // 创建
  65. if !createOptions.disable {
  66. createMiddlewares := append(globalOptions.middlewares, createOptions.middlewares...)
  67. copyBuilder := builder.Url(http.MethodPost, domainPath+"/create")
  68. copyBuilder.
  69. Post(&gateway.PostRequest{
  70. Url: simple.ServiceVersionedUrl + domainPath + "/create",
  71. BodyFormFunc: func(c *api.Context, body any, historyRequests []gateway.BuilderRequest, resultMap map[string]any) (any, error) {
  72. _, err := gateway.FormJsonBodyWithTenantIDAndUserIDFunc("tenantId", "createUserId")(c, body, historyRequests, resultMap)
  73. if err != nil {
  74. return nil, err
  75. }
  76. if createOptions.beforeBuilderCallback != nil {
  77. innerBuilder, err := createOptions.beforeBuilderCallback(copyBuilder, c, historyRequests, resultMap)
  78. if err != nil {
  79. return nil, err
  80. }
  81. copyBuilder = innerBuilder
  82. }
  83. jsonBody, err := c.GetJsonBody()
  84. if err != nil {
  85. return nil, err
  86. }
  87. return jsonBody.Map(), nil
  88. },
  89. HeadersFormFunc: nil,
  90. }, gateway.WithRequestResponseCallback(
  91. func(c *api.Context, response *http_client.Response, historyRequests []gateway.BuilderRequest, resultMap map[string]any) error {
  92. if createOptions.afterBuilderCallback != nil {
  93. innerBuilder, err := createOptions.afterBuilderCallback(copyBuilder, c, historyRequests, resultMap)
  94. if err != nil {
  95. return err
  96. }
  97. copyBuilder = innerBuilder
  98. }
  99. return nil
  100. })).
  101. Build(createMiddlewares...)
  102. }
  103. // 删除
  104. if !deleteOptions.disable {
  105. deleteMiddlewares := append(globalOptions.middlewares, deleteOptions.middlewares...)
  106. copyBuilder := builder.Url(http.MethodDelete, domainPath+"/delete")
  107. copyBuilder.
  108. Delete(&gateway.DeleteRequest{
  109. Url: simple.ServiceVersionedUrl + domainPath + "/delete",
  110. QueryParamsFormFunc: func(c *api.Context, _ map[string]string, historyRequests []gateway.BuilderRequest, resultMap map[string]any) (map[string]string, error) {
  111. if deleteOptions.beforeBuilderCallback != nil {
  112. innerBuilder, err := deleteOptions.beforeBuilderCallback(copyBuilder, c, historyRequests, resultMap)
  113. if err != nil {
  114. return nil, err
  115. }
  116. copyBuilder = innerBuilder
  117. }
  118. return c.GetQueryParams().Map(), nil
  119. },
  120. }, gateway.WithRequestResponseCallback(
  121. func(c *api.Context, response *http_client.Response, historyRequests []gateway.BuilderRequest, resultMap map[string]any) error {
  122. if deleteOptions.afterBuilderCallback != nil {
  123. innerBuilder, err := deleteOptions.afterBuilderCallback(copyBuilder, c, historyRequests, resultMap)
  124. if err != nil {
  125. return err
  126. }
  127. copyBuilder = innerBuilder
  128. }
  129. return nil
  130. })).
  131. Build(deleteMiddlewares...)
  132. }
  133. // 修改
  134. if !updateOptions.disable {
  135. updateMiddlewares := append(globalOptions.middlewares, updateOptions.middlewares...)
  136. copyBuilder := builder.Url(http.MethodPut, domainPath+"/update")
  137. copyBuilder.
  138. Put(&gateway.PutRequest{
  139. Url: simple.ServiceVersionedUrl + domainPath + "/update",
  140. BodyFormFunc: func(c *api.Context, body any, historyRequests []gateway.BuilderRequest, resultMap map[string]any) (any, error) {
  141. _, err := gateway.FormJsonBodyWithTenantIDAndUserIDFunc("", "updateUserId")(c, body, historyRequests, resultMap)
  142. if err != nil {
  143. return nil, err
  144. }
  145. if updateOptions.beforeBuilderCallback != nil {
  146. innerBuilder, err := updateOptions.beforeBuilderCallback(copyBuilder, c, historyRequests, resultMap)
  147. if err != nil {
  148. return nil, err
  149. }
  150. copyBuilder = innerBuilder
  151. }
  152. jsonBody, err := c.GetJsonBody()
  153. if err != nil {
  154. return nil, err
  155. }
  156. return jsonBody.Map(), nil
  157. },
  158. }, gateway.WithRequestResponseCallback(
  159. func(c *api.Context, response *http_client.Response, historyRequests []gateway.BuilderRequest, resultMap map[string]any) error {
  160. if updateOptions.afterBuilderCallback != nil {
  161. innerBuilder, err := updateOptions.afterBuilderCallback(copyBuilder, c, historyRequests, resultMap)
  162. if err != nil {
  163. return err
  164. }
  165. copyBuilder = innerBuilder
  166. }
  167. return nil
  168. })).
  169. Build(updateMiddlewares...)
  170. }
  171. // 查询
  172. if !queryOptions.disable {
  173. queryMiddlewares := append(globalOptions.middlewares, queryOptions.middlewares...)
  174. copyBuilder := builder.Url(http.MethodGet, domainPath+"/query")
  175. copyBuilder.
  176. Get(&gateway.GetRequest{
  177. Url: simple.ServiceVersionedUrl + domainPath + "/query",
  178. QueryParamsFormFunc: func(c *api.Context, queryParams map[string]string, historyRequests []gateway.BuilderRequest, resultMap map[string]any) (map[string]string, error) {
  179. _, err := gateway.FormQueryParamsWithTenantIDAndUserIDFunc("tenantId", "")(c, queryParams, historyRequests, resultMap)
  180. if err != nil {
  181. return nil, err
  182. }
  183. if queryOptions.beforeBuilderCallback != nil {
  184. innerBuilder, err := queryOptions.beforeBuilderCallback(copyBuilder, c, historyRequests, resultMap)
  185. if err != nil {
  186. return nil, err
  187. }
  188. copyBuilder = innerBuilder
  189. }
  190. return c.GetQueryParams().Map(), nil
  191. },
  192. PathParamsFormFunc: nil,
  193. }, gateway.WithRequestResponseCallback(
  194. func(c *api.Context, response *http_client.Response, historyRequests []gateway.BuilderRequest, resultMap map[string]any) error {
  195. if queryOptions.afterBuilderCallback != nil {
  196. innerBuilder, err := queryOptions.afterBuilderCallback(copyBuilder, c, historyRequests, resultMap)
  197. if err != nil {
  198. return err
  199. }
  200. copyBuilder = innerBuilder
  201. }
  202. return nil
  203. })).
  204. Build(queryMiddlewares...)
  205. }
  206. // 通过ID获取
  207. if !getByIDOptions.disable {
  208. getByIDMiddlewares := append(globalOptions.middlewares, getByIDOptions.middlewares...)
  209. copyBuilder := builder.Url(http.MethodGet, domainPath+"/get")
  210. copyBuilder.
  211. Get(&gateway.GetRequest{
  212. Url: simple.ServiceVersionedUrl + domainPath + "/get",
  213. QueryParams: nil,
  214. PathParams: nil,
  215. UrlFormFunc: nil,
  216. HeadersFormFunc: nil,
  217. QueryParamsFormFunc: func(c *api.Context, _ map[string]string, historyRequests []gateway.BuilderRequest, resultMap map[string]any) (map[string]string, error) {
  218. if getByIDOptions.beforeBuilderCallback != nil {
  219. innerBuilder, err := getByIDOptions.beforeBuilderCallback(copyBuilder, c, historyRequests, resultMap)
  220. if err != nil {
  221. return nil, err
  222. }
  223. copyBuilder = innerBuilder
  224. }
  225. return c.GetQueryParams().Map(), nil
  226. },
  227. PathParamsFormFunc: nil,
  228. }, gateway.WithRequestResponseCallback(
  229. func(c *api.Context, response *http_client.Response, historyRequests []gateway.BuilderRequest, resultMap map[string]any) error {
  230. if getByIDOptions.afterBuilderCallback != nil {
  231. innerBuilder, err := getByIDOptions.afterBuilderCallback(copyBuilder, c, historyRequests, resultMap)
  232. if err != nil {
  233. return err
  234. }
  235. copyBuilder = innerBuilder
  236. }
  237. return nil
  238. })).
  239. Build(getByIDMiddlewares...)
  240. }
  241. }
  242. type BuilderCallback func(builder *gateway.Builder, c *api.Context, historyRequests []gateway.BuilderRequest, resultMap map[string]any) (*gateway.Builder, error)
  243. type GlobalOption func(options *GlobalOptions)
  244. type CreateOption func(options *CreateOptions)
  245. type DeleteOption func(options *DeleteOptions)
  246. type UpdateOption func(options *UpdateOptions)
  247. type QueryOption func(options *QueryOptions)
  248. type GetByIDOption func(options *GetByIDOptions)
  249. type GlobalOptions struct {
  250. middlewares []api.Handler
  251. }
  252. type CreateOptions struct {
  253. // 关闭创建
  254. disable bool
  255. // 创建请求前回调
  256. beforeBuilderCallback BuilderCallback
  257. // 创建请求后回调
  258. afterBuilderCallback BuilderCallback
  259. // 创建中间件
  260. middlewares []api.Handler
  261. }
  262. type DeleteOptions struct {
  263. // 关闭删除
  264. disable bool
  265. // 删除请求前回调
  266. beforeBuilderCallback BuilderCallback
  267. // 删除请求后回调
  268. afterBuilderCallback BuilderCallback
  269. // 删除中间件
  270. middlewares []api.Handler
  271. }
  272. type UpdateOptions struct {
  273. // 关闭更新
  274. disable bool
  275. // 更新请求前回调
  276. beforeBuilderCallback BuilderCallback
  277. // 更新请求后回调
  278. afterBuilderCallback BuilderCallback
  279. // 更新中间件
  280. middlewares []api.Handler
  281. }
  282. type QueryOptions struct {
  283. // 关闭查询
  284. disable bool
  285. // 查询请求前回调
  286. beforeBuilderCallback BuilderCallback
  287. // 查询请求后回调
  288. afterBuilderCallback BuilderCallback
  289. // 查询中间件
  290. middlewares []api.Handler
  291. }
  292. type GetByIDOptions struct {
  293. // 关闭根据ID查询
  294. disable bool
  295. // 根据ID请求前回调
  296. beforeBuilderCallback BuilderCallback
  297. // 根据ID请求后回调
  298. afterBuilderCallback BuilderCallback
  299. // 根据ID查询中间件
  300. middlewares []api.Handler
  301. }
  302. func WithGlobalMiddlewares(middlewares ...api.Handler) GlobalOption {
  303. return func(options *GlobalOptions) {
  304. options.middlewares = middlewares
  305. }
  306. }
  307. func WithBeforeCreateBuilderCallback(callbacks BuilderCallback) CreateOption {
  308. return func(options *CreateOptions) {
  309. options.beforeBuilderCallback = callbacks
  310. }
  311. }
  312. func WithAfterCreateBuilderCallback(callbacks BuilderCallback) CreateOption {
  313. return func(options *CreateOptions) {
  314. options.afterBuilderCallback = callbacks
  315. }
  316. }
  317. func WithCreateMiddlewares(middlewares []api.Handler) CreateOption {
  318. return func(options *CreateOptions) {
  319. options.middlewares = middlewares
  320. }
  321. }
  322. func WithDisableDelete() DeleteOption {
  323. return func(options *DeleteOptions) {
  324. options.disable = true
  325. }
  326. }
  327. func WithBeforeDeleteBuilderCallback(callbacks BuilderCallback) DeleteOption {
  328. return func(options *DeleteOptions) {
  329. options.beforeBuilderCallback = callbacks
  330. }
  331. }
  332. func WithAfterDeleteBuilderCallback(callbacks BuilderCallback) DeleteOption {
  333. return func(options *DeleteOptions) {
  334. options.afterBuilderCallback = callbacks
  335. }
  336. }
  337. func WithDeleteMiddlewares(middlewares []api.Handler) DeleteOption {
  338. return func(options *DeleteOptions) {
  339. options.middlewares = middlewares
  340. }
  341. }
  342. func WithDisableUpdate() UpdateOption {
  343. return func(options *UpdateOptions) {
  344. options.disable = true
  345. }
  346. }
  347. func WithBeforeUpdateBuilderCallback(callbacks BuilderCallback) UpdateOption {
  348. return func(options *UpdateOptions) {
  349. options.beforeBuilderCallback = callbacks
  350. }
  351. }
  352. func WithAfterUpdateBuilderCallback(callbacks BuilderCallback) UpdateOption {
  353. return func(options *UpdateOptions) {
  354. options.afterBuilderCallback = callbacks
  355. }
  356. }
  357. func WithUpdateMiddlewares(middlewares []api.Handler) UpdateOption {
  358. return func(options *UpdateOptions) {
  359. options.middlewares = middlewares
  360. }
  361. }
  362. func WithDisableQuery() QueryOption {
  363. return func(options *QueryOptions) {
  364. options.disable = true
  365. }
  366. }
  367. func WithBeforeQueryBuilderCallback(callbacks BuilderCallback) QueryOption {
  368. return func(options *QueryOptions) {
  369. options.beforeBuilderCallback = callbacks
  370. }
  371. }
  372. func WithAfterQueryBuilderCallback(callbacks BuilderCallback) QueryOption {
  373. return func(options *QueryOptions) {
  374. options.afterBuilderCallback = callbacks
  375. }
  376. }
  377. func WithQueryMiddlewares(middlewares []api.Handler) QueryOption {
  378. return func(options *QueryOptions) {
  379. options.middlewares = middlewares
  380. }
  381. }
  382. func WithDisableGetByID() GetByIDOption {
  383. return func(options *GetByIDOptions) {
  384. options.disable = true
  385. }
  386. }
  387. func WithBeforeGetByIDBuilderCallback(callbacks BuilderCallback) GetByIDOption {
  388. return func(options *GetByIDOptions) {
  389. options.beforeBuilderCallback = callbacks
  390. }
  391. }
  392. func WithAfterGetByIDBuilderCallback(callbacks BuilderCallback) GetByIDOption {
  393. return func(options *GetByIDOptions) {
  394. options.afterBuilderCallback = callbacks
  395. }
  396. }
  397. func WithGetByIDMiddlewares(middlewares []api.Handler) GetByIDOption {
  398. return func(options *GetByIDOptions) {
  399. options.middlewares = middlewares
  400. }
  401. }