entity_crud.go 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  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. builder.
  67. Url(http.MethodPost, domainPath+"/create").
  68. Post(gateway.NewPostRequest(params.ServiceVersionedUrl+domainPath+"/create",
  69. gateway.PostRequestWithBodyForm(
  70. gateway.FormJsonBodyWithTenantIDAndUserIDFunc("tenantId", "createUserId"))),
  71. createOptions.requestResponseCallback).
  72. Build(createMiddlewares...)
  73. }
  74. // 删除
  75. if !deleteOptions.disable {
  76. deleteMiddlewares := append(globalOptions.middlewares, deleteOptions.middlewares...)
  77. builder.
  78. Url(http.MethodDelete, domainPath+"/delete").
  79. Delete(gateway.NewDeleteRequest(params.ServiceVersionedUrl+domainPath+"/delete"),
  80. deleteOptions.requestResponseCallback).
  81. Build(deleteMiddlewares...)
  82. }
  83. // 修改
  84. if !updateOptions.disable {
  85. updateMiddlewares := append(globalOptions.middlewares, updateOptions.middlewares...)
  86. builder.
  87. Url(http.MethodPut, domainPath+"/update").
  88. Put(gateway.NewPutRequest(params.ServiceVersionedUrl+domainPath+"/update",
  89. gateway.PutRequestWithBodyForm(
  90. gateway.FormJsonBodyWithTenantIDAndUserIDFunc("", "updateUserId"))),
  91. updateOptions.requestResponseCallback).
  92. Build(updateMiddlewares...)
  93. }
  94. // 查询
  95. if !queryOptions.disable {
  96. queryMiddlewares := append(globalOptions.middlewares, queryOptions.middlewares...)
  97. builder.
  98. Url(http.MethodGet, domainPath+"/query").
  99. Get(gateway.NewGetRequest(params.ServiceVersionedUrl+domainPath+"/query",
  100. gateway.GetRequestWithQueryParamsForm(gateway.FormQueryParamsWithTenantIDAndUserIDFunc("tenantId", ""))),
  101. queryOptions.requestResponseCallback).
  102. Build(queryMiddlewares...)
  103. }
  104. // 通过ID获取
  105. if !getByIDOptions.disable {
  106. getByIDMiddlewares := append(globalOptions.middlewares, getByIDOptions.middlewares...)
  107. builder.
  108. Url(http.MethodGet, domainPath+"/get").
  109. Get(gateway.NewGetRequest(params.ServiceVersionedUrl+domainPath+"/get"),
  110. getByIDOptions.requestResponseCallback).
  111. Build(getByIDMiddlewares...)
  112. }
  113. }
  114. type EntityCRUDGlobalOption func(options *EntityCRUDGlobalOptions)
  115. type EntityCRUDCreateOption func(options *EntityCRUDCreateOptions)
  116. type EntityCRUDDeleteOption func(options *EntityCRUDDeleteOptions)
  117. type EntityCRUDUpdateOption func(options *EntityCRUDUpdateOptions)
  118. type EntityCRUDQueryOption func(options *EntityCRUDQueryOptions)
  119. type EntityCRUDGetByIDOption func(options *EntityCRUDGetByIDOptions)
  120. type EntityCRUDGlobalOptions struct {
  121. middlewares []api.Handler
  122. }
  123. type EntityCRUDCreateOptions struct {
  124. // 关闭创建
  125. disable bool
  126. // 创建请求响应回调
  127. requestResponseCallback gateway.RequestResponseCallback
  128. // 创建中间件
  129. middlewares []api.Handler
  130. }
  131. type EntityCRUDDeleteOptions struct {
  132. // 关闭删除
  133. disable bool
  134. // 删除请求响应回调
  135. requestResponseCallback gateway.RequestResponseCallback
  136. // 删除中间件
  137. middlewares []api.Handler
  138. }
  139. type EntityCRUDUpdateOptions struct {
  140. // 关闭更新
  141. disable bool
  142. // 更新请求响应回调
  143. requestResponseCallback gateway.RequestResponseCallback
  144. // 更新中间件
  145. middlewares []api.Handler
  146. }
  147. type EntityCRUDQueryOptions struct {
  148. // 关闭查询
  149. disable bool
  150. // 查询请求响应回调
  151. requestResponseCallback gateway.RequestResponseCallback
  152. // 查询中间件
  153. middlewares []api.Handler
  154. }
  155. type EntityCRUDGetByIDOptions struct {
  156. // 关闭根据ID查询
  157. disable bool
  158. // 根据ID请求响应回调
  159. requestResponseCallback gateway.RequestResponseCallback
  160. // 根据ID查询中间件
  161. middlewares []api.Handler
  162. }
  163. func WithEntityCRUDGlobalMiddlewares(middlewares ...api.Handler) EntityCRUDGlobalOption {
  164. return func(options *EntityCRUDGlobalOptions) {
  165. options.middlewares = middlewares
  166. }
  167. }
  168. func WithEntityCRUDCreateCallbacks(callbacks gateway.RequestResponseCallback) EntityCRUDCreateOption {
  169. return func(options *EntityCRUDCreateOptions) {
  170. options.requestResponseCallback = callbacks
  171. }
  172. }
  173. func WithEntityCRUDCreateMiddlewares(middlewares []api.Handler) EntityCRUDCreateOption {
  174. return func(options *EntityCRUDCreateOptions) {
  175. options.middlewares = middlewares
  176. }
  177. }
  178. func WithEntityCRUDDisableDelete() EntityCRUDDeleteOption {
  179. return func(options *EntityCRUDDeleteOptions) {
  180. options.disable = true
  181. }
  182. }
  183. func WithEntityCRUDDeleteCallbacks(callbacks gateway.RequestResponseCallback) EntityCRUDDeleteOption {
  184. return func(options *EntityCRUDDeleteOptions) {
  185. options.requestResponseCallback = callbacks
  186. }
  187. }
  188. func WithEntityCRUDDeleteMiddlewares(middlewares []api.Handler) EntityCRUDDeleteOption {
  189. return func(options *EntityCRUDDeleteOptions) {
  190. options.middlewares = middlewares
  191. }
  192. }
  193. func WithEntityCRUDDisableUpdate() EntityCRUDUpdateOption {
  194. return func(options *EntityCRUDUpdateOptions) {
  195. options.disable = true
  196. }
  197. }
  198. func WithEntityCRUDUpdateCallbacks(callbacks gateway.RequestResponseCallback) EntityCRUDUpdateOption {
  199. return func(options *EntityCRUDUpdateOptions) {
  200. options.requestResponseCallback = callbacks
  201. }
  202. }
  203. func WithEntityCRUDUpdateMiddlewares(middlewares []api.Handler) EntityCRUDUpdateOption {
  204. return func(options *EntityCRUDUpdateOptions) {
  205. options.middlewares = middlewares
  206. }
  207. }
  208. func WithEntityCRUDDisableQuery() EntityCRUDQueryOption {
  209. return func(options *EntityCRUDQueryOptions) {
  210. options.disable = true
  211. }
  212. }
  213. func WithEntityCRUDQueryCallbacks(callbacks gateway.RequestResponseCallback) EntityCRUDQueryOption {
  214. return func(options *EntityCRUDQueryOptions) {
  215. options.requestResponseCallback = callbacks
  216. }
  217. }
  218. func WithEntityCRUDQueryMiddlewares(middlewares []api.Handler) EntityCRUDQueryOption {
  219. return func(options *EntityCRUDQueryOptions) {
  220. options.middlewares = middlewares
  221. }
  222. }
  223. func WithEntityCRUDDisableGetByID() EntityCRUDGetByIDOption {
  224. return func(options *EntityCRUDGetByIDOptions) {
  225. options.disable = true
  226. }
  227. }
  228. func WithEntityCRUDGetByIDCallbacks(callbacks gateway.RequestResponseCallback) EntityCRUDGetByIDOption {
  229. return func(options *EntityCRUDGetByIDOptions) {
  230. options.requestResponseCallback = callbacks
  231. }
  232. }
  233. func WithEntityCRUDGetByIDMiddlewares(middlewares []api.Handler) EntityCRUDGetByIDOption {
  234. return func(options *EntityCRUDGetByIDOptions) {
  235. options.middlewares = middlewares
  236. }
  237. }