diff --git a/internal/applicant/acme-user.go b/internal/applicant/acme-user.go index 7d3e5d10..dd3de89f 100644 --- a/internal/applicant/acme-user.go +++ b/internal/applicant/acme-user.go @@ -75,7 +75,7 @@ func (u *acmeUser) getPrivateKeyPEM() string { return u.privkey } -type AcmeAccountRepository interface { +type acmeAccountRepository interface { GetByCAAndEmail(ca, email string) (*domain.AcmeAccount, error) Save(ca, email, key string, resource *registration.Resource) error } diff --git a/internal/applicant/applicant.go b/internal/applicant/applicant.go index 6bc8f77f..399bfa5f 100644 --- a/internal/applicant/applicant.go +++ b/internal/applicant/applicant.go @@ -2,6 +2,7 @@ package applicant import ( "context" + "encoding/json" "fmt" "os" "strconv" @@ -13,7 +14,6 @@ import ( "github.com/go-acme/lego/v4/challenge/dns01" "github.com/go-acme/lego/v4/lego" - "github.com/usual2970/certimate/internal/app" "github.com/usual2970/certimate/internal/domain" "github.com/usual2970/certimate/internal/repository" ) @@ -37,11 +37,11 @@ type ApplyCertResult struct { CSR string } -type applicant interface { +type Applicant interface { Apply() (*ApplyCertResult, error) } -func NewWithApplyNode(node *domain.WorkflowNode) (applicant, error) { +func NewWithApplyNode(node *domain.WorkflowNode) (Applicant, error) { if node.Type != domain.WorkflowNodeTypeApply { return nil, fmt.Errorf("node type is not apply") } @@ -74,14 +74,15 @@ func NewWithApplyNode(node *domain.WorkflowNode) (applicant, error) { } func apply(challengeProvider challenge.Provider, applyConfig *applyConfig) (*ApplyCertResult, error) { - record, _ := app.GetApp().Dao().FindFirstRecordByFilter("settings", "name='sslProvider'") + settingsRepo := repository.NewSettingsRepository() + settings, _ := settingsRepo.GetByName(context.Background(), "sslProvider") sslProvider := &acmeSSLProviderConfig{ Config: acmeSSLProviderConfigContent{}, Provider: defaultSSLProvider, } - if record != nil { - if err := record.UnmarshalJSONField("content", sslProvider); err != nil { + if settings != nil { + if err := json.Unmarshal([]byte(settings.Content), sslProvider); err != nil { return nil, err } } diff --git a/internal/notify/notify.go b/internal/notify/notify.go index 6e7432a4..f509630c 100644 --- a/internal/notify/notify.go +++ b/internal/notify/notify.go @@ -2,14 +2,15 @@ package notify import ( "context" + "encoding/json" "fmt" "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" + "github.com/usual2970/certimate/internal/repository" ) func SendToAllChannels(subject, message string) error { @@ -48,13 +49,14 @@ func SendToChannel(subject, message string, channel string, channelConfig map[st } func getEnabledNotifiers() ([]notifier.Notifier, error) { - settings, err := app.GetApp().Dao().FindFirstRecordByFilter("settings", "name='notifyChannels'") + settingsRepo := repository.NewSettingsRepository() + settings, err := settingsRepo.GetByName(context.Background(), "notifyChannels") if err != nil { return nil, fmt.Errorf("find notifyChannels error: %w", err) } rs := make(map[string]map[string]any) - if err := settings.UnmarshalJSONField("content", &rs); err != nil { + if err := json.Unmarshal([]byte(settings.Content), &rs); err != nil { return nil, fmt.Errorf("unmarshal notifyChannels error: %w", err) } diff --git a/ui/src/components/access/AccessEditFormACMEHttpReqConfig.tsx b/ui/src/components/access/AccessEditFormACMEHttpReqConfig.tsx index 07eb1324..8c23b39b 100644 --- a/ui/src/components/access/AccessEditFormACMEHttpReqConfig.tsx +++ b/ui/src/components/access/AccessEditFormACMEHttpReqConfig.tsx @@ -4,7 +4,6 @@ import { createSchemaFieldRule } from "antd-zod"; import { z } from "zod"; import { type AccessConfigForACMEHttpReq } from "@/domain/access"; -import { useAntdForm } from "@/hooks"; type AccessEditFormACMEHttpReqConfigFieldValues = Partial; @@ -41,17 +40,13 @@ const AccessEditFormACMEHttpReqConfig = ({ form, formName, disabled, initialValu .nullish(), }); const formRule = createSchemaFieldRule(formSchema); - const { form: formInst, formProps } = useAntdForm>({ - form: form, - initialValues: initialValues ?? initFormModel(), - }); const handleFormChange = (_: unknown, values: z.infer) => { onValuesChange?.(values as AccessEditFormACMEHttpReqConfigFieldValues); }; return ( -
+ ; @@ -53,17 +52,13 @@ const AccessEditFormAWSConfig = ({ form, formName, disabled, initialValues, onVa .nullish(), }); const formRule = createSchemaFieldRule(formSchema); - const { form: formInst, formProps } = useAntdForm>({ - form: form, - initialValues: initialValues ?? initFormModel(), - }); const handleFormChange = (_: unknown, values: z.infer) => { onValuesChange?.(values as AccessEditFormAWSConfigFieldValues); }; return ( - + ; @@ -39,17 +38,13 @@ const AccessEditFormAliyunConfig = ({ form, formName, disabled, initialValues, o .trim(), }); const formRule = createSchemaFieldRule(formSchema); - const { form: formInst, formProps } = useAntdForm>({ - form: form, - initialValues: initialValues ?? initFormModel(), - }); const handleFormChange = (_: unknown, values: z.infer) => { onValuesChange?.(values as AccessEditFormAliyunConfigFieldValues); }; return ( - + ; @@ -39,17 +38,13 @@ const AccessEditFormBaiduCloudConfig = ({ form, formName, disabled, initialValue .trim(), }); const formRule = createSchemaFieldRule(formSchema); - const { form: formInst, formProps } = useAntdForm>({ - form: form, - initialValues: initialValues ?? initFormModel(), - }); const handleFormChange = (_: unknown, values: z.infer) => { onValuesChange?.(values as AccessEditFormBaiduCloudConfigFieldValues); }; return ( - + ; @@ -39,17 +38,13 @@ const AccessEditFormBytePlusConfig = ({ form, formName, disabled, initialValues, .trim(), }); const formRule = createSchemaFieldRule(formSchema); - const { form: formInst, formProps } = useAntdForm>({ - form: form, - initialValues: initialValues ?? initFormModel(), - }); const handleFormChange = (_: unknown, values: z.infer) => { onValuesChange?.(values as AccessEditFormBytePlusConfigFieldValues); }; return ( - + ; @@ -33,17 +32,13 @@ const AccessEditFormCloudflareConfig = ({ form, formName, disabled, initialValue .trim(), }); const formRule = createSchemaFieldRule(formSchema); - const { form: formInst, formProps } = useAntdForm>({ - form: form, - initialValues: initialValues ?? initFormModel(), - }); const handleFormChange = (_: unknown, values: z.infer) => { onValuesChange?.(values as AccessEditFormCloudflareConfigFieldValues); }; return ( - + ; @@ -39,17 +38,13 @@ const AccessEditFormDogeCloudConfig = ({ form, formName, disabled, initialValues .trim(), }); const formRule = createSchemaFieldRule(formSchema); - const { form: formInst, formProps } = useAntdForm>({ - form: form, - initialValues: initialValues ?? initFormModel(), - }); const handleFormChange = (_: unknown, values: z.infer) => { onValuesChange?.(values as AccessEditFormDogeCloudConfigFieldValues); }; return ( - + ; @@ -39,17 +38,13 @@ const AccessEditFormGoDaddyConfig = ({ form, formName, disabled, initialValues, .trim(), }); const formRule = createSchemaFieldRule(formSchema); - const { form: formInst, formProps } = useAntdForm>({ - form: form, - initialValues: initialValues ?? initFormModel(), - }); const handleFormChange = (_: unknown, values: z.infer) => { onValuesChange?.(values as AccessEditFormGoDaddyConfigFieldValues); }; return ( - + ; @@ -46,17 +45,13 @@ const AccessEditFormHuaweiCloudConfig = ({ form, formName, disabled, initialValu .nullish(), }); const formRule = createSchemaFieldRule(formSchema); - const { form: formInst, formProps } = useAntdForm>({ - form: form, - initialValues: initialValues ?? initFormModel(), - }); const handleFormChange = (_: unknown, values: z.infer) => { onValuesChange?.(values as AccessEditFormHuaweiCloudConfigFieldValues); }; return ( - + ; @@ -36,14 +35,11 @@ const AccessEditFormKubernetesConfig = ({ form, formName, disabled, initialValue .nullish(), }); const formRule = createSchemaFieldRule(formSchema); - const { form: formInst, formProps } = useAntdForm>({ - form: form, - initialValues: initialValues ?? initFormModel(), - }); - const [kubeFileList, setKubeFileList] = useState([]); + const fieldKubeConfig = Form.useWatch("kubeConfig", form); + const [fieldKubeFileList, setFieldKubeFileList] = useState([]); useDeepCompareEffect(() => { - setKubeFileList(initialValues?.kubeConfig?.trim() ? [{ uid: "-1", name: "kubeconfig", status: "done" }] : []); + setFieldKubeFileList(initialValues?.kubeConfig?.trim() ? [{ uid: "-1", name: "kubeconfig", status: "done" }] : []); }, [initialValues]); const handleFormChange = (_: unknown, values: z.infer) => { @@ -52,31 +48,26 @@ const AccessEditFormKubernetesConfig = ({ form, formName, disabled, initialValue const handleKubeFileChange: UploadProps["onChange"] = async ({ file }) => { if (file && file.status !== "removed") { - formInst.setFieldValue("kubeConfig", await readFileContent(file.originFileObj ?? (file as unknown as File))); - setKubeFileList([file]); + form.setFieldValue("kubeConfig", await readFileContent(file.originFileObj ?? (file as unknown as File))); + setFieldKubeFileList([file]); } else { - formInst.setFieldValue("kubeConfig", ""); - setKubeFileList([]); + form.setFieldValue("kubeConfig", ""); + setFieldKubeFileList([]); } - flushSync(() => onValuesChange?.(formInst.getFieldsValue(true))); + flushSync(() => onValuesChange?.(form.getFieldsValue(true))); }; return ( - + - } > - false} fileList={kubeFileList} maxCount={1} onChange={handleKubeFileChange}> + false} fileList={fieldKubeFileList} maxCount={1} onChange={handleKubeFileChange}> diff --git a/ui/src/components/access/AccessEditFormLocalConfig.tsx b/ui/src/components/access/AccessEditFormLocalConfig.tsx index d0c20d58..540c2951 100644 --- a/ui/src/components/access/AccessEditFormLocalConfig.tsx +++ b/ui/src/components/access/AccessEditFormLocalConfig.tsx @@ -1,7 +1,6 @@ import { Form, type FormInstance } from "antd"; import { type AccessConfigForLocal } from "@/domain/access"; -import { useAntdForm } from "@/hooks"; type AccessEditFormLocalConfigFieldValues = Partial; @@ -18,16 +17,20 @@ const initFormModel = (): AccessEditFormLocalConfigFieldValues => { }; const AccessEditFormLocalConfig = ({ form, formName, disabled, initialValues, onValuesChange }: AccessEditFormLocalConfigProps) => { - const { form: formInst, formProps } = useAntdForm({ - form: form, - initialValues: initialValues ?? initFormModel(), - }); - const handleFormChange = (_: unknown, values: unknown) => { onValuesChange?.(values as AccessEditFormLocalConfigFieldValues); }; - return ; + return ( +
+ ); }; export default AccessEditFormLocalConfig; diff --git a/ui/src/components/access/AccessEditFormNameDotComConfig.tsx b/ui/src/components/access/AccessEditFormNameDotComConfig.tsx index 3e5ec9ca..9a01c9a6 100644 --- a/ui/src/components/access/AccessEditFormNameDotComConfig.tsx +++ b/ui/src/components/access/AccessEditFormNameDotComConfig.tsx @@ -4,7 +4,6 @@ import { createSchemaFieldRule } from "antd-zod"; import { z } from "zod"; import { type AccessConfigForNameDotCom } from "@/domain/access"; -import { useAntdForm } from "@/hooks"; type AccessEditFormNameDotComConfigFieldValues = Partial; @@ -39,17 +38,13 @@ const AccessEditFormNameDotComConfig = ({ form, formName, disabled, initialValue .trim(), }); const formRule = createSchemaFieldRule(formSchema); - const { form: formInst, formProps } = useAntdForm>({ - form: form, - initialValues: initialValues ?? initFormModel(), - }); const handleFormChange = (_: unknown, values: z.infer) => { onValuesChange?.(values as AccessEditFormNameDotComConfigFieldValues); }; return ( -
+ ; @@ -33,17 +32,13 @@ const AccessEditFormNameSiloConfig = ({ form, formName, disabled, initialValues, .trim(), }); const formRule = createSchemaFieldRule(formSchema); - const { form: formInst, formProps } = useAntdForm>({ - form: form, - initialValues: initialValues ?? initFormModel(), - }); const handleFormChange = (_: unknown, values: z.infer) => { onValuesChange?.(values as AccessEditFormNameSiloConfigFieldValues); }; return ( - + ; @@ -35,17 +34,13 @@ const AccessEditFormPowerDNSConfig = ({ form, formName, disabled, initialValues, .trim(), }); const formRule = createSchemaFieldRule(formSchema); - const { form: formInst, formProps } = useAntdForm>({ - form: form, - initialValues: initialValues ?? initFormModel(), - }); const handleFormChange = (_: unknown, values: z.infer) => { onValuesChange?.(values as AccessEditFormPowerDNSConfigFieldValues); }; return ( - + ; @@ -39,17 +38,13 @@ const AccessEditFormQiniuConfig = ({ form, formName, disabled, initialValues, on .trim(), }); const formRule = createSchemaFieldRule(formSchema); - const { form: formInst, formProps } = useAntdForm>({ - form: form, - initialValues: initialValues ?? initFormModel(), - }); const handleFormChange = (_: unknown, values: z.infer) => { onValuesChange?.(values as AccessEditFormQiniuConfigFieldValues); }; return ( - + !v || form.getFieldValue("key"), t("access.form.ssh_key.placeholder")), }); const formRule = createSchemaFieldRule(formSchema); - const { form: formInst, formProps } = useAntdForm>({ - form: form, - initialValues: initialValues ?? initFormModel(), - }); - const [keyFileList, setKeyFileList] = useState([]); + const fieldKey = Form.useWatch("key", form); + const [fieldKeyFileList, setFieldKeyFileList] = useState([]); useDeepCompareEffect(() => { - setKeyFileList(initialValues?.key?.trim() ? [{ uid: "-1", name: "sshkey", status: "done" }] : []); + setFieldKeyFileList(initialValues?.key?.trim() ? [{ uid: "-1", name: "sshkey", status: "done" }] : []); }, [initialValues]); const handleFormChange = (_: unknown, values: z.infer) => { @@ -71,18 +67,18 @@ const AccessEditFormSSHConfig = ({ form, formName, disabled, initialValues, onVa const handleKeyFileChange: UploadProps["onChange"] = async ({ file }) => { if (file && file.status !== "removed") { - formInst.setFieldValue("key", await readFileContent(file.originFileObj ?? (file as unknown as File))); - setKeyFileList([file]); + form.setFieldValue("key", await readFileContent(file.originFileObj ?? (file as unknown as File))); + setFieldKeyFileList([file]); } else { - formInst.setFieldValue("key", ""); - setKeyFileList([]); + form.setFieldValue("key", ""); + setFieldKeyFileList([]); } - flushSync(() => onValuesChange?.(formInst.getFieldsValue(true))); + flushSync(() => onValuesChange?.(form.getFieldsValue(true))); }; return ( - +
@@ -119,10 +115,10 @@ const AccessEditFormSSHConfig = ({ form, formName, disabled, initialValues, onVa
- }> - false} fileList={keyFileList} maxCount={1} onChange={handleKeyFileChange}> + false} fileList={fieldKeyFileList} maxCount={1} onChange={handleKeyFileChange}> diff --git a/ui/src/components/access/AccessEditFormTencentCloudConfig.tsx b/ui/src/components/access/AccessEditFormTencentCloudConfig.tsx index 7739d9bc..c6adbb1b 100644 --- a/ui/src/components/access/AccessEditFormTencentCloudConfig.tsx +++ b/ui/src/components/access/AccessEditFormTencentCloudConfig.tsx @@ -4,7 +4,6 @@ import { createSchemaFieldRule } from "antd-zod"; import { z } from "zod"; import { type AccessConfigForTencentCloud } from "@/domain/access"; -import { useAntdForm } from "@/hooks"; type AccessEditFormTencentCloudConfigFieldValues = Partial; @@ -39,17 +38,13 @@ const AccessEditFormTencentCloudConfig = ({ form, formName, disabled, initialVal .trim(), }); const formRule = createSchemaFieldRule(formSchema); - const { form: formInst, formProps } = useAntdForm>({ - form: form, - initialValues: initialValues ?? initFormModel(), - }); const handleFormChange = (_: unknown, values: z.infer) => { onValuesChange?.(values as AccessEditFormTencentCloudConfigFieldValues); }; return ( - + ; @@ -39,17 +38,13 @@ const AccessEditFormVolcEngineConfig = ({ form, formName, disabled, initialValue .trim(), }); const formRule = createSchemaFieldRule(formSchema); - const { form: formInst, formProps } = useAntdForm>({ - form: form, - initialValues: initialValues ?? initFormModel(), - }); const handleFormChange = (_: unknown, values: z.infer) => { onValuesChange?.(values as AccessEditFormVolcEngineConfigFieldValues); }; return ( - + ; @@ -29,17 +28,13 @@ const AccessEditFormWebhookConfig = ({ form, formName, disabled, initialValues, url: z.string({ message: t("access.form.webhook_url.placeholder") }).url(t("common.errmsg.url_invalid")), }); const formRule = createSchemaFieldRule(formSchema); - const { form: formInst, formProps } = useAntdForm>({ - form: form, - initialValues: initialValues ?? initFormModel(), - }); const handleFormChange = (_: unknown, values: z.infer) => { onValuesChange?.(values as AccessEditFormWebhookConfigFieldValues); }; return ( - + diff --git a/ui/src/hooks/useAntdForm.ts b/ui/src/hooks/useAntdForm.ts index 96aa6e45..48c90a9a 100644 --- a/ui/src/hooks/useAntdForm.ts +++ b/ui/src/hooks/useAntdForm.ts @@ -36,24 +36,24 @@ const useAntdForm = = any>({ form, initialValues return; } - let temp: Promise>; + let p: Promise>; if (typeof initialValues === "function") { - temp = Promise.resolve(initialValues()); + p = Promise.resolve(initialValues()); } else { - temp = Promise.resolve(initialValues); + p = Promise.resolve(initialValues); } - temp.then((temp) => { + p.then((res) => { if (!unmounted) { type FieldName = Parameters["getFieldValue"]>[0]; type FieldsValue = Parameters["setFieldsValue"]>[0]; - const obj = { ...temp }; - Object.keys(temp).forEach((key) => { - obj[key as keyof T] = formInst!.isFieldTouched(key as FieldName) ? formInst!.getFieldValue(key as FieldName) : temp[key as keyof T]; + const obj = { ...res }; + Object.keys(res).forEach((key) => { + obj[key as keyof T] = formInst!.isFieldTouched(key as FieldName) ? formInst!.getFieldValue(key as FieldName) : res[key as keyof T]; }); - setFormInitialValues(temp); + setFormInitialValues(res); formInst!.setFieldsValue(obj as FieldsValue); } }); diff --git a/ui/src/hooks/useTriggerElement.ts b/ui/src/hooks/useTriggerElement.ts index 03ed62d0..a8d8cb8c 100644 --- a/ui/src/hooks/useTriggerElement.ts +++ b/ui/src/hooks/useTriggerElement.ts @@ -17,12 +17,12 @@ const useTriggerElement = (trigger: React.ReactNode, options?: UseTriggerElement return null; } - const temp = isValidElement(trigger) ? trigger : createElement(Fragment, null, trigger); - return cloneElement(temp, { - ...temp.props, + const el = isValidElement(trigger) ? trigger : createElement(Fragment, null, trigger); + return cloneElement(el, { + ...el.props, onClick: (e: MouseEvent) => { onClick?.(e); - temp.props?.onClick?.(e); + el.props?.onClick?.(e); }, }); }, [trigger, onClick]);