builder.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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, httpTimeoutSec int64) *Builder {
  18. return &Builder{
  19. router: router,
  20. httpClient: httpClient,
  21. httpTimeoutSec: httpTimeoutSec,
  22. params: newBuilderParams(),
  23. }
  24. }
  25. func (builder *Builder) Url(httpMethod string, relativePath string) *Builder {
  26. copyBuilder := builder.copy()
  27. copyBuilder.params.httpMethod = httpMethod
  28. copyBuilder.params.relativePath = relativePath
  29. return copyBuilder
  30. }
  31. func (builder *Builder) Post(request *PostRequest, requestCallbackFunc RequestCallbackFunc) *Builder {
  32. return builder.addRequest(newBuilderRequestItem(request, requestCallbackFunc))
  33. }
  34. func (builder *Builder) Delete(request *DeleteRequest, requestCallbackFunc RequestCallbackFunc) *Builder {
  35. return builder.addRequest(newBuilderRequestItem(request, requestCallbackFunc))
  36. }
  37. func (builder *Builder) Put(request *PutRequest, requestCallbackFunc RequestCallbackFunc) *Builder {
  38. return builder.addRequest(newBuilderRequestItem(request, requestCallbackFunc))
  39. }
  40. func (builder *Builder) Get(request *GetRequest, requestCallbackFunc RequestCallbackFunc) *Builder {
  41. return builder.addRequest(newBuilderRequestItem(request, requestCallbackFunc))
  42. }
  43. func (builder *Builder) GlobalRequestCallbackFunc(globalRequestCallbackFunc GlobalRequestCallbackFunc) *Builder {
  44. copyBuilder := builder.copy()
  45. copyBuilder.params.globalRequestCallbackFunc = globalRequestCallbackFunc
  46. return copyBuilder
  47. }
  48. func (builder *Builder) ResponseSuccessFunc(responseSuccessFunc ResponseSuccessFunc) *Builder {
  49. copyBuilder := builder.copy()
  50. copyBuilder.params.responseSuccessFunc = responseSuccessFunc
  51. return copyBuilder
  52. }
  53. func (builder *Builder) ResponseErrorFunc(responseErrorFunc ResponseErrorFunc) *Builder {
  54. copyBuilder := builder.copy()
  55. copyBuilder.params.responseErrorFunc = responseErrorFunc
  56. return copyBuilder
  57. }
  58. func (builder *Builder) Build(middlewares ...api.Handler) {
  59. copyBuilder := builder.copy()
  60. copyBuilder.router.AddRoute(builder.params.httpMethod, builder.params.relativePath, append(middlewares,
  61. func(c *api.Context) {
  62. httpRequest := builder.httpClient.NewRequest(http_client.WithNewRequestTimeout(time.Duration(builder.httpTimeoutSec) * time.Second))
  63. historyRequests := make([]BuilderRequest, 0)
  64. resultMap := make(map[string]any)
  65. for _, requestItem := range builder.params.requestItems {
  66. err := requestItem.request.Request(httpRequest)
  67. if err != nil {
  68. builder.params.responseErrorFunc(c, err)
  69. return
  70. }
  71. if requestItem.requestCallbackFunc != nil {
  72. err := requestItem.requestCallbackFunc(c, requestItem.request.Response(), resultMap)
  73. if err != nil {
  74. builder.params.responseErrorFunc(c, err)
  75. return
  76. }
  77. continue
  78. }
  79. if builder.params.globalRequestCallbackFunc != nil {
  80. err := builder.params.globalRequestCallbackFunc(c, requestItem.request, historyRequests, resultMap)
  81. if err != nil {
  82. builder.params.responseErrorFunc(c, err)
  83. return
  84. }
  85. continue
  86. }
  87. historyRequests = append(historyRequests, requestItem.request)
  88. }
  89. builder.params.responseSuccessFunc(c, historyRequests, resultMap)
  90. })...)
  91. }
  92. func (builder *Builder) addRequest(item *builderRequestItem) *Builder {
  93. copyBuilder := builder.copy()
  94. copyBuilder.params.requestItems = append(copyBuilder.params.requestItems, item)
  95. return copyBuilder
  96. }
  97. func (builder *Builder) copy() *Builder {
  98. copyBuilder := newBuilder(builder.router, builder.httpClient, builder.httpTimeoutSec)
  99. copyBuilder.params = builder.params.copy()
  100. return copyBuilder
  101. }