value_object_crud.go 7.6 KB

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