refactor: clean code

This commit is contained in:
Fu Diwei 2024-12-27 19:35:50 +08:00
parent 047479426a
commit 86133ba52b
41 changed files with 396 additions and 544 deletions

View File

@ -21,8 +21,8 @@ func NewACMEHttpReqApplicant(option *ApplyOption) Applicant {
}
func (a *acmeHttpReqApplicant) Apply() (*Certificate, error) {
access := &domain.HttpreqAccess{}
json.Unmarshal([]byte(a.option.Access), access)
access := &domain.ACMEHttpReqAccessConfig{}
json.Unmarshal([]byte(a.option.AccessConfig), access)
config := httpreq.NewDefaultConfig()
endpoint, _ := url.Parse(access.Endpoint)

View File

@ -20,8 +20,8 @@ func NewAliyunApplicant(option *ApplyOption) Applicant {
}
func (a *aliyunApplicant) Apply() (*Certificate, error) {
access := &domain.AliyunAccess{}
json.Unmarshal([]byte(a.option.Access), access)
access := &domain.AliyunAccessConfig{}
json.Unmarshal([]byte(a.option.AccessConfig), access)
config := alidns.NewDefaultConfig()
config.APIKey = access.AccessKeyId

View File

@ -26,26 +26,6 @@ import (
"github.com/usual2970/certimate/internal/repository"
)
/*
提供商类型常量值
注意如果追加新的常量值请保持以 ASCII 排序
NOTICE: If you add new constant, please keep ASCII order.
*/
const (
configTypeACMEHttpReq = "acmehttpreq"
configTypeAliyun = "aliyun"
configTypeAWS = "aws"
configTypeCloudflare = "cloudflare"
configTypeGoDaddy = "godaddy"
configTypeHuaweiCloud = "huaweicloud"
configTypeNameDotCom = "namedotcom"
configTypeNameSilo = "namesilo"
configTypePowerDNS = "powerdns"
configTypeTencentCloud = "tencentcloud"
configTypeVolcEngine = "volcengine"
)
const defaultSSLProvider = "letsencrypt"
const (
sslProviderLetsencrypt = "letsencrypt"
@ -78,8 +58,8 @@ type Certificate struct {
type ApplyOption struct {
Email string `json:"email"`
Domain string `json:"domain"`
Access string `json:"access"`
Domain string `json:"subjectAltNames"`
AccessConfig string `json:"accessConfig"`
KeyAlgorithm string `json:"keyAlgorithm"`
Nameservers string `json:"nameservers"`
PropagationTimeout int64 `json:"propagationTimeout"`
@ -165,14 +145,14 @@ func Get(record *models.Record) (Applicant, error) {
option := &ApplyOption{
Email: applyConfig.Email,
Domain: record.GetString("domain"),
Access: access.GetString("config"),
AccessConfig: access.GetString("config"),
KeyAlgorithm: applyConfig.KeyAlgorithm,
Nameservers: applyConfig.Nameservers,
PropagationTimeout: applyConfig.PropagationTimeout,
DisableFollowCNAME: applyConfig.DisableFollowCNAME,
}
return GetWithTypeOption(access.GetString("configType"), option)
return GetWithTypeOption(domain.AccessProviderType(access.GetString("configType")), option)
}
func GetWithApplyNode(node *domain.WorkflowNode) (Applicant, error) {
@ -187,46 +167,46 @@ func GetWithApplyNode(node *domain.WorkflowNode) (Applicant, error) {
applyConfig := &ApplyOption{
Email: node.GetConfigString("email"),
Domain: node.GetConfigString("domain"),
Access: access.Config,
AccessConfig: access.Config,
KeyAlgorithm: node.GetConfigString("keyAlgorithm"),
Nameservers: node.GetConfigString("nameservers"),
PropagationTimeout: node.GetConfigInt64("propagationTimeout"),
DisableFollowCNAME: node.GetConfigBool("disableFollowCNAME"),
}
return GetWithTypeOption(access.ConfigType, applyConfig)
return GetWithTypeOption(domain.AccessProviderType(access.ConfigType), applyConfig)
}
func GetWithTypeOption(t string, option *ApplyOption) (Applicant, error) {
func GetWithTypeOption(providerType domain.AccessProviderType, option *ApplyOption) (Applicant, error) {
/*
注意如果追加新的常量值请保持以 ASCII 排序
NOTICE: If you add new constant, please keep ASCII order.
*/
switch t {
case configTypeACMEHttpReq:
switch providerType {
case domain.ACCESS_PROVIDER_ACMEHTTPREQ:
return NewACMEHttpReqApplicant(option), nil
case configTypeAliyun:
case domain.ACCESS_PROVIDER_ALIYUN:
return NewAliyunApplicant(option), nil
case configTypeAWS:
case domain.ACCESS_PROVIDER_AWS:
return NewAWSApplicant(option), nil
case configTypeCloudflare:
case domain.ACCESS_PROVIDER_CLOUDFLARE:
return NewCloudflareApplicant(option), nil
case configTypeGoDaddy:
case domain.ACCESS_PROVIDER_GODADDY:
return NewGoDaddyApplicant(option), nil
case configTypeHuaweiCloud:
case domain.ACCESS_PROVIDER_HUAWEICLOUD:
return NewHuaweiCloudApplicant(option), nil
case configTypeNameDotCom:
case domain.ACCESS_PROVIDER_NAMEDOTCOM:
return NewNameDotComApplicant(option), nil
case configTypeNameSilo:
case domain.ACCESS_PROVIDER_NAMESILO:
return NewNamesiloApplicant(option), nil
case configTypePowerDNS:
case domain.ACCESS_PROVIDER_POWERDNS:
return NewPowerDNSApplicant(option), nil
case configTypeTencentCloud:
case domain.ACCESS_PROVIDER_TENCENTCLOUD:
return NewTencentCloudApplicant(option), nil
case configTypeVolcEngine:
case domain.ACCESS_PROVIDER_VOLCENGINE:
return NewVolcEngineApplicant(option), nil
default:
return nil, fmt.Errorf("unsupported applicant type: %s", t)
return nil, fmt.Errorf("unsupported applicant provider type: %s", providerType)
}
}

View File

@ -20,8 +20,8 @@ func NewAWSApplicant(option *ApplyOption) Applicant {
}
func (a *awsApplicant) Apply() (*Certificate, error) {
access := &domain.AwsAccess{}
json.Unmarshal([]byte(a.option.Access), access)
access := &domain.AWSAccessConfig{}
json.Unmarshal([]byte(a.option.AccessConfig), access)
config := route53.NewDefaultConfig()
config.AccessKeyID = access.AccessKeyId

View File

@ -20,8 +20,8 @@ func NewCloudflareApplicant(option *ApplyOption) Applicant {
}
func (a *cloudflareApplicant) Apply() (*Certificate, error) {
access := &domain.CloudflareAccess{}
json.Unmarshal([]byte(a.option.Access), access)
access := &domain.CloudflareAccessConfig{}
json.Unmarshal([]byte(a.option.AccessConfig), access)
config := cloudflare.NewDefaultConfig()
config.AuthToken = access.DnsApiToken

View File

@ -20,8 +20,8 @@ func NewGoDaddyApplicant(option *ApplyOption) Applicant {
}
func (a *godaddyApplicant) Apply() (*Certificate, error) {
access := &domain.GodaddyAccess{}
json.Unmarshal([]byte(a.option.Access), access)
access := &domain.GoDaddyAccessConfig{}
json.Unmarshal([]byte(a.option.AccessConfig), access)
config := godaddy.NewDefaultConfig()
config.APIKey = access.ApiKey

View File

@ -20,8 +20,8 @@ func NewHuaweiCloudApplicant(option *ApplyOption) Applicant {
}
func (a *huaweicloudApplicant) Apply() (*Certificate, error) {
access := &domain.HuaweiCloudAccess{}
json.Unmarshal([]byte(a.option.Access), access)
access := &domain.HuaweiCloudAccessConfig{}
json.Unmarshal([]byte(a.option.AccessConfig), access)
region := access.Region
if region == "" {

View File

@ -19,8 +19,8 @@ func NewNameDotComApplicant(option *ApplyOption) Applicant {
}
func (a *nameDotComApplicant) Apply() (*Certificate, error) {
access := &domain.NameDotComAccess{}
json.Unmarshal([]byte(a.option.Access), access)
access := &domain.NameDotComAccessConfig{}
json.Unmarshal([]byte(a.option.AccessConfig), access)
config := namedotcom.NewDefaultConfig()
config.Username = access.Username

View File

@ -20,8 +20,8 @@ func NewNamesiloApplicant(option *ApplyOption) Applicant {
}
func (a *namesiloApplicant) Apply() (*Certificate, error) {
access := &domain.NameSiloAccess{}
json.Unmarshal([]byte(a.option.Access), access)
access := &domain.NameSiloAccessConfig{}
json.Unmarshal([]byte(a.option.AccessConfig), access)
config := namesilo.NewDefaultConfig()
config.APIKey = access.ApiKey

View File

@ -21,8 +21,8 @@ func NewPowerDNSApplicant(option *ApplyOption) Applicant {
}
func (a *powerdnsApplicant) Apply() (*Certificate, error) {
access := &domain.PdnsAccess{}
json.Unmarshal([]byte(a.option.Access), access)
access := &domain.PowerDNSAccessConfig{}
json.Unmarshal([]byte(a.option.AccessConfig), access)
config := pdns.NewDefaultConfig()
host, _ := url.Parse(access.ApiUrl)

View File

@ -20,8 +20,8 @@ func NewTencentCloudApplicant(option *ApplyOption) Applicant {
}
func (a *tencentcloudApplicant) Apply() (*Certificate, error) {
access := &domain.TencentAccess{}
json.Unmarshal([]byte(a.option.Access), access)
access := &domain.TencentCloudAccessConfig{}
json.Unmarshal([]byte(a.option.AccessConfig), access)
config := tencentcloud.NewDefaultConfig()
config.SecretID = access.SecretId

View File

@ -19,8 +19,8 @@ func NewVolcEngineApplicant(option *ApplyOption) Applicant {
}
func (a *volcengineApplicant) Apply() (*Certificate, error) {
access := &domain.VolcEngineAccess{}
json.Unmarshal([]byte(a.option.Access), access)
access := &domain.VolcEngineAccessConfig{}
json.Unmarshal([]byte(a.option.AccessConfig), access)
config := volcengine.NewDefaultConfig()
config.AccessKey = access.AccessKeyId

View File

@ -14,6 +14,7 @@ import (
/*
提供商部署目标常量值
短横线前的部分始终等于提供商类型
注意如果追加新的常量值请保持以 ASCII 排序
NOTICE: If you add new constant, please keep ASCII order.
@ -140,7 +141,7 @@ type proxyDeployer struct {
}
func (d *proxyDeployer) GetID() string {
return fmt.Sprintf("%s-%s", d.option.AccessRecord.GetString("name"), d.option.AccessRecord.Id)
return fmt.Sprintf("%s-%s", d.option.AccessRecord.Name, d.option.AccessRecord.Id)
}
func (d *proxyDeployer) GetInfos() []string {

View File

@ -43,7 +43,7 @@ func createDeployer(target string, accessConfig string, deployConfig map[string]
switch target {
case targetAliyunALB, targetAliyunCDN, targetAliyunCLB, targetAliyunDCDN, targetAliyunNLB, targetAliyunOSS:
{
access := &domain.AliyunAccess{}
access := &domain.AliyunAccessConfig{}
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
return nil, nil, fmt.Errorf("failed to unmarshal access config: %w", err)
}
@ -115,7 +115,7 @@ func createDeployer(target string, accessConfig string, deployConfig map[string]
case targetBaiduCloudCDN:
{
access := &domain.BaiduCloudAccess{}
access := &domain.BaiduCloudAccessConfig{}
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
return nil, nil, fmt.Errorf("failed to unmarshal access config: %w", err)
}
@ -130,7 +130,7 @@ func createDeployer(target string, accessConfig string, deployConfig map[string]
case targetBytePlusCDN:
{
access := &domain.ByteplusAccess{}
access := &domain.BytePlusAccessConfig{}
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
return nil, nil, fmt.Errorf("failed to unmarshal access config: %w", err)
}
@ -145,7 +145,7 @@ func createDeployer(target string, accessConfig string, deployConfig map[string]
case targetDogeCloudCDN:
{
access := &domain.DogeCloudAccess{}
access := &domain.DogeCloudAccessConfig{}
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
return nil, nil, fmt.Errorf("failed to unmarshal access config: %w", err)
}
@ -160,7 +160,7 @@ func createDeployer(target string, accessConfig string, deployConfig map[string]
case targetHuaweiCloudCDN, targetHuaweiCloudELB:
{
access := &domain.HuaweiCloudAccess{}
access := &domain.HuaweiCloudAccessConfig{}
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
return nil, nil, fmt.Errorf("failed to unmarshal access config: %w", err)
}
@ -211,7 +211,7 @@ func createDeployer(target string, accessConfig string, deployConfig map[string]
case targetK8sSecret:
{
access := &domain.KubernetesAccess{}
access := &domain.KubernetesAccessConfig{}
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
return nil, nil, fmt.Errorf("failed to unmarshal access config: %w", err)
}
@ -228,7 +228,7 @@ func createDeployer(target string, accessConfig string, deployConfig map[string]
case targetQiniuCDN:
{
access := &domain.QiniuAccess{}
access := &domain.QiniuAccessConfig{}
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
return nil, nil, fmt.Errorf("failed to unmarshal access config: %w", err)
}
@ -243,7 +243,7 @@ func createDeployer(target string, accessConfig string, deployConfig map[string]
case targetSSH:
{
access := &domain.SSHAccess{}
access := &domain.SSHAccessConfig{}
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
return nil, nil, fmt.Errorf("failed to unmarshal access config: %w", err)
}
@ -271,7 +271,7 @@ func createDeployer(target string, accessConfig string, deployConfig map[string]
case targetTencentCloudCDN, targetTencentCloudCLB, targetTencentCloudCOS, targetTencentCloudECDN, targetTencentCloudEO:
{
access := &domain.TencentAccess{}
access := &domain.TencentCloudAccessConfig{}
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
return nil, nil, fmt.Errorf("failed to unmarshal access config: %w", err)
}
@ -331,7 +331,7 @@ func createDeployer(target string, accessConfig string, deployConfig map[string]
case targetVolcEngineCDN, targetVolcEngineLive:
{
access := &domain.VolcEngineAccess{}
access := &domain.VolcEngineAccessConfig{}
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
return nil, nil, fmt.Errorf("failed to unmarshal access config: %w", err)
}
@ -339,16 +339,16 @@ func createDeployer(target string, accessConfig string, deployConfig map[string]
switch target {
case targetVolcEngineCDN:
deployer, err := providerVolcEngineCDN.NewWithLogger(&providerVolcEngineCDN.VolcEngineCDNDeployerConfig{
AccessKey: access.AccessKey,
SecretKey: access.SecretKey,
AccessKey: access.AccessKeyId,
SecretKey: access.SecretAccessKey,
Domain: maps.GetValueAsString(deployConfig, "domain"),
}, logger)
return deployer, logger, err
case targetVolcEngineLive:
deployer, err := providerVolcEngineLive.NewWithLogger(&providerVolcEngineLive.VolcEngineLiveDeployerConfig{
AccessKey: access.AccessKey,
SecretKey: access.SecretKey,
AccessKey: access.AccessKeyId,
SecretKey: access.SecretAccessKey,
Domain: maps.GetValueAsString(deployConfig, "domain"),
}, logger)
return deployer, logger, err
@ -360,7 +360,7 @@ func createDeployer(target string, accessConfig string, deployConfig map[string]
case targetWebhook:
{
access := &domain.WebhookAccess{}
access := &domain.WebhookAccessConfig{}
if err := json.Unmarshal([]byte(accessConfig), access); err != nil {
return nil, nil, fmt.Errorf("failed to unmarshal access config: %w", err)
}

View File

@ -4,109 +4,118 @@ import "time"
type Access struct {
Meta
Name string `json:"name"`
Config string `json:"config"`
ConfigType string `json:"configType"`
Deleted time.Time `json:"deleted"`
Usage string `json:"usage"`
Name string `json:"name" db:"name"`
ConfigType string `json:"configType" db:"configType"`
Config string `json:"config" db:"config"`
Usage string `json:"usage" db:"usage"`
DeletedAt time.Time `json:"deleted" db:"deleted"`
}
// 兼容一下原 pocketbase 的 record
func (a *Access) GetString(key string) string {
switch key {
case "name":
return a.Name
default:
return ""
}
}
type AccessProviderType string
type AliyunAccess struct {
AccessKeyId string `json:"accessKeyId"`
AccessKeySecret string `json:"accessKeySecret"`
}
/*
提供商类型常量值
type ByteplusAccess struct {
AccessKey string `json:"accessKey"`
SecretKey string `json:"secretKey"`
}
注意如果追加新的常量值请保持以 ASCII 排序
NOTICE: If you add new constant, please keep ASCII order.
*/
const (
ACCESS_PROVIDER_ACMEHTTPREQ = AccessProviderType("acmehttpreq")
ACCESS_PROVIDER_ALIYUN = AccessProviderType("aliyun")
ACCESS_PROVIDER_AWS = AccessProviderType("aws")
ACCESS_PROVIDER_BAIDUCLOUD = AccessProviderType("baiducloud")
ACCESS_PROVIDER_BYTEPLUS = AccessProviderType("byteplus")
ACCESS_PROVIDER_CLOUDFLARE = AccessProviderType("cloudflare")
ACCESS_PROVIDER_DOGECLOUD = AccessProviderType("dogecloud")
ACCESS_PROVIDER_GODADDY = AccessProviderType("godaddy")
ACCESS_PROVIDER_HUAWEICLOUD = AccessProviderType("huaweicloud")
ACCESS_PROVIDER_KUBERNETES = AccessProviderType("k8s")
ACCESS_PROVIDER_LOCAL = AccessProviderType("local")
ACCESS_PROVIDER_NAMEDOTCOM = AccessProviderType("namedotcom")
ACCESS_PROVIDER_NAMESILO = AccessProviderType("namesilo")
ACCESS_PROVIDER_POWERDNS = AccessProviderType("powerdns")
ACCESS_PROVIDER_QINIU = AccessProviderType("qiniu")
ACCESS_PROVIDER_SSH = AccessProviderType("ssh")
ACCESS_PROVIDER_TENCENTCLOUD = AccessProviderType("tencentcloud")
ACCESS_PROVIDER_VOLCENGINE = AccessProviderType("volcengine")
ACCESS_PROVIDER_WEBHOOK = AccessProviderType("webhook")
)
type TencentAccess struct {
SecretId string `json:"secretId"`
SecretKey string `json:"secretKey"`
}
type HuaweiCloudAccess struct {
AccessKeyId string `json:"accessKeyId"`
SecretAccessKey string `json:"secretAccessKey"`
Region string `json:"region"`
}
type BaiduCloudAccess struct {
AccessKeyId string `json:"accessKeyId"`
SecretAccessKey string `json:"secretAccessKey"`
}
type AwsAccess struct {
AccessKeyId string `json:"accessKeyId"`
SecretAccessKey string `json:"secretAccessKey"`
Region string `json:"region"`
HostedZoneId string `json:"hostedZoneId"`
}
type CloudflareAccess struct {
DnsApiToken string `json:"dnsApiToken"`
}
type QiniuAccess struct {
AccessKey string `json:"accessKey"`
SecretKey string `json:"secretKey"`
}
type DogeCloudAccess struct {
AccessKey string `json:"accessKey"`
SecretKey string `json:"secretKey"`
}
type NameSiloAccess struct {
ApiKey string `json:"apiKey"`
}
type GodaddyAccess struct {
ApiKey string `json:"apiKey"`
ApiSecret string `json:"apiSecret"`
}
type NameDotComAccess struct {
Username string `json:"username"`
ApiToken string `json:"apiToken"`
}
type PdnsAccess struct {
ApiUrl string `json:"apiUrl"`
ApiKey string `json:"apiKey"`
}
type VolcEngineAccess struct {
AccessKey string `json:"accessKey"`
SecretKey string `json:"secretKey"`
// Deprecated: Use [AccessKey] and [SecretKey] instead in the future
AccessKeyId string `json:"accessKeyId"`
// Deprecated: Use [AccessKey] and [SecretKey] instead in the future
SecretAccessKey string `json:"secretAccessKey"`
}
type HttpreqAccess struct {
type ACMEHttpReqAccessConfig struct {
Endpoint string `json:"endpoint"`
Mode string `json:"mode"`
Username string `json:"username"`
Password string `json:"password"`
}
type LocalAccess struct{}
type AliyunAccessConfig struct {
AccessKeyId string `json:"accessKeyId"`
AccessKeySecret string `json:"accessKeySecret"`
}
type SSHAccess struct {
type AWSAccessConfig struct {
AccessKeyId string `json:"accessKeyId"`
SecretAccessKey string `json:"secretAccessKey"`
Region string `json:"region"`
HostedZoneId string `json:"hostedZoneId"`
}
type BaiduCloudAccessConfig struct {
AccessKeyId string `json:"accessKeyId"`
SecretAccessKey string `json:"secretAccessKey"`
}
type BytePlusAccessConfig struct {
AccessKey string `json:"accessKey"`
SecretKey string `json:"secretKey"`
}
type CloudflareAccessConfig struct {
DnsApiToken string `json:"dnsApiToken"`
}
type DogeCloudAccessConfig struct {
AccessKey string `json:"accessKey"`
SecretKey string `json:"secretKey"`
}
type GoDaddyAccessConfig struct {
ApiKey string `json:"apiKey"`
ApiSecret string `json:"apiSecret"`
}
type HuaweiCloudAccessConfig struct {
AccessKeyId string `json:"accessKeyId"`
SecretAccessKey string `json:"secretAccessKey"`
Region string `json:"region"`
}
type LocalAccessConfig struct{}
type KubernetesAccessConfig struct {
KubeConfig string `json:"kubeConfig"`
}
type NameDotComAccessConfig struct {
Username string `json:"username"`
ApiToken string `json:"apiToken"`
}
type NameSiloAccessConfig struct {
ApiKey string `json:"apiKey"`
}
type PowerDNSAccessConfig struct {
ApiUrl string `json:"apiUrl"`
ApiKey string `json:"apiKey"`
}
type QiniuAccessConfig struct {
AccessKey string `json:"accessKey"`
SecretKey string `json:"secretKey"`
}
type SSHAccessConfig struct {
Host string `json:"host"`
Port string `json:"port"`
Username string `json:"username"`
@ -115,10 +124,16 @@ type SSHAccess struct {
KeyPassphrase string `json:"keyPassphrase"`
}
type WebhookAccess struct {
Url string `json:"url"`
type TencentCloudAccessConfig struct {
SecretId string `json:"secretId"`
SecretKey string `json:"secretKey"`
}
type KubernetesAccess struct {
KubeConfig string `json:"kubeConfig"`
type VolcEngineAccessConfig struct {
AccessKeyId string `json:"accessKeyId"`
SecretAccessKey string `json:"secretAccessKey"`
}
type WebhookAccessConfig struct {
Url string `json:"url"`
}

View File

@ -1,17 +1,13 @@
package domain
import (
"time"
"github.com/go-acme/lego/v4/registration"
)
type AcmeAccount struct {
Id string
Ca string
Email string
Resource *registration.Resource
Key string
Created time.Time
Updated time.Time
Meta
CA string `json:"ca" db:"ca"`
Email string `json:"email" db:"email"`
Resource *registration.Resource `json:"resource" db:"resource"`
Key string `json:"key" db:"key"`
}

View File

@ -12,13 +12,13 @@ type Certificate struct {
IssuerCertificate string `json:"issuerCertificate" db:"issuerCertificate"`
CertUrl string `json:"certUrl" db:"certUrl"`
CertStableUrl string `json:"certStableUrl" db:"certStableUrl"`
Output string `json:"output" db:"output"`
Workflow string `json:"workflow" db:"workflow"`
ExpireAt time.Time `json:"ExpireAt" db:"expireAt"`
NodeId string `json:"nodeId" db:"nodeId"`
WorkflowId string `json:"workflow" db:"workflow"`
WorkflowNodeId string `json:"nodeId" db:"nodeId"`
WorkflowOutputId string `json:"output" db:"output"`
ExpireAt time.Time `json:"expireAt" db:"expireAt"`
}
type MetaData struct {
type CertificateMeta struct {
Version string `json:"version"`
SerialNumber string `json:"serialNumber"`
Validity CertificateValidity `json:"validity"`

View File

@ -1,9 +0,0 @@
package domain
import "time"
type Meta struct {
Id string `json:"id" db:"id"`
Created time.Time `json:"created" db:"created"`
Updated time.Time `json:"updated" db:"updated"`
}

View File

@ -1,12 +1,6 @@
package domain
import (
"encoding/json"
"strings"
"github.com/usual2970/certimate/internal/pkg/utils/maps"
)
// Deprecated: TODO: 即将废弃
type ApplyConfig struct {
Email string `json:"email"`
Access string `json:"access"`
@ -16,6 +10,7 @@ type ApplyConfig struct {
DisableFollowCNAME bool `json:"disableFollowCNAME"`
}
// Deprecated: TODO: 即将废弃
type DeployConfig struct {
Id string `json:"id"`
Access string `json:"access"`
@ -23,121 +18,7 @@ type DeployConfig struct {
Config map[string]any `json:"config"`
}
// Deprecated: 以字符串形式获取配置项。
//
// 入参:
// - key: 配置项的键。
//
// 出参:
// - 配置项的值。如果配置项不存在或者类型不是字符串,则返回空字符串。
func (dc *DeployConfig) GetConfigAsString(key string) string {
return maps.GetValueAsString(dc.Config, key)
}
// Deprecated: 以字符串形式获取配置项。
//
// 入参:
// - key: 配置项的键。
// - defaultValue: 默认值。
//
// 出参:
// - 配置项的值。如果配置项不存在、类型不是字符串或者值为零值,则返回默认值。
func (dc *DeployConfig) GetConfigOrDefaultAsString(key string, defaultValue string) string {
return maps.GetValueOrDefaultAsString(dc.Config, key, defaultValue)
}
// Deprecated: 以 32 位整数形式获取配置项。
//
// 入参:
// - key: 配置项的键。
//
// 出参:
// - 配置项的值。如果配置项不存在或者类型不是 32 位整数,则返回 0。
func (dc *DeployConfig) GetConfigAsInt32(key string) int32 {
return maps.GetValueAsInt32(dc.Config, key)
}
// Deprecated: 以 32 位整数形式获取配置项。
//
// 入参:
// - key: 配置项的键。
// - defaultValue: 默认值。
//
// 出参:
// - 配置项的值。如果配置项不存在、类型不是 32 位整数或者值为零值,则返回默认值。
func (dc *DeployConfig) GetConfigOrDefaultAsInt32(key string, defaultValue int32) int32 {
return maps.GetValueOrDefaultAsInt32(dc.Config, key, defaultValue)
}
// Deprecated: 以布尔形式获取配置项。
//
// 入参:
// - key: 配置项的键。
//
// 出参:
// - 配置项的值。如果配置项不存在或者类型不是布尔,则返回 false。
func (dc *DeployConfig) GetConfigAsBool(key string) bool {
return maps.GetValueAsBool(dc.Config, key)
}
// Deprecated: 以布尔形式获取配置项。
//
// 入参:
// - key: 配置项的键。
// - defaultValue: 默认值。
//
// 出参:
// - 配置项的值。如果配置项不存在或者类型不是布尔,则返回默认值。
func (dc *DeployConfig) GetConfigOrDefaultAsBool(key string, defaultValue bool) bool {
return maps.GetValueOrDefaultAsBool(dc.Config, key, defaultValue)
}
// Deprecated: 以变量字典形式获取配置项。
//
// 出参:
// - 变量字典。
func (dc *DeployConfig) GetConfigAsVariables() map[string]string {
rs := make(map[string]string)
if dc.Config != nil {
value, ok := dc.Config["variables"]
if !ok {
return rs
}
kvs := make([]KV, 0)
bts, _ := json.Marshal(value)
if err := json.Unmarshal(bts, &kvs); err != nil {
return rs
}
for _, kv := range kvs {
rs[kv.Key] = kv.Value
}
}
return rs
}
// Deprecated: GetDomain returns the domain from the deploy config,
// if the domain is a wildcard domain, and wildcard is true, return the wildcard domain
func (dc *DeployConfig) GetDomain(wildcard ...bool) string {
val := dc.GetConfigAsString("domain")
if val == "" {
return ""
}
if !strings.HasPrefix(val, "*") {
return val
}
if len(wildcard) > 0 && wildcard[0] {
return val
}
return strings.TrimPrefix(val, "*")
}
// Deprecated: TODO: 即将废弃
type KV struct {
Key string `json:"key"`
Value string `json:"value"`

9
internal/domain/meta.go Normal file
View File

@ -0,0 +1,9 @@
package domain
import "time"
type Meta struct {
Id string `json:"id" db:"id"`
CreatedAt time.Time `json:"created" db:"created"`
UpdatedAt time.Time `json:"updated" db:"updated"`
}

View File

@ -1,5 +1,7 @@
package domain
type NotifyChannelType string
/*
消息通知渠道常量值
@ -7,14 +9,14 @@ package domain
NOTICE: If you add new constant, please keep ASCII order.
*/
const (
NotifyChannelBark = "bark"
NotifyChannelDingtalk = "dingtalk"
NotifyChannelEmail = "email"
NotifyChannelLark = "lark"
NotifyChannelServerChan = "serverchan"
NotifyChannelTelegram = "telegram"
NotifyChannelWebhook = "webhook"
NotifyChannelWeCom = "wecom"
NOTIFY_CHANNEL_BARK = NotifyChannelType("bark")
NOTIFY_CHANNEL_DINGTALK = NotifyChannelType("dingtalk")
NOTIFY_CHANNEL_EMAIL = NotifyChannelType("email")
NOTIFY_CHANNEL_LARK = NotifyChannelType("lark")
NOTIFY_CHANNEL_SERVERCHAN = NotifyChannelType("serverchan")
NOTIFY_CHANNEL_TELEGRAM = NotifyChannelType("telegram")
NOTIFY_CHANNEL_WEBHOOK = NotifyChannelType("webhook")
NOTIFY_CHANNEL_WECOM = NotifyChannelType("wecom")
)
type NotifyTestPushReq struct {

View File

@ -3,21 +3,18 @@ package domain
import (
"encoding/json"
"fmt"
"time"
)
type Setting struct {
ID string `json:"id"`
Name string `json:"name"`
Content string `json:"content"`
Created time.Time `json:"created"`
Updated time.Time `json:"updated"`
type Settings struct {
Meta
Name string `json:"name" db:"name"`
Content string `json:"content" db:"content"`
}
type ChannelsConfig map[string]map[string]any
type NotifyChannelsConfig map[string]map[string]any
func (s *Setting) GetChannelContent(channel string) (map[string]any, error) {
conf := &ChannelsConfig{}
func (s *Settings) GetChannelContent(channel string) (map[string]any, error) {
conf := &NotifyChannelsConfig{}
if err := json.Unmarshal([]byte(s.Content), conf); err != nil {
return nil, err
}

View File

@ -16,25 +16,25 @@ import (
"github.com/usual2970/certimate/internal/pkg/utils/maps"
)
func createNotifier(channel string, channelConfig map[string]any) (notifier.Notifier, error) {
func createNotifier(channel domain.NotifyChannelType, channelConfig map[string]any) (notifier.Notifier, error) {
/*
注意如果追加新的常量值请保持以 ASCII 排序
NOTICE: If you add new constant, please keep ASCII order.
*/
switch channel {
case domain.NotifyChannelBark:
case domain.NOTIFY_CHANNEL_BARK:
return providerBark.New(&providerBark.BarkNotifierConfig{
DeviceKey: maps.GetValueAsString(channelConfig, "deviceKey"),
ServerUrl: maps.GetValueAsString(channelConfig, "serverUrl"),
})
case domain.NotifyChannelDingtalk:
case domain.NOTIFY_CHANNEL_DINGTALK:
return providerDingTalk.New(&providerDingTalk.DingTalkNotifierConfig{
AccessToken: maps.GetValueAsString(channelConfig, "accessToken"),
Secret: maps.GetValueAsString(channelConfig, "secret"),
})
case domain.NotifyChannelEmail:
case domain.NOTIFY_CHANNEL_EMAIL:
return providerEmail.New(&providerEmail.EmailNotifierConfig{
SmtpHost: maps.GetValueAsString(channelConfig, "smtpHost"),
SmtpPort: maps.GetValueAsInt32(channelConfig, "smtpPort"),
@ -45,28 +45,28 @@ func createNotifier(channel string, channelConfig map[string]any) (notifier.Noti
ReceiverAddress: maps.GetValueAsString(channelConfig, "receiverAddress"),
})
case domain.NotifyChannelLark:
case domain.NOTIFY_CHANNEL_LARK:
return providerLark.New(&providerLark.LarkNotifierConfig{
WebhookUrl: maps.GetValueAsString(channelConfig, "webhookUrl"),
})
case domain.NotifyChannelServerChan:
case domain.NOTIFY_CHANNEL_SERVERCHAN:
return providerServerChan.New(&providerServerChan.ServerChanNotifierConfig{
Url: maps.GetValueAsString(channelConfig, "url"),
})
case domain.NotifyChannelTelegram:
case domain.NOTIFY_CHANNEL_TELEGRAM:
return providerTelegram.New(&providerTelegram.TelegramNotifierConfig{
ApiToken: maps.GetValueAsString(channelConfig, "apiToken"),
ChatId: maps.GetValueAsInt64(channelConfig, "chatId"),
})
case domain.NotifyChannelWebhook:
case domain.NOTIFY_CHANNEL_WEBHOOK:
return providerWebhook.New(&providerWebhook.WebhookNotifierConfig{
Url: maps.GetValueAsString(channelConfig, "url"),
})
case domain.NotifyChannelWeCom:
case domain.NOTIFY_CHANNEL_WECOM:
return providerWeCom.New(&providerWeCom.WeComNotifierConfig{
WebhookUrl: maps.GetValueAsString(channelConfig, "webhookUrl"),
})

View File

@ -7,6 +7,7 @@ import (
"golang.org/x/sync/errgroup"
"github.com/usual2970/certimate/internal/app"
"github.com/usual2970/certimate/internal/domain"
"github.com/usual2970/certimate/internal/pkg/core/notifier"
"github.com/usual2970/certimate/internal/pkg/utils/maps"
)
@ -37,7 +38,7 @@ func SendToAllChannels(subject, message string) error {
}
func SendToChannel(subject, message string, channel string, channelConfig map[string]any) error {
notifier, err := createNotifier(channel, channelConfig)
notifier, err := createNotifier(domain.NotifyChannelType(channel), channelConfig)
if err != nil {
return err
}
@ -63,7 +64,7 @@ func getEnabledNotifiers() ([]notifier.Notifier, error) {
continue
}
notifier, err := createNotifier(k, v)
notifier, err := createNotifier(domain.NotifyChannelType(k), v)
if err != nil {
continue
}

View File

@ -13,7 +13,7 @@ const (
)
type SettingRepository interface {
GetByName(ctx context.Context, name string) (*domain.Setting, error)
GetByName(ctx context.Context, name string) (*domain.Settings, error)
}
type NotifyService struct {

View File

@ -26,9 +26,9 @@ func (a *AccessRepository) GetById(ctx context.Context, id string) (*domain.Acce
rs := &domain.Access{
Meta: domain.Meta{
Id: record.GetId(),
Created: record.GetTime("created"),
Updated: record.GetTime("updated"),
Id: record.GetId(),
CreatedAt: record.GetTime("created"),
UpdatedAt: record.GetTime("updated"),
},
Name: record.GetString("name"),
Config: record.GetString("config"),

View File

@ -47,13 +47,15 @@ func (r *AcmeAccountRepository) GetByCAAndEmail(ca, email string) (*domain.AcmeA
}
return &domain.AcmeAccount{
Id: record.GetString("id"),
Ca: record.GetString("ca"),
Meta: domain.Meta{
Id: record.GetString("id"),
CreatedAt: record.GetTime("created"),
UpdatedAt: record.GetTime("updated"),
},
CA: record.GetString("ca"),
Email: record.GetString("email"),
Key: record.GetString("key"),
Resource: resource,
Created: record.GetTime("created"),
Updated: record.GetTime("updated"),
}, nil
}

View File

@ -3,6 +3,7 @@ package repository
import (
"context"
"github.com/pocketbase/dbx"
"github.com/usual2970/certimate/internal/app"
"github.com/usual2970/certimate/internal/domain"
)
@ -13,18 +14,20 @@ func NewSettingRepository() *SettingRepository {
return &SettingRepository{}
}
func (s *SettingRepository) GetByName(ctx context.Context, name string) (*domain.Setting, error) {
resp, err := app.GetApp().Dao().FindFirstRecordByFilter("settings", "name='"+name+"'")
func (s *SettingRepository) GetByName(ctx context.Context, name string) (*domain.Settings, error) {
resp, err := app.GetApp().Dao().FindFirstRecordByFilter("settings", "name={:name}", dbx.Params{"name": name})
if err != nil {
return nil, err
}
rs := &domain.Setting{
ID: resp.GetString("id"),
rs := &domain.Settings{
Meta: domain.Meta{
Id: resp.GetString("id"),
CreatedAt: resp.GetTime("created"),
UpdatedAt: resp.GetTime("updated"),
},
Name: resp.GetString("name"),
Content: resp.GetString("content"),
Created: resp.GetTime("created"),
Updated: resp.GetTime("updated"),
}
return rs, nil

View File

@ -77,9 +77,9 @@ func record2Workflow(record *models.Record) (*domain.Workflow, error) {
workflow := &domain.Workflow{
Meta: domain.Meta{
Id: record.GetId(),
Created: record.GetTime("created"),
Updated: record.GetTime("updated"),
Id: record.GetId(),
CreatedAt: record.GetTime("created"),
UpdatedAt: record.GetTime("updated"),
},
Name: record.GetString("name"),
Description: record.GetString("description"),

View File

@ -42,9 +42,9 @@ func (w *WorkflowOutputRepository) Get(ctx context.Context, nodeId string) (*dom
rs := &domain.WorkflowOutput{
Meta: domain.Meta{
Id: record.GetId(),
Created: record.GetCreated().Time(),
Updated: record.GetUpdated().Time(),
Id: record.GetId(),
CreatedAt: record.GetCreated().Time(),
UpdatedAt: record.GetUpdated().Time(),
},
Workflow: record.GetString("workflow"),
NodeId: record.GetString("nodeId"),
@ -72,20 +72,20 @@ func (w *WorkflowOutputRepository) GetCertificate(ctx context.Context, nodeId st
rs := &domain.Certificate{
Meta: domain.Meta{
Id: record.GetId(),
Created: record.GetDateTime("created").Time(),
Updated: record.GetDateTime("updated").Time(),
Id: record.GetId(),
CreatedAt: record.GetDateTime("created").Time(),
UpdatedAt: record.GetDateTime("updated").Time(),
},
Certificate: record.GetString("certificate"),
PrivateKey: record.GetString("privateKey"),
IssuerCertificate: record.GetString("issuerCertificate"),
SAN: record.GetString("san"),
Output: record.GetString("output"),
WorkflowOutputId: record.GetString("output"),
ExpireAt: record.GetDateTime("expireAt").Time(),
CertUrl: record.GetString("certUrl"),
CertStableUrl: record.GetString("certStableUrl"),
Workflow: record.GetString("workflow"),
NodeId: record.GetString("nodeId"),
WorkflowId: record.GetString("workflow"),
WorkflowNodeId: record.GetString("nodeId"),
}
return rs, nil
}
@ -132,12 +132,12 @@ func (w *WorkflowOutputRepository) Save(ctx context.Context, output *domain.Work
certRecord.Set("privateKey", certificate.PrivateKey)
certRecord.Set("issuerCertificate", certificate.IssuerCertificate)
certRecord.Set("san", certificate.SAN)
certRecord.Set("output", certificate.Output)
certRecord.Set("output", certificate.WorkflowOutputId)
certRecord.Set("expireAt", certificate.ExpireAt)
certRecord.Set("certUrl", certificate.CertUrl)
certRecord.Set("certStableUrl", certificate.CertStableUrl)
certRecord.Set("workflow", certificate.Workflow)
certRecord.Set("nodeId", certificate.NodeId)
certRecord.Set("workflow", certificate.WorkflowId)
certRecord.Set("nodeId", certificate.WorkflowNodeId)
if err := app.GetApp().Dao().SaveRecord(certRecord); err != nil {
return err

View File

@ -103,13 +103,13 @@ func (a *applyNode) Run(ctx context.Context) error {
CertUrl: certificate.CertUrl,
CertStableUrl: certificate.CertStableUrl,
ExpireAt: cert.NotAfter,
Workflow: GetWorkflowId(ctx),
NodeId: a.node.Id,
WorkflowId: GetWorkflowId(ctx),
WorkflowNodeId: a.node.Id,
}
if err := a.outputRepo.Save(ctx, output, certificateRecord, func(id string) error {
if certificateRecord != nil {
certificateRecord.Output = id
certificateRecord.WorkflowOutputId = id
}
return nil

View File

@ -53,7 +53,7 @@ func (d *deployNode) Run(ctx context.Context) error {
// 部署过但是证书更新了,重新部署
// 部署过且证书未更新,直接返回
if d.deployed(output) && cert.Created.Before(output.Updated) {
if d.deployed(output) && cert.CreatedAt.Before(output.UpdatedAt) {
d.AddOutput(ctx, d.node.Name, "已部署过且证书未更新")
return nil
}

View File

@ -9,7 +9,7 @@ import (
)
type SettingRepository interface {
GetByName(ctx context.Context, name string) (*domain.Setting, error)
GetByName(ctx context.Context, name string) (*domain.Settings, error)
}
type notifyNode struct {
node *domain.WorkflowNode

View File

@ -6,7 +6,7 @@ import { createSchemaFieldRule } from "antd-zod";
import { z } from "zod";
import { useAntdForm } from "@/hooks";
import { ACCESS_PROVIDER_TYPES, type AccessModel } from "@/domain/access";
import { ACCESS_PROVIDERS, type AccessModel } from "@/domain/access";
import AccessTypeSelect from "./AccessTypeSelect";
import AccessEditFormACMEHttpReqConfig from "./AccessEditFormACMEHttpReqConfig";
import AccessEditFormAliyunConfig from "./AccessEditFormAliyunConfig";
@ -55,7 +55,7 @@ const AccessEditForm = forwardRef<AccessEditFormInstance, AccessEditFormProps>((
.trim()
.min(1, t("access.form.name.placeholder"))
.max(64, t("common.errmsg.string_max", { max: 64 })),
configType: z.nativeEnum(ACCESS_PROVIDER_TYPES, { message: t("access.form.type.placeholder") }),
configType: z.nativeEnum(ACCESS_PROVIDERS, { message: t("access.form.type.placeholder") }),
config: z.any(),
});
const formRule = createSchemaFieldRule(formSchema);
@ -77,43 +77,43 @@ const AccessEditForm = forwardRef<AccessEditFormInstance, AccessEditFormProps>((
*/
const configFormProps = { form: configFormInst, formName: configFormName, disabled: disabled, initialValues: initialValues?.config };
switch (configType) {
case ACCESS_PROVIDER_TYPES.ACMEHTTPREQ:
case ACCESS_PROVIDERS.ACMEHTTPREQ:
return <AccessEditFormACMEHttpReqConfig {...configFormProps} />;
case ACCESS_PROVIDER_TYPES.ALIYUN:
case ACCESS_PROVIDERS.ALIYUN:
return <AccessEditFormAliyunConfig {...configFormProps} />;
case ACCESS_PROVIDER_TYPES.AWS:
case ACCESS_PROVIDERS.AWS:
return <AccessEditFormAWSConfig {...configFormProps} />;
case ACCESS_PROVIDER_TYPES.BAIDUCLOUD:
case ACCESS_PROVIDERS.BAIDUCLOUD:
return <AccessEditFormBaiduCloudConfig {...configFormProps} />;
case ACCESS_PROVIDER_TYPES.BYTEPLUS:
case ACCESS_PROVIDERS.BYTEPLUS:
return <AccessEditFormBytePlusConfig {...configFormProps} />;
case ACCESS_PROVIDER_TYPES.CLOUDFLARE:
case ACCESS_PROVIDERS.CLOUDFLARE:
return <AccessEditFormCloudflareConfig {...configFormProps} />;
case ACCESS_PROVIDER_TYPES.DOGECLOUD:
case ACCESS_PROVIDERS.DOGECLOUD:
return <AccessEditFormDogeCloudConfig {...configFormProps} />;
case ACCESS_PROVIDER_TYPES.GODADDY:
case ACCESS_PROVIDERS.GODADDY:
return <AccessEditFormGoDaddyConfig {...configFormProps} />;
case ACCESS_PROVIDER_TYPES.HUAWEICLOUD:
case ACCESS_PROVIDERS.HUAWEICLOUD:
return <AccessEditFormHuaweiCloudConfig {...configFormProps} />;
case ACCESS_PROVIDER_TYPES.KUBERNETES:
case ACCESS_PROVIDERS.KUBERNETES:
return <AccessEditFormKubernetesConfig {...configFormProps} />;
case ACCESS_PROVIDER_TYPES.LOCAL:
case ACCESS_PROVIDERS.LOCAL:
return <AccessEditFormLocalConfig {...configFormProps} />;
case ACCESS_PROVIDER_TYPES.NAMEDOTCOM:
case ACCESS_PROVIDERS.NAMEDOTCOM:
return <AccessEditFormNameDotComConfig {...configFormProps} />;
case ACCESS_PROVIDER_TYPES.NAMESILO:
case ACCESS_PROVIDERS.NAMESILO:
return <AccessEditFormNameSiloConfig {...configFormProps} />;
case ACCESS_PROVIDER_TYPES.POWERDNS:
case ACCESS_PROVIDERS.POWERDNS:
return <AccessEditFormPowerDNSConfig {...configFormProps} />;
case ACCESS_PROVIDER_TYPES.QINIU:
case ACCESS_PROVIDERS.QINIU:
return <AccessEditFormQiniuConfig {...configFormProps} />;
case ACCESS_PROVIDER_TYPES.SSH:
case ACCESS_PROVIDERS.SSH:
return <AccessEditFormSSHConfig {...configFormProps} />;
case ACCESS_PROVIDER_TYPES.TENCENTCLOUD:
case ACCESS_PROVIDERS.TENCENTCLOUD:
return <AccessEditFormTencentCloudConfig {...configFormProps} />;
case ACCESS_PROVIDER_TYPES.VOLCENGINE:
case ACCESS_PROVIDERS.VOLCENGINE:
return <AccessEditFormVolcEngineConfig {...configFormProps} />;
case ACCESS_PROVIDER_TYPES.WEBHOOK:
case ACCESS_PROVIDERS.WEBHOOK:
return <AccessEditFormWebhookConfig {...configFormProps} />;
}
}, [disabled, initialValues, configType, configFormInst, configFormName]);

View File

@ -2,7 +2,7 @@ import { memo } from "react";
import { useTranslation } from "react-i18next";
import { Avatar, Select, Space, Tag, Typography, type SelectProps } from "antd";
import { ACCESS_PROVIDER_USAGES, accessProvidersMap } from "@/domain/access";
import { ACCESS_USAGES, accessProvidersMap } from "@/domain/access";
export type AccessTypeSelectProps = Omit<
SelectProps,
@ -29,17 +29,17 @@ const AccessTypeSelect = (props: AccessTypeSelectProps) => {
</Typography.Text>
</Space>
<div>
{provider?.usage === ACCESS_PROVIDER_USAGES.APPLY && (
{provider?.usage === ACCESS_USAGES.APPLY && (
<>
<Tag color="orange">{t("access.props.provider.usage.dns")}</Tag>
</>
)}
{provider?.usage === ACCESS_PROVIDER_USAGES.DEPLOY && (
{provider?.usage === ACCESS_USAGES.DEPLOY && (
<>
<Tag color="blue">{t("access.props.provider.usage.host")}</Tag>
</>
)}
{provider?.usage === ACCESS_PROVIDER_USAGES.ALL && (
{provider?.usage === ACCESS_USAGES.ALL && (
<>
<Tag color="orange">{t("access.props.provider.usage.dns")}</Tag>
<Tag color="blue">{t("access.props.provider.usage.host")}</Tag>

View File

@ -67,9 +67,9 @@ const Node = ({ data }: NodeProps) => {
case WorkflowNodeType.Notify: {
const channelLabel = notifyChannelsMap.get(data.config?.channel as string);
return (
<div className="flex space-x-2 items-baseline">
<div className="text-stone-700 w-12 truncate">{t(channelLabel?.name ?? "")}</div>
<div className="text-muted-foreground truncate">{(data.config?.title as string) ?? ""}</div>
<div className="flex space-x-2 items-center justify-between">
<div className="text-stone-700 truncate">{t(channelLabel?.name ?? "")}</div>
<div className="text-muted-foreground truncate">{(data.config?.subject as string) ?? ""}</div>
</div>
);
}

View File

@ -12,7 +12,7 @@ import ModalForm from "@/components/core/ModalForm";
import MultipleInput from "@/components/core/MultipleInput";
import { usePanel } from "../PanelProvider";
import { useAntdForm, useZustandShallowSelector } from "@/hooks";
import { ACCESS_PROVIDER_USAGES, accessProvidersMap } from "@/domain/access";
import { ACCESS_USAGES, accessProvidersMap } from "@/domain/access";
import { type WorkflowNode, type WorkflowNodeConfig } from "@/domain/workflow";
import { useContactStore } from "@/stores/contact";
import { useWorkflowStore } from "@/stores/workflow";
@ -163,7 +163,7 @@ const ApplyNodeForm = ({ data }: ApplyNodeFormProps) => {
}
onSubmit={(record) => {
const provider = accessProvidersMap.get(record.configType);
if (ACCESS_PROVIDER_USAGES.ALL === provider?.usage || ACCESS_PROVIDER_USAGES.APPLY === provider?.usage) {
if (ACCESS_USAGES.ALL === provider?.usage || ACCESS_USAGES.APPLY === provider?.usage) {
formInst.setFieldValue("access", record.id);
}
}}
@ -176,7 +176,7 @@ const ApplyNodeForm = ({ data }: ApplyNodeFormProps) => {
placeholder={t("workflow.nodes.apply.form.access.placeholder")}
filter={(record) => {
const provider = accessProvidersMap.get(record.configType);
return ACCESS_PROVIDER_USAGES.ALL === provider?.usage || ACCESS_PROVIDER_USAGES.APPLY === provider?.usage;
return ACCESS_USAGES.ALL === provider?.usage || ACCESS_USAGES.APPLY === provider?.usage;
}}
/>
</Form.Item>

View File

@ -2,65 +2,65 @@
ASCII
NOTICE: If you add new constant, please keep ASCII order.
*/
export const ACCESS_PROVIDER_TYPE_ACMEHTTPREQ = "acmehttpreq" as const;
export const ACCESS_PROVIDER_TYPE_ALIYUN = "aliyun" as const;
export const ACCESS_PROVIDER_TYPE_AWS = "aws" as const;
export const ACCESS_PROVIDER_TYPE_BAIDUCLOUD = "baiducloud" as const;
export const ACCESS_PROVIDER_TYPE_BYTEPLUS = "byteplus" as const;
export const ACCESS_PROVIDER_TYPE_CLOUDFLARE = "cloudflare" as const;
export const ACCESS_PROVIDER_TYPE_DOGECLOUD = "dogecloud" as const;
export const ACCESS_PROVIDER_TYPE_GODADDY = "godaddy" as const;
export const ACCESS_PROVIDER_TYPE_HUAWEICLOUD = "huaweicloud" as const;
export const ACCESS_PROVIDER_TYPE_KUBERNETES = "k8s" as const;
export const ACCESS_PROVIDER_TYPE_LOCAL = "local" as const;
export const ACCESS_PROVIDER_TYPE_NAMEDOTCOM = "namedotcom" as const;
export const ACCESS_PROVIDER_TYPE_NAMESILO = "namesilo" as const;
export const ACCESS_PROVIDER_TYPE_POWERDNS = "powerdns" as const;
export const ACCESS_PROVIDER_TYPE_QINIU = "qiniu" as const;
export const ACCESS_PROVIDER_TYPE_SSH = "ssh" as const;
export const ACCESS_PROVIDER_TYPE_TENCENTCLOUD = "tencentcloud" as const;
export const ACCESS_PROVIDER_TYPE_VOLCENGINE = "volcengine" as const;
export const ACCESS_PROVIDER_TYPE_WEBHOOK = "webhook" as const;
export const ACCESS_PROVIDER_TYPES = Object.freeze({
ACMEHTTPREQ: ACCESS_PROVIDER_TYPE_ACMEHTTPREQ,
ALIYUN: ACCESS_PROVIDER_TYPE_ALIYUN,
AWS: ACCESS_PROVIDER_TYPE_AWS,
BAIDUCLOUD: ACCESS_PROVIDER_TYPE_BAIDUCLOUD,
BYTEPLUS: ACCESS_PROVIDER_TYPE_BYTEPLUS,
CLOUDFLARE: ACCESS_PROVIDER_TYPE_CLOUDFLARE,
DOGECLOUD: ACCESS_PROVIDER_TYPE_DOGECLOUD,
GODADDY: ACCESS_PROVIDER_TYPE_GODADDY,
HUAWEICLOUD: ACCESS_PROVIDER_TYPE_HUAWEICLOUD,
KUBERNETES: ACCESS_PROVIDER_TYPE_KUBERNETES,
LOCAL: ACCESS_PROVIDER_TYPE_LOCAL,
NAMEDOTCOM: ACCESS_PROVIDER_TYPE_NAMEDOTCOM,
NAMESILO: ACCESS_PROVIDER_TYPE_NAMESILO,
POWERDNS: ACCESS_PROVIDER_TYPE_POWERDNS,
QINIU: ACCESS_PROVIDER_TYPE_QINIU,
SSH: ACCESS_PROVIDER_TYPE_SSH,
TENCENTCLOUD: ACCESS_PROVIDER_TYPE_TENCENTCLOUD,
VOLCENGINE: ACCESS_PROVIDER_TYPE_VOLCENGINE,
WEBHOOK: ACCESS_PROVIDER_TYPE_WEBHOOK,
export const ACCESS_PROVIDER_ACMEHTTPREQ = "acmehttpreq" as const;
export const ACCESS_PROVIDER_ALIYUN = "aliyun" as const;
export const ACCESS_PROVIDER_AWS = "aws" as const;
export const ACCESS_PROVIDER_BAIDUCLOUD = "baiducloud" as const;
export const ACCESS_PROVIDER_BYTEPLUS = "byteplus" as const;
export const ACCESS_PROVIDER_CLOUDFLARE = "cloudflare" as const;
export const ACCESS_PROVIDER_DOGECLOUD = "dogecloud" as const;
export const ACCESS_PROVIDER_GODADDY = "godaddy" as const;
export const ACCESS_PROVIDER_HUAWEICLOUD = "huaweicloud" as const;
export const ACCESS_PROVIDER_KUBERNETES = "k8s" as const;
export const ACCESS_PROVIDER_LOCAL = "local" as const;
export const ACCESS_PROVIDER_NAMEDOTCOM = "namedotcom" as const;
export const ACCESS_PROVIDER_NAMESILO = "namesilo" as const;
export const ACCESS_PROVIDER_POWERDNS = "powerdns" as const;
export const ACCESS_PROVIDER_QINIU = "qiniu" as const;
export const ACCESS_PROVIDER_SSH = "ssh" as const;
export const ACCESS_PROVIDER_TENCENTCLOUD = "tencentcloud" as const;
export const ACCESS_PROVIDER_VOLCENGINE = "volcengine" as const;
export const ACCESS_PROVIDER_WEBHOOK = "webhook" as const;
export const ACCESS_PROVIDERS = Object.freeze({
ACMEHTTPREQ: ACCESS_PROVIDER_ACMEHTTPREQ,
ALIYUN: ACCESS_PROVIDER_ALIYUN,
AWS: ACCESS_PROVIDER_AWS,
BAIDUCLOUD: ACCESS_PROVIDER_BAIDUCLOUD,
BYTEPLUS: ACCESS_PROVIDER_BYTEPLUS,
CLOUDFLARE: ACCESS_PROVIDER_CLOUDFLARE,
DOGECLOUD: ACCESS_PROVIDER_DOGECLOUD,
GODADDY: ACCESS_PROVIDER_GODADDY,
HUAWEICLOUD: ACCESS_PROVIDER_HUAWEICLOUD,
KUBERNETES: ACCESS_PROVIDER_KUBERNETES,
LOCAL: ACCESS_PROVIDER_LOCAL,
NAMEDOTCOM: ACCESS_PROVIDER_NAMEDOTCOM,
NAMESILO: ACCESS_PROVIDER_NAMESILO,
POWERDNS: ACCESS_PROVIDER_POWERDNS,
QINIU: ACCESS_PROVIDER_QINIU,
SSH: ACCESS_PROVIDER_SSH,
TENCENTCLOUD: ACCESS_PROVIDER_TENCENTCLOUD,
VOLCENGINE: ACCESS_PROVIDER_VOLCENGINE,
WEBHOOK: ACCESS_PROVIDER_WEBHOOK,
} as const);
export type AccessProviderTypes = (typeof ACCESS_PROVIDER_TYPES)[keyof typeof ACCESS_PROVIDER_TYPES];
export type AccessProviderType = (typeof ACCESS_PROVIDERS)[keyof typeof ACCESS_PROVIDERS];
export const ACCESS_PROVIDER_USAGE_ALL = "all" as const;
export const ACCESS_PROVIDER_USAGE_APPLY = "apply" as const;
export const ACCESS_PROVIDER_USAGE_DEPLOY = "deploy" as const;
export const ACCESS_PROVIDER_USAGES = Object.freeze({
ALL: ACCESS_PROVIDER_USAGE_ALL,
APPLY: ACCESS_PROVIDER_USAGE_APPLY,
DEPLOY: ACCESS_PROVIDER_USAGE_DEPLOY,
export const ACCESS_USAGE_ALL = "all" as const;
export const ACCESS_USAGE_APPLY = "apply" as const;
export const ACCESS_USAGE_DEPLOY = "deploy" as const;
export const ACCESS_USAGES = Object.freeze({
ALL: ACCESS_USAGE_ALL,
APPLY: ACCESS_USAGE_APPLY,
DEPLOY: ACCESS_USAGE_DEPLOY,
} as const);
export type AccessProviderUsages = (typeof ACCESS_PROVIDER_USAGES)[keyof typeof ACCESS_PROVIDER_USAGES];
export type AccessUsageType = (typeof ACCESS_USAGES)[keyof typeof ACCESS_USAGES];
// #region AccessModel
export interface AccessModel extends BaseModel {
name: string;
configType: string;
usage: AccessProviderUsages;
usage: AccessUsageType;
config: /*
ASCII
NOTICE: If you add new type, please keep ASCII order.
@ -193,7 +193,7 @@ export type AccessProvider = {
type: string;
name: string;
icon: string;
usage: AccessProviderUsages;
usage: AccessUsageType;
};
export const accessProvidersMap: Map<AccessProvider["type"], AccessProvider> = new Map(
@ -202,25 +202,25 @@ export const accessProvidersMap: Map<AccessProvider["type"], AccessProvider> = n
NOTICE: The following order determines the order displayed at the frontend.
*/
[
[ACCESS_PROVIDER_TYPE_LOCAL, "common.provider.local", "/imgs/providers/local.svg", "deploy"],
[ACCESS_PROVIDER_TYPE_SSH, "common.provider.ssh", "/imgs/providers/ssh.svg", "deploy"],
[ACCESS_PROVIDER_TYPE_WEBHOOK, "common.provider.webhook", "/imgs/providers/webhook.svg", "deploy"],
[ACCESS_PROVIDER_TYPE_ALIYUN, "common.provider.aliyun", "/imgs/providers/aliyun.svg", "all"],
[ACCESS_PROVIDER_TYPE_TENCENTCLOUD, "common.provider.tencentcloud", "/imgs/providers/tencentcloud.svg", "all"],
[ACCESS_PROVIDER_TYPE_HUAWEICLOUD, "common.provider.huaweicloud", "/imgs/providers/huaweicloud.svg", "all"],
[ACCESS_PROVIDER_TYPE_BAIDUCLOUD, "common.provider.baiducloud", "/imgs/providers/baiducloud.svg", "all"],
[ACCESS_PROVIDER_TYPE_QINIU, "common.provider.qiniu", "/imgs/providers/qiniu.svg", "deploy"],
[ACCESS_PROVIDER_TYPE_DOGECLOUD, "common.provider.dogecloud", "/imgs/providers/dogecloud.svg", "deploy"],
[ACCESS_PROVIDER_TYPE_VOLCENGINE, "common.provider.volcengine", "/imgs/providers/volcengine.svg", "all"],
[ACCESS_PROVIDER_TYPE_BYTEPLUS, "common.provider.byteplus", "/imgs/providers/byteplus.svg", "all"],
[ACCESS_PROVIDER_TYPE_AWS, "common.provider.aws", "/imgs/providers/aws.svg", "apply"],
[ACCESS_PROVIDER_TYPE_CLOUDFLARE, "common.provider.cloudflare", "/imgs/providers/cloudflare.svg", "apply"],
[ACCESS_PROVIDER_TYPE_NAMEDOTCOM, "common.provider.namedotcom", "/imgs/providers/namedotcom.svg", "apply"],
[ACCESS_PROVIDER_TYPE_NAMESILO, "common.provider.namesilo", "/imgs/providers/namesilo.svg", "apply"],
[ACCESS_PROVIDER_TYPE_GODADDY, "common.provider.godaddy", "/imgs/providers/godaddy.svg", "apply"],
[ACCESS_PROVIDER_TYPE_POWERDNS, "common.provider.powerdns", "/imgs/providers/powerdns.svg", "apply"],
[ACCESS_PROVIDER_TYPE_KUBERNETES, "common.provider.kubernetes", "/imgs/providers/kubernetes.svg", "deploy"],
[ACCESS_PROVIDER_TYPE_ACMEHTTPREQ, "common.provider.acmehttpreq", "/imgs/providers/acmehttpreq.svg", "apply"],
].map(([type, name, icon, usage]) => [type, { type, name, icon, usage: usage as AccessProviderUsages }])
[ACCESS_PROVIDER_LOCAL, "common.provider.local", "/imgs/providers/local.svg", "deploy"],
[ACCESS_PROVIDER_SSH, "common.provider.ssh", "/imgs/providers/ssh.svg", "deploy"],
[ACCESS_PROVIDER_WEBHOOK, "common.provider.webhook", "/imgs/providers/webhook.svg", "deploy"],
[ACCESS_PROVIDER_ALIYUN, "common.provider.aliyun", "/imgs/providers/aliyun.svg", "all"],
[ACCESS_PROVIDER_TENCENTCLOUD, "common.provider.tencentcloud", "/imgs/providers/tencentcloud.svg", "all"],
[ACCESS_PROVIDER_HUAWEICLOUD, "common.provider.huaweicloud", "/imgs/providers/huaweicloud.svg", "all"],
[ACCESS_PROVIDER_BAIDUCLOUD, "common.provider.baiducloud", "/imgs/providers/baiducloud.svg", "all"],
[ACCESS_PROVIDER_QINIU, "common.provider.qiniu", "/imgs/providers/qiniu.svg", "deploy"],
[ACCESS_PROVIDER_DOGECLOUD, "common.provider.dogecloud", "/imgs/providers/dogecloud.svg", "deploy"],
[ACCESS_PROVIDER_VOLCENGINE, "common.provider.volcengine", "/imgs/providers/volcengine.svg", "all"],
[ACCESS_PROVIDER_BYTEPLUS, "common.provider.byteplus", "/imgs/providers/byteplus.svg", "all"],
[ACCESS_PROVIDER_AWS, "common.provider.aws", "/imgs/providers/aws.svg", "apply"],
[ACCESS_PROVIDER_CLOUDFLARE, "common.provider.cloudflare", "/imgs/providers/cloudflare.svg", "apply"],
[ACCESS_PROVIDER_NAMEDOTCOM, "common.provider.namedotcom", "/imgs/providers/namedotcom.svg", "apply"],
[ACCESS_PROVIDER_NAMESILO, "common.provider.namesilo", "/imgs/providers/namesilo.svg", "apply"],
[ACCESS_PROVIDER_GODADDY, "common.provider.godaddy", "/imgs/providers/godaddy.svg", "apply"],
[ACCESS_PROVIDER_POWERDNS, "common.provider.powerdns", "/imgs/providers/powerdns.svg", "apply"],
[ACCESS_PROVIDER_KUBERNETES, "common.provider.kubernetes", "/imgs/providers/kubernetes.svg", "deploy"],
[ACCESS_PROVIDER_ACMEHTTPREQ, "common.provider.acmehttpreq", "/imgs/providers/acmehttpreq.svg", "apply"],
].map(([type, name, icon, usage]) => [type, { type, name, icon, usage: usage as AccessUsageType }])
);
// #endregion

View File

@ -1,16 +1,16 @@
import {
ACCESS_PROVIDER_TYPE_ALIYUN,
ACCESS_PROVIDER_TYPE_BAIDUCLOUD,
ACCESS_PROVIDER_TYPE_BYTEPLUS,
ACCESS_PROVIDER_TYPE_DOGECLOUD,
ACCESS_PROVIDER_TYPE_HUAWEICLOUD,
ACCESS_PROVIDER_TYPE_KUBERNETES,
ACCESS_PROVIDER_TYPE_LOCAL,
ACCESS_PROVIDER_TYPE_QINIU,
ACCESS_PROVIDER_TYPE_SSH,
ACCESS_PROVIDER_TYPE_TENCENTCLOUD,
ACCESS_PROVIDER_TYPE_VOLCENGINE,
ACCESS_PROVIDER_TYPE_WEBHOOK,
ACCESS_PROVIDER_ALIYUN,
ACCESS_PROVIDER_BAIDUCLOUD,
ACCESS_PROVIDER_BYTEPLUS,
ACCESS_PROVIDER_DOGECLOUD,
ACCESS_PROVIDER_HUAWEICLOUD,
ACCESS_PROVIDER_KUBERNETES,
ACCESS_PROVIDER_LOCAL,
ACCESS_PROVIDER_QINIU,
ACCESS_PROVIDER_SSH,
ACCESS_PROVIDER_TENCENTCLOUD,
ACCESS_PROVIDER_VOLCENGINE,
ACCESS_PROVIDER_WEBHOOK,
} from "./access";
export type KVType = {
@ -34,7 +34,7 @@ export type ApplyConfig = {
email: string;
keyAlgorithm?: string;
nameservers?: string;
timeout?: number;
propagationTimeout?: number;
disableFollowCNAME?: boolean;
};
@ -50,29 +50,29 @@ export const deployTargetList: string[][] = [
NOTICE: The following order determines the order displayed at the frontend.
*/
[`${ACCESS_PROVIDER_TYPE_LOCAL}`, "common.provider.local", "/imgs/providers/local.svg"],
[`${ACCESS_PROVIDER_TYPE_SSH}`, "common.provider.ssh", "/imgs/providers/ssh.svg"],
[`${ACCESS_PROVIDER_TYPE_WEBHOOK}`, "common.provider.webhook", "/imgs/providers/webhook.svg"],
[`${ACCESS_PROVIDER_TYPE_ALIYUN}-oss`, "common.provider.aliyun.oss", "/imgs/providers/aliyun.svg"],
[`${ACCESS_PROVIDER_TYPE_ALIYUN}-cdn`, "common.provider.aliyun.cdn", "/imgs/providers/aliyun.svg"],
[`${ACCESS_PROVIDER_TYPE_ALIYUN}-dcdn`, "common.provider.aliyun.dcdn", "/imgs/providers/aliyun.svg"],
[`${ACCESS_PROVIDER_TYPE_ALIYUN}-clb`, "common.provider.aliyun.clb", "/imgs/providers/aliyun.svg"],
[`${ACCESS_PROVIDER_TYPE_ALIYUN}-alb`, "common.provider.aliyun.alb", "/imgs/providers/aliyun.svg"],
[`${ACCESS_PROVIDER_TYPE_ALIYUN}-nlb`, "common.provider.aliyun.nlb", "/imgs/providers/aliyun.svg"],
[`${ACCESS_PROVIDER_TYPE_TENCENTCLOUD}-cdn`, "common.provider.tencentcloud.cdn", "/imgs/providers/tencentcloud.svg"],
[`${ACCESS_PROVIDER_TYPE_TENCENTCLOUD}-ecdn`, "common.provider.tencentcloud.ecdn", "/imgs/providers/tencentcloud.svg"],
[`${ACCESS_PROVIDER_TYPE_TENCENTCLOUD}-clb`, "common.provider.tencentcloud.clb", "/imgs/providers/tencentcloud.svg"],
[`${ACCESS_PROVIDER_TYPE_TENCENTCLOUD}-cos`, "common.provider.tencentcloud.cos", "/imgs/providers/tencentcloud.svg"],
[`${ACCESS_PROVIDER_TYPE_TENCENTCLOUD}-eo`, "common.provider.tencentcloud.eo", "/imgs/providers/tencentcloud.svg"],
[`${ACCESS_PROVIDER_TYPE_HUAWEICLOUD}-cdn`, "common.provider.huaweicloud.cdn", "/imgs/providers/huaweicloud.svg"],
[`${ACCESS_PROVIDER_TYPE_HUAWEICLOUD}-elb`, "common.provider.huaweicloud.elb", "/imgs/providers/huaweicloud.svg"],
[`${ACCESS_PROVIDER_TYPE_BAIDUCLOUD}-cdn`, "common.provider.baiducloud.cdn", "/imgs/providers/baiducloud.svg"],
[`${ACCESS_PROVIDER_TYPE_VOLCENGINE}-cdn`, "common.provider.volcengine.cdn", "/imgs/providers/volcengine.svg"],
[`${ACCESS_PROVIDER_TYPE_VOLCENGINE}-live`, "common.provider.volcengine.live", "/imgs/providers/volcengine.svg"],
[`${ACCESS_PROVIDER_TYPE_QINIU}-cdn`, "common.provider.qiniu.cdn", "/imgs/providers/qiniu.svg"],
[`${ACCESS_PROVIDER_TYPE_DOGECLOUD}-cdn`, "common.provider.dogecloud.cdn", "/imgs/providers/dogecloud.svg"],
[`${ACCESS_PROVIDER_TYPE_BYTEPLUS}-cdn`, "common.provider.byteplus.cdn", "/imgs/providers/byteplus.svg"],
[`${ACCESS_PROVIDER_TYPE_KUBERNETES}-secret`, "common.provider.kubernetes.secret", "/imgs/providers/kubernetes.svg"],
[`${ACCESS_PROVIDER_LOCAL}`, "common.provider.local", "/imgs/providers/local.svg"],
[`${ACCESS_PROVIDER_SSH}`, "common.provider.ssh", "/imgs/providers/ssh.svg"],
[`${ACCESS_PROVIDER_WEBHOOK}`, "common.provider.webhook", "/imgs/providers/webhook.svg"],
[`${ACCESS_PROVIDER_ALIYUN}-oss`, "common.provider.aliyun.oss", "/imgs/providers/aliyun.svg"],
[`${ACCESS_PROVIDER_ALIYUN}-cdn`, "common.provider.aliyun.cdn", "/imgs/providers/aliyun.svg"],
[`${ACCESS_PROVIDER_ALIYUN}-dcdn`, "common.provider.aliyun.dcdn", "/imgs/providers/aliyun.svg"],
[`${ACCESS_PROVIDER_ALIYUN}-clb`, "common.provider.aliyun.clb", "/imgs/providers/aliyun.svg"],
[`${ACCESS_PROVIDER_ALIYUN}-alb`, "common.provider.aliyun.alb", "/imgs/providers/aliyun.svg"],
[`${ACCESS_PROVIDER_ALIYUN}-nlb`, "common.provider.aliyun.nlb", "/imgs/providers/aliyun.svg"],
[`${ACCESS_PROVIDER_TENCENTCLOUD}-cdn`, "common.provider.tencentcloud.cdn", "/imgs/providers/tencentcloud.svg"],
[`${ACCESS_PROVIDER_TENCENTCLOUD}-ecdn`, "common.provider.tencentcloud.ecdn", "/imgs/providers/tencentcloud.svg"],
[`${ACCESS_PROVIDER_TENCENTCLOUD}-clb`, "common.provider.tencentcloud.clb", "/imgs/providers/tencentcloud.svg"],
[`${ACCESS_PROVIDER_TENCENTCLOUD}-cos`, "common.provider.tencentcloud.cos", "/imgs/providers/tencentcloud.svg"],
[`${ACCESS_PROVIDER_TENCENTCLOUD}-eo`, "common.provider.tencentcloud.eo", "/imgs/providers/tencentcloud.svg"],
[`${ACCESS_PROVIDER_HUAWEICLOUD}-cdn`, "common.provider.huaweicloud.cdn", "/imgs/providers/huaweicloud.svg"],
[`${ACCESS_PROVIDER_HUAWEICLOUD}-elb`, "common.provider.huaweicloud.elb", "/imgs/providers/huaweicloud.svg"],
[`${ACCESS_PROVIDER_BAIDUCLOUD}-cdn`, "common.provider.baiducloud.cdn", "/imgs/providers/baiducloud.svg"],
[`${ACCESS_PROVIDER_VOLCENGINE}-cdn`, "common.provider.volcengine.cdn", "/imgs/providers/volcengine.svg"],
[`${ACCESS_PROVIDER_VOLCENGINE}-live`, "common.provider.volcengine.live", "/imgs/providers/volcengine.svg"],
[`${ACCESS_PROVIDER_QINIU}-cdn`, "common.provider.qiniu.cdn", "/imgs/providers/qiniu.svg"],
[`${ACCESS_PROVIDER_DOGECLOUD}-cdn`, "common.provider.dogecloud.cdn", "/imgs/providers/dogecloud.svg"],
[`${ACCESS_PROVIDER_BYTEPLUS}-cdn`, "common.provider.byteplus.cdn", "/imgs/providers/byteplus.svg"],
[`${ACCESS_PROVIDER_KUBERNETES}-secret`, "common.provider.kubernetes.secret", "/imgs/providers/kubernetes.svg"],
];
export const deployTargetsMap: Map<DeployTarget["type"], DeployTarget> = new Map(

View File

@ -11,13 +11,6 @@
"common.button.save": "Save",
"common.button.submit": "Submit",
"common.text.domain": "Domain",
"common.text.domain.empty": "No Domain",
"common.text.ip": "IP Address",
"common.text.ip.empty": "No IP address",
"common.text.dns": "Domain Name Server",
"common.text.dns.empty": "No DNS",
"common.text.ca": "Certificate Authority",
"common.text.copied": "Copied",
"common.text.nodata": "No data available",
"common.text.operation_succeeded": "Operation succeeded",
@ -30,18 +23,12 @@
"common.menu.logout": "Logout",
"common.menu.document": "Document",
"common.pagination.next": "Next",
"common.pagination.prev": "Previous",
"common.pagination.more": "More pages",
"common.theme.light": "Light",
"common.theme.dark": "Dark",
"common.theme.system": "System",
"common.errmsg.string_max": "Please enter no more than {{max}} characters",
"common.errmsg.email_empty": "Please enter email",
"common.errmsg.email_invalid": "Please enter a valid email address",
"common.errmsg.email_duplicate": "Email already exists",
"common.errmsg.domain_invalid": "Please enter domain",
"common.errmsg.host_invalid": "Please enter a valid domain name or IP",
"common.errmsg.port_invalid": "Please enter a valid port",

View File

@ -11,13 +11,6 @@
"common.button.save": "保存",
"common.button.submit": "提交",
"common.text.domain": "域名",
"common.text.domain.empty": "无域名",
"common.text.ip": "IP 地址",
"common.text.ip.empty": "无 IP 地址",
"common.text.dns": "DNS域名服务器",
"common.text.dns.empty": "无 DNS 地址",
"common.text.ca": "CA证书颁发机构",
"common.text.copied": "已复制",
"common.text.nodata": "暂无数据",
"common.text.operation_succeeded": "操作成功",
@ -30,18 +23,12 @@
"common.menu.logout": "退出登录",
"common.menu.document": "文档",
"common.pagination.next": "下一页",
"common.pagination.prev": "上一页",
"common.pagination.more": "更多",
"common.theme.light": "浅色",
"common.theme.dark": "暗黑",
"common.theme.system": "跟随系统",
"common.errmsg.string_max": "请输入不超过 {{max}} 个字符",
"common.errmsg.email_empty": "请输入邮箱",
"common.errmsg.email_invalid": "请输入正确的邮箱",
"common.errmsg.email_duplicate": "邮箱已存在",
"common.errmsg.domain_invalid": "请输入正确的域名",
"common.errmsg.host_invalid": "请输入正确的域名或 IP 地址",
"common.errmsg.port_invalid": "请输入正确的端口号",