value_object_crud.go 9.6 KB

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