From a0c08e841d299a43b8a34aeedc6c22785cfcbf25 Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Fri, 10 Jan 2025 22:41:39 +0800 Subject: [PATCH] feat: separate access providers and dns providers --- internal/applicant/applicant.go | 3 +- internal/applicant/providers.go | 24 ++--- internal/domain/provider.go | 34 ++++++- .../provider/ApplyDNSProviderPicker.tsx | 67 +++++++++++++ .../provider/ApplyDNSProviderSelect.tsx | 51 ++++++++++ .../provider/DeployProviderPicker.tsx | 5 +- ui/src/components/workflow/node/ApplyNode.tsx | 2 - .../workflow/node/ApplyNodeConfigForm.tsx | 45 ++++++++- .../workflow/node/DeployNodeConfigForm.tsx | 5 +- ui/src/domain/provider.ts | 99 +++++++++++++++---- ui/src/i18n/locales/en/nls.common.json | 5 + .../i18n/locales/en/nls.workflow.nodes.json | 2 + ui/src/i18n/locales/zh/nls.common.json | 5 + .../i18n/locales/zh/nls.workflow.nodes.json | 2 + 14 files changed, 307 insertions(+), 42 deletions(-) create mode 100644 ui/src/components/provider/ApplyDNSProviderPicker.tsx create mode 100644 ui/src/components/provider/ApplyDNSProviderSelect.tsx diff --git a/internal/applicant/applicant.go b/internal/applicant/applicant.go index 2f2f411f..8f38f4a4 100644 --- a/internal/applicant/applicant.go +++ b/internal/applicant/applicant.go @@ -53,6 +53,7 @@ func NewWithApplyNode(node *domain.WorkflowNode) (Applicant, error) { return nil, fmt.Errorf("failed to get access #%s record: %w", accessId, err) } + applyProvider := node.GetConfigString("provider") applyConfig := &applyConfig{ Domains: node.GetConfigString("domains"), ContactEmail: node.GetConfigString("contactEmail"), @@ -63,7 +64,7 @@ func NewWithApplyNode(node *domain.WorkflowNode) (Applicant, error) { DisableFollowCNAME: node.GetConfigBool("disableFollowCNAME"), } - challengeProvider, err := createChallengeProvider(domain.AccessProviderType(access.Provider), access.Config, applyConfig) + challengeProvider, err := createChallengeProvider(domain.ApplyDNSProviderType(applyProvider), access.Config, applyConfig) if err != nil { return nil, err } diff --git a/internal/applicant/providers.go b/internal/applicant/providers.go index c8800093..147fbc72 100644 --- a/internal/applicant/providers.go +++ b/internal/applicant/providers.go @@ -20,13 +20,13 @@ import ( providerVolcEngine "github.com/usual2970/certimate/internal/pkg/core/applicant/acme-dns-01/lego-providers/volcengine" ) -func createChallengeProvider(provider domain.AccessProviderType, accessConfig string, applyConfig *applyConfig) (challenge.Provider, error) { +func createChallengeProvider(provider domain.ApplyDNSProviderType, accessConfig string, applyConfig *applyConfig) (challenge.Provider, error) { /* 注意:如果追加新的常量值,请保持以 ASCII 排序。 NOTICE: If you add new constant, please keep ASCII order. */ switch provider { - case domain.AccessProviderTypeACMEHttpReq: + case domain.ApplyDNSProviderTypeACMEHttpReq: { access := &domain.AccessConfigForACMEHttpReq{} if err := json.Unmarshal([]byte(accessConfig), access); err != nil { @@ -43,7 +43,7 @@ func createChallengeProvider(provider domain.AccessProviderType, accessConfig st return applicant, err } - case domain.AccessProviderTypeAliyun: + case domain.ApplyDNSProviderTypeAliyun, domain.ApplyDNSProviderTypeAliyunDNS: { access := &domain.AccessConfigForAliyun{} if err := json.Unmarshal([]byte(accessConfig), access); err != nil { @@ -58,7 +58,7 @@ func createChallengeProvider(provider domain.AccessProviderType, accessConfig st return applicant, err } - case domain.AccessProviderTypeAWS: + case domain.ApplyDNSProviderTypeAWS, domain.ApplyDNSProviderTypeAWSRoute53: { access := &domain.AccessConfigForAWS{} if err := json.Unmarshal([]byte(accessConfig), access); err != nil { @@ -75,7 +75,7 @@ func createChallengeProvider(provider domain.AccessProviderType, accessConfig st return applicant, err } - case domain.AccessProviderTypeCloudflare: + case domain.ApplyDNSProviderTypeCloudflare: { access := &domain.AccessConfigForCloudflare{} if err := json.Unmarshal([]byte(accessConfig), access); err != nil { @@ -89,7 +89,7 @@ func createChallengeProvider(provider domain.AccessProviderType, accessConfig st return applicant, err } - case domain.AccessProviderTypeGoDaddy: + case domain.ApplyDNSProviderTypeGoDaddy: { access := &domain.AccessConfigForGoDaddy{} if err := json.Unmarshal([]byte(accessConfig), access); err != nil { @@ -104,7 +104,7 @@ func createChallengeProvider(provider domain.AccessProviderType, accessConfig st return applicant, err } - case domain.AccessProviderTypeHuaweiCloud: + case domain.ApplyDNSProviderTypeHuaweiCloud, domain.ApplyDNSProviderTypeHuaweiCloudDNS: { access := &domain.AccessConfigForHuaweiCloud{} if err := json.Unmarshal([]byte(accessConfig), access); err != nil { @@ -120,7 +120,7 @@ func createChallengeProvider(provider domain.AccessProviderType, accessConfig st return applicant, err } - case domain.AccessProviderTypeNameDotCom: + case domain.ApplyDNSProviderTypeNameDotCom: { access := &domain.AccessConfigForNameDotCom{} if err := json.Unmarshal([]byte(accessConfig), access); err != nil { @@ -135,7 +135,7 @@ func createChallengeProvider(provider domain.AccessProviderType, accessConfig st return applicant, err } - case domain.AccessProviderTypeNameSilo: + case domain.ApplyDNSProviderTypeNameSilo: { access := &domain.AccessConfigForNameSilo{} if err := json.Unmarshal([]byte(accessConfig), access); err != nil { @@ -149,7 +149,7 @@ func createChallengeProvider(provider domain.AccessProviderType, accessConfig st return applicant, err } - case domain.AccessProviderTypePowerDNS: + case domain.ApplyDNSProviderTypePowerDNS: { access := &domain.AccessConfigForPowerDNS{} if err := json.Unmarshal([]byte(accessConfig), access); err != nil { @@ -164,7 +164,7 @@ func createChallengeProvider(provider domain.AccessProviderType, accessConfig st return applicant, err } - case domain.AccessProviderTypeTencentCloud: + case domain.ApplyDNSProviderTypeTencentCloud, domain.ApplyDNSProviderTypeTencentCloudDNS: { access := &domain.AccessConfigForTencentCloud{} if err := json.Unmarshal([]byte(accessConfig), access); err != nil { @@ -179,7 +179,7 @@ func createChallengeProvider(provider domain.AccessProviderType, accessConfig st return applicant, err } - case domain.AccessProviderTypeVolcEngine: + case domain.ApplyDNSProviderTypeVolcEngine, domain.ApplyDNSProviderTypeVolcEngineDNS: { access := &domain.AccessConfigForVolcEngine{} if err := json.Unmarshal([]byte(accessConfig), access); err != nil { diff --git a/internal/domain/provider.go b/internal/domain/provider.go index b0f9c05b..0c07e458 100644 --- a/internal/domain/provider.go +++ b/internal/domain/provider.go @@ -3,7 +3,7 @@ type AccessProviderType string /* -提供商类型常量值。 +授权提供商类型常量值。 注意:如果追加新的常量值,请保持以 ASCII 排序。 NOTICE: If you add new constant, please keep ASCII order. @@ -30,11 +30,39 @@ const ( AccessProviderTypeWebhook = AccessProviderType("webhook") ) +type ApplyDNSProviderType string + +/* +申请证书 DNS 提供商常量值。 +短横线前的部分始终等于授权提供商类型。 + + 注意:如果追加新的常量值,请保持以 ASCII 排序。 + NOTICE: If you add new constant, please keep ASCII order. +*/ +const ( + ApplyDNSProviderTypeACMEHttpReq = ApplyDNSProviderType("acmehttpreq") + ApplyDNSProviderTypeAliyun = ApplyDNSProviderType("aliyun") // 兼容旧值,等同于 [ApplyDNSProviderTypeAliyunDNS] + ApplyDNSProviderTypeAliyunDNS = ApplyDNSProviderType("aliyun-dns") + ApplyDNSProviderTypeAWS = ApplyDNSProviderType("aws") // 兼容旧值,等同于 [ApplyDNSProviderTypeAWSRoute53] + ApplyDNSProviderTypeAWSRoute53 = ApplyDNSProviderType("aws-route53") + ApplyDNSProviderTypeCloudflare = ApplyDNSProviderType("cloudflare") + ApplyDNSProviderTypeGoDaddy = ApplyDNSProviderType("godaddy") + ApplyDNSProviderTypeHuaweiCloud = ApplyDNSProviderType("huaweicloud") // 兼容旧值,等同于 [ApplyDNSProviderTypeHuaweiCloudDNS] + ApplyDNSProviderTypeHuaweiCloudDNS = ApplyDNSProviderType("huaweicloud-dns") + ApplyDNSProviderTypeNameDotCom = ApplyDNSProviderType("namedotcom") + ApplyDNSProviderTypeNameSilo = ApplyDNSProviderType("namesilo") + ApplyDNSProviderTypePowerDNS = ApplyDNSProviderType("powerdns") + ApplyDNSProviderTypeTencentCloud = ApplyDNSProviderType("tencentcloud") // 兼容旧值,等同于 [ApplyDNSProviderTypeTencentCloudDNS] + ApplyDNSProviderTypeTencentCloudDNS = ApplyDNSProviderType("tencentcloud-dns") + ApplyDNSProviderTypeVolcEngine = ApplyDNSProviderType("volcengine") // 兼容旧值,等同于 [ApplyDNSProviderTypeVolcEngineDNS] + ApplyDNSProviderTypeVolcEngineDNS = ApplyDNSProviderType("volcengine-dns") +) + type DeployProviderType string /* -提供商部署目标常量值。 -短横线前的部分始终等于提供商类型。 +部署目标提供商常量值。 +短横线前的部分始终等于授权提供商类型。 注意:如果追加新的常量值,请保持以 ASCII 排序。 NOTICE: If you add new constant, please keep ASCII order. diff --git a/ui/src/components/provider/ApplyDNSProviderPicker.tsx b/ui/src/components/provider/ApplyDNSProviderPicker.tsx new file mode 100644 index 00000000..e72935cc --- /dev/null +++ b/ui/src/components/provider/ApplyDNSProviderPicker.tsx @@ -0,0 +1,67 @@ +import { memo, useState } from "react"; +import { useTranslation } from "react-i18next"; +import { Avatar, Card, Col, Empty, Flex, Input, Row, Typography } from "antd"; + +import Show from "@/components/Show"; +import { applyDNSProvidersMap } from "@/domain/provider"; + +export type ApplyDNSProviderPickerProps = { + className?: string; + style?: React.CSSProperties; + placeholder?: string; + onSelect?: (value: string) => void; +}; + +const ApplyDNSProviderPicker = ({ className, style, placeholder, onSelect }: ApplyDNSProviderPickerProps) => { + const { t } = useTranslation(); + + const [keyword, setKeyword] = useState(); + + const providers = Array.from(applyDNSProvidersMap.values()); + const filteredProviders = providers.filter((provider) => { + if (keyword) { + const value = keyword.toLowerCase(); + return provider.type.toLowerCase().includes(value) || provider.name.toLowerCase().includes(value); + } + + return true; + }); + + const handleProviderTypeSelect = (value: string) => { + onSelect?.(value); + }; + + return ( +
+ setKeyword(e.target.value.trim())} /> + +
+ 0} fallback={}> + + {filteredProviders.map((provider, index) => { + return ( + + { + handleProviderTypeSelect(provider.type); + }} + > + + + {t(provider.name)} + + + + ); + })} + + +
+
+ ); +}; + +export default memo(ApplyDNSProviderPicker); diff --git a/ui/src/components/provider/ApplyDNSProviderSelect.tsx b/ui/src/components/provider/ApplyDNSProviderSelect.tsx new file mode 100644 index 00000000..3b76feff --- /dev/null +++ b/ui/src/components/provider/ApplyDNSProviderSelect.tsx @@ -0,0 +1,51 @@ +import { memo } from "react"; +import { useTranslation } from "react-i18next"; +import { Avatar, Select, type SelectProps, Space, Typography } from "antd"; + +import { applyDNSProvidersMap } from "@/domain/provider"; + +export type ApplyDNSProviderSelectProps = Omit< + SelectProps, + "filterOption" | "filterSort" | "labelRender" | "options" | "optionFilterProp" | "optionLabelProp" | "optionRender" +>; + +const ApplyDNSProviderSelect = (props: ApplyDNSProviderSelectProps) => { + const { t } = useTranslation(); + + const options = Array.from(applyDNSProvidersMap.values()).map((item) => ({ + key: item.type, + value: item.type, + label: t(item.name), + })); + + const renderOption = (key: string) => { + const provider = applyDNSProvidersMap.get(key); + return ( + + + + {t(provider?.name ?? "")} + + + ); + }; + + return ( +