origin.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package web
  2. import (
  3. "context"
  4. "fmt"
  5. v1 "github.com/go-nunu/nunu-layout-advanced/api/v1"
  6. "github.com/go-nunu/nunu-layout-advanced/internal/model"
  7. )
  8. type Origin interface {
  9. CreateOriginServers(ctx context.Context, req *v1.WebForwardingRequest) (map[string]int64, error)
  10. AddOriginsToWebsite(ctx context.Context, req *v1.WebForwardingRequest, webId int64) (map[string]int64, error)
  11. UpdateOriginServers(ctx context.Context, req *v1.WebForwardingRequest, oldData *model.WebForwarding, ipData *model.WebForwardingRule) error
  12. }
  13. // CreateOriginServers 创建源站服务器
  14. func (s *aidedWebService) CreateOriginServers(ctx context.Context, req *v1.WebForwardingRequest) (map[string]int64, error) {
  15. cdnOriginIds := make(map[string]int64)
  16. for _, backend := range req.WebForwardingData.BackendList {
  17. apiType := s.GetProtocolType(backend.IsHttps)
  18. id, err := s.wafformatter.AddOrigin(ctx, v1.WebJson{
  19. ApiType: apiType,
  20. BackendList: backend.Addr,
  21. Host: backend.CustomHost,
  22. Comment: req.WebForwardingData.Comment,
  23. })
  24. if err != nil {
  25. return nil, fmt.Errorf("添加源站 %s 失败: %w", backend.Addr, err)
  26. }
  27. cdnOriginIds[backend.Addr] = id
  28. }
  29. return cdnOriginIds, nil
  30. }
  31. // AddOriginsToWebsite 添加源站到网站
  32. func (s *aidedWebService) AddOriginsToWebsite(ctx context.Context, req *v1.WebForwardingRequest, webId int64) (map[string]int64, error) {
  33. cdnOriginIds, err := s.CreateOriginServers(ctx, req)
  34. if err != nil {
  35. return nil, fmt.Errorf("创建源站服务器失败: %w", err)
  36. }
  37. // 添加源站到网站
  38. for _, originId := range cdnOriginIds {
  39. if err := s.cdn.AddServerOrigin(ctx, webId, originId); err != nil {
  40. return nil, fmt.Errorf("添加源站到网站失败: %w", err)
  41. }
  42. }
  43. return cdnOriginIds, nil
  44. }
  45. // UpdateOriginServers 更新源站服务器
  46. func (s *aidedWebService) UpdateOriginServers(ctx context.Context, req *v1.WebForwardingRequest, oldData *model.WebForwarding, ipData *model.WebForwardingRule) error {
  47. addOrigins, delOrigins := s.FindDifferenceList(ipData.BackendList, req.WebForwardingData.BackendList)
  48. addedIds := make(map[string]int64)
  49. // 添加新源站
  50. for _, v := range addOrigins {
  51. apiType := s.GetProtocolType(v.IsHttps)
  52. id, err := s.wafformatter.AddOrigin(ctx, v1.WebJson{
  53. ApiType: apiType,
  54. BackendList: v.Addr,
  55. Host: v.CustomHost,
  56. Comment: req.WebForwardingData.Comment,
  57. })
  58. if err != nil {
  59. return fmt.Errorf("添加源站 %s 失败: %w", v.Addr, err)
  60. }
  61. addedIds[v.Addr] = id
  62. }
  63. // 将新源站添加到网站
  64. for _, v := range addedIds {
  65. if err := s.cdn.AddServerOrigin(ctx, int64(oldData.CdnWebId), v); err != nil {
  66. return fmt.Errorf("添加源站到网站失败: %w", err)
  67. }
  68. }
  69. // 删除旧源站
  70. for k, v := range ipData.CdnOriginIds {
  71. for _, ip := range delOrigins {
  72. if k == ip.Addr {
  73. if err := s.cdn.DelServerOrigin(ctx, int64(oldData.CdnWebId), v); err != nil {
  74. return fmt.Errorf("删除源站失败: %w", err)
  75. }
  76. delete(ipData.CdnOriginIds, k)
  77. }
  78. }
  79. }
  80. // 合并新的源站ID
  81. for k, v := range addedIds {
  82. ipData.CdnOriginIds[k] = v
  83. }
  84. return nil
  85. }