From d21c027db8bda9476c3d425f999c20eb6b1a9d68 Mon Sep 17 00:00:00 2001
From: Fu Diwei <fudiwei@sina.com>
Date: Fri, 14 Feb 2025 16:20:53 +0800
Subject: [PATCH] refactor: drop access field `usage`

---
 internal/domain/access.go                     |  1 -
 internal/repository/access.go                 |  1 -
 .../provider/AccessProviderSelect.tsx         | 10 +--
 .../workflow/node/ApplyNodeConfigForm.tsx     |  4 +-
 .../workflow/node/DeployNodeConfigForm.tsx    |  4 +-
 ui/src/domain/provider.ts                     | 71 +++++++++----------
 6 files changed, 41 insertions(+), 50 deletions(-)

diff --git a/internal/domain/access.go b/internal/domain/access.go
index e6d94764..e9df61d2 100644
--- a/internal/domain/access.go
+++ b/internal/domain/access.go
@@ -12,7 +12,6 @@ type Access struct {
 	Name      string     `json:"name" db:"name"`
 	Provider  string     `json:"provider" db:"provider"`
 	Config    string     `json:"config" db:"config"`
-	Usage     string     `json:"usage" db:"usage"`
 	DeletedAt *time.Time `json:"deleted" db:"deleted"`
 }
 
diff --git a/internal/repository/access.go b/internal/repository/access.go
index a8370fd8..0bfeaea9 100644
--- a/internal/repository/access.go
+++ b/internal/repository/access.go
@@ -48,7 +48,6 @@ func (r *AccessRepository) castRecordToModel(record *core.Record) (*domain.Acces
 		Name:     record.GetString("name"),
 		Provider: record.GetString("provider"),
 		Config:   record.GetString("config"),
-		Usage:    record.GetString("usage"),
 	}
 	return access, nil
 }
diff --git a/ui/src/components/provider/AccessProviderSelect.tsx b/ui/src/components/provider/AccessProviderSelect.tsx
index ffba5c8a..04b859ac 100644
--- a/ui/src/components/provider/AccessProviderSelect.tsx
+++ b/ui/src/components/provider/AccessProviderSelect.tsx
@@ -29,22 +29,16 @@ const AccessProviderSelect = (props: AccessProviderSelectProps) => {
           </Typography.Text>
         </Space>
         <div>
-          {provider?.usage === ACCESS_USAGES.APPLY && (
+          {provider?.usages?.includes(ACCESS_USAGES.APPLY) && (
             <>
               <Tag color="orange">{t("access.props.provider.usage.dns")}</Tag>
             </>
           )}
-          {provider?.usage === ACCESS_USAGES.DEPLOY && (
+          {provider?.usages?.includes(ACCESS_USAGES.DEPLOY) && (
             <>
               <Tag color="blue">{t("access.props.provider.usage.host")}</Tag>
             </>
           )}
-          {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>
-            </>
-          )}
         </div>
       </div>
     );
diff --git a/ui/src/components/workflow/node/ApplyNodeConfigForm.tsx b/ui/src/components/workflow/node/ApplyNodeConfigForm.tsx
index bfb5f420..5a0472dd 100644
--- a/ui/src/components/workflow/node/ApplyNodeConfigForm.tsx
+++ b/ui/src/components/workflow/node/ApplyNodeConfigForm.tsx
@@ -279,7 +279,7 @@ const ApplyNodeConfigForm = forwardRef<ApplyNodeConfigFormInstance, ApplyNodeCon
                     }
                     afterSubmit={(record) => {
                       const provider = accessProvidersMap.get(record.provider);
-                      if (ACCESS_USAGES.ALL === provider?.usage || ACCESS_USAGES.APPLY === provider?.usage) {
+                      if (provider?.usages?.includes(ACCESS_USAGES.APPLY)) {
                         formInst.setFieldValue("providerAccessId", record.id);
                       }
                     }}
@@ -292,7 +292,7 @@ const ApplyNodeConfigForm = forwardRef<ApplyNodeConfigFormInstance, ApplyNodeCon
                 placeholder={t("workflow_node.apply.form.provider_access.placeholder")}
                 filter={(record) => {
                   const provider = accessProvidersMap.get(record.provider);
-                  return ACCESS_USAGES.ALL === provider?.usage || ACCESS_USAGES.APPLY === provider?.usage;
+                  return !!provider?.usages?.includes(ACCESS_USAGES.APPLY);
                 }}
                 onChange={handleProviderAccessSelect}
               />
diff --git a/ui/src/components/workflow/node/DeployNodeConfigForm.tsx b/ui/src/components/workflow/node/DeployNodeConfigForm.tsx
index c5518057..78d1b99d 100644
--- a/ui/src/components/workflow/node/DeployNodeConfigForm.tsx
+++ b/ui/src/components/workflow/node/DeployNodeConfigForm.tsx
@@ -301,7 +301,7 @@ const DeployNodeConfigForm = forwardRef<DeployNodeConfigFormInstance, DeployNode
                       }
                       afterSubmit={(record) => {
                         const provider = accessProvidersMap.get(record.provider);
-                        if (ACCESS_USAGES.ALL === provider?.usage || ACCESS_USAGES.DEPLOY === provider?.usage) {
+                        if (provider?.usages?.includes(ACCESS_USAGES.DEPLOY)) {
                           formInst.setFieldValue("providerAccessId", record.id);
                         }
                       }}
@@ -318,7 +318,7 @@ const DeployNodeConfigForm = forwardRef<DeployNodeConfigFormInstance, DeployNode
                     }
 
                     const provider = accessProvidersMap.get(record.provider);
-                    return ACCESS_USAGES.ALL === provider?.usage || ACCESS_USAGES.APPLY === provider?.usage;
+                    return !!provider?.usages?.includes(ACCESS_USAGES.DEPLOY);
                   }}
                 />
               </Form.Item>
diff --git a/ui/src/domain/provider.ts b/ui/src/domain/provider.ts
index 7a6df3f2..b4504694 100644
--- a/ui/src/domain/provider.ts
+++ b/ui/src/domain/provider.ts
@@ -37,7 +37,6 @@ export const ACCESS_PROVIDERS = Object.freeze({
 export type AccessProviderType = (typeof ACCESS_PROVIDERS)[keyof typeof ACCESS_PROVIDERS];
 
 export const ACCESS_USAGES = Object.freeze({
-  ALL: "all",
   APPLY: "apply",
   DEPLOY: "deploy",
 } as const);
@@ -48,7 +47,7 @@ export type AccessProvider = {
   type: AccessProviderType;
   name: string;
   icon: string;
-  usage: AccessUsageType;
+  usages: AccessUsageType[];
 };
 
 export const accessProvidersMap: Map<AccessProvider["type"] | string, AccessProvider> = new Map(
@@ -57,41 +56,41 @@ export const accessProvidersMap: Map<AccessProvider["type"] | string, AccessProv
    NOTICE: The following order determines the order displayed at the frontend.
   */
   [
-    [ACCESS_PROVIDERS.LOCAL, "provider.local", "/imgs/providers/local.svg", ACCESS_USAGES.DEPLOY],
-    [ACCESS_PROVIDERS.SSH, "provider.ssh", "/imgs/providers/ssh.svg", ACCESS_USAGES.DEPLOY],
-    [ACCESS_PROVIDERS.WEBHOOK, "provider.webhook", "/imgs/providers/webhook.svg", ACCESS_USAGES.DEPLOY],
-    [ACCESS_PROVIDERS.KUBERNETES, "provider.kubernetes", "/imgs/providers/kubernetes.svg", ACCESS_USAGES.DEPLOY],
-    [ACCESS_PROVIDERS.ALIYUN, "provider.aliyun", "/imgs/providers/aliyun.svg", ACCESS_USAGES.ALL],
-    [ACCESS_PROVIDERS.TENCENTCLOUD, "provider.tencentcloud", "/imgs/providers/tencentcloud.svg", ACCESS_USAGES.ALL],
-    [ACCESS_PROVIDERS.HUAWEICLOUD, "provider.huaweicloud", "/imgs/providers/huaweicloud.svg", ACCESS_USAGES.ALL],
-    [ACCESS_PROVIDERS.VOLCENGINE, "provider.volcengine", "/imgs/providers/volcengine.svg", ACCESS_USAGES.ALL],
-    [ACCESS_PROVIDERS.AWS, "provider.aws", "/imgs/providers/aws.svg", ACCESS_USAGES.ALL],
-    [ACCESS_PROVIDERS.BAIDUCLOUD, "provider.baiducloud", "/imgs/providers/baiducloud.svg", ACCESS_USAGES.DEPLOY],
-    [ACCESS_PROVIDERS.QINIU, "provider.qiniu", "/imgs/providers/qiniu.svg", ACCESS_USAGES.DEPLOY],
-    [ACCESS_PROVIDERS.DOGECLOUD, "provider.dogecloud", "/imgs/providers/dogecloud.svg", ACCESS_USAGES.DEPLOY],
-    [ACCESS_PROVIDERS.BYTEPLUS, "provider.byteplus", "/imgs/providers/byteplus.svg", ACCESS_USAGES.DEPLOY],
-    [ACCESS_PROVIDERS.UCLOUD, "provider.ucloud", "/imgs/providers/ucloud.svg", ACCESS_USAGES.DEPLOY],
-    [ACCESS_PROVIDERS.BAOTAPANEL, "provider.baotapanel", "/imgs/providers/baotapanel.svg", ACCESS_USAGES.DEPLOY],
-    [ACCESS_PROVIDERS.EDGIO, "provider.edgio", "/imgs/providers/edgio.svg", ACCESS_USAGES.DEPLOY],
-    [ACCESS_PROVIDERS.AZURE, "provider.azure", "/imgs/providers/azure.svg", ACCESS_USAGES.APPLY],
-    [ACCESS_PROVIDERS.CLOUDFLARE, "provider.cloudflare", "/imgs/providers/cloudflare.svg", ACCESS_USAGES.APPLY],
-    [ACCESS_PROVIDERS.CLOUDNS, "provider.cloudns", "/imgs/providers/cloudns.svg", ACCESS_USAGES.APPLY],
-    [ACCESS_PROVIDERS.GNAME, "provider.gname", "/imgs/providers/gname.svg", ACCESS_USAGES.APPLY],
-    [ACCESS_PROVIDERS.GODADDY, "provider.godaddy", "/imgs/providers/godaddy.svg", ACCESS_USAGES.APPLY],
-    [ACCESS_PROVIDERS.NAMEDOTCOM, "provider.namedotcom", "/imgs/providers/namedotcom.svg", ACCESS_USAGES.APPLY],
-    [ACCESS_PROVIDERS.NAMESILO, "provider.namesilo", "/imgs/providers/namesilo.svg", ACCESS_USAGES.APPLY],
-    [ACCESS_PROVIDERS.NS1, "provider.ns1", "/imgs/providers/ns1.svg", ACCESS_USAGES.APPLY],
-    [ACCESS_PROVIDERS.RAINYUN, "provider.rainyun", "/imgs/providers/rainyun.svg", ACCESS_USAGES.APPLY],
-    [ACCESS_PROVIDERS.WESTCN, "provider.westcn", "/imgs/providers/westcn.svg", ACCESS_USAGES.APPLY],
-    [ACCESS_PROVIDERS.POWERDNS, "provider.powerdns", "/imgs/providers/powerdns.svg", ACCESS_USAGES.APPLY],
-    [ACCESS_PROVIDERS.ACMEHTTPREQ, "provider.acmehttpreq", "/imgs/providers/acmehttpreq.svg", ACCESS_USAGES.APPLY],
-  ].map(([type, name, icon, usage]) => [
-    type,
+    [ACCESS_PROVIDERS.LOCAL, "provider.local", "/imgs/providers/local.svg", [ACCESS_USAGES.DEPLOY]],
+    [ACCESS_PROVIDERS.SSH, "provider.ssh", "/imgs/providers/ssh.svg", [ACCESS_USAGES.DEPLOY]],
+    [ACCESS_PROVIDERS.WEBHOOK, "provider.webhook", "/imgs/providers/webhook.svg", [ACCESS_USAGES.DEPLOY]],
+    [ACCESS_PROVIDERS.KUBERNETES, "provider.kubernetes", "/imgs/providers/kubernetes.svg", [ACCESS_USAGES.DEPLOY]],
+    [ACCESS_PROVIDERS.ALIYUN, "provider.aliyun", "/imgs/providers/aliyun.svg", [ACCESS_USAGES.APPLY, ACCESS_USAGES.DEPLOY]],
+    [ACCESS_PROVIDERS.TENCENTCLOUD, "provider.tencentcloud", "/imgs/providers/tencentcloud.svg", [ACCESS_USAGES.APPLY, ACCESS_USAGES.DEPLOY]],
+    [ACCESS_PROVIDERS.HUAWEICLOUD, "provider.huaweicloud", "/imgs/providers/huaweicloud.svg", [ACCESS_USAGES.APPLY, ACCESS_USAGES.DEPLOY]],
+    [ACCESS_PROVIDERS.VOLCENGINE, "provider.volcengine", "/imgs/providers/volcengine.svg", [ACCESS_USAGES.APPLY, ACCESS_USAGES.DEPLOY]],
+    [ACCESS_PROVIDERS.AWS, "provider.aws", "/imgs/providers/aws.svg", [ACCESS_USAGES.APPLY, ACCESS_USAGES.DEPLOY]],
+    [ACCESS_PROVIDERS.BAIDUCLOUD, "provider.baiducloud", "/imgs/providers/baiducloud.svg", [ACCESS_USAGES.DEPLOY]],
+    [ACCESS_PROVIDERS.QINIU, "provider.qiniu", "/imgs/providers/qiniu.svg", [ACCESS_USAGES.DEPLOY]],
+    [ACCESS_PROVIDERS.DOGECLOUD, "provider.dogecloud", "/imgs/providers/dogecloud.svg", [ACCESS_USAGES.DEPLOY]],
+    [ACCESS_PROVIDERS.BYTEPLUS, "provider.byteplus", "/imgs/providers/byteplus.svg", [ACCESS_USAGES.DEPLOY]],
+    [ACCESS_PROVIDERS.UCLOUD, "provider.ucloud", "/imgs/providers/ucloud.svg", [ACCESS_USAGES.DEPLOY]],
+    [ACCESS_PROVIDERS.BAOTAPANEL, "provider.baotapanel", "/imgs/providers/baotapanel.svg", [ACCESS_USAGES.DEPLOY]],
+    [ACCESS_PROVIDERS.EDGIO, "provider.edgio", "/imgs/providers/edgio.svg", [ACCESS_USAGES.DEPLOY]],
+    [ACCESS_PROVIDERS.AZURE, "provider.azure", "/imgs/providers/azure.svg", [ACCESS_USAGES.APPLY]],
+    [ACCESS_PROVIDERS.CLOUDFLARE, "provider.cloudflare", "/imgs/providers/cloudflare.svg", [ACCESS_USAGES.APPLY]],
+    [ACCESS_PROVIDERS.CLOUDNS, "provider.cloudns", "/imgs/providers/cloudns.svg", [ACCESS_USAGES.APPLY]],
+    [ACCESS_PROVIDERS.GNAME, "provider.gname", "/imgs/providers/gname.svg", [ACCESS_USAGES.APPLY]],
+    [ACCESS_PROVIDERS.GODADDY, "provider.godaddy", "/imgs/providers/godaddy.svg", [ACCESS_USAGES.APPLY]],
+    [ACCESS_PROVIDERS.NAMEDOTCOM, "provider.namedotcom", "/imgs/providers/namedotcom.svg", [ACCESS_USAGES.APPLY]],
+    [ACCESS_PROVIDERS.NAMESILO, "provider.namesilo", "/imgs/providers/namesilo.svg", [ACCESS_USAGES.APPLY]],
+    [ACCESS_PROVIDERS.NS1, "provider.ns1", "/imgs/providers/ns1.svg", [ACCESS_USAGES.APPLY]],
+    [ACCESS_PROVIDERS.RAINYUN, "provider.rainyun", "/imgs/providers/rainyun.svg", [ACCESS_USAGES.APPLY]],
+    [ACCESS_PROVIDERS.WESTCN, "provider.westcn", "/imgs/providers/westcn.svg", [ACCESS_USAGES.APPLY]],
+    [ACCESS_PROVIDERS.POWERDNS, "provider.powerdns", "/imgs/providers/powerdns.svg", [ACCESS_USAGES.APPLY]],
+    [ACCESS_PROVIDERS.ACMEHTTPREQ, "provider.acmehttpreq", "/imgs/providers/acmehttpreq.svg", [ACCESS_USAGES.APPLY]],
+  ].map((e) => [
+    e[0] as string,
     {
-      type: type as AccessProviderType,
-      name: name,
-      icon: icon,
-      usage: usage as AccessUsageType,
+      type: e[0] as AccessProviderType,
+      name: e[1] as string,
+      icon: e[2] as string,
+      usages: e[3] as AccessUsageType[],
     },
   ])
 );