builder.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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 Result struct {
  8. Result map[string]any
  9. Custom map[string]any
  10. }
  11. type RequestCallbackFunc func(c *api.Context, response *http_client.Response, err error, customResultMap map[string]any)
  12. type GlobalRequestCallbackFunc func(c *api.Context, request BuilderRequest, err error, historyRequests []BuilderRequest, customResultMap map[string]any)
  13. type Builder struct {
  14. router api.Router
  15. httpClient *http_client.Client
  16. httpTimeoutSec int64
  17. params *builderParams
  18. }
  19. func newBuilder(router api.Router, httpClient *http_client.Client) *Builder {
  20. return &Builder{
  21. router: router,
  22. httpClient: httpClient,
  23. params: newBuilderParams(),
  24. }
  25. }
  26. func (builder *Builder) Url(httpMethod string, relativePath string) *Builder {
  27. copyBuilder := builder.copy()
  28. copyBuilder.params.httpMethod = httpMethod
  29. copyBuilder.params.relativePath = relativePath
  30. return copyBuilder
  31. }
  32. func (builder *Builder) Post(request *PostRequest, requestCallbackFunc RequestCallbackFunc) *Builder {
  33. return builder.addRequest(newBuilderRequestItem(request, requestCallbackFunc))
  34. }
  35. func (builder *Builder) Delete(request *DeleteRequest, requestCallbackFunc RequestCallbackFunc) *Builder {
  36. return builder.addRequest(newBuilderRequestItem(request, requestCallbackFunc))
  37. }
  38. func (builder *Builder) Put(request *PutRequest, requestCallbackFunc RequestCallbackFunc) *Builder {
  39. return builder.addRequest(newBuilderRequestItem(request, requestCallbackFunc))
  40. }
  41. func (builder *Builder) Get(request *GetRequest, requestCallbackFunc RequestCallbackFunc) *Builder {
  42. return builder.addRequest(newBuilderRequestItem(request, requestCallbackFunc))
  43. }
  44. func (builder *Builder) RequestCallbackFunc(globalRequestCallbackFunc GlobalRequestCallbackFunc) *Builder {
  45. copyBuilder := builder.copy()
  46. copyBuilder.params.globalRequestCallbackFunc = globalRequestCallbackFunc
  47. return copyBuilder
  48. }
  49. func (builder *Builder) Build(middlewares ...api.Handler) {
  50. copyBuilder := builder.copy()
  51. copyBuilder.router.AddRoute(builder.params.httpMethod, builder.params.relativePath, append(middlewares,
  52. func(c *api.Context) {
  53. httpRequest := builder.httpClient.NewRequest(http_client.WithNewRequestTimeout(time.Duration(builder.httpTimeoutSec) * time.Second))
  54. historyRequests := make([]BuilderRequest, 0)
  55. result := Result{
  56. Result: make(map[string]any),
  57. Custom: make(map[string]any),
  58. }
  59. for _, requestItem := range builder.params.requestItems {
  60. err := requestItem.request.Request(httpRequest)
  61. if requestItem.requestCallbackFunc != nil {
  62. requestItem.requestCallbackFunc(c, requestItem.request.Response(), err, result.Custom)
  63. return
  64. }
  65. if builder.params.globalRequestCallbackFunc != nil {
  66. builder.params.globalRequestCallbackFunc(c, requestItem.request, err, historyRequests, result.Custom)
  67. continue
  68. }
  69. // TODO
  70. if err != nil {
  71. }
  72. historyRequests = append(historyRequests, requestItem.request)
  73. return
  74. }
  75. // TODO 最终结果处理
  76. })...)
  77. }
  78. func (builder *Builder) addRequest(item *builderRequestItem) *Builder {
  79. copyBuilder := builder.copy()
  80. copyBuilder.params.requestItems = append(copyBuilder.params.requestItems, item)
  81. return copyBuilder
  82. }
  83. func (builder *Builder) copy() *Builder {
  84. copyBuilder := newBuilder(builder.router, builder.httpClient)
  85. copyBuilder.params = copyBuilder.params.copy()
  86. return copyBuilder
  87. }