value_object_crud.go 9.5 KB

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