builder.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package gateway
  2. import (
  3. "git.sxidc.com/go-framework/baize/framework/core/api"
  4. "git.sxidc.com/go-tools/utils/http_client"
  5. "time"
  6. )
  7. type RequestCallbackFunc func(c *api.Context, response *http_client.Response, customResultMap map[string]any) error
  8. type GlobalRequestCallbackFunc func(c *api.Context, request BuilderRequest, historyRequests []BuilderRequest, customResultMap map[string]any) error
  9. type ResponseSuccessFunc func(c *api.Context, historyRequests []BuilderRequest, customResultMap map[string]any)
  10. type ResponseErrorFunc func(c *api.Context, err error)
  11. type Builder struct {
  12. router api.Router
  13. httpClient *http_client.Client
  14. httpTimeoutSec int64
  15. params *builderParams
  16. }
  17. func newBuilder(router api.Router, httpClient *http_client.Client) *Builder {
  18. return &Builder{
  19. router: router,
  20. httpClient: httpClient,
  21. params: newBuilderParams(),
  22. }
  23. }
  24. func (builder *Builder) Url(httpMethod string, relativePath string) *Builder {
  25. copyBuilder := builder.copy()
  26. copyBuilder.params.httpMethod = httpMethod
  27. copyBuilder.params.relativePath = relativePath
  28. return copyBuilder
  29. }
  30. func (builder *Builder) Post(request *PostRequest, requestCallbackFunc RequestCallbackFunc) *Builder {
  31. return builder.addRequest(newBuilderRequestItem(request, requestCallbackFunc))
  32. }
  33. func (builder *Builder) Delete(request *DeleteRequest, requestCallbackFunc RequestCallbackFunc) *Builder {
  34. return builder.addRequest(newBuilderRequestItem(request, requestCallbackFunc))
  35. }
  36. func (builder *Builder) Put(request *PutRequest, requestCallbackFunc RequestCallbackFunc) *Builder {
  37. return builder.addRequest(newBuilderRequestItem(request, requestCallbackFunc))
  38. }
  39. func (builder *Builder) Get(request *GetRequest, requestCallbackFunc RequestCallbackFunc) *Builder {
  40. return builder.addRequest(newBuilderRequestItem(request, requestCallbackFunc))
  41. }
  42. func (builder *Builder) GlobalRequestCallbackFunc(globalRequestCallbackFunc GlobalRequestCallbackFunc) *Builder {
  43. copyBuilder := builder.copy()
  44. copyBuilder.params.globalRequestCallbackFunc = globalRequestCallbackFunc
  45. return copyBuilder
  46. }
  47. func (builder *Builder) ResponseSuccessFunc(responseSuccessFunc ResponseSuccessFunc) *Builder {
  48. copyBuilder := builder.copy()
  49. copyBuilder.params.responseSuccessFunc = responseSuccessFunc
  50. return copyBuilder
  51. }
  52. func (builder *Builder) ResponseErrorFunc(responseErrorFunc ResponseErrorFunc) *Builder {
  53. copyBuilder := builder.copy()
  54. copyBuilder.params.responseErrorFunc = responseErrorFunc
  55. return copyBuilder
  56. }
  57. func (builder *Builder) Build(middlewares ...api.Handler) {
  58. copyBuilder := builder.copy()
  59. copyBuilder.router.AddRoute(builder.params.httpMethod, builder.params.relativePath, append(middlewares,
  60. func(c *api.Context) {
  61. httpRequest := builder.httpClient.NewRequest(http_client.WithNewRequestTimeout(time.Duration(builder.httpTimeoutSec) * time.Second))
  62. historyRequests := make([]BuilderRequest, 0)
  63. resultMap := make(map[string]any)
  64. for _, requestItem := range builder.params.requestItems {
  65. err := requestItem.request.Request(httpRequest)
  66. if err != nil {
  67. builder.params.responseErrorFunc(c, err)
  68. return
  69. }
  70. if requestItem.requestCallbackFunc != nil {
  71. err := requestItem.requestCallbackFunc(c, requestItem.request.Response(), resultMap)
  72. if err != nil {
  73. builder.params.responseErrorFunc(c, err)
  74. return
  75. }
  76. continue
  77. }
  78. if builder.params.globalRequestCallbackFunc != nil {
  79. err := builder.params.globalRequestCallbackFunc(c, requestItem.request, historyRequests, resultMap)
  80. if err != nil {
  81. builder.params.responseErrorFunc(c, err)
  82. return
  83. }
  84. continue
  85. }
  86. historyRequests = append(historyRequests, requestItem.request)
  87. }
  88. builder.params.responseSuccessFunc(c, historyRequests, resultMap)
  89. })...)
  90. }
  91. func (builder *Builder) addRequest(item *builderRequestItem) *Builder {
  92. copyBuilder := builder.copy()
  93. copyBuilder.params.requestItems = append(copyBuilder.params.requestItems, item)
  94. return copyBuilder
  95. }
  96. func (builder *Builder) copy() *Builder {
  97. copyBuilder := newBuilder(builder.router, builder.httpClient)
  98. copyBuilder.params = builder.params.copy()
  99. return copyBuilder
  100. }