entity_crud.go 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  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. createOptions := new(EntityCRUDCreateOptions)
  11. deleteOptions := new(EntityCRUDDeleteOptions)
  12. updateOptions := new(EntityCRUDUpdateOptions)
  13. queryOptions := new(EntityCRUDQueryOptions)
  14. getByIDOptions := new(EntityCRUDGetByIDOptions)
  15. for _, opt := range opts {
  16. switch o := opt.(type) {
  17. case EntityCRUDCreateOption:
  18. o(createOptions)
  19. case EntityCRUDDeleteOption:
  20. o(deleteOptions)
  21. case EntityCRUDUpdateOption:
  22. o(updateOptions)
  23. case EntityCRUDQueryOption:
  24. o(queryOptions)
  25. case EntityCRUDGetByIDOption:
  26. o(getByIDOptions)
  27. default:
  28. continue
  29. }
  30. }
  31. params.createOptions = createOptions
  32. params.deleteOptions = deleteOptions
  33. params.updateOptions = updateOptions
  34. params.queryOptions = queryOptions
  35. params.getByIDOptions = getByIDOptions
  36. params.crud(builder)
  37. }
  38. type EntityCRUDParams struct {
  39. // 除去后缀的服务URL,如http://localhost:8080/example/api/v1
  40. ServiceVersionedUrl string
  41. // 领域名称
  42. DomainCamelName string
  43. // 可选配置项,通过WithXXX配置
  44. createOptions *EntityCRUDCreateOptions
  45. deleteOptions *EntityCRUDDeleteOptions
  46. updateOptions *EntityCRUDUpdateOptions
  47. queryOptions *EntityCRUDQueryOptions
  48. getByIDOptions *EntityCRUDGetByIDOptions
  49. }
  50. func (params *EntityCRUDParams) crud(builder *gateway.Builder) {
  51. createOptions := params.createOptions
  52. deleteOptions := params.deleteOptions
  53. updateOptions := params.updateOptions
  54. queryOptions := params.queryOptions
  55. getByIDOptions := params.getByIDOptions
  56. domainPath := "/" + strcase.ToLowerCamel(template.Id(params.DomainCamelName))
  57. // 创建
  58. if !createOptions.disable {
  59. builder.
  60. Url(http.MethodPost, domainPath+"/create").
  61. Post(gateway.NewPostRequest(params.ServiceVersionedUrl+domainPath+"/create",
  62. gateway.PostRequestWithBodyForm(
  63. gateway.FormJsonBodyWithTenantIDAndUserIDFunc("tenantId", "createUserId"))),
  64. createOptions.requestResponseCallback).
  65. Build(createOptions.middlewares...)
  66. }
  67. // 删除
  68. if !deleteOptions.disable {
  69. builder.
  70. Url(http.MethodDelete, domainPath+"/delete").
  71. Delete(gateway.NewDeleteRequest(params.ServiceVersionedUrl+domainPath+"/delete"),
  72. deleteOptions.requestResponseCallback).
  73. Build(deleteOptions.middlewares...)
  74. }
  75. // 修改
  76. if !updateOptions.disable {
  77. builder.
  78. Url(http.MethodPut, domainPath+"/update").
  79. Put(gateway.NewPutRequest(params.ServiceVersionedUrl+domainPath+"/update",
  80. gateway.PutRequestWithBodyForm(
  81. gateway.FormJsonBodyWithTenantIDAndUserIDFunc("", "updateUserId"))),
  82. updateOptions.requestResponseCallback).
  83. Build(updateOptions.middlewares...)
  84. }
  85. // 查询
  86. if !queryOptions.disable {
  87. builder.
  88. Url(http.MethodGet, domainPath+"/query").
  89. Get(gateway.NewGetRequest(params.ServiceVersionedUrl+domainPath+"/query",
  90. gateway.GetRequestWithQueryParamsForm(gateway.FormQueryParamsWithTenantIDAndUserIDFunc("tenantId", ""))),
  91. queryOptions.requestResponseCallback).
  92. Build(queryOptions.middlewares...)
  93. }
  94. // 通过ID获取
  95. if !getByIDOptions.disable {
  96. builder.
  97. Url(http.MethodGet, domainPath+"/get").
  98. Get(gateway.NewGetRequest(params.ServiceVersionedUrl+domainPath+"/get"),
  99. getByIDOptions.requestResponseCallback).
  100. Build(getByIDOptions.middlewares...)
  101. }
  102. }
  103. type EntityCRUDCreateOption func(options *EntityCRUDCreateOptions)
  104. type EntityCRUDDeleteOption func(options *EntityCRUDDeleteOptions)
  105. type EntityCRUDUpdateOption func(options *EntityCRUDUpdateOptions)
  106. type EntityCRUDQueryOption func(options *EntityCRUDQueryOptions)
  107. type EntityCRUDGetByIDOption func(options *EntityCRUDGetByIDOptions)
  108. type EntityCRUDCreateOptions struct {
  109. // 关闭创建
  110. disable bool
  111. // 创建请求响应回调
  112. requestResponseCallback gateway.RequestResponseCallback
  113. // 创建中间件
  114. middlewares []api.Handler
  115. }
  116. type EntityCRUDDeleteOptions struct {
  117. // 关闭删除
  118. disable bool
  119. // 删除请求响应回调
  120. requestResponseCallback gateway.RequestResponseCallback
  121. // 删除中间件
  122. middlewares []api.Handler
  123. }
  124. type EntityCRUDUpdateOptions struct {
  125. // 关闭更新
  126. disable bool
  127. // 更新请求响应回调
  128. requestResponseCallback gateway.RequestResponseCallback
  129. // 更新中间件
  130. middlewares []api.Handler
  131. }
  132. type EntityCRUDQueryOptions struct {
  133. // 关闭查询
  134. disable bool
  135. // 查询请求响应回调
  136. requestResponseCallback gateway.RequestResponseCallback
  137. // 查询中间件
  138. middlewares []api.Handler
  139. }
  140. type EntityCRUDGetByIDOptions struct {
  141. // 关闭根据ID查询
  142. disable bool
  143. // 根据ID请求响应回调
  144. requestResponseCallback gateway.RequestResponseCallback
  145. // 根据ID查询中间件
  146. middlewares []api.Handler
  147. }
  148. func WithEntityCRUDCreateCallbacks(callbacks gateway.RequestResponseCallback) EntityCRUDCreateOption {
  149. return func(options *EntityCRUDCreateOptions) {
  150. options.requestResponseCallback = callbacks
  151. }
  152. }
  153. func WithEntityCRUDCreateMiddlewares(middlewares []api.Handler) EntityCRUDCreateOption {
  154. return func(options *EntityCRUDCreateOptions) {
  155. options.middlewares = middlewares
  156. }
  157. }
  158. func WithEntityCRUDDisableDelete() EntityCRUDDeleteOption {
  159. return func(options *EntityCRUDDeleteOptions) {
  160. options.disable = true
  161. }
  162. }
  163. func WithEntityCRUDDeleteCallbacks(callbacks gateway.RequestResponseCallback) EntityCRUDDeleteOption {
  164. return func(options *EntityCRUDDeleteOptions) {
  165. options.requestResponseCallback = callbacks
  166. }
  167. }
  168. func WithEntityCRUDDeleteMiddlewares(middlewares []api.Handler) EntityCRUDDeleteOption {
  169. return func(options *EntityCRUDDeleteOptions) {
  170. options.middlewares = middlewares
  171. }
  172. }
  173. func WithEntityCRUDDisableUpdate() EntityCRUDUpdateOption {
  174. return func(options *EntityCRUDUpdateOptions) {
  175. options.disable = true
  176. }
  177. }
  178. func WithEntityCRUDUpdateCallbacks(callbacks gateway.RequestResponseCallback) EntityCRUDUpdateOption {
  179. return func(options *EntityCRUDUpdateOptions) {
  180. options.requestResponseCallback = callbacks
  181. }
  182. }
  183. func WithEntityCRUDUpdateMiddlewares(middlewares []api.Handler) EntityCRUDUpdateOption {
  184. return func(options *EntityCRUDUpdateOptions) {
  185. options.middlewares = middlewares
  186. }
  187. }
  188. func WithEntityCRUDDisableQuery() EntityCRUDQueryOption {
  189. return func(options *EntityCRUDQueryOptions) {
  190. options.disable = true
  191. }
  192. }
  193. func WithEntityCRUDQueryCallbacks(callbacks gateway.RequestResponseCallback) EntityCRUDQueryOption {
  194. return func(options *EntityCRUDQueryOptions) {
  195. options.requestResponseCallback = callbacks
  196. }
  197. }
  198. func WithEntityCRUDQueryMiddlewares(middlewares []api.Handler) EntityCRUDQueryOption {
  199. return func(options *EntityCRUDQueryOptions) {
  200. options.middlewares = middlewares
  201. }
  202. }
  203. func WithEntityCRUDDisableGetByID() EntityCRUDGetByIDOption {
  204. return func(options *EntityCRUDGetByIDOptions) {
  205. options.disable = true
  206. }
  207. }
  208. func WithEntityCRUDGetByIDCallbacks(callbacks gateway.RequestResponseCallback) EntityCRUDGetByIDOption {
  209. return func(options *EntityCRUDGetByIDOptions) {
  210. options.requestResponseCallback = callbacks
  211. }
  212. }
  213. func WithEntityCRUDGetByIDMiddlewares(middlewares []api.Handler) EntityCRUDGetByIDOption {
  214. return func(options *EntityCRUDGetByIDOptions) {
  215. options.middlewares = middlewares
  216. }
  217. }