value_object_crud.go 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  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 ValueObjectCRUD(builder *gateway.Builder, params *ValueObjectCRUDParams, opts ...any) {
  10. globalOptions := new(ValueObjectCRUDGlobalOptions)
  11. createOptions := new(ValueObjectCRUDCreateOptions)
  12. deleteOptions := new(ValueObjectCRUDDeleteOptions)
  13. queryOptions := new(ValueObjectCRUDQueryOptions)
  14. for _, opt := range opts {
  15. switch o := opt.(type) {
  16. case ValueObjectCRUDGlobalOption:
  17. o(globalOptions)
  18. case ValueObjectCRUDCreateOption:
  19. o(createOptions)
  20. case ValueObjectCRUDDeleteOption:
  21. o(deleteOptions)
  22. case ValueObjectCRUDQueryOption:
  23. o(queryOptions)
  24. default:
  25. continue
  26. }
  27. }
  28. params.globalOptions = globalOptions
  29. params.createOptions = createOptions
  30. params.deleteOptions = deleteOptions
  31. params.queryOptions = queryOptions
  32. params.crud(builder)
  33. }
  34. type ValueObjectCRUDParams struct {
  35. // 除去后缀的服务URL,如http://localhost:8080/example/api/v1
  36. ServiceVersionedUrl string
  37. // 领域名称
  38. DomainCamelName string
  39. // 可选配置项,通过WithXXX配置
  40. globalOptions *ValueObjectCRUDGlobalOptions
  41. createOptions *ValueObjectCRUDCreateOptions
  42. deleteOptions *ValueObjectCRUDDeleteOptions
  43. queryOptions *ValueObjectCRUDQueryOptions
  44. }
  45. func (params *ValueObjectCRUDParams) crud(builder *gateway.Builder) {
  46. globalOptions := params.globalOptions
  47. createOptions := params.createOptions
  48. deleteOptions := params.deleteOptions
  49. queryOptions := params.queryOptions
  50. domainPath := "/" + strcase.ToLowerCamel(template.Id(params.DomainCamelName))
  51. // 创建
  52. if !createOptions.disable {
  53. createMiddlewares := append(globalOptions.middlewares, createOptions.middlewares...)
  54. copyBuilder := builder.Url(http.MethodPost, domainPath+"/create")
  55. if createOptions.beforeBuilderCallback != nil {
  56. copyBuilder = createOptions.beforeBuilderCallback(copyBuilder)
  57. }
  58. copyBuilder = copyBuilder.Post(gateway.NewPostRequest(params.ServiceVersionedUrl+domainPath+"/create",
  59. gateway.PostRequestWithBodyForm(
  60. gateway.FormJsonBodyWithTenantIDAndUserIDFunc("tenantId", "createUserId"))),
  61. createOptions.requestResponseCallback)
  62. if createOptions.afterBuilderCallback != nil {
  63. copyBuilder = createOptions.afterBuilderCallback(copyBuilder)
  64. }
  65. copyBuilder.Build(createMiddlewares...)
  66. }
  67. // 删除
  68. if !deleteOptions.disable {
  69. deleteMiddlewares := append(globalOptions.middlewares, deleteOptions.middlewares...)
  70. copyBuilder := builder.Url(http.MethodPost, domainPath+"/delete")
  71. if deleteOptions.beforeBuilderCallback != nil {
  72. copyBuilder = deleteOptions.beforeBuilderCallback(copyBuilder)
  73. }
  74. copyBuilder = copyBuilder.Post(gateway.NewPostRequest(params.ServiceVersionedUrl+domainPath+"/delete"),
  75. deleteOptions.requestResponseCallback)
  76. if deleteOptions.afterBuilderCallback != nil {
  77. copyBuilder = deleteOptions.afterBuilderCallback(copyBuilder)
  78. }
  79. copyBuilder.Build(deleteMiddlewares...)
  80. }
  81. // 查询
  82. if !queryOptions.disable {
  83. queryMiddlewares := append(globalOptions.middlewares, queryOptions.middlewares...)
  84. copyBuilder := builder.Url(http.MethodGet, domainPath+"/query")
  85. if queryOptions.beforeBuilderCallback != nil {
  86. copyBuilder = queryOptions.beforeBuilderCallback(copyBuilder)
  87. }
  88. copyBuilder = copyBuilder.Get(gateway.NewGetRequest(params.ServiceVersionedUrl+domainPath+"/query",
  89. gateway.GetRequestWithQueryParamsForm(
  90. gateway.FormQueryParamsWithTenantIDAndUserIDFunc("tenantId", ""))),
  91. queryOptions.requestResponseCallback)
  92. if queryOptions.afterBuilderCallback != nil {
  93. copyBuilder = queryOptions.afterBuilderCallback(copyBuilder)
  94. }
  95. copyBuilder.Build(queryMiddlewares...)
  96. }
  97. }
  98. type ValueObjectCRUDBuilderCallback func(builder *gateway.Builder) *gateway.Builder
  99. type ValueObjectCRUDGlobalOption func(options *ValueObjectCRUDGlobalOptions)
  100. type ValueObjectCRUDCreateOption func(options *ValueObjectCRUDCreateOptions)
  101. type ValueObjectCRUDDeleteOption func(options *ValueObjectCRUDDeleteOptions)
  102. type ValueObjectCRUDQueryOption func(options *ValueObjectCRUDQueryOptions)
  103. type ValueObjectCRUDGlobalOptions struct {
  104. middlewares []api.Handler
  105. }
  106. type ValueObjectCRUDCreateOptions struct {
  107. // 关闭创建
  108. disable bool
  109. // 创建请求前回调
  110. beforeBuilderCallback ValueObjectCRUDBuilderCallback
  111. // 创建请求响应回调
  112. requestResponseCallback gateway.RequestResponseCallback
  113. // 创建请求后回调
  114. afterBuilderCallback ValueObjectCRUDBuilderCallback
  115. // 创建中间件
  116. middlewares []api.Handler
  117. }
  118. type ValueObjectCRUDDeleteOptions struct {
  119. // 关闭删除
  120. disable bool
  121. // 删除请求前回调
  122. beforeBuilderCallback ValueObjectCRUDBuilderCallback
  123. // 删除请求响应回调
  124. requestResponseCallback gateway.RequestResponseCallback
  125. // 删除请求后回调
  126. afterBuilderCallback ValueObjectCRUDBuilderCallback
  127. // 删除中间件
  128. middlewares []api.Handler
  129. }
  130. type ValueObjectCRUDQueryOptions struct {
  131. // 关闭查询
  132. disable bool
  133. // 查询请求前回调
  134. beforeBuilderCallback ValueObjectCRUDBuilderCallback
  135. // 查询请求响应回调
  136. requestResponseCallback gateway.RequestResponseCallback
  137. // 查询请求后回调
  138. afterBuilderCallback ValueObjectCRUDBuilderCallback
  139. // 查询中间件
  140. middlewares []api.Handler
  141. }
  142. func WithValueObjectCRUDGlobalMiddlewares(middlewares ...api.Handler) ValueObjectCRUDGlobalOption {
  143. return func(options *ValueObjectCRUDGlobalOptions) {
  144. options.middlewares = middlewares
  145. }
  146. }
  147. func WithValueObjectCRUDBeforeCreateBuilderCallback(callbacks ValueObjectCRUDBuilderCallback) ValueObjectCRUDCreateOption {
  148. return func(options *ValueObjectCRUDCreateOptions) {
  149. options.beforeBuilderCallback = callbacks
  150. }
  151. }
  152. func WithValueObjectCRUDCreateCallbacks(callbacks gateway.RequestResponseCallback) ValueObjectCRUDCreateOption {
  153. return func(options *ValueObjectCRUDCreateOptions) {
  154. options.requestResponseCallback = callbacks
  155. }
  156. }
  157. func WithValueObjectCRUDAfterCreateBuilderCallback(callbacks ValueObjectCRUDBuilderCallback) ValueObjectCRUDCreateOption {
  158. return func(options *ValueObjectCRUDCreateOptions) {
  159. options.afterBuilderCallback = callbacks
  160. }
  161. }
  162. func WithValueObjectCRUDCreateMiddlewares(middlewares []api.Handler) ValueObjectCRUDCreateOption {
  163. return func(options *ValueObjectCRUDCreateOptions) {
  164. options.middlewares = middlewares
  165. }
  166. }
  167. func WithValueObjectCRUDDisableDelete() ValueObjectCRUDDeleteOption {
  168. return func(options *ValueObjectCRUDDeleteOptions) {
  169. options.disable = true
  170. }
  171. }
  172. func WithValueObjectCRUDBeforeDeleteBuilderCallback(callbacks ValueObjectCRUDBuilderCallback) ValueObjectCRUDDeleteOption {
  173. return func(options *ValueObjectCRUDDeleteOptions) {
  174. options.beforeBuilderCallback = callbacks
  175. }
  176. }
  177. func WithValueObjectCRUDDeleteCallbacks(callbacks gateway.RequestResponseCallback) ValueObjectCRUDDeleteOption {
  178. return func(options *ValueObjectCRUDDeleteOptions) {
  179. options.requestResponseCallback = callbacks
  180. }
  181. }
  182. func WithValueObjectCRUDAfterDeleteBuilderCallback(callbacks ValueObjectCRUDBuilderCallback) ValueObjectCRUDDeleteOption {
  183. return func(options *ValueObjectCRUDDeleteOptions) {
  184. options.afterBuilderCallback = callbacks
  185. }
  186. }
  187. func WithValueObjectCRUDDeleteMiddlewares(middlewares []api.Handler) ValueObjectCRUDDeleteOption {
  188. return func(options *ValueObjectCRUDDeleteOptions) {
  189. options.middlewares = middlewares
  190. }
  191. }
  192. func WithValueObjectCRUDDisableQuery() ValueObjectCRUDQueryOption {
  193. return func(options *ValueObjectCRUDQueryOptions) {
  194. options.disable = true
  195. }
  196. }
  197. func WithValueObjectCRUDBeforeQueryBuilderCallback(callbacks ValueObjectCRUDBuilderCallback) ValueObjectCRUDQueryOption {
  198. return func(options *ValueObjectCRUDQueryOptions) {
  199. options.beforeBuilderCallback = callbacks
  200. }
  201. }
  202. func WithValueObjectCRUDQueryCallbacks(callbacks gateway.RequestResponseCallback) ValueObjectCRUDQueryOption {
  203. return func(options *ValueObjectCRUDQueryOptions) {
  204. options.requestResponseCallback = callbacks
  205. }
  206. }
  207. func WithValueObjectCRUDAfterQueryBuilderCallback(callbacks ValueObjectCRUDBuilderCallback) ValueObjectCRUDQueryOption {
  208. return func(options *ValueObjectCRUDQueryOptions) {
  209. options.afterBuilderCallback = callbacks
  210. }
  211. }
  212. func WithValueObjectCRUDQueryMiddlewares(middlewares []api.Handler) ValueObjectCRUDQueryOption {
  213. return func(options *ValueObjectCRUDQueryOptions) {
  214. options.middlewares = middlewares
  215. }
  216. }