value_object_crud.go 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  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. postRequest := gateway.NewPostRequest(params.ServiceVersionedUrl+domainPath+"/create",
  56. gateway.PostRequestWithBodyForm(func(c *api.Context, historyRequest []gateway.BuilderRequest, resultMap map[string]any) (any, error) {
  57. _, err := gateway.FormJsonBodyWithTenantIDAndUserIDFunc("tenantId", "createUserId")(c, historyRequest, resultMap)
  58. if err != nil {
  59. return nil, err
  60. }
  61. if createOptions.beforeBuilderCallback != nil {
  62. copyBuilder = createOptions.beforeBuilderCallback(copyBuilder, c)
  63. }
  64. jsonBody, err := c.GetJsonBody()
  65. if err != nil {
  66. return nil, err
  67. }
  68. return jsonBody.Map(), nil
  69. }))
  70. copyBuilder = copyBuilder.Post(postRequest, createOptions.requestResponseCallback)
  71. if createOptions.afterBuilderCallback != nil {
  72. copyBuilder = createOptions.afterBuilderCallback(copyBuilder)
  73. }
  74. copyBuilder.Build(createMiddlewares...)
  75. }
  76. // 删除
  77. if !deleteOptions.disable {
  78. deleteMiddlewares := append(globalOptions.middlewares, deleteOptions.middlewares...)
  79. copyBuilder := builder.Url(http.MethodPost, domainPath+"/delete")
  80. postRequest := gateway.NewPostRequest(params.ServiceVersionedUrl+domainPath+"/delete",
  81. gateway.PostRequestWithBodyForm(func(c *api.Context, historyRequest []gateway.BuilderRequest, resultMap map[string]any) (any, error) {
  82. if deleteOptions.beforeBuilderCallback != nil {
  83. copyBuilder = deleteOptions.beforeBuilderCallback(copyBuilder, c)
  84. }
  85. jsonBody, err := c.GetJsonBody()
  86. if err != nil {
  87. return nil, err
  88. }
  89. return jsonBody.Map(), nil
  90. }))
  91. copyBuilder = copyBuilder.Post(postRequest, deleteOptions.requestResponseCallback)
  92. if deleteOptions.afterBuilderCallback != nil {
  93. copyBuilder = deleteOptions.afterBuilderCallback(copyBuilder)
  94. }
  95. copyBuilder.Build(deleteMiddlewares...)
  96. }
  97. // 查询
  98. if !queryOptions.disable {
  99. queryMiddlewares := append(globalOptions.middlewares, queryOptions.middlewares...)
  100. copyBuilder := builder.Url(http.MethodGet, domainPath+"/query")
  101. getRequest := gateway.NewGetRequest(params.ServiceVersionedUrl+domainPath+"/query",
  102. gateway.GetRequestWithQueryParamsForm(func(c *api.Context, historyRequest []gateway.BuilderRequest, resultMap map[string]any) (map[string]string, error) {
  103. _, err := gateway.FormQueryParamsWithTenantIDAndUserIDFunc("tenantId", "")(c, historyRequest, resultMap)
  104. if err != nil {
  105. return nil, err
  106. }
  107. if queryOptions.beforeBuilderCallback != nil {
  108. copyBuilder = queryOptions.beforeBuilderCallback(copyBuilder, c)
  109. }
  110. return c.GetQueryParams().Map(), nil
  111. }))
  112. copyBuilder = copyBuilder.Get(getRequest, queryOptions.requestResponseCallback)
  113. if queryOptions.afterBuilderCallback != nil {
  114. copyBuilder = queryOptions.afterBuilderCallback(copyBuilder)
  115. }
  116. copyBuilder.Build(queryMiddlewares...)
  117. }
  118. }
  119. type ValueObjectCRUDBeforeCallback func(builder *gateway.Builder, c *api.Context) *gateway.Builder
  120. type ValueObjectCRUDAfterCallback func(builder *gateway.Builder) *gateway.Builder
  121. type ValueObjectCRUDGlobalOption func(options *ValueObjectCRUDGlobalOptions)
  122. type ValueObjectCRUDCreateOption func(options *ValueObjectCRUDCreateOptions)
  123. type ValueObjectCRUDDeleteOption func(options *ValueObjectCRUDDeleteOptions)
  124. type ValueObjectCRUDQueryOption func(options *ValueObjectCRUDQueryOptions)
  125. type ValueObjectCRUDGlobalOptions struct {
  126. middlewares []api.Handler
  127. }
  128. type ValueObjectCRUDCreateOptions struct {
  129. // 关闭创建
  130. disable bool
  131. // 创建请求前回调
  132. beforeBuilderCallback ValueObjectCRUDBeforeCallback
  133. // 创建请求响应回调
  134. requestResponseCallback gateway.RequestResponseCallback
  135. // 创建请求后回调
  136. afterBuilderCallback ValueObjectCRUDAfterCallback
  137. // 创建中间件
  138. middlewares []api.Handler
  139. }
  140. type ValueObjectCRUDDeleteOptions struct {
  141. // 关闭删除
  142. disable bool
  143. // 删除请求前回调
  144. beforeBuilderCallback ValueObjectCRUDBeforeCallback
  145. // 删除请求响应回调
  146. requestResponseCallback gateway.RequestResponseCallback
  147. // 删除请求后回调
  148. afterBuilderCallback ValueObjectCRUDAfterCallback
  149. // 删除中间件
  150. middlewares []api.Handler
  151. }
  152. type ValueObjectCRUDQueryOptions struct {
  153. // 关闭查询
  154. disable bool
  155. // 查询请求前回调
  156. beforeBuilderCallback ValueObjectCRUDBeforeCallback
  157. // 查询请求响应回调
  158. requestResponseCallback gateway.RequestResponseCallback
  159. // 查询请求后回调
  160. afterBuilderCallback ValueObjectCRUDAfterCallback
  161. // 查询中间件
  162. middlewares []api.Handler
  163. }
  164. func WithValueObjectCRUDGlobalMiddlewares(middlewares ...api.Handler) ValueObjectCRUDGlobalOption {
  165. return func(options *ValueObjectCRUDGlobalOptions) {
  166. options.middlewares = middlewares
  167. }
  168. }
  169. func WithValueObjectCRUDBeforeCreateBuilderCallback(callbacks ValueObjectCRUDBeforeCallback) ValueObjectCRUDCreateOption {
  170. return func(options *ValueObjectCRUDCreateOptions) {
  171. options.beforeBuilderCallback = callbacks
  172. }
  173. }
  174. func WithValueObjectCRUDCreateCallbacks(callbacks gateway.RequestResponseCallback) ValueObjectCRUDCreateOption {
  175. return func(options *ValueObjectCRUDCreateOptions) {
  176. options.requestResponseCallback = callbacks
  177. }
  178. }
  179. func WithValueObjectCRUDAfterCreateBuilderCallback(callbacks ValueObjectCRUDAfterCallback) ValueObjectCRUDCreateOption {
  180. return func(options *ValueObjectCRUDCreateOptions) {
  181. options.afterBuilderCallback = callbacks
  182. }
  183. }
  184. func WithValueObjectCRUDCreateMiddlewares(middlewares []api.Handler) ValueObjectCRUDCreateOption {
  185. return func(options *ValueObjectCRUDCreateOptions) {
  186. options.middlewares = middlewares
  187. }
  188. }
  189. func WithValueObjectCRUDDisableDelete() ValueObjectCRUDDeleteOption {
  190. return func(options *ValueObjectCRUDDeleteOptions) {
  191. options.disable = true
  192. }
  193. }
  194. func WithValueObjectCRUDBeforeDeleteBuilderCallback(callbacks ValueObjectCRUDBeforeCallback) ValueObjectCRUDDeleteOption {
  195. return func(options *ValueObjectCRUDDeleteOptions) {
  196. options.beforeBuilderCallback = callbacks
  197. }
  198. }
  199. func WithValueObjectCRUDDeleteCallbacks(callbacks gateway.RequestResponseCallback) ValueObjectCRUDDeleteOption {
  200. return func(options *ValueObjectCRUDDeleteOptions) {
  201. options.requestResponseCallback = callbacks
  202. }
  203. }
  204. func WithValueObjectCRUDAfterDeleteBuilderCallback(callbacks ValueObjectCRUDAfterCallback) ValueObjectCRUDDeleteOption {
  205. return func(options *ValueObjectCRUDDeleteOptions) {
  206. options.afterBuilderCallback = callbacks
  207. }
  208. }
  209. func WithValueObjectCRUDDeleteMiddlewares(middlewares []api.Handler) ValueObjectCRUDDeleteOption {
  210. return func(options *ValueObjectCRUDDeleteOptions) {
  211. options.middlewares = middlewares
  212. }
  213. }
  214. func WithValueObjectCRUDDisableQuery() ValueObjectCRUDQueryOption {
  215. return func(options *ValueObjectCRUDQueryOptions) {
  216. options.disable = true
  217. }
  218. }
  219. func WithValueObjectCRUDBeforeQueryBuilderCallback(callbacks ValueObjectCRUDBeforeCallback) ValueObjectCRUDQueryOption {
  220. return func(options *ValueObjectCRUDQueryOptions) {
  221. options.beforeBuilderCallback = callbacks
  222. }
  223. }
  224. func WithValueObjectCRUDQueryCallbacks(callbacks gateway.RequestResponseCallback) ValueObjectCRUDQueryOption {
  225. return func(options *ValueObjectCRUDQueryOptions) {
  226. options.requestResponseCallback = callbacks
  227. }
  228. }
  229. func WithValueObjectCRUDAfterQueryBuilderCallback(callbacks ValueObjectCRUDAfterCallback) ValueObjectCRUDQueryOption {
  230. return func(options *ValueObjectCRUDQueryOptions) {
  231. options.afterBuilderCallback = callbacks
  232. }
  233. }
  234. func WithValueObjectCRUDQueryMiddlewares(middlewares []api.Handler) ValueObjectCRUDQueryOption {
  235. return func(options *ValueObjectCRUDQueryOptions) {
  236. options.middlewares = middlewares
  237. }
  238. }