From 76de83721474e0f87a11e2a63421fc3718f90a97 Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Mon, 4 Nov 2024 11:11:00 +0800 Subject: [PATCH] feat: add baiducloud provider --- internal/domain/access.go | 5 + ui/public/imgs/providers/baiducloud.svg | 1 + .../certimate/AccessBaiduCloudForm.tsx | 194 ++++++++++++++++++ .../components/certimate/AccessEditDialog.tsx | 12 ++ ui/src/domain/access.ts | 9 +- ui/src/i18n/locales/en/nls.common.json | 1 + ui/src/i18n/locales/zh/nls.common.json | 1 + 7 files changed, 222 insertions(+), 1 deletion(-) create mode 100644 ui/public/imgs/providers/baiducloud.svg create mode 100644 ui/src/components/certimate/AccessBaiduCloudForm.tsx diff --git a/internal/domain/access.go b/internal/domain/access.go index bd4f41c1..9e351e99 100644 --- a/internal/domain/access.go +++ b/internal/domain/access.go @@ -11,7 +11,12 @@ type TencentAccess struct { } 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"` } diff --git a/ui/public/imgs/providers/baiducloud.svg b/ui/public/imgs/providers/baiducloud.svg new file mode 100644 index 00000000..25ab747a --- /dev/null +++ b/ui/public/imgs/providers/baiducloud.svg @@ -0,0 +1 @@ + diff --git a/ui/src/components/certimate/AccessBaiduCloudForm.tsx b/ui/src/components/certimate/AccessBaiduCloudForm.tsx new file mode 100644 index 00000000..2a6e4781 --- /dev/null +++ b/ui/src/components/certimate/AccessBaiduCloudForm.tsx @@ -0,0 +1,194 @@ +import { useForm } from "react-hook-form"; +import { useTranslation } from "react-i18next"; +import z from "zod"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { ClientResponseError } from "pocketbase"; + +import { Input } from "@/components/ui/input"; +import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "@/components/ui/form"; +import { Button } from "@/components/ui/button"; +import { PbErrorData } from "@/domain/base"; +import { accessProvidersMap, accessTypeFormSchema, type Access, type BaiduCloudConfig } from "@/domain/access"; +import { save } from "@/repository/access"; +import { useConfigContext } from "@/providers/config"; + +type AccessBaiduCloudFormProps = { + op: "add" | "edit" | "copy"; + data?: Access; + onAfterReq: () => void; +}; + +const AccessBaiduCloudForm = ({ data, op, onAfterReq }: AccessBaiduCloudFormProps) => { + const { addAccess, updateAccess } = useConfigContext(); + const { t } = useTranslation(); + const formSchema = z.object({ + id: z.string().optional(), + name: z + .string() + .min(1, "access.authorization.form.name.placeholder") + .max(64, t("common.errmsg.string_max", { max: 64 })), + configType: accessTypeFormSchema, + accessKeyId: z + .string() + .min(1, "access.authorization.form.access_key_id.placeholder") + .max(64, t("common.errmsg.string_max", { max: 64 })), + secretAccessKey: z + .string() + .min(1, "access.authorization.form.secret_access_key.placeholder") + .max(64, t("common.errmsg.string_max", { max: 64 })), + }); + + let config: BaiduCloudConfig = { + accessKeyId: "", + secretAccessKey: "", + }; + if (data) config = data.config as BaiduCloudConfig; + + const form = useForm>({ + resolver: zodResolver(formSchema), + defaultValues: { + id: data?.id, + name: data?.name || "", + configType: "baiducloud", + accessKeyId: config.accessKeyId, + secretAccessKey: config.secretAccessKey, + }, + }); + + const onSubmit = async (data: z.infer) => { + const req: Access = { + id: data.id as string, + name: data.name, + configType: data.configType, + usage: accessProvidersMap.get(data.configType)!.usage, + config: { + accessKeyId: data.accessKeyId, + secretAccessKey: data.secretAccessKey, + }, + }; + + try { + req.id = op == "copy" ? "" : req.id; + const rs = await save(req); + + onAfterReq(); + + req.id = rs.id; + req.created = rs.created; + req.updated = rs.updated; + if (data.id && op == "edit") { + updateAccess(req); + return; + } + addAccess(req); + } catch (e) { + const err = e as ClientResponseError; + + Object.entries(err.response.data as PbErrorData).forEach(([key, value]) => { + form.setError(key as keyof z.infer, { + type: "manual", + message: value.message, + }); + }); + + return; + } + }; + + return ( + <> +
+ { + e.stopPropagation(); + form.handleSubmit(onSubmit)(e); + }} + className="space-y-8" + > + ( + + {t("access.authorization.form.name.label")} + + + + + + + )} + /> + + ( + + {t("access.authorization.form.config.label")} + + + + + + + )} + /> + + ( + + {t("access.authorization.form.config.label")} + + + + + + + )} + /> + + ( + + {t("access.authorization.form.access_key_id.label")} + + + + + + + )} + /> + + ( + + {t("access.authorization.form.secret_access_key.label")} + + + + + + + )} + /> + + + +
+ +
+ + + + ); +}; + +export default AccessBaiduCloudForm; diff --git a/ui/src/components/certimate/AccessEditDialog.tsx b/ui/src/components/certimate/AccessEditDialog.tsx index f5c3c65e..8f226343 100644 --- a/ui/src/components/certimate/AccessEditDialog.tsx +++ b/ui/src/components/certimate/AccessEditDialog.tsx @@ -8,6 +8,7 @@ import { ScrollArea } from "@/components/ui/scroll-area"; import AccessAliyunForm from "./AccessAliyunForm"; import AccessTencentForm from "./AccessTencentForm"; import AccessHuaweiCloudForm from "./AccessHuaweicloudForm"; +import AccessBaiduCloudForm from "./AccessBaiduCloudForm"; import AccessQiniuForm from "./AccessQiniuForm"; import AccessDogeCloudForm from "./AccessDogeCloudForm"; import AccessAwsForm from "./AccessAwsForm"; @@ -72,6 +73,17 @@ const AccessEditDialog = ({ trigger, op, data, className }: AccessEditProps) => /> ); break; + case "baiducloud": + childComponent = ( + { + setOpen(false); + }} + /> + ); + break; case "qiniu": childComponent = ( = n ["aliyun", "common.provider.aliyun", "/imgs/providers/aliyun.svg", "all", "阿里云:alibaba cloud"], ["tencent", "common.provider.tencent", "/imgs/providers/tencent.svg", "all", "腾讯云:tencent cloud"], ["huaweicloud", "common.provider.huaweicloud", "/imgs/providers/huaweicloud.svg", "all", "华为云:huawei cloud"], + ["baiducloud", "common.provider.baiducloud", "/imgs/providers/baiducloud.svg", "all", "百度智能云:百度云:baidu cloud"], ["qiniu", "common.provider.qiniu", "/imgs/providers/qiniu.svg", "deploy", "七牛云:qiniu"], - ["dogecloud", "common.provider.dogecloud", "/imgs/providers/dogecloud.svg", "deploy", "多吉云:dogecloud:doge cloud"], + ["dogecloud", "common.provider.dogecloud", "/imgs/providers/dogecloud.svg", "deploy", "多吉云:doge cloud"], ["aws", "common.provider.aws", "/imgs/providers/aws.svg", "apply", "亚马逊:amazon:aws"], ["cloudflare", "common.provider.cloudflare", "/imgs/providers/cloudflare.svg", "apply", "cloudflare:cf:cloud flare"], ["namesilo", "common.provider.namesilo", "/imgs/providers/namesilo.svg", "apply", "namesilo"], @@ -35,6 +36,7 @@ export const accessTypeFormSchema = z.union( z.literal("aliyun"), z.literal("tencent"), z.literal("huaweicloud"), + z.literal("baiducloud"), z.literal("qiniu"), z.literal("dogecloud"), z.literal("aws"), @@ -94,6 +96,11 @@ export type HuaweiCloudConfig = { secretAccessKey: string; }; +export type BaiduCloudConfig = { + accessKeyId: string; + secretAccessKey: string; +}; + export type QiniuConfig = { accessKey: string; secretKey: string; diff --git a/ui/src/i18n/locales/en/nls.common.json b/ui/src/i18n/locales/en/nls.common.json index b872c7f0..54e1fa97 100644 --- a/ui/src/i18n/locales/en/nls.common.json +++ b/ui/src/i18n/locales/en/nls.common.json @@ -68,6 +68,7 @@ "common.provider.huaweicloud": "Huawei Cloud", "common.provider.huaweicloud.cdn": "Huawei Cloud - CDN", "common.provider.huaweicloud.elb": "Huawei Cloud - ELB", + "common.provider.baiducloud": "Baidu Cloud", "common.provider.qiniu": "Qiniu Cloud", "common.provider.qiniu.cdn": "Qiniu Cloud - CDN", "common.provider.dogecloud": "Doge Cloud", diff --git a/ui/src/i18n/locales/zh/nls.common.json b/ui/src/i18n/locales/zh/nls.common.json index 462a771e..607da17d 100644 --- a/ui/src/i18n/locales/zh/nls.common.json +++ b/ui/src/i18n/locales/zh/nls.common.json @@ -68,6 +68,7 @@ "common.provider.huaweicloud": "华为云", "common.provider.huaweicloud.cdn": "华为云 - 内容分发网络 CDN", "common.provider.huaweicloud.elb": "华为云 - 弹性负载均衡 ELB", + "common.provider.baiducloud": "百度智能云", "common.provider.qiniu": "七牛云", "common.provider.qiniu.cdn": "七牛云 - 内容分发网络 CDN", "common.provider.dogecloud": "多吉云",