builder.go 4.4 KB

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