refactor(ui): clean code

This commit is contained in:
Fu Diwei 2025-06-04 10:50:52 +08:00
parent c3e7590f53
commit 252da5d7e1
9 changed files with 72 additions and 34 deletions

View File

@ -6,6 +6,7 @@ import (
"crypto/x509" "crypto/x509"
"fmt" "fmt"
"math" "math"
"net"
"net/http" "net/http"
"strconv" "strconv"
"strings" "strings"
@ -34,9 +35,9 @@ func (n *monitorNode) Process(ctx context.Context) error {
nodeCfg := n.node.GetConfigForMonitor() nodeCfg := n.node.GetConfigForMonitor()
targetAddr := fmt.Sprintf("%s:%d", nodeCfg.Host, nodeCfg.Port) targetAddr := net.JoinHostPort(nodeCfg.Host, fmt.Sprintf("%d", nodeCfg.Port))
if nodeCfg.Port == 0 { if nodeCfg.Port == 0 {
targetAddr = fmt.Sprintf("%s:443", nodeCfg.Host) targetAddr = net.JoinHostPort(nodeCfg.Host, "443")
} }
targetDomain := nodeCfg.Domain targetDomain := nodeCfg.Domain

View File

@ -28,7 +28,7 @@ import ACMEDns01ProviderSelect from "@/components/provider/ACMEDns01ProviderSele
import CAProviderSelect from "@/components/provider/CAProviderSelect"; import CAProviderSelect from "@/components/provider/CAProviderSelect";
import Show from "@/components/Show"; import Show from "@/components/Show";
import { ACCESS_USAGES, ACME_DNS01_PROVIDERS, accessProvidersMap, acmeDns01ProvidersMap, caProvidersMap } from "@/domain/provider"; import { ACCESS_USAGES, ACME_DNS01_PROVIDERS, accessProvidersMap, acmeDns01ProvidersMap, caProvidersMap } from "@/domain/provider";
import { type WorkflowNodeConfigForApply } from "@/domain/workflow"; import { type WorkflowNodeConfigForApply, defaultNodeConfigForApply } from "@/domain/workflow";
import { useAntdForm, useAntdFormName, useZustandShallowSelector } from "@/hooks"; import { useAntdForm, useAntdFormName, useZustandShallowSelector } from "@/hooks";
import { useAccessesStore } from "@/stores/access"; import { useAccessesStore } from "@/stores/access";
import { useContactEmailsStore } from "@/stores/contact"; import { useContactEmailsStore } from "@/stores/contact";
@ -59,11 +59,7 @@ export type ApplyNodeConfigFormInstance = {
const MULTIPLE_INPUT_SEPARATOR = ";"; const MULTIPLE_INPUT_SEPARATOR = ";";
const initFormModel = (): ApplyNodeConfigFormFieldValues => { const initFormModel = (): ApplyNodeConfigFormFieldValues => {
return { return defaultNodeConfigForApply();
challengeType: "dns-01",
keyAlgorithm: "RSA2048",
skipBeforeExpiryDays: 30,
};
}; };
const ApplyNodeConfigForm = forwardRef<ApplyNodeConfigFormInstance, ApplyNodeConfigFormProps>( const ApplyNodeConfigForm = forwardRef<ApplyNodeConfigFormInstance, ApplyNodeConfigFormProps>(

View File

@ -4,7 +4,7 @@ import { Form, type FormInstance } from "antd";
import { createSchemaFieldRule } from "antd-zod"; import { createSchemaFieldRule } from "antd-zod";
import { z } from "zod"; import { z } from "zod";
import { type Expr, type WorkflowNodeConfigForCondition } from "@/domain/workflow"; import { type Expr, type WorkflowNodeConfigForCondition, defaultNodeConfigForCondition } from "@/domain/workflow";
import { useAntdForm } from "@/hooks"; import { useAntdForm } from "@/hooks";
import ConditionNodeConfigFormExpressionEditor, { type ConditionNodeConfigFormExpressionEditorInstance } from "./ConditionNodeConfigFormExpressionEditor"; import ConditionNodeConfigFormExpressionEditor, { type ConditionNodeConfigFormExpressionEditorInstance } from "./ConditionNodeConfigFormExpressionEditor";
@ -29,7 +29,7 @@ export type ConditionNodeConfigFormInstance = {
}; };
const initFormModel = (): ConditionNodeConfigFormFieldValues => { const initFormModel = (): ConditionNodeConfigFormFieldValues => {
return {}; return defaultNodeConfigForCondition();
}; };
const ConditionNodeConfigForm = forwardRef<ConditionNodeConfigFormInstance, ConditionNodeConfigFormProps>( const ConditionNodeConfigForm = forwardRef<ConditionNodeConfigFormInstance, ConditionNodeConfigFormProps>(

View File

@ -11,7 +11,7 @@ import DeploymentProviderPicker from "@/components/provider/DeploymentProviderPi
import DeploymentProviderSelect from "@/components/provider/DeploymentProviderSelect.tsx"; import DeploymentProviderSelect from "@/components/provider/DeploymentProviderSelect.tsx";
import Show from "@/components/Show"; import Show from "@/components/Show";
import { ACCESS_USAGES, DEPLOYMENT_PROVIDERS, accessProvidersMap, deploymentProvidersMap } from "@/domain/provider"; import { ACCESS_USAGES, DEPLOYMENT_PROVIDERS, accessProvidersMap, deploymentProvidersMap } from "@/domain/provider";
import { type WorkflowNodeConfigForDeploy, WorkflowNodeType } from "@/domain/workflow"; import { type WorkflowNodeConfigForDeploy, WorkflowNodeType, defaultNodeConfigForDeploy } from "@/domain/workflow";
import { useAntdForm, useAntdFormName, useZustandShallowSelector } from "@/hooks"; import { useAntdForm, useAntdFormName, useZustandShallowSelector } from "@/hooks";
import { useWorkflowStore } from "@/stores/workflow"; import { useWorkflowStore } from "@/stores/workflow";
@ -117,9 +117,7 @@ export type DeployNodeConfigFormInstance = {
}; };
const initFormModel = (): DeployNodeConfigFormFieldValues => { const initFormModel = (): DeployNodeConfigFormFieldValues => {
return { return defaultNodeConfigForDeploy();
skipOnLastSucceeded: true,
};
}; };
const DeployNodeConfigForm = forwardRef<DeployNodeConfigFormInstance, DeployNodeConfigFormProps>( const DeployNodeConfigForm = forwardRef<DeployNodeConfigFormInstance, DeployNodeConfigFormProps>(

View File

@ -4,7 +4,7 @@ import { Alert, Form, type FormInstance, Input, InputNumber } from "antd";
import { createSchemaFieldRule } from "antd-zod"; import { createSchemaFieldRule } from "antd-zod";
import { z } from "zod"; import { z } from "zod";
import { type WorkflowNodeConfigForMonitor } from "@/domain/workflow"; import { type WorkflowNodeConfigForMonitor, defaultNodeConfigForMonitor } from "@/domain/workflow";
import { useAntdForm } from "@/hooks"; import { useAntdForm } from "@/hooks";
import { validDomainName, validIPv4Address, validIPv6Address, validPortNumber } from "@/utils/validators"; import { validDomainName, validIPv4Address, validIPv6Address, validPortNumber } from "@/utils/validators";
@ -25,11 +25,7 @@ export type MonitorNodeConfigFormInstance = {
}; };
const initFormModel = (): MonitorNodeConfigFormFieldValues => { const initFormModel = (): MonitorNodeConfigFormFieldValues => {
return { return defaultNodeConfigForMonitor();
host: "",
port: 443,
requestPath: "/",
};
}; };
const MonitorNodeConfigForm = forwardRef<MonitorNodeConfigFormInstance, MonitorNodeConfigFormProps>( const MonitorNodeConfigForm = forwardRef<MonitorNodeConfigFormInstance, MonitorNodeConfigFormProps>(

View File

@ -12,7 +12,7 @@ import NotificationProviderSelect from "@/components/provider/NotificationProvid
import Show from "@/components/Show"; import Show from "@/components/Show";
import { ACCESS_USAGES, NOTIFICATION_PROVIDERS, accessProvidersMap, notificationProvidersMap } from "@/domain/provider"; import { ACCESS_USAGES, NOTIFICATION_PROVIDERS, accessProvidersMap, notificationProvidersMap } from "@/domain/provider";
import { notifyChannelsMap } from "@/domain/settings"; import { notifyChannelsMap } from "@/domain/settings";
import { type WorkflowNodeConfigForNotify } from "@/domain/workflow"; import { type WorkflowNodeConfigForNotify, defaultNodeConfigForNotify } from "@/domain/workflow";
import { useAntdForm, useAntdFormName, useZustandShallowSelector } from "@/hooks"; import { useAntdForm, useAntdFormName, useZustandShallowSelector } from "@/hooks";
import { useAccessesStore } from "@/stores/access"; import { useAccessesStore } from "@/stores/access";
import { useNotifyChannelsStore } from "@/stores/notify"; import { useNotifyChannelsStore } from "@/stores/notify";
@ -41,7 +41,7 @@ export type NotifyNodeConfigFormInstance = {
}; };
const initFormModel = (): NotifyNodeConfigFormFieldValues => { const initFormModel = (): NotifyNodeConfigFormFieldValues => {
return {}; return defaultNodeConfigForNotify();
}; };
const NotifyNodeConfigForm = forwardRef<NotifyNodeConfigFormInstance, NotifyNodeConfigFormProps>( const NotifyNodeConfigForm = forwardRef<NotifyNodeConfigFormInstance, NotifyNodeConfigFormProps>(

View File

@ -6,7 +6,7 @@ import dayjs from "dayjs";
import { z } from "zod"; import { z } from "zod";
import Show from "@/components/Show"; import Show from "@/components/Show";
import { WORKFLOW_TRIGGERS, type WorkflowNodeConfigForStart, type WorkflowTriggerType } from "@/domain/workflow"; import { WORKFLOW_TRIGGERS, type WorkflowNodeConfigForStart, type WorkflowTriggerType, defaultNodeConfigForStart } from "@/domain/workflow";
import { useAntdForm } from "@/hooks"; import { useAntdForm } from "@/hooks";
import { getNextCronExecutions, validCronExpression } from "@/utils/cron"; import { getNextCronExecutions, validCronExpression } from "@/utils/cron";
@ -27,10 +27,7 @@ export type StartNodeConfigFormInstance = {
}; };
const initFormModel = (): StartNodeConfigFormFieldValues => { const initFormModel = (): StartNodeConfigFormFieldValues => {
return { return defaultNodeConfigForStart();
trigger: WORKFLOW_TRIGGERS.AUTO,
triggerCron: "0 0 * * *",
};
}; };
const StartNodeConfigForm = forwardRef<StartNodeConfigFormInstance, StartNodeConfigFormProps>( const StartNodeConfigForm = forwardRef<StartNodeConfigFormInstance, StartNodeConfigFormProps>(

View File

@ -6,7 +6,7 @@ import { z } from "zod";
import { validateCertificate, validatePrivateKey } from "@/api/certificates"; import { validateCertificate, validatePrivateKey } from "@/api/certificates";
import TextFileInput from "@/components/TextFileInput"; import TextFileInput from "@/components/TextFileInput";
import { type WorkflowNodeConfigForUpload } from "@/domain/workflow"; import { type WorkflowNodeConfigForUpload, defaultNodeConfigForUpload } from "@/domain/workflow";
import { useAntdForm } from "@/hooks"; import { useAntdForm } from "@/hooks";
import { getErrMsg } from "@/utils/error"; import { getErrMsg } from "@/utils/error";
@ -27,7 +27,7 @@ export type UploadNodeConfigFormInstance = {
}; };
const initFormModel = (): UploadNodeConfigFormFieldValues => { const initFormModel = (): UploadNodeConfigFormFieldValues => {
return {}; return defaultNodeConfigForUpload();
}; };
const UploadNodeConfigForm = forwardRef<UploadNodeConfigFormInstance, UploadNodeConfigFormProps>( const UploadNodeConfigForm = forwardRef<UploadNodeConfigFormInstance, UploadNodeConfigFormProps>(

View File

@ -133,6 +133,13 @@ export type WorkflowNodeConfigForStart = {
triggerCron?: string; triggerCron?: string;
}; };
export const defaultNodeConfigForStart = (): Partial<WorkflowNodeConfigForStart> => {
return {
trigger: WORKFLOW_TRIGGERS.AUTO,
triggerCron: "0 0 * * *",
};
};
export type WorkflowNodeConfigForApply = { export type WorkflowNodeConfigForApply = {
domains: string; domains: string;
contactEmail: string; contactEmail: string;
@ -152,6 +159,14 @@ export type WorkflowNodeConfigForApply = {
skipBeforeExpiryDays: number; skipBeforeExpiryDays: number;
}; };
export const defaultNodeConfigForApply = (): Partial<WorkflowNodeConfigForApply> => {
return {
challengeType: "dns-01",
keyAlgorithm: "RSA2048",
skipBeforeExpiryDays: 30,
};
};
export type WorkflowNodeConfigForUpload = { export type WorkflowNodeConfigForUpload = {
certificateId: string; certificateId: string;
domains: string; domains: string;
@ -159,6 +174,10 @@ export type WorkflowNodeConfigForUpload = {
privateKey: string; privateKey: string;
}; };
export const defaultNodeConfigForUpload = (): Partial<WorkflowNodeConfigForUpload> => {
return {};
};
export type WorkflowNodeConfigForMonitor = { export type WorkflowNodeConfigForMonitor = {
host: string; host: string;
port: number; port: number;
@ -166,6 +185,13 @@ export type WorkflowNodeConfigForMonitor = {
requestPath?: string; requestPath?: string;
}; };
export const defaultNodeConfigForMonitor = (): Partial<WorkflowNodeConfigForMonitor> => {
return {
port: 443,
requestPath: "/",
};
};
export type WorkflowNodeConfigForDeploy = { export type WorkflowNodeConfigForDeploy = {
certificate: string; certificate: string;
provider: string; provider: string;
@ -174,6 +200,12 @@ export type WorkflowNodeConfigForDeploy = {
skipOnLastSucceeded: boolean; skipOnLastSucceeded: boolean;
}; };
export const defaultNodeConfigForDeploy = (): Partial<WorkflowNodeConfigForDeploy> => {
return {
skipOnLastSucceeded: true,
};
};
export type WorkflowNodeConfigForNotify = { export type WorkflowNodeConfigForNotify = {
subject: string; subject: string;
message: string; message: string;
@ -186,10 +218,18 @@ export type WorkflowNodeConfigForNotify = {
providerConfig?: Record<string, unknown>; providerConfig?: Record<string, unknown>;
}; };
export const defaultNodeConfigForNotify = (): Partial<WorkflowNodeConfigForNotify> => {
return {};
};
export type WorkflowNodeConfigForCondition = { export type WorkflowNodeConfigForCondition = {
expression?: Expr; expression?: Expr;
}; };
export const defaultNodeConfigForCondition = (): Partial<WorkflowNodeConfigForCondition> => {
return {};
};
export type WorkflowNodeConfigForBranch = never; export type WorkflowNodeConfigForBranch = never;
export type WorkflowNodeConfigForEnd = never; export type WorkflowNodeConfigForEnd = never;
@ -243,15 +283,18 @@ type InitWorkflowOptions = {
}; };
export const initWorkflow = (options: InitWorkflowOptions = {}): WorkflowModel => { export const initWorkflow = (options: InitWorkflowOptions = {}): WorkflowModel => {
const root = newNode(WorkflowNodeType.Start, {}) as WorkflowNode; const root = newNode(WorkflowNodeType.Start, {
root.config = { trigger: WORKFLOW_TRIGGERS.MANUAL }; nodeConfig: { trigger: WORKFLOW_TRIGGERS.MANUAL },
});
switch (options.template) { switch (options.template) {
case "standard": case "standard":
{ {
let current = root; let current = root;
const applyNode = newNode(WorkflowNodeType.Apply); const applyNode = newNode(WorkflowNodeType.Apply, {
nodeConfig: defaultNodeConfigForApply(),
});
current.next = applyNode; current.next = applyNode;
current = current.next; current = current.next;
@ -260,6 +303,7 @@ export const initWorkflow = (options: InitWorkflowOptions = {}): WorkflowModel =
current = current.next!.branches![1]; current = current.next!.branches![1];
current.next = newNode(WorkflowNodeType.Notify, { current.next = newNode(WorkflowNodeType.Notify, {
nodeConfig: { nodeConfig: {
...defaultNodeConfigForNotify(),
subject: "[Certimate] Workflow Failure Alert!", subject: "[Certimate] Workflow Failure Alert!",
message: "Your workflow run for the certificate application has failed. Please check the details.", message: "Your workflow run for the certificate application has failed. Please check the details.",
} as WorkflowNodeConfigForNotify, } as WorkflowNodeConfigForNotify,
@ -268,8 +312,8 @@ export const initWorkflow = (options: InitWorkflowOptions = {}): WorkflowModel =
current = applyNode.next!.branches![0]; current = applyNode.next!.branches![0];
current.next = newNode(WorkflowNodeType.Deploy, { current.next = newNode(WorkflowNodeType.Deploy, {
nodeConfig: { nodeConfig: {
...defaultNodeConfigForDeploy(),
certificate: `${applyNode.id}#certificate`, certificate: `${applyNode.id}#certificate`,
skipOnLastSucceeded: true,
} as WorkflowNodeConfigForDeploy, } as WorkflowNodeConfigForDeploy,
}); });
@ -279,6 +323,7 @@ export const initWorkflow = (options: InitWorkflowOptions = {}): WorkflowModel =
current = current.next!.branches![1]; current = current.next!.branches![1];
current.next = newNode(WorkflowNodeType.Notify, { current.next = newNode(WorkflowNodeType.Notify, {
nodeConfig: { nodeConfig: {
...defaultNodeConfigForNotify(),
subject: "[Certimate] Workflow Failure Alert!", subject: "[Certimate] Workflow Failure Alert!",
message: "Your workflow run for the certificate deployment has failed. Please check the details.", message: "Your workflow run for the certificate deployment has failed. Please check the details.",
} as WorkflowNodeConfigForNotify, } as WorkflowNodeConfigForNotify,
@ -290,7 +335,9 @@ export const initWorkflow = (options: InitWorkflowOptions = {}): WorkflowModel =
{ {
let current = root; let current = root;
const monitorNode = newNode(WorkflowNodeType.Monitor); const monitorNode = newNode(WorkflowNodeType.Monitor, {
nodeConfig: defaultNodeConfigForMonitor(),
});
current.next = monitorNode; current.next = monitorNode;
current = current.next; current = current.next;
@ -299,6 +346,7 @@ export const initWorkflow = (options: InitWorkflowOptions = {}): WorkflowModel =
current = current.next!.branches![1]; current = current.next!.branches![1];
current.next = newNode(WorkflowNodeType.Notify, { current.next = newNode(WorkflowNodeType.Notify, {
nodeConfig: { nodeConfig: {
...defaultNodeConfigForNotify(),
subject: "[Certimate] Workflow Failure Alert!", subject: "[Certimate] Workflow Failure Alert!",
message: "Your workflow run for the certificate monitoring has failed. Please check the details.", message: "Your workflow run for the certificate monitoring has failed. Please check the details.",
} as WorkflowNodeConfigForNotify, } as WorkflowNodeConfigForNotify,
@ -352,6 +400,7 @@ export const initWorkflow = (options: InitWorkflowOptions = {}): WorkflowModel =
} as WorkflowNodeConfigForCondition; } as WorkflowNodeConfigForCondition;
current.next = newNode(WorkflowNodeType.Notify, { current.next = newNode(WorkflowNodeType.Notify, {
nodeConfig: { nodeConfig: {
...defaultNodeConfigForNotify(),
subject: "[Certimate] Certificate Expiry Alert!", subject: "[Certimate] Certificate Expiry Alert!",
message: "The certificate will expire soon. Please pay attention to your website.", message: "The certificate will expire soon. Please pay attention to your website.",
} as WorkflowNodeConfigForNotify, } as WorkflowNodeConfigForNotify,
@ -380,6 +429,7 @@ export const initWorkflow = (options: InitWorkflowOptions = {}): WorkflowModel =
} as WorkflowNodeConfigForCondition; } as WorkflowNodeConfigForCondition;
current.next = newNode(WorkflowNodeType.Notify, { current.next = newNode(WorkflowNodeType.Notify, {
nodeConfig: { nodeConfig: {
...defaultNodeConfigForNotify(),
subject: "[Certimate] Certificate Expiry Alert!", subject: "[Certimate] Certificate Expiry Alert!",
message: "The certificate has already expired. Please pay attention to your website.", message: "The certificate has already expired. Please pay attention to your website.",
} as WorkflowNodeConfigForNotify, } as WorkflowNodeConfigForNotify,