entity_crud.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491
  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. postRequestCallback := func(c *api.Context, response *http_client.Response, historyRequests []gateway.BuilderRequest, resultMap map[string]any) error {
  69. if createOptions.afterBuilderCallback != nil {
  70. innerBuilder, err := createOptions.afterBuilderCallback(copyBuilder, c, historyRequests, resultMap)
  71. if err != nil {
  72. return err
  73. }
  74. copyBuilder = innerBuilder
  75. }
  76. return nil
  77. }
  78. copyBuilder.
  79. Post(&gateway.PostRequest{
  80. Url: simple.ServiceVersionedUrl + domainPath + "/create",
  81. BodyFormFunc: func(c *api.Context, body any, historyRequests []gateway.BuilderRequest, resultMap map[string]any) (any, error) {
  82. _, err := gateway.FormJsonBodyWithTenantIDAndUserIDFunc("tenantId", "createUserId")(c, body, historyRequests, resultMap)
  83. if err != nil {
  84. return nil, err
  85. }
  86. if createOptions.beforeBuilderCallback != nil {
  87. innerBuilder, err := createOptions.beforeBuilderCallback(copyBuilder, c, historyRequests, resultMap)
  88. if err != nil {
  89. return nil, err
  90. }
  91. copyBuilder = innerBuilder
  92. }
  93. jsonBody, err := c.GetJsonBody()
  94. if err != nil {
  95. return nil, err
  96. }
  97. return jsonBody.Map(), nil
  98. },
  99. HeadersFormFunc: nil,
  100. }, postRequestCallback).
  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. }, func(c *api.Context, response *http_client.Response, historyRequests []gateway.BuilderRequest, resultMap map[string]any) error {
  121. if deleteOptions.afterBuilderCallback != nil {
  122. innerBuilder, err := deleteOptions.afterBuilderCallback(copyBuilder, c, historyRequests, resultMap)
  123. if err != nil {
  124. return err
  125. }
  126. copyBuilder = innerBuilder
  127. }
  128. return nil
  129. }).
  130. Build(deleteMiddlewares...)
  131. }
  132. // 修改
  133. if !updateOptions.disable {
  134. updateMiddlewares := append(globalOptions.middlewares, updateOptions.middlewares...)
  135. copyBuilder := builder.Url(http.MethodPut, domainPath+"/update")
  136. copyBuilder.
  137. Put(&gateway.PutRequest{
  138. Url: simple.ServiceVersionedUrl + domainPath + "/update",
  139. BodyFormFunc: func(c *api.Context, body any, historyRequests []gateway.BuilderRequest, resultMap map[string]any) (any, error) {
  140. _, err := gateway.FormJsonBodyWithTenantIDAndUserIDFunc("", "updateUserId")(c, body, historyRequests, resultMap)
  141. if err != nil {
  142. return nil, err
  143. }
  144. if updateOptions.beforeBuilderCallback != nil {
  145. innerBuilder, err := updateOptions.beforeBuilderCallback(copyBuilder, c, historyRequests, resultMap)
  146. if err != nil {
  147. return nil, err
  148. }
  149. copyBuilder = innerBuilder
  150. }
  151. jsonBody, err := c.GetJsonBody()
  152. if err != nil {
  153. return nil, err
  154. }
  155. return jsonBody.Map(), nil
  156. },
  157. }, func(c *api.Context, response *http_client.Response, historyRequests []gateway.BuilderRequest, resultMap map[string]any) error {
  158. if updateOptions.afterBuilderCallback != nil {
  159. innerBuilder, err := updateOptions.afterBuilderCallback(copyBuilder, c, historyRequests, resultMap)
  160. if err != nil {
  161. return err
  162. }
  163. copyBuilder = innerBuilder
  164. }
  165. return nil
  166. }).
  167. Build(updateMiddlewares...)
  168. }
  169. // 查询
  170. if !queryOptions.disable {
  171. queryMiddlewares := append(globalOptions.middlewares, queryOptions.middlewares...)
  172. copyBuilder := builder.Url(http.MethodGet, domainPath+"/query")
  173. copyBuilder.
  174. Get(&gateway.GetRequest{
  175. Url: simple.ServiceVersionedUrl + domainPath + "/query",
  176. QueryParamsFormFunc: func(c *api.Context, queryParams map[string]string, historyRequests []gateway.BuilderRequest, resultMap map[string]any) (map[string]string, error) {
  177. _, err := gateway.FormQueryParamsWithTenantIDAndUserIDFunc("tenantId", "")(c, queryParams, historyRequests, resultMap)
  178. if err != nil {
  179. return nil, err
  180. }
  181. if queryOptions.beforeBuilderCallback != nil {
  182. innerBuilder, err := queryOptions.beforeBuilderCallback(copyBuilder, c, historyRequests, resultMap)
  183. if err != nil {
  184. return nil, err
  185. }
  186. copyBuilder = innerBuilder
  187. }
  188. return c.GetQueryParams().Map(), nil
  189. },
  190. PathParamsFormFunc: nil,
  191. }, func(c *api.Context, response *http_client.Response, historyRequests []gateway.BuilderRequest, resultMap map[string]any) error {
  192. if queryOptions.afterBuilderCallback != nil {
  193. innerBuilder, err := queryOptions.afterBuilderCallback(copyBuilder, c, historyRequests, resultMap)
  194. if err != nil {
  195. return err
  196. }
  197. copyBuilder = innerBuilder
  198. }
  199. return nil
  200. }).
  201. Build(queryMiddlewares...)
  202. }
  203. // 通过ID获取
  204. if !getByIDOptions.disable {
  205. getByIDMiddlewares := append(globalOptions.middlewares, getByIDOptions.middlewares...)
  206. copyBuilder := builder.Url(http.MethodGet, domainPath+"/get")
  207. copyBuilder.
  208. Get(&gateway.GetRequest{
  209. Url: simple.ServiceVersionedUrl + domainPath + "/get",
  210. QueryParams: nil,
  211. PathParams: nil,
  212. UrlFormFunc: nil,
  213. HeadersFormFunc: nil,
  214. QueryParamsFormFunc: func(c *api.Context, _ map[string]string, historyRequests []gateway.BuilderRequest, resultMap map[string]any) (map[string]string, error) {
  215. if getByIDOptions.beforeBuilderCallback != nil {
  216. innerBuilder, err := getByIDOptions.beforeBuilderCallback(copyBuilder, c, historyRequests, resultMap)
  217. if err != nil {
  218. return nil, err
  219. }
  220. copyBuilder = innerBuilder
  221. }
  222. return c.GetQueryParams().Map(), nil
  223. },
  224. PathParamsFormFunc: nil,
  225. }, func(c *api.Context, response *http_client.Response, historyRequests []gateway.BuilderRequest, resultMap map[string]any) error {
  226. if getByIDOptions.afterBuilderCallback != nil {
  227. innerBuilder, err := getByIDOptions.afterBuilderCallback(copyBuilder, c, historyRequests, resultMap)
  228. if err != nil {
  229. return err
  230. }
  231. copyBuilder = innerBuilder
  232. }
  233. return nil
  234. }).
  235. Build(getByIDMiddlewares...)
  236. }
  237. }
  238. type BuilderCallback func(builder *gateway.Builder, c *api.Context, historyRequests []gateway.BuilderRequest, resultMap map[string]any) (*gateway.Builder, error)
  239. type GlobalOption func(options *GlobalOptions)
  240. type CreateOption func(options *CreateOptions)
  241. type DeleteOption func(options *DeleteOptions)
  242. type UpdateOption func(options *UpdateOptions)
  243. type QueryOption func(options *QueryOptions)
  244. type GetByIDOption func(options *GetByIDOptions)
  245. type GlobalOptions struct {
  246. middlewares []api.Handler
  247. }
  248. type CreateOptions struct {
  249. // 关闭创建
  250. disable bool
  251. // 创建请求前回调
  252. beforeBuilderCallback BuilderCallback
  253. // 创建请求后回调
  254. afterBuilderCallback BuilderCallback
  255. // 创建中间件
  256. middlewares []api.Handler
  257. }
  258. type DeleteOptions struct {
  259. // 关闭删除
  260. disable bool
  261. // 删除请求前回调
  262. beforeBuilderCallback BuilderCallback
  263. // 删除请求后回调
  264. afterBuilderCallback BuilderCallback
  265. // 删除中间件
  266. middlewares []api.Handler
  267. }
  268. type UpdateOptions struct {
  269. // 关闭更新
  270. disable bool
  271. // 更新请求前回调
  272. beforeBuilderCallback BuilderCallback
  273. // 更新请求后回调
  274. afterBuilderCallback BuilderCallback
  275. // 更新中间件
  276. middlewares []api.Handler
  277. }
  278. type QueryOptions struct {
  279. // 关闭查询
  280. disable bool
  281. // 查询请求前回调
  282. beforeBuilderCallback BuilderCallback
  283. // 查询请求后回调
  284. afterBuilderCallback BuilderCallback
  285. // 查询中间件
  286. middlewares []api.Handler
  287. }
  288. type GetByIDOptions struct {
  289. // 关闭根据ID查询
  290. disable bool
  291. // 根据ID请求前回调
  292. beforeBuilderCallback BuilderCallback
  293. // 根据ID请求后回调
  294. afterBuilderCallback BuilderCallback
  295. // 根据ID查询中间件
  296. middlewares []api.Handler
  297. }
  298. func WithGlobalMiddlewares(middlewares ...api.Handler) GlobalOption {
  299. return func(options *GlobalOptions) {
  300. options.middlewares = middlewares
  301. }
  302. }
  303. func WithBeforeCreateBuilderCallback(callbacks BuilderCallback) CreateOption {
  304. return func(options *CreateOptions) {
  305. options.beforeBuilderCallback = callbacks
  306. }
  307. }
  308. func WithAfterCreateBuilderCallback(callbacks BuilderCallback) CreateOption {
  309. return func(options *CreateOptions) {
  310. options.afterBuilderCallback = callbacks
  311. }
  312. }
  313. func WithCreateMiddlewares(middlewares []api.Handler) CreateOption {
  314. return func(options *CreateOptions) {
  315. options.middlewares = middlewares
  316. }
  317. }
  318. func WithDisableDelete() DeleteOption {
  319. return func(options *DeleteOptions) {
  320. options.disable = true
  321. }
  322. }
  323. func WithBeforeDeleteBuilderCallback(callbacks BuilderCallback) DeleteOption {
  324. return func(options *DeleteOptions) {
  325. options.beforeBuilderCallback = callbacks
  326. }
  327. }
  328. func WithAfterDeleteBuilderCallback(callbacks BuilderCallback) DeleteOption {
  329. return func(options *DeleteOptions) {
  330. options.afterBuilderCallback = callbacks
  331. }
  332. }
  333. func WithDeleteMiddlewares(middlewares []api.Handler) DeleteOption {
  334. return func(options *DeleteOptions) {
  335. options.middlewares = middlewares
  336. }
  337. }
  338. func WithDisableUpdate() UpdateOption {
  339. return func(options *UpdateOptions) {
  340. options.disable = true
  341. }
  342. }
  343. func WithBeforeUpdateBuilderCallback(callbacks BuilderCallback) UpdateOption {
  344. return func(options *UpdateOptions) {
  345. options.beforeBuilderCallback = callbacks
  346. }
  347. }
  348. func WithAfterUpdateBuilderCallback(callbacks BuilderCallback) UpdateOption {
  349. return func(options *UpdateOptions) {
  350. options.afterBuilderCallback = callbacks
  351. }
  352. }
  353. func WithUpdateMiddlewares(middlewares []api.Handler) UpdateOption {
  354. return func(options *UpdateOptions) {
  355. options.middlewares = middlewares
  356. }
  357. }
  358. func WithDisableQuery() QueryOption {
  359. return func(options *QueryOptions) {
  360. options.disable = true
  361. }
  362. }
  363. func WithBeforeQueryBuilderCallback(callbacks BuilderCallback) QueryOption {
  364. return func(options *QueryOptions) {
  365. options.beforeBuilderCallback = callbacks
  366. }
  367. }
  368. func WithAfterQueryBuilderCallback(callbacks BuilderCallback) QueryOption {
  369. return func(options *QueryOptions) {
  370. options.afterBuilderCallback = callbacks
  371. }
  372. }
  373. func WithQueryMiddlewares(middlewares []api.Handler) QueryOption {
  374. return func(options *QueryOptions) {
  375. options.middlewares = middlewares
  376. }
  377. }
  378. func WithDisableGetByID() GetByIDOption {
  379. return func(options *GetByIDOptions) {
  380. options.disable = true
  381. }
  382. }
  383. func WithBeforeGetByIDBuilderCallback(callbacks BuilderCallback) GetByIDOption {
  384. return func(options *GetByIDOptions) {
  385. options.beforeBuilderCallback = callbacks
  386. }
  387. }
  388. func WithAfterGetByIDBuilderCallback(callbacks BuilderCallback) GetByIDOption {
  389. return func(options *GetByIDOptions) {
  390. options.afterBuilderCallback = callbacks
  391. }
  392. }
  393. func WithGetByIDMiddlewares(middlewares []api.Handler) GetByIDOption {
  394. return func(options *GetByIDOptions) {
  395. options.middlewares = middlewares
  396. }
  397. }