package web import ( "context" "fmt" v1 "github.com/go-nunu/nunu-layout-advanced/api/v1" "github.com/go-nunu/nunu-layout-advanced/internal/model" ) type Origin interface { CreateOriginServers(ctx context.Context, req *v1.WebForwardingRequest) (map[string]int64, error) AddOriginsToWebsite(ctx context.Context, req *v1.WebForwardingRequest, webId int64) (map[string]int64, error) UpdateOriginServers(ctx context.Context, req *v1.WebForwardingRequest, oldData *model.WebForwarding, ipData *model.WebForwardingRule) error } // CreateOriginServers 创建源站服务器 func (s *aidedWebService) CreateOriginServers(ctx context.Context, req *v1.WebForwardingRequest) (map[string]int64, error) { cdnOriginIds := make(map[string]int64) for _, backend := range req.WebForwardingData.BackendList { apiType := s.GetProtocolType(backend.IsHttps) id, err := s.wafformatter.AddOrigin(ctx, v1.WebJson{ ApiType: apiType, BackendList: backend.Addr, Host: backend.CustomHost, Comment: req.WebForwardingData.Comment, }) if err != nil { return nil, fmt.Errorf("添加源站 %s 失败: %w", backend.Addr, err) } cdnOriginIds[backend.Addr] = id } return cdnOriginIds, nil } // AddOriginsToWebsite 添加源站到网站 func (s *aidedWebService) AddOriginsToWebsite(ctx context.Context, req *v1.WebForwardingRequest, webId int64) (map[string]int64, error) { cdnOriginIds, err := s.CreateOriginServers(ctx, req) if err != nil { return nil, fmt.Errorf("创建源站服务器失败: %w", err) } // 添加源站到网站 for _, originId := range cdnOriginIds { if err := s.cdn.AddServerOrigin(ctx, webId, originId); err != nil { return nil, fmt.Errorf("添加源站到网站失败: %w", err) } } return cdnOriginIds, nil } // UpdateOriginServers 更新源站服务器 func (s *aidedWebService) UpdateOriginServers(ctx context.Context, req *v1.WebForwardingRequest, oldData *model.WebForwarding, ipData *model.WebForwardingRule) error { addOrigins, delOrigins := s.FindDifferenceList(ipData.BackendList, req.WebForwardingData.BackendList) addedIds := make(map[string]int64) // 添加新源站 for _, v := range addOrigins { apiType := s.GetProtocolType(v.IsHttps) id, err := s.wafformatter.AddOrigin(ctx, v1.WebJson{ ApiType: apiType, BackendList: v.Addr, Host: v.CustomHost, Comment: req.WebForwardingData.Comment, }) if err != nil { return fmt.Errorf("添加源站 %s 失败: %w", v.Addr, err) } addedIds[v.Addr] = id } // 将新源站添加到网站 for _, v := range addedIds { if err := s.cdn.AddServerOrigin(ctx, int64(oldData.CdnWebId), v); err != nil { return fmt.Errorf("添加源站到网站失败: %w", err) } } // 删除旧源站 for k, v := range ipData.CdnOriginIds { for _, ip := range delOrigins { if k == ip.Addr { if err := s.cdn.DelServerOrigin(ctx, int64(oldData.CdnWebId), v); err != nil { return fmt.Errorf("删除源站失败: %w", err) } delete(ipData.CdnOriginIds, k) } } } // 合并新的源站ID for k, v := range addedIds { ipData.CdnOriginIds[k] = v } return nil }