Quellcode durchsuchen

refactor(cdn): 重构创建网站接口并优化 SSL 证书处理

- 新增 WebsiteSend 结构体用于创建网站请求
- 修改 CreateWebsite 接口签名,使用 WebsiteSend 作为参数
-优化 SSL 证书处理逻辑,使用 map 进行快速查找
- 调整 TCP/UDP/Web 转发服务中的网站创建流程
- 新增 BulidFormData 方法用于构建创建网站所需的表单数据
fusu vor 1 Monat
Ursprung
Commit
08267b52c3

+ 22 - 0
api/v1/cdn.go

@@ -58,6 +58,28 @@ type Website struct {
 	ExcludeNodesJSON string  `json:"excludeNodesJSON" form:"excludeNodesJSON"`           // 备用参数,不用填写
 }
 
+
+type WebsiteSend struct {
+	UserId           int64   `json:"userId" form:"userId"`                               //可选项,用户ID,如果不想指定用户,此值可以为0
+	AdminId          int64   `json:"adminId" form:"adminId"`                             //可选项,管理员ID
+	Type             string  `json:"type" form:"type"`                                   // 类型:httpProxy(HTTP反向代理,一般CDN服务都选这个)、httpWeb(静态文件服务,只会从服务器上读取文件内容,不会转发到源站)、tcpProxy(TCP反向代理)、udpProxy(UDP反向代理)
+	Name             string  `json:"name" form:"name"`                                   // 网站名称
+	Description      string  `json:"description" form:"description"`                     // 可选项,网站描述
+	ServerNamesJSON  []byte  `json:"serverNamesJSON,omitempty" form:"serverNamesJSON"`   // 域名列表 json:server_names
+	HttpJSON         []byte `json:"httpJSON,omitempty" form:"httpJSON"`                 // HTTP协议设置,当type为httpProxy或者httpWeb时填写 json:http_protocol
+	HttpsJSON        []byte  `json:"httpsJSON,omitempty" form:"httpsJSON"`               // HTTPS协议设置,当type为httpProxy或者httpWeb时填写 json:https_protocol
+	TcpJSON          []byte  `json:"tcpJSON,omitempty" form:"tcpJSON"`                   // TCP协议设置,当type为tcpProxy时填写 json:tcp_protocol
+	TlsJSON          []byte  `json:"tlsJSON,omitempty" form:"tlsJSON"`                   // TLS协议设置,当type为tcpProxy时填写 json:tls_protocol
+	UdpJSON          []byte  `json:"udpJSON,omitempty" form:"udpJSON"`                   // UDP协议设置,当type为udpProxy时填写 json:udp_protocol
+	WebId            int64   `json:"webId" form:"webId"`                                 // 可选项,Web配置ID,当type为httpProxy或者httpWeb时填写,可以通过 /HTTPWebService/createHTTPWeb 接口创建;如果你需要配置缓存等信息时需要在 HTTPWebService 接口操作=
+	ReverseProxyJSON []byte  `json:"reverseProxyJSON,omitempty" form:"reverseProxyJSON"` // 反向代理(包含源站)配置引用,此项可以在创建网站后再设置 json:reverse_proxy_ref
+	ServerGroupIds   []int64 `json:"serverGroupIds" form:"serverGroupIds"`               // 可选项,所属网站分组ID列表
+	UserPlanId       int64   `json:"userPlanId" form:"userPlanId"`                       // 可选项,套餐ID
+	NodeClusterId    int64   `json:"nodeClusterId" form:"nodeClusterId"`                 // 所部署的集群ID
+	IncludeNodesJSON string  `json:"includeNodesJSON" form:"includeNodesJSON"`           // 备用参数,不用填写
+	ExcludeNodesJSON string  `json:"excludeNodesJSON" form:"excludeNodesJSON"`           // 备用参数,不用填写
+}
+
 type TypeJSON struct {
 	IsOn         bool         `json:"isOn" form:"isOn"`                 // 是否开启
 	Listen       []Listen     `json:"listen" form:"listen"`             // 监听端口

+ 4 - 20
internal/service/cdn.go

@@ -18,7 +18,7 @@ type CdnService interface {
 	CreateGroup(ctx context.Context, req v1.Group) (int64, error)
 	BindPlan(ctx context.Context, req v1.Plan) (int64, error)
 	RenewPlan(ctx context.Context, req v1.RenewalPlan) error
-	CreateWebsite(ctx context.Context, req v1.Website) (int64, error)
+	CreateWebsite(ctx context.Context, req v1.WebsiteSend) (int64, error)
 	EditServerType(ctx context.Context, req v1.EditWebsite, apiType string) error
 	EditProtocol(ctx context.Context, req v1.ProxyJson, action string) error
 	CreateOrigin(ctx context.Context, req v1.Origin) (int64, error)
@@ -309,31 +309,15 @@ func (s *cdnService) RenewPlan(ctx context.Context, req v1.RenewalPlan) error {
 }
 
 // 创建网站
-func (s *cdnService) CreateWebsite(ctx context.Context, req v1.Website) (int64, error) {
-	var httpJSON, httpsJSON []byte
-	var err error
-	if req.HttpJSON.Listen != nil {
-		httpJSON, err = json.Marshal(req.HttpJSON)
-		if err != nil {
-			return 0, err
-		}
-	}
-	if req.HttpsJSON.Listen != nil {
-		httpsJSON, err = json.Marshal(req.HttpsJSON)
-		if err != nil {
-			return 0, err
-		}
-	}
-
-
+func (s *cdnService) CreateWebsite(ctx context.Context, req v1.WebsiteSend) (int64, error) {
 	formData := map[string]interface{}{
 		"userId":           req.UserId,
 		"type":             req.Type,
 		"name":             req.Name,
 		"description":      req.Description,
 		"serverNamesJSON":  req.ServerNamesJSON,
-		"httpJSON":         httpJSON,
-		"httpsJSON":        httpsJSON,
+		"httpJSON":         req.HttpJSON,
+		"httpsJSON":        req.HttpsJSON,
 		"tcpJSON":          req.TcpJSON,
 		"tlsJSON":          req.TlsJSON,
 		"udpJSON":          req.UdpJSON,

+ 18 - 21
internal/service/sslcert.go

@@ -116,23 +116,25 @@ func (s *sslCertService) EditSslPolicy(ctx context.Context, sslPolicyId int64, C
 	if err != nil {
 		return fmt.Errorf("获取SSL证书失败: %w", err)
 	}
-	if len(oldCertIds) == 0 {
-		return nil
-	}
 
 	var sslCertsSlice []sslCerts
 
+	newCertIdSet := make(map[int64]struct{}, len(CertIds))
+	for _, certId := range CertIds {
+		newCertIdSet[certId] = struct{}{}
+	}
+
+	oldCertIdSet := make(map[int64]struct{}, len(oldCertIds))
+	for _, oldCert := range oldCertIds {
+		oldCertIdSet[oldCert.CertId] = struct{}{}
+	}
+
 	switch action {
 	case "add":
 		for _, certId := range CertIds {
-			exist := false
-			for _, oldCertId := range oldCertIds {
-				if oldCertId.CertId == certId {
-					exist = true
-					break
-				}
-			}
-			if !exist {
+			// 使用 oldCertIdSet 进行 O(1) 复杂度的查找。
+			if _, found := oldCertIdSet[certId]; !found {
+				// 如果在旧的集合中没找到,说明是新增的。
 				sslCertsSlice = append(sslCertsSlice, sslCerts{
 					IsOn:   true,
 					CertId: certId,
@@ -140,18 +142,13 @@ func (s *sslCertService) EditSslPolicy(ctx context.Context, sslPolicyId int64, C
 			}
 		}
 	case "del":
-		for _, oldCertId := range oldCertIds {
-			exist := false
-			for _, certId := range CertIds {
-				if oldCertId.CertId == certId {
-					exist = true
-					break
-				}
-			}
-			if !exist {
+		for _, oldCert := range oldCertIds {
+			// 使用 newCertIdSet 进行 O(1) 复杂度的查找。
+			if _, found := newCertIdSet[oldCert.CertId]; !found {
+				// 如果在新的集合中没找到,说明被删除了。
 				sslCertsSlice = append(sslCertsSlice, sslCerts{
 					IsOn:   false,
-					CertId: oldCertId.CertId,
+					CertId: oldCert.CertId,
 				})
 			}
 		}

+ 5 - 5
internal/service/tcpforwarding.go

@@ -123,7 +123,7 @@ func (s *tcpforwardingService) buildTcpRuleModel(reqData *v1.TcpForwardingDataRe
 	}
 }
 
-func (s *tcpforwardingService) prepareWafData(ctx context.Context, req *v1.TcpForwardingRequest) (RequireResponse, v1.Website, error) {
+func (s *tcpforwardingService) prepareWafData(ctx context.Context, req *v1.TcpForwardingRequest) (RequireResponse, v1.WebsiteSend, error) {
 	// 1. 获取必要的全局信息
 	require, err := s.wafformatter.Require(ctx, v1.GlobalRequire{
 		HostId:  req.HostId,
@@ -131,10 +131,10 @@ func (s *tcpforwardingService) prepareWafData(ctx context.Context, req *v1.TcpFo
 		Comment: req.TcpForwardingData.Comment,
 	})
 	if err != nil {
-		return RequireResponse{}, v1.Website{}, err
+		return RequireResponse{}, v1.WebsiteSend{}, err
 	}
 	if require.GatewayGroupId == 0 || require.Uid == 0 {
-		return RequireResponse{}, v1.Website{}, fmt.Errorf("请先配置实例")
+		return RequireResponse{}, v1.WebsiteSend{}, fmt.Errorf("请先配置实例")
 	}
 	var jsonData v1.TypeJSON
 	jsonData.IsOn = true
@@ -148,10 +148,10 @@ func (s *tcpforwardingService) prepareWafData(ctx context.Context, req *v1.TcpFo
 
 	byteData, err := json.Marshal(jsonData)
 	if err != nil {
-		return RequireResponse{}, v1.Website{}, err
+		return RequireResponse{}, v1.WebsiteSend{}, err
 	}
 
-	formData := v1.Website{
+	formData := v1.WebsiteSend{
 		UserId:         int64(require.CdnUid),
 		Type:           "tcpProxy",
 		Name:           require.Tag,

+ 5 - 5
internal/service/udpforwarding.go

@@ -122,17 +122,17 @@ func (s *udpForWardingService) buildUdpRuleModel(reqData *v1.UdpForwardingDataRe
 	}
 }
 
-func (s *udpForWardingService) prepareWafData(ctx context.Context, req *v1.UdpForwardingRequest) (RequireResponse, v1.Website, error) {
+func (s *udpForWardingService) prepareWafData(ctx context.Context, req *v1.UdpForwardingRequest) (RequireResponse, v1.WebsiteSend, error) {
 	require, err := s.wafformatter.Require(ctx, v1.GlobalRequire{
 		HostId:  req.HostId,
 		Uid:     req.Uid,
 		Comment: req.UdpForwardingData.Comment,
 	})
 	if err != nil {
-		return RequireResponse{}, v1.Website{}, err
+		return RequireResponse{}, v1.WebsiteSend{}, err
 	}
 	if require.GatewayGroupId == 0 || require.Uid == 0 {
-		return RequireResponse{}, v1.Website{}, fmt.Errorf("请先配置实例")
+		return RequireResponse{}, v1.WebsiteSend{}, fmt.Errorf("请先配置实例")
 	}
 	var jsonData v1.TypeJSON
 	jsonData.IsOn = true
@@ -146,10 +146,10 @@ func (s *udpForWardingService) prepareWafData(ctx context.Context, req *v1.UdpFo
 
 	byteData, err := json.Marshal(jsonData)
 	if err != nil {
-		return RequireResponse{}, v1.Website{}, err
+		return RequireResponse{}, v1.WebsiteSend{}, err
 	}
 
-	formData := v1.Website{
+	formData := v1.WebsiteSend{
 		UserId:         int64(require.CdnUid),
 		Type:           "udpProxy",
 		Name:           require.Tag,

+ 39 - 1
internal/service/webforwarding.go

@@ -372,7 +372,12 @@ func (s *webForwardingService) AddWebForwarding(ctx context.Context, req *v1.Web
 
 
 	// 添加网站
-	webId, err := s.cdn.CreateWebsite(ctx, formData)
+	formDataSend, err := s.BulidFormData(ctx, formData)
+	if err != nil {
+		return err
+	}
+
+	webId, err := s.cdn.CreateWebsite(ctx, formDataSend)
 	if err != nil {
 		return err
 	}
@@ -1073,3 +1078,36 @@ func (s *webForwardingService) EditCcConfig(ctx context.Context,webId int64, req
 	}
 	return nil
 }
+
+
+func (s *webForwardingService) BulidFormData(ctx context.Context,formData v1.Website) (v1.WebsiteSend, error) {
+	httpJSON, err := json.Marshal(formData.HttpJSON)
+	if err != nil {
+		return v1.WebsiteSend{},err
+	}
+	httpsJSON, err := json.Marshal(formData.HttpsJSON)
+	if err != nil {
+		return v1.WebsiteSend{},err
+	}
+	formDataSend := v1.WebsiteSend{
+		UserId: formData.UserId,
+		AdminId:           formData.AdminId,
+		Type:             formData.Type,
+		Name:             formData.Name,
+		Description:      formData.Description,
+		ServerNamesJSON:  formData.ServerNamesJSON,
+		HttpJSON:         httpJSON,
+		HttpsJSON:        httpsJSON,
+		TcpJSON:          formData.TcpJSON,
+		TlsJSON:          formData.TlsJSON,
+		UdpJSON:          formData.UdpJSON,
+		WebId:            formData.WebId,
+		ReverseProxyJSON: formData.ReverseProxyJSON,
+		ServerGroupIds:   formData.ServerGroupIds,
+		UserPlanId:       formData.UserPlanId,
+		NodeClusterId:    formData.NodeClusterId,
+		IncludeNodesJSON: formData.IncludeNodesJSON,
+		ExcludeNodesJSON: formData.ExcludeNodesJSON,
+	}
+	return formDataSend, nil
+}