value_object_crud.go 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. package value_object_crud
  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 BindSimple(builder *gateway.Builder, params *Simple, opts ...any) {
  11. globalOptions := new(GlobalOptions)
  12. createOptions := new(CreateOptions)
  13. deleteOptions := new(DeleteOptions)
  14. queryOptions := new(QueryOptions)
  15. for _, opt := range opts {
  16. switch o := opt.(type) {
  17. case GlobalOption:
  18. o(globalOptions)
  19. case CreateOption:
  20. o(createOptions)
  21. case DeleteOption:
  22. o(deleteOptions)
  23. case QueryOption:
  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.bind(builder)
  34. }
  35. type Simple struct {
  36. // 除去后缀的服务URL,如http://localhost:8080/example/api/v1
  37. ServiceVersionedUrl string
  38. // 领域名称
  39. DomainCamelName string
  40. // 可选配置项,通过WithXXX配置
  41. globalOptions *GlobalOptions
  42. createOptions *CreateOptions
  43. deleteOptions *DeleteOptions
  44. queryOptions *QueryOptions
  45. }
  46. func (simple *Simple) bind(builder *gateway.Builder) {
  47. globalOptions := simple.globalOptions
  48. createOptions := simple.createOptions
  49. deleteOptions := simple.deleteOptions
  50. queryOptions := simple.queryOptions
  51. domainPath := "/" + strcase.ToLowerCamel(template.Id(simple.DomainCamelName))
  52. // 创建
  53. if !createOptions.disable {
  54. createMiddlewares := append(globalOptions.middlewares, createOptions.middlewares...)
  55. copyBuilder := builder.Url(http.MethodPost, domainPath+"/create")
  56. copyBuilder.
  57. Post(&gateway.PostRequest{
  58. Url: simple.ServiceVersionedUrl + domainPath + "/create",
  59. BodyFormFunc: func(c *api.Context, body any, historyRequests []gateway.BuilderRequest, resultMap map[string]any) (any, error) {
  60. _, err := gateway.FormJsonBodyWithTenantIDAndUserIDFunc("tenantId", "createUserId")(c, body, historyRequests, resultMap)
  61. if err != nil {
  62. return nil, err
  63. }
  64. if createOptions.beforeBuilderCallback != nil {
  65. innerBuilder, err := createOptions.beforeBuilderCallback(copyBuilder, c, historyRequests, resultMap)
  66. if err != nil {
  67. return nil, err
  68. }
  69. copyBuilder = innerBuilder
  70. }
  71. jsonBody, err := c.GetJsonBody()
  72. if err != nil {
  73. return nil, err
  74. }
  75. return jsonBody.Map(), nil
  76. },
  77. HeadersFormFunc: nil,
  78. }, gateway.WithRequestResponseCallback(
  79. func(c *api.Context, response *http_client.Response, historyRequests []gateway.BuilderRequest, resultMap map[string]any) error {
  80. if createOptions.afterBuilderCallback != nil {
  81. innerBuilder, err := createOptions.afterBuilderCallback(copyBuilder, c, historyRequests, resultMap)
  82. if err != nil {
  83. return err
  84. }
  85. copyBuilder = innerBuilder
  86. }
  87. return nil
  88. })).
  89. Build(createMiddlewares...)
  90. }
  91. // 删除
  92. if !deleteOptions.disable {
  93. deleteMiddlewares := append(globalOptions.middlewares, deleteOptions.middlewares...)
  94. copyBuilder := builder.Url(http.MethodPost, domainPath+"/delete")
  95. copyBuilder.
  96. Post(&gateway.PostRequest{
  97. Url: simple.ServiceVersionedUrl + domainPath + "/delete",
  98. BodyFormFunc: func(c *api.Context, _ any, historyRequests []gateway.BuilderRequest, resultMap map[string]any) (any, error) {
  99. if deleteOptions.beforeBuilderCallback != nil {
  100. innerBuilder, err := deleteOptions.beforeBuilderCallback(copyBuilder, c, historyRequests, resultMap)
  101. if err != nil {
  102. return nil, err
  103. }
  104. copyBuilder = innerBuilder
  105. }
  106. jsonBody, err := c.GetJsonBody()
  107. if err != nil {
  108. return nil, err
  109. }
  110. return jsonBody.Map(), nil
  111. },
  112. HeadersFormFunc: nil,
  113. }, gateway.WithRequestResponseCallback(
  114. func(c *api.Context, response *http_client.Response, historyRequests []gateway.BuilderRequest, resultMap map[string]any) error {
  115. if deleteOptions.afterBuilderCallback != nil {
  116. innerBuilder, err := deleteOptions.afterBuilderCallback(copyBuilder, c, historyRequests, resultMap)
  117. if err != nil {
  118. return err
  119. }
  120. copyBuilder = innerBuilder
  121. }
  122. return nil
  123. })).
  124. Build(deleteMiddlewares...)
  125. }
  126. // 查询
  127. if !queryOptions.disable {
  128. queryMiddlewares := append(globalOptions.middlewares, queryOptions.middlewares...)
  129. copyBuilder := builder.Url(http.MethodGet, domainPath+"/query")
  130. copyBuilder.
  131. Get(&gateway.GetRequest{
  132. Url: simple.ServiceVersionedUrl + domainPath + "/query",
  133. QueryParamsFormFunc: func(c *api.Context, queryParams map[string]string, historyRequests []gateway.BuilderRequest, resultMap map[string]any) (map[string]string, error) {
  134. _, err := gateway.FormQueryParamsWithTenantIDAndUserIDFunc("tenantId", "")(c, queryParams, historyRequests, resultMap)
  135. if err != nil {
  136. return nil, err
  137. }
  138. if queryOptions.beforeBuilderCallback != nil {
  139. innerBuilder, err := queryOptions.beforeBuilderCallback(copyBuilder, c, historyRequests, resultMap)
  140. if err != nil {
  141. return nil, err
  142. }
  143. copyBuilder = innerBuilder
  144. }
  145. return c.GetQueryParams().Map(), nil
  146. },
  147. }, gateway.WithRequestResponseCallback(
  148. func(c *api.Context, response *http_client.Response, historyRequests []gateway.BuilderRequest, resultMap map[string]any) error {
  149. if queryOptions.afterBuilderCallback != nil {
  150. innerBuilder, err := queryOptions.afterBuilderCallback(copyBuilder, c, historyRequests, resultMap)
  151. if err != nil {
  152. return err
  153. }
  154. copyBuilder = innerBuilder
  155. }
  156. return nil
  157. })).
  158. Build(queryMiddlewares...)
  159. }
  160. }
  161. type BuilderCallback func(builder *gateway.Builder, c *api.Context, historyRequests []gateway.BuilderRequest, resultMap map[string]any) (*gateway.Builder, error)
  162. type GlobalOption func(options *GlobalOptions)
  163. type CreateOption func(options *CreateOptions)
  164. type DeleteOption func(options *DeleteOptions)
  165. type QueryOption func(options *QueryOptions)
  166. type GlobalOptions struct {
  167. middlewares []api.Handler
  168. }
  169. type CreateOptions struct {
  170. // 关闭创建
  171. disable bool
  172. // 创建请求前回调
  173. beforeBuilderCallback BuilderCallback
  174. // 创建请求后回调
  175. afterBuilderCallback BuilderCallback
  176. // 创建中间件
  177. middlewares []api.Handler
  178. }
  179. type DeleteOptions struct {
  180. // 关闭删除
  181. disable bool
  182. // 删除请求前回调
  183. beforeBuilderCallback BuilderCallback
  184. // 删除请求后回调
  185. afterBuilderCallback BuilderCallback
  186. // 删除中间件
  187. middlewares []api.Handler
  188. }
  189. type QueryOptions struct {
  190. // 关闭查询
  191. disable bool
  192. // 查询请求前回调
  193. beforeBuilderCallback BuilderCallback
  194. // 查询请求后回调
  195. afterBuilderCallback BuilderCallback
  196. // 查询中间件
  197. middlewares []api.Handler
  198. }
  199. func WithGlobalMiddlewares(middlewares ...api.Handler) GlobalOption {
  200. return func(options *GlobalOptions) {
  201. options.middlewares = middlewares
  202. }
  203. }
  204. func WithBeforeCreateBuilderCallback(callbacks BuilderCallback) CreateOption {
  205. return func(options *CreateOptions) {
  206. options.beforeBuilderCallback = callbacks
  207. }
  208. }
  209. func WithAfterCreateBuilderCallback(callbacks BuilderCallback) CreateOption {
  210. return func(options *CreateOptions) {
  211. options.afterBuilderCallback = callbacks
  212. }
  213. }
  214. func WithCreateMiddlewares(middlewares []api.Handler) CreateOption {
  215. return func(options *CreateOptions) {
  216. options.middlewares = middlewares
  217. }
  218. }
  219. func WithDisableDelete() DeleteOption {
  220. return func(options *DeleteOptions) {
  221. options.disable = true
  222. }
  223. }
  224. func WithBeforeDeleteBuilderCallback(callbacks BuilderCallback) DeleteOption {
  225. return func(options *DeleteOptions) {
  226. options.beforeBuilderCallback = callbacks
  227. }
  228. }
  229. func WithAfterDeleteBuilderCallback(callbacks BuilderCallback) DeleteOption {
  230. return func(options *DeleteOptions) {
  231. options.afterBuilderCallback = callbacks
  232. }
  233. }
  234. func WithDeleteMiddlewares(middlewares []api.Handler) DeleteOption {
  235. return func(options *DeleteOptions) {
  236. options.middlewares = middlewares
  237. }
  238. }
  239. func WithDisableQuery() QueryOption {
  240. return func(options *QueryOptions) {
  241. options.disable = true
  242. }
  243. }
  244. func WithBeforeQueryBuilderCallback(callbacks BuilderCallback) QueryOption {
  245. return func(options *QueryOptions) {
  246. options.beforeBuilderCallback = callbacks
  247. }
  248. }
  249. func WithAfterQueryBuilderCallback(callbacks BuilderCallback) QueryOption {
  250. return func(options *QueryOptions) {
  251. options.afterBuilderCallback = callbacks
  252. }
  253. }
  254. func WithQueryMiddlewares(middlewares []api.Handler) QueryOption {
  255. return func(options *QueryOptions) {
  256. options.middlewares = middlewares
  257. }
  258. }