value_object_crud.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  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. )
  9. func BindSimple(builder *gateway.Builder, params *Simple, opts ...any) {
  10. globalOptions := new(GlobalOptions)
  11. createOptions := new(CreateOptions)
  12. deleteOptions := new(DeleteOptions)
  13. queryOptions := new(QueryOptions)
  14. for _, opt := range opts {
  15. switch o := opt.(type) {
  16. case GlobalOption:
  17. o(globalOptions)
  18. case CreateOption:
  19. o(createOptions)
  20. case DeleteOption:
  21. o(deleteOptions)
  22. case QueryOption:
  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.bind(builder)
  33. }
  34. type Simple struct {
  35. // 除去后缀的服务URL,如http://localhost:8080/example/api/v1
  36. ServiceVersionedUrl string
  37. // 服务缩写
  38. ServiceShortName string
  39. // 领域名称
  40. DomainCamelName string
  41. // 可选配置项,通过WithXXX配置
  42. globalOptions *GlobalOptions
  43. createOptions *CreateOptions
  44. deleteOptions *DeleteOptions
  45. queryOptions *QueryOptions
  46. }
  47. func (simple *Simple) bind(builder *gateway.Builder) {
  48. globalOptions := simple.globalOptions
  49. createOptions := simple.createOptions
  50. deleteOptions := simple.deleteOptions
  51. queryOptions := simple.queryOptions
  52. domainPath := "/" + strcase.ToLowerCamel(template.Id(simple.DomainCamelName))
  53. // 创建
  54. if !createOptions.disable {
  55. createMiddlewares := append(globalOptions.middlewares, createOptions.middlewares...)
  56. builder.PostRouteWithTenantIDAndCreateUserID("/"+simple.ServiceShortName+domainPath+"/create",
  57. func(requestBuilder *gateway.RequestBuilder) {
  58. if createOptions.responseSuccessCallback != nil {
  59. requestBuilder.ResponseSuccessCallback(func(c *api.Context, historyRequests []gateway.Request, resultMap map[string]any) {
  60. err := createOptions.responseSuccessCallback(c, historyRequests, resultMap)
  61. if err != nil {
  62. requestBuilder.ResponseError(err)
  63. return
  64. }
  65. })
  66. }
  67. if createOptions.responseErrorCallback != nil {
  68. requestBuilder.ResponseErrorCallback(func(c *api.Context, historyRequests []gateway.Request, resultMap map[string]any, err error) {
  69. retErr := createOptions.responseErrorCallback(c, historyRequests, resultMap, err)
  70. if retErr != nil {
  71. requestBuilder.ResponseError(retErr)
  72. return
  73. }
  74. })
  75. }
  76. requestBuilder.
  77. Post(
  78. &gateway.PostRequest{
  79. Url: simple.ServiceVersionedUrl + domainPath + "/create",
  80. },
  81. gateway.WithBeforeRequestCallback(
  82. func(c *api.Context, historyRequests []gateway.Request, resultMap map[string]any) error {
  83. if createOptions.beforeBuilderCallback != nil {
  84. err := createOptions.beforeBuilderCallback(c, historyRequests, resultMap)
  85. if err != nil {
  86. return err
  87. }
  88. }
  89. return nil
  90. }),
  91. gateway.WithRequestResponseCallback(
  92. func(c *api.Context, historyRequests []gateway.Request, resultMap map[string]any, response *http_client.Response) error {
  93. if createOptions.afterBuilderCallback != nil {
  94. err := createOptions.afterBuilderCallback(c, historyRequests, resultMap)
  95. if err != nil {
  96. return err
  97. }
  98. }
  99. return nil
  100. })).
  101. Request()
  102. }, createMiddlewares...)
  103. }
  104. // 删除
  105. if !deleteOptions.disable {
  106. deleteMiddlewares := append(globalOptions.middlewares, deleteOptions.middlewares...)
  107. builder.PostRoute("/"+simple.ServiceShortName+domainPath+"/delete",
  108. func(requestBuilder *gateway.RequestBuilder) {
  109. if deleteOptions.responseSuccessCallback != nil {
  110. requestBuilder.ResponseSuccessCallback(func(c *api.Context, historyRequests []gateway.Request, resultMap map[string]any) {
  111. err := deleteOptions.responseSuccessCallback(c, historyRequests, resultMap)
  112. if err != nil {
  113. requestBuilder.ResponseError(err)
  114. return
  115. }
  116. })
  117. }
  118. if deleteOptions.responseErrorCallback != nil {
  119. requestBuilder.ResponseErrorCallback(func(c *api.Context, historyRequests []gateway.Request, resultMap map[string]any, err error) {
  120. retErr := deleteOptions.responseErrorCallback(c, historyRequests, resultMap, err)
  121. if retErr != nil {
  122. requestBuilder.ResponseError(retErr)
  123. return
  124. }
  125. })
  126. }
  127. requestBuilder.
  128. Post(
  129. &gateway.PostRequest{
  130. Url: simple.ServiceVersionedUrl + domainPath + "/delete",
  131. },
  132. gateway.WithBeforeRequestCallback(
  133. func(c *api.Context, historyRequests []gateway.Request, resultMap map[string]any) error {
  134. if deleteOptions.beforeBuilderCallback != nil {
  135. err := deleteOptions.beforeBuilderCallback(c, historyRequests, resultMap)
  136. if err != nil {
  137. return err
  138. }
  139. }
  140. return nil
  141. }),
  142. gateway.WithRequestResponseCallback(
  143. func(c *api.Context, historyRequests []gateway.Request, resultMap map[string]any, response *http_client.Response) error {
  144. if deleteOptions.afterBuilderCallback != nil {
  145. err := deleteOptions.afterBuilderCallback(c, historyRequests, resultMap)
  146. if err != nil {
  147. return err
  148. }
  149. }
  150. return nil
  151. })).
  152. Request()
  153. }, deleteMiddlewares...)
  154. }
  155. // 查询
  156. if !queryOptions.disable {
  157. queryMiddlewares := append(globalOptions.middlewares, queryOptions.middlewares...)
  158. builder.GetRouteWithTenantID("/"+simple.ServiceShortName+domainPath+"/query",
  159. func(requestBuilder *gateway.RequestBuilder) {
  160. if queryOptions.responseSuccessCallback != nil {
  161. requestBuilder.ResponseSuccessCallback(func(c *api.Context, historyRequests []gateway.Request, resultMap map[string]any) {
  162. err := queryOptions.responseSuccessCallback(c, historyRequests, resultMap)
  163. if err != nil {
  164. requestBuilder.ResponseError(err)
  165. return
  166. }
  167. })
  168. }
  169. if queryOptions.responseErrorCallback != nil {
  170. requestBuilder.ResponseErrorCallback(func(c *api.Context, historyRequests []gateway.Request, resultMap map[string]any, err error) {
  171. retErr := queryOptions.responseErrorCallback(c, historyRequests, resultMap, err)
  172. if retErr != nil {
  173. requestBuilder.ResponseError(retErr)
  174. return
  175. }
  176. })
  177. }
  178. requestBuilder.
  179. Get(
  180. &gateway.GetRequest{
  181. Url: simple.ServiceVersionedUrl + domainPath + "/query",
  182. },
  183. gateway.WithBeforeRequestCallback(
  184. func(c *api.Context, historyRequests []gateway.Request, resultMap map[string]any) error {
  185. if queryOptions.beforeBuilderCallback != nil {
  186. err := queryOptions.beforeBuilderCallback(c, historyRequests, resultMap)
  187. if err != nil {
  188. return err
  189. }
  190. }
  191. return nil
  192. }),
  193. gateway.WithRequestResponseCallback(
  194. func(c *api.Context, historyRequests []gateway.Request, resultMap map[string]any, response *http_client.Response) error {
  195. if queryOptions.afterBuilderCallback != nil {
  196. err := queryOptions.afterBuilderCallback(c, historyRequests, resultMap)
  197. if err != nil {
  198. return err
  199. }
  200. }
  201. return nil
  202. })).
  203. Request()
  204. }, queryMiddlewares...)
  205. }
  206. }
  207. type RequestBuilderCallback func(c *api.Context, historyRequests []gateway.Request, resultMap map[string]any) error
  208. type RequestBuilderErrorCallback func(c *api.Context, historyRequests []gateway.Request, resultMap map[string]any, err error) error
  209. type GlobalOption func(options *GlobalOptions)
  210. type CreateOption func(options *CreateOptions)
  211. type DeleteOption func(options *DeleteOptions)
  212. type QueryOption func(options *QueryOptions)
  213. type GlobalOptions struct {
  214. middlewares []gateway.Handler
  215. }
  216. type CreateOptions struct {
  217. // 关闭创建
  218. disable bool
  219. // 创建请求前回调
  220. beforeBuilderCallback RequestBuilderCallback
  221. // 创建请求后回调
  222. afterBuilderCallback RequestBuilderCallback
  223. // responseSuccessCallback 成功响应回调
  224. responseSuccessCallback RequestBuilderCallback
  225. // responseErrorCallback 失败响应回调
  226. responseErrorCallback RequestBuilderErrorCallback
  227. // 创建中间件
  228. middlewares []gateway.Handler
  229. }
  230. type DeleteOptions struct {
  231. // 关闭删除
  232. disable bool
  233. // 删除请求前回调
  234. beforeBuilderCallback RequestBuilderCallback
  235. // 删除请求后回调
  236. afterBuilderCallback RequestBuilderCallback
  237. // responseSuccessCallback 成功响应回调
  238. responseSuccessCallback RequestBuilderCallback
  239. // responseErrorCallback 失败响应回调
  240. responseErrorCallback RequestBuilderErrorCallback
  241. // 删除中间件
  242. middlewares []gateway.Handler
  243. }
  244. type QueryOptions struct {
  245. // 关闭查询
  246. disable bool
  247. // 查询请求前回调
  248. beforeBuilderCallback RequestBuilderCallback
  249. // 查询请求后回调
  250. afterBuilderCallback RequestBuilderCallback
  251. // responseSuccessCallback 成功响应回调
  252. responseSuccessCallback RequestBuilderCallback
  253. // responseErrorCallback 失败响应回调
  254. responseErrorCallback RequestBuilderErrorCallback
  255. // 查询中间件
  256. middlewares []gateway.Handler
  257. }
  258. func WithGlobalMiddlewares(middlewares ...gateway.Handler) GlobalOption {
  259. return func(options *GlobalOptions) {
  260. options.middlewares = middlewares
  261. }
  262. }
  263. func WithBeforeCreateBuilderCallback(callbacks RequestBuilderCallback) CreateOption {
  264. return func(options *CreateOptions) {
  265. options.beforeBuilderCallback = callbacks
  266. }
  267. }
  268. func WithAfterCreateBuilderCallback(callbacks RequestBuilderCallback) CreateOption {
  269. return func(options *CreateOptions) {
  270. options.afterBuilderCallback = callbacks
  271. }
  272. }
  273. func WithCreateResponseSuccessCallback(responseSuccessCallback RequestBuilderCallback) CreateOption {
  274. return func(options *CreateOptions) {
  275. options.responseSuccessCallback = responseSuccessCallback
  276. }
  277. }
  278. func WithCreateResponseErrorCallback(responseErrorCallback RequestBuilderErrorCallback) CreateOption {
  279. return func(options *CreateOptions) {
  280. options.responseErrorCallback = responseErrorCallback
  281. }
  282. }
  283. func WithCreateMiddlewares(middlewares ...gateway.Handler) CreateOption {
  284. return func(options *CreateOptions) {
  285. options.middlewares = middlewares
  286. }
  287. }
  288. func WithDisableDelete() DeleteOption {
  289. return func(options *DeleteOptions) {
  290. options.disable = true
  291. }
  292. }
  293. func WithBeforeDeleteBuilderCallback(callbacks RequestBuilderCallback) DeleteOption {
  294. return func(options *DeleteOptions) {
  295. options.beforeBuilderCallback = callbacks
  296. }
  297. }
  298. func WithAfterDeleteBuilderCallback(callbacks RequestBuilderCallback) DeleteOption {
  299. return func(options *DeleteOptions) {
  300. options.afterBuilderCallback = callbacks
  301. }
  302. }
  303. func WithDeleteResponseSuccessCallback(responseSuccessCallback RequestBuilderCallback) DeleteOption {
  304. return func(options *DeleteOptions) {
  305. options.responseSuccessCallback = responseSuccessCallback
  306. }
  307. }
  308. func WithDeleteResponseErrorCallback(responseErrorCallback RequestBuilderErrorCallback) DeleteOption {
  309. return func(options *DeleteOptions) {
  310. options.responseErrorCallback = responseErrorCallback
  311. }
  312. }
  313. func WithDeleteMiddlewares(middlewares ...gateway.Handler) DeleteOption {
  314. return func(options *DeleteOptions) {
  315. options.middlewares = middlewares
  316. }
  317. }
  318. func WithDisableQuery() QueryOption {
  319. return func(options *QueryOptions) {
  320. options.disable = true
  321. }
  322. }
  323. func WithBeforeQueryBuilderCallback(callbacks RequestBuilderCallback) QueryOption {
  324. return func(options *QueryOptions) {
  325. options.beforeBuilderCallback = callbacks
  326. }
  327. }
  328. func WithAfterQueryBuilderCallback(callbacks RequestBuilderCallback) QueryOption {
  329. return func(options *QueryOptions) {
  330. options.afterBuilderCallback = callbacks
  331. }
  332. }
  333. func WithQueryResponseSuccessCallback(responseSuccessCallback RequestBuilderCallback) QueryOption {
  334. return func(options *QueryOptions) {
  335. options.responseSuccessCallback = responseSuccessCallback
  336. }
  337. }
  338. func WithQueryResponseErrorCallback(responseErrorCallback RequestBuilderErrorCallback) QueryOption {
  339. return func(options *QueryOptions) {
  340. options.responseErrorCallback = responseErrorCallback
  341. }
  342. }
  343. func WithQueryMiddlewares(middlewares ...gateway.Handler) QueryOption {
  344. return func(options *QueryOptions) {
  345. options.middlewares = middlewares
  346. }
  347. }