Эх сурвалжийг харах

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

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

+ 22 - 0
api/v1/cdn.go

@@ -58,6 +58,28 @@ type Website struct {
 	ExcludeNodesJSON string  `json:"excludeNodesJSON" form:"excludeNodesJSON"`           // 备用参数,不用填写
 	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 {
 type TypeJSON struct {
 	IsOn         bool         `json:"isOn" form:"isOn"`                 // 是否开启
 	IsOn         bool         `json:"isOn" form:"isOn"`                 // 是否开启
 	Listen       []Listen     `json:"listen" form:"listen"`             // 监听端口
 	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)
 	CreateGroup(ctx context.Context, req v1.Group) (int64, error)
 	BindPlan(ctx context.Context, req v1.Plan) (int64, error)
 	BindPlan(ctx context.Context, req v1.Plan) (int64, error)
 	RenewPlan(ctx context.Context, req v1.RenewalPlan) 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
 	EditServerType(ctx context.Context, req v1.EditWebsite, apiType string) error
 	EditProtocol(ctx context.Context, req v1.ProxyJson, action string) error
 	EditProtocol(ctx context.Context, req v1.ProxyJson, action string) error
 	CreateOrigin(ctx context.Context, req v1.Origin) (int64, 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{}{
 	formData := map[string]interface{}{
 		"userId":           req.UserId,
 		"userId":           req.UserId,
 		"type":             req.Type,
 		"type":             req.Type,
 		"name":             req.Name,
 		"name":             req.Name,
 		"description":      req.Description,
 		"description":      req.Description,
 		"serverNamesJSON":  req.ServerNamesJSON,
 		"serverNamesJSON":  req.ServerNamesJSON,
-		"httpJSON":         httpJSON,
-		"httpsJSON":        httpsJSON,
+		"httpJSON":         req.HttpJSON,
+		"httpsJSON":        req.HttpsJSON,
 		"tcpJSON":          req.TcpJSON,
 		"tcpJSON":          req.TcpJSON,
 		"tlsJSON":          req.TlsJSON,
 		"tlsJSON":          req.TlsJSON,
 		"udpJSON":          req.UdpJSON,
 		"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 {
 	if err != nil {
 		return fmt.Errorf("获取SSL证书失败: %w", err)
 		return fmt.Errorf("获取SSL证书失败: %w", err)
 	}
 	}
-	if len(oldCertIds) == 0 {
-		return nil
-	}
 
 
 	var sslCertsSlice []sslCerts
 	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 {
 	switch action {
 	case "add":
 	case "add":
 		for _, certId := range CertIds {
 		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{
 				sslCertsSlice = append(sslCertsSlice, sslCerts{
 					IsOn:   true,
 					IsOn:   true,
 					CertId: certId,
 					CertId: certId,
@@ -140,18 +142,13 @@ func (s *sslCertService) EditSslPolicy(ctx context.Context, sslPolicyId int64, C
 			}
 			}
 		}
 		}
 	case "del":
 	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{
 				sslCertsSlice = append(sslCertsSlice, sslCerts{
 					IsOn:   false,
 					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. 获取必要的全局信息
 	// 1. 获取必要的全局信息
 	require, err := s.wafformatter.Require(ctx, v1.GlobalRequire{
 	require, err := s.wafformatter.Require(ctx, v1.GlobalRequire{
 		HostId:  req.HostId,
 		HostId:  req.HostId,
@@ -131,10 +131,10 @@ func (s *tcpforwardingService) prepareWafData(ctx context.Context, req *v1.TcpFo
 		Comment: req.TcpForwardingData.Comment,
 		Comment: req.TcpForwardingData.Comment,
 	})
 	})
 	if err != nil {
 	if err != nil {
-		return RequireResponse{}, v1.Website{}, err
+		return RequireResponse{}, v1.WebsiteSend{}, err
 	}
 	}
 	if require.GatewayGroupId == 0 || require.Uid == 0 {
 	if require.GatewayGroupId == 0 || require.Uid == 0 {
-		return RequireResponse{}, v1.Website{}, fmt.Errorf("请先配置实例")
+		return RequireResponse{}, v1.WebsiteSend{}, fmt.Errorf("请先配置实例")
 	}
 	}
 	var jsonData v1.TypeJSON
 	var jsonData v1.TypeJSON
 	jsonData.IsOn = true
 	jsonData.IsOn = true
@@ -148,10 +148,10 @@ func (s *tcpforwardingService) prepareWafData(ctx context.Context, req *v1.TcpFo
 
 
 	byteData, err := json.Marshal(jsonData)
 	byteData, err := json.Marshal(jsonData)
 	if err != nil {
 	if err != nil {
-		return RequireResponse{}, v1.Website{}, err
+		return RequireResponse{}, v1.WebsiteSend{}, err
 	}
 	}
 
 
-	formData := v1.Website{
+	formData := v1.WebsiteSend{
 		UserId:         int64(require.CdnUid),
 		UserId:         int64(require.CdnUid),
 		Type:           "tcpProxy",
 		Type:           "tcpProxy",
 		Name:           require.Tag,
 		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{
 	require, err := s.wafformatter.Require(ctx, v1.GlobalRequire{
 		HostId:  req.HostId,
 		HostId:  req.HostId,
 		Uid:     req.Uid,
 		Uid:     req.Uid,
 		Comment: req.UdpForwardingData.Comment,
 		Comment: req.UdpForwardingData.Comment,
 	})
 	})
 	if err != nil {
 	if err != nil {
-		return RequireResponse{}, v1.Website{}, err
+		return RequireResponse{}, v1.WebsiteSend{}, err
 	}
 	}
 	if require.GatewayGroupId == 0 || require.Uid == 0 {
 	if require.GatewayGroupId == 0 || require.Uid == 0 {
-		return RequireResponse{}, v1.Website{}, fmt.Errorf("请先配置实例")
+		return RequireResponse{}, v1.WebsiteSend{}, fmt.Errorf("请先配置实例")
 	}
 	}
 	var jsonData v1.TypeJSON
 	var jsonData v1.TypeJSON
 	jsonData.IsOn = true
 	jsonData.IsOn = true
@@ -146,10 +146,10 @@ func (s *udpForWardingService) prepareWafData(ctx context.Context, req *v1.UdpFo
 
 
 	byteData, err := json.Marshal(jsonData)
 	byteData, err := json.Marshal(jsonData)
 	if err != nil {
 	if err != nil {
-		return RequireResponse{}, v1.Website{}, err
+		return RequireResponse{}, v1.WebsiteSend{}, err
 	}
 	}
 
 
-	formData := v1.Website{
+	formData := v1.WebsiteSend{
 		UserId:         int64(require.CdnUid),
 		UserId:         int64(require.CdnUid),
 		Type:           "udpProxy",
 		Type:           "udpProxy",
 		Name:           require.Tag,
 		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 {
 	if err != nil {
 		return err
 		return err
 	}
 	}
@@ -1073,3 +1078,36 @@ func (s *webForwardingService) EditCcConfig(ctx context.Context,webId int64, req
 	}
 	}
 	return nil
 	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
+}