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"
"fmt"
"math"
"net"
"net/http"
"strconv"
"strings"
@ -34,9 +35,9 @@ func (n *monitorNode) Process(ctx context.Context) error {
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 {
targetAddr = fmt.Sprintf("%s:443", nodeCfg.Host)
targetAddr = net.JoinHostPort(nodeCfg.Host, "443")
}
targetDomain := nodeCfg.Domain

View File

@ -28,7 +28,7 @@ import ACMEDns01ProviderSelect from "@/components/provider/ACMEDns01ProviderSele
import CAProviderSelect from "@/components/provider/CAProviderSelect";
import Show from "@/components/Show";
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 { useAccessesStore } from "@/stores/access";
import { useContactEmailsStore } from "@/stores/contact";
@ -59,11 +59,7 @@ export type ApplyNodeConfigFormInstance = {
const MULTIPLE_INPUT_SEPARATOR = ";";
const initFormModel = (): ApplyNodeConfigFormFieldValues => {
return {
challengeType: "dns-01",
keyAlgorithm: "RSA2048",
skipBeforeExpiryDays: 30,
};
return defaultNodeConfigForApply();
};
const ApplyNodeConfigForm = forwardRef<ApplyNodeConfigFormInstance, ApplyNodeConfigFormProps>(

View File

@ -4,7 +4,7 @@ import { Form, type FormInstance } from "antd";
import { createSchemaFieldRule } from "antd-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 ConditionNodeConfigFormExpressionEditor, { type ConditionNodeConfigFormExpressionEditorInstance } from "./ConditionNodeConfigFormExpressionEditor";
@ -29,7 +29,7 @@ export type ConditionNodeConfigFormInstance = {
};
const initFormModel = (): ConditionNodeConfigFormFieldValues => {
return {};
return defaultNodeConfigForCondition();
};
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 Show from "@/components/Show";
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 { useWorkflowStore } from "@/stores/workflow";
@ -117,9 +117,7 @@ export type DeployNodeConfigFormInstance = {
};
const initFormModel = (): DeployNodeConfigFormFieldValues => {
return {
skipOnLastSucceeded: true,
};
return defaultNodeConfigForDeploy();
};
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 { z } from "zod";
import { type WorkflowNodeConfigForMonitor } from "@/domain/workflow";
import { type WorkflowNodeConfigForMonitor, defaultNodeConfigForMonitor } from "@/domain/workflow";
import { useAntdForm } from "@/hooks";
import { validDomainName, validIPv4Address, validIPv6Address, validPortNumber } from "@/utils/validators";
@ -25,11 +25,7 @@ export type MonitorNodeConfigFormInstance = {
};
const initFormModel = (): MonitorNodeConfigFormFieldValues => {
return {
host: "",
port: 443,
requestPath: "/",
};
return defaultNodeConfigForMonitor();
};
const MonitorNodeConfigForm = forwardRef<MonitorNodeConfigFormInstance, MonitorNodeConfigFormProps>(

View File

@ -12,7 +12,7 @@ import NotificationProviderSelect from "@/components/provider/NotificationProvid
import Show from "@/components/Show";
import { ACCESS_USAGES, NOTIFICATION_PROVIDERS, accessProvidersMap, notificationProvidersMap } from "@/domain/provider";
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 { useAccessesStore } from "@/stores/access";
import { useNotifyChannelsStore } from "@/stores/notify";
@ -41,7 +41,7 @@ export type NotifyNodeConfigFormInstance = {
};
const initFormModel = (): NotifyNodeConfigFormFieldValues => {
return {};
return defaultNodeConfigForNotify();
};
const NotifyNodeConfigForm = forwardRef<NotifyNodeConfigFormInstance, NotifyNodeConfigFormProps>(

View File

@ -6,7 +6,7 @@ import dayjs from "dayjs";
import { z } from "zod";
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 { getNextCronExecutions, validCronExpression } from "@/utils/cron";
@ -27,10 +27,7 @@ export type StartNodeConfigFormInstance = {
};
const initFormModel = (): StartNodeConfigFormFieldValues => {
return {
trigger: WORKFLOW_TRIGGERS.AUTO,
triggerCron: "0 0 * * *",
};
return defaultNodeConfigForStart();
};
const StartNodeConfigForm = forwardRef<StartNodeConfigFormInstance, StartNodeConfigFormProps>(

View File

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

View File

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