entity_crud.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492
  1. package gwtools
  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/template"
  6. "github.com/iancoleman/strcase"
  7. "net/http"
  8. )
  9. func EntityCRUD(builder *gateway.Builder, params *EntityCRUDParams, opts ...any) {
  10. globalOptions := new(EntityCRUDGlobalOptions)
  11. createOptions := new(EntityCRUDCreateOptions)
  12. deleteOptions := new(EntityCRUDDeleteOptions)
  13. updateOptions := new(EntityCRUDUpdateOptions)
  14. queryOptions := new(EntityCRUDQueryOptions)
  15. getByIDOptions := new(EntityCRUDGetByIDOptions)
  16. for _, opt := range opts {
  17. switch o := opt.(type) {
  18. case EntityCRUDGlobalOption:
  19. o(globalOptions)
  20. case EntityCRUDCreateOption:
  21. o(createOptions)
  22. case EntityCRUDDeleteOption:
  23. o(deleteOptions)
  24. case EntityCRUDUpdateOption:
  25. o(updateOptions)
  26. case EntityCRUDQueryOption:
  27. o(queryOptions)
  28. case EntityCRUDGetByIDOption:
  29. o(getByIDOptions)
  30. default:
  31. continue
  32. }
  33. }
  34. params.globalOptions = globalOptions
  35. params.createOptions = createOptions
  36. params.deleteOptions = deleteOptions
  37. params.updateOptions = updateOptions
  38. params.queryOptions = queryOptions
  39. params.getByIDOptions = getByIDOptions
  40. params.crud(builder)
  41. }
  42. type EntityCRUDParams struct {
  43. // 除去后缀的服务URL,如http://localhost:8080/example/api/v1
  44. ServiceVersionedUrl string
  45. // 领域名称
  46. DomainCamelName string
  47. // 可选配置项,通过WithXXX配置
  48. globalOptions *EntityCRUDGlobalOptions
  49. createOptions *EntityCRUDCreateOptions
  50. deleteOptions *EntityCRUDDeleteOptions
  51. updateOptions *EntityCRUDUpdateOptions
  52. queryOptions *EntityCRUDQueryOptions
  53. getByIDOptions *EntityCRUDGetByIDOptions
  54. }
  55. func (params *EntityCRUDParams) crud(builder *gateway.Builder) {
  56. globalOptions := params.globalOptions
  57. createOptions := params.createOptions
  58. deleteOptions := params.deleteOptions
  59. updateOptions := params.updateOptions
  60. queryOptions := params.queryOptions
  61. getByIDOptions := params.getByIDOptions
  62. domainPath := "/" + strcase.ToLowerCamel(template.Id(params.DomainCamelName))
  63. // 创建
  64. if !createOptions.disable {
  65. createMiddlewares := append(globalOptions.middlewares, createOptions.middlewares...)
  66. copyBuilder := builder.Url(http.MethodPost, domainPath+"/create")
  67. postRequest := gateway.NewPostRequest(params.ServiceVersionedUrl+domainPath+"/create",
  68. gateway.PostRequestWithBodyForm(func(c *api.Context, historyRequest []gateway.BuilderRequest, resultMap map[string]any) (any, error) {
  69. _, err := gateway.FormJsonBodyWithTenantIDAndUserIDFunc("tenantId", "createUserId")(c, historyRequest, resultMap)
  70. if err != nil {
  71. return nil, err
  72. }
  73. if createOptions.beforeBuilderCallback != nil {
  74. innerBuilder, err := createOptions.beforeBuilderCallback(copyBuilder, c)
  75. if err != nil {
  76. return nil, err
  77. }
  78. copyBuilder = innerBuilder
  79. }
  80. jsonBody, err := c.GetJsonBody()
  81. if err != nil {
  82. return nil, err
  83. }
  84. return jsonBody.Map(), nil
  85. }))
  86. copyBuilder = copyBuilder.Post(postRequest, createOptions.requestResponseCallback)
  87. if createOptions.afterBuilderCallback != nil {
  88. copyBuilder = createOptions.afterBuilderCallback(copyBuilder)
  89. }
  90. copyBuilder.Build(createMiddlewares...)
  91. }
  92. // 删除
  93. if !deleteOptions.disable {
  94. deleteMiddlewares := append(globalOptions.middlewares, deleteOptions.middlewares...)
  95. copyBuilder := builder.Url(http.MethodDelete, domainPath+"/delete")
  96. deleteRequest := gateway.NewDeleteRequest(params.ServiceVersionedUrl+domainPath+"/delete",
  97. gateway.DeleteRequestWithQueryParamsForm(func(c *api.Context, historyRequest []gateway.BuilderRequest, resultMap map[string]any) (map[string]string, error) {
  98. if deleteOptions.beforeBuilderCallback != nil {
  99. innerBuilder, err := deleteOptions.beforeBuilderCallback(copyBuilder, c)
  100. if err != nil {
  101. return nil, err
  102. }
  103. copyBuilder = innerBuilder
  104. }
  105. return c.GetQueryParams().Map(), nil
  106. }))
  107. copyBuilder = copyBuilder.Delete(deleteRequest, deleteOptions.requestResponseCallback)
  108. if deleteOptions.afterBuilderCallback != nil {
  109. copyBuilder = deleteOptions.afterBuilderCallback(copyBuilder)
  110. }
  111. copyBuilder.Build(deleteMiddlewares...)
  112. }
  113. // 修改
  114. if !updateOptions.disable {
  115. updateMiddlewares := append(globalOptions.middlewares, updateOptions.middlewares...)
  116. copyBuilder := builder.Url(http.MethodPut, domainPath+"/update")
  117. putRequest := gateway.NewPutRequest(params.ServiceVersionedUrl+domainPath+"/update",
  118. gateway.PutRequestWithBodyForm(func(c *api.Context, historyRequest []gateway.BuilderRequest, resultMap map[string]any) (any, error) {
  119. _, err := gateway.FormJsonBodyWithTenantIDAndUserIDFunc("", "updateUserId")(c, historyRequest, resultMap)
  120. if err != nil {
  121. return nil, err
  122. }
  123. if updateOptions.beforeBuilderCallback != nil {
  124. innerBuilder, err := updateOptions.beforeBuilderCallback(copyBuilder, c)
  125. if err != nil {
  126. return nil, err
  127. }
  128. copyBuilder = innerBuilder
  129. }
  130. jsonBody, err := c.GetJsonBody()
  131. if err != nil {
  132. return nil, err
  133. }
  134. return jsonBody.Map(), nil
  135. }))
  136. copyBuilder = copyBuilder.Put(putRequest, updateOptions.requestResponseCallback)
  137. if updateOptions.afterBuilderCallback != nil {
  138. copyBuilder = updateOptions.afterBuilderCallback(copyBuilder)
  139. }
  140. copyBuilder.Build(updateMiddlewares...)
  141. }
  142. // 查询
  143. if !queryOptions.disable {
  144. queryMiddlewares := append(globalOptions.middlewares, queryOptions.middlewares...)
  145. copyBuilder := builder.Url(http.MethodGet, domainPath+"/query")
  146. getRequest := gateway.NewGetRequest(params.ServiceVersionedUrl+domainPath+"/query",
  147. gateway.GetRequestWithQueryParamsForm(func(c *api.Context, historyRequest []gateway.BuilderRequest, resultMap map[string]any) (map[string]string, error) {
  148. _, err := gateway.FormQueryParamsWithTenantIDAndUserIDFunc("tenantId", "")(c, historyRequest, resultMap)
  149. if err != nil {
  150. return nil, err
  151. }
  152. if queryOptions.beforeBuilderCallback != nil {
  153. innerBuilder, err := queryOptions.beforeBuilderCallback(copyBuilder, c)
  154. if err != nil {
  155. return nil, err
  156. }
  157. copyBuilder = innerBuilder
  158. }
  159. return c.GetQueryParams().Map(), nil
  160. }))
  161. copyBuilder = copyBuilder.Get(getRequest, queryOptions.requestResponseCallback)
  162. if queryOptions.afterBuilderCallback != nil {
  163. copyBuilder = queryOptions.afterBuilderCallback(copyBuilder)
  164. }
  165. copyBuilder.Build(queryMiddlewares...)
  166. }
  167. // 通过ID获取
  168. if !getByIDOptions.disable {
  169. getByIDMiddlewares := append(globalOptions.middlewares, getByIDOptions.middlewares...)
  170. copyBuilder := builder.Url(http.MethodGet, domainPath+"/get")
  171. getRequest := gateway.NewGetRequest(params.ServiceVersionedUrl+domainPath+"/get",
  172. gateway.GetRequestWithQueryParamsForm(func(c *api.Context, historyRequest []gateway.BuilderRequest, resultMap map[string]any) (map[string]string, error) {
  173. if getByIDOptions.beforeBuilderCallback != nil {
  174. innerBuilder, err := getByIDOptions.beforeBuilderCallback(copyBuilder, c)
  175. if err != nil {
  176. return nil, err
  177. }
  178. copyBuilder = innerBuilder
  179. }
  180. return c.GetQueryParams().Map(), nil
  181. }))
  182. copyBuilder = copyBuilder.Get(getRequest, getByIDOptions.requestResponseCallback)
  183. if getByIDOptions.afterBuilderCallback != nil {
  184. copyBuilder = getByIDOptions.afterBuilderCallback(copyBuilder)
  185. }
  186. copyBuilder.Build(getByIDMiddlewares...)
  187. }
  188. }
  189. type EntityCRUDBeforeCallback func(builder *gateway.Builder, c *api.Context) (*gateway.Builder, error)
  190. type EntityCRUDAfterCallback func(builder *gateway.Builder) *gateway.Builder
  191. type EntityCRUDGlobalOption func(options *EntityCRUDGlobalOptions)
  192. type EntityCRUDCreateOption func(options *EntityCRUDCreateOptions)
  193. type EntityCRUDDeleteOption func(options *EntityCRUDDeleteOptions)
  194. type EntityCRUDUpdateOption func(options *EntityCRUDUpdateOptions)
  195. type EntityCRUDQueryOption func(options *EntityCRUDQueryOptions)
  196. type EntityCRUDGetByIDOption func(options *EntityCRUDGetByIDOptions)
  197. type EntityCRUDGlobalOptions struct {
  198. middlewares []api.Handler
  199. }
  200. type EntityCRUDCreateOptions struct {
  201. // 关闭创建
  202. disable bool
  203. // 创建请求前回调
  204. beforeBuilderCallback EntityCRUDBeforeCallback
  205. // 创建请求响应回调
  206. requestResponseCallback gateway.RequestResponseCallback
  207. // 创建请求后回调
  208. afterBuilderCallback EntityCRUDAfterCallback
  209. // 创建中间件
  210. middlewares []api.Handler
  211. }
  212. type EntityCRUDDeleteOptions struct {
  213. // 关闭删除
  214. disable bool
  215. // 删除请求前回调
  216. beforeBuilderCallback EntityCRUDBeforeCallback
  217. // 删除请求响应回调
  218. requestResponseCallback gateway.RequestResponseCallback
  219. // 删除请求后回调
  220. afterBuilderCallback EntityCRUDAfterCallback
  221. // 删除中间件
  222. middlewares []api.Handler
  223. }
  224. type EntityCRUDUpdateOptions struct {
  225. // 关闭更新
  226. disable bool
  227. // 更新请求前回调
  228. beforeBuilderCallback EntityCRUDBeforeCallback
  229. // 更新请求响应回调
  230. requestResponseCallback gateway.RequestResponseCallback
  231. // 更新请求后回调
  232. afterBuilderCallback EntityCRUDAfterCallback
  233. // 更新中间件
  234. middlewares []api.Handler
  235. }
  236. type EntityCRUDQueryOptions struct {
  237. // 关闭查询
  238. disable bool
  239. // 查询请求前回调
  240. beforeBuilderCallback EntityCRUDBeforeCallback
  241. // 查询请求响应回调
  242. requestResponseCallback gateway.RequestResponseCallback
  243. // 查询请求后回调
  244. afterBuilderCallback EntityCRUDAfterCallback
  245. // 查询中间件
  246. middlewares []api.Handler
  247. }
  248. type EntityCRUDGetByIDOptions struct {
  249. // 关闭根据ID查询
  250. disable bool
  251. // 根据ID请求前回调
  252. beforeBuilderCallback EntityCRUDBeforeCallback
  253. // 根据ID请求响应回调
  254. requestResponseCallback gateway.RequestResponseCallback
  255. // 根据ID请求后回调
  256. afterBuilderCallback EntityCRUDAfterCallback
  257. // 根据ID查询中间件
  258. middlewares []api.Handler
  259. }
  260. func WithEntityCRUDGlobalMiddlewares(middlewares ...api.Handler) EntityCRUDGlobalOption {
  261. return func(options *EntityCRUDGlobalOptions) {
  262. options.middlewares = middlewares
  263. }
  264. }
  265. func WithEntityCRUDBeforeCreateBuilderCallback(callbacks EntityCRUDBeforeCallback) EntityCRUDCreateOption {
  266. return func(options *EntityCRUDCreateOptions) {
  267. options.beforeBuilderCallback = callbacks
  268. }
  269. }
  270. func WithEntityCRUDCreateCallbacks(callbacks gateway.RequestResponseCallback) EntityCRUDCreateOption {
  271. return func(options *EntityCRUDCreateOptions) {
  272. options.requestResponseCallback = callbacks
  273. }
  274. }
  275. func WithEntityCRUDAfterCreateBuilderCallback(callbacks EntityCRUDAfterCallback) EntityCRUDCreateOption {
  276. return func(options *EntityCRUDCreateOptions) {
  277. options.afterBuilderCallback = callbacks
  278. }
  279. }
  280. func WithEntityCRUDCreateMiddlewares(middlewares []api.Handler) EntityCRUDCreateOption {
  281. return func(options *EntityCRUDCreateOptions) {
  282. options.middlewares = middlewares
  283. }
  284. }
  285. func WithEntityCRUDDisableDelete() EntityCRUDDeleteOption {
  286. return func(options *EntityCRUDDeleteOptions) {
  287. options.disable = true
  288. }
  289. }
  290. func WithEntityCRUDBeforeDeleteBuilderCallback(callbacks EntityCRUDBeforeCallback) EntityCRUDDeleteOption {
  291. return func(options *EntityCRUDDeleteOptions) {
  292. options.beforeBuilderCallback = callbacks
  293. }
  294. }
  295. func WithEntityCRUDDeleteCallbacks(callbacks gateway.RequestResponseCallback) EntityCRUDDeleteOption {
  296. return func(options *EntityCRUDDeleteOptions) {
  297. options.requestResponseCallback = callbacks
  298. }
  299. }
  300. func WithEntityCRUDAfterDeleteBuilderCallback(callbacks EntityCRUDAfterCallback) EntityCRUDDeleteOption {
  301. return func(options *EntityCRUDDeleteOptions) {
  302. options.afterBuilderCallback = callbacks
  303. }
  304. }
  305. func WithEntityCRUDDeleteMiddlewares(middlewares []api.Handler) EntityCRUDDeleteOption {
  306. return func(options *EntityCRUDDeleteOptions) {
  307. options.middlewares = middlewares
  308. }
  309. }
  310. func WithEntityCRUDDisableUpdate() EntityCRUDUpdateOption {
  311. return func(options *EntityCRUDUpdateOptions) {
  312. options.disable = true
  313. }
  314. }
  315. func WithEntityCRUDBeforeUpdateBuilderCallback(callbacks EntityCRUDBeforeCallback) EntityCRUDUpdateOption {
  316. return func(options *EntityCRUDUpdateOptions) {
  317. options.beforeBuilderCallback = callbacks
  318. }
  319. }
  320. func WithEntityCRUDUpdateCallbacks(callbacks gateway.RequestResponseCallback) EntityCRUDUpdateOption {
  321. return func(options *EntityCRUDUpdateOptions) {
  322. options.requestResponseCallback = callbacks
  323. }
  324. }
  325. func WithEntityCRUDAfterUpdateBuilderCallback(callbacks EntityCRUDAfterCallback) EntityCRUDUpdateOption {
  326. return func(options *EntityCRUDUpdateOptions) {
  327. options.afterBuilderCallback = callbacks
  328. }
  329. }
  330. func WithEntityCRUDUpdateMiddlewares(middlewares []api.Handler) EntityCRUDUpdateOption {
  331. return func(options *EntityCRUDUpdateOptions) {
  332. options.middlewares = middlewares
  333. }
  334. }
  335. func WithEntityCRUDDisableQuery() EntityCRUDQueryOption {
  336. return func(options *EntityCRUDQueryOptions) {
  337. options.disable = true
  338. }
  339. }
  340. func WithEntityCRUDBeforeQueryBuilderCallback(callbacks EntityCRUDBeforeCallback) EntityCRUDQueryOption {
  341. return func(options *EntityCRUDQueryOptions) {
  342. options.beforeBuilderCallback = callbacks
  343. }
  344. }
  345. func WithEntityCRUDQueryCallbacks(callbacks gateway.RequestResponseCallback) EntityCRUDQueryOption {
  346. return func(options *EntityCRUDQueryOptions) {
  347. options.requestResponseCallback = callbacks
  348. }
  349. }
  350. func WithEntityCRUDAfterQueryBuilderCallback(callbacks EntityCRUDAfterCallback) EntityCRUDQueryOption {
  351. return func(options *EntityCRUDQueryOptions) {
  352. options.afterBuilderCallback = callbacks
  353. }
  354. }
  355. func WithEntityCRUDQueryMiddlewares(middlewares []api.Handler) EntityCRUDQueryOption {
  356. return func(options *EntityCRUDQueryOptions) {
  357. options.middlewares = middlewares
  358. }
  359. }
  360. func WithEntityCRUDDisableGetByID() EntityCRUDGetByIDOption {
  361. return func(options *EntityCRUDGetByIDOptions) {
  362. options.disable = true
  363. }
  364. }
  365. func WithEntityCRUDBeforeGetByIDBuilderCallback(callbacks EntityCRUDBeforeCallback) EntityCRUDGetByIDOption {
  366. return func(options *EntityCRUDGetByIDOptions) {
  367. options.beforeBuilderCallback = callbacks
  368. }
  369. }
  370. func WithEntityCRUDGetByIDCallbacks(callbacks gateway.RequestResponseCallback) EntityCRUDGetByIDOption {
  371. return func(options *EntityCRUDGetByIDOptions) {
  372. options.requestResponseCallback = callbacks
  373. }
  374. }
  375. func WithEntityCRUDAfterGetByIDBuilderCallback(callbacks EntityCRUDAfterCallback) EntityCRUDGetByIDOption {
  376. return func(options *EntityCRUDGetByIDOptions) {
  377. options.afterBuilderCallback = callbacks
  378. }
  379. }
  380. func WithEntityCRUDGetByIDMiddlewares(middlewares []api.Handler) EntityCRUDGetByIDOption {
  381. return func(options *EntityCRUDGetByIDOptions) {
  382. options.middlewares = middlewares
  383. }
  384. }