From f885b49daf176a56c55845b7554323eac1411c6e Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Sun, 1 Jun 2025 22:59:24 +0800 Subject: [PATCH] feat: add certtest workflow template --- ui/public/imgs/workflow/tpl-blank.png | Bin 5262 -> 9218 bytes ui/public/imgs/workflow/tpl-certtest.png | Bin 0 -> 20833 bytes ui/public/imgs/workflow/tpl-standard.png | Bin 12858 -> 20723 bytes ui/src/domain/workflow.ts | 154 ++++++++++++++++-- ui/src/domain/workflowExpr.ts | 1 - ui/src/i18n/locales/en/nls.workflow.json | 2 + .../i18n/locales/en/nls.workflow.nodes.json | 2 + ui/src/i18n/locales/zh/nls.workflow.json | 4 +- .../i18n/locales/zh/nls.workflow.nodes.json | 10 +- ui/src/pages/workflows/WorkflowNew.tsx | 34 +++- 10 files changed, 184 insertions(+), 23 deletions(-) create mode 100644 ui/public/imgs/workflow/tpl-certtest.png delete mode 100644 ui/src/domain/workflowExpr.ts diff --git a/ui/public/imgs/workflow/tpl-blank.png b/ui/public/imgs/workflow/tpl-blank.png index 8f683ce6fcb0f5e62d469d415c6277fccf7e0770..ee6568a9804f982e74f4f9a5ee78fd08640a272e 100644 GIT binary patch literal 9218 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 F^iR&aMN9wy literal 5262 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 diff --git a/ui/public/imgs/workflow/tpl-certtest.png b/ui/public/imgs/workflow/tpl-certtest.png new file mode 100644 index 0000000000000000000000000000000000000000..da7bfada55b7d0ff800363c414c9bca88b1d3e67 GIT binary patch literal 20833 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 b9_+v7zW#+&{u|Z5CGc+v{BI?&JN*9uO%#IC literal 0 HcmV?d00001 diff --git a/ui/public/imgs/workflow/tpl-standard.png b/ui/public/imgs/workflow/tpl-standard.png index 46698a875c3b835a18b4fb9b059d405c905bd181..c14238fff2bf3948763f87a1e111f7b9ae0468f9 100644 GIT binary patch literal 20723 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 AivR!s literal 12858 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¨?LE_}115n{4ET98mJ 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 = new Map([ [WorkflowNodeType.ExecuteResultBranch, i18n.t("workflow_node.execute_result_branch.default_name")], [WorkflowNodeType.ExecuteSuccess, i18n.t("workflow_node.execute_success.default_name")], [WorkflowNodeType.ExecuteFailure, i18n.t("workflow_node.execute_failure.default_name")], - [WorkflowNodeType.Custom, i18n.t("workflow_node.custom.default_name")], ]); const workflowNodeTypeDefaultInputs: Map = new Map([ @@ -240,25 +239,153 @@ const isBranchLike = (node: WorkflowNode) => { }; type InitWorkflowOptions = { - template?: "standard"; + template?: "standard" | "certtest"; }; export const initWorkflow = (options: InitWorkflowOptions = {}): WorkflowModel => { const root = newNode(WorkflowNodeType.Start, {}) as WorkflowNode; root.config = { trigger: WORKFLOW_TRIGGERS.MANUAL }; - if (options.template === "standard") { - let current = root; - current.next = newNode(WorkflowNodeType.Apply, {}); + switch (options.template) { + case "standard": + { + let current = root; - current = current.next; - current.next = newNode(WorkflowNodeType.Deploy, {}); + const applyNode = newNode(WorkflowNodeType.Apply); + current.next = applyNode; - current = current.next; - current.next = newNode(WorkflowNodeType.ExecuteResultBranch, {}); + current = current.next; + current.next = newNode(WorkflowNodeType.ExecuteResultBranch); - current = current.next!.branches![1]; - current.next = newNode(WorkflowNodeType.Notify, {}); + current = current.next!.branches![1]; + current.next = newNode(WorkflowNodeType.Notify, { + nodeConfig: { + subject: "[Certimate] Workflow Failure Alert!", + message: "Your workflow run for the certificate application has failed. Please check the details.", + } as WorkflowNodeConfigForNotify, + }); + + current = applyNode.next!.branches![0]; + current.next = newNode(WorkflowNodeType.Deploy, { + nodeConfig: { + certificate: `${applyNode.id}#certificate`, + skipOnLastSucceeded: true, + } as WorkflowNodeConfigForDeploy, + }); + + current = current.next; + current.next = newNode(WorkflowNodeType.ExecuteResultBranch); + + current = current.next!.branches![1]; + current.next = newNode(WorkflowNodeType.Notify, { + nodeConfig: { + subject: "[Certimate] Workflow Failure Alert!", + message: "Your workflow run for the certificate deployment has failed. Please check the details.", + } as WorkflowNodeConfigForNotify, + }); + } + break; + + case "certtest": + { + let current = root; + + const monitorNode = newNode(WorkflowNodeType.Monitor); + current.next = monitorNode; + + current = current.next; + current.next = newNode(WorkflowNodeType.ExecuteResultBranch); + + current = current.next!.branches![1]; + current.next = newNode(WorkflowNodeType.Notify, { + nodeConfig: { + subject: "[Certimate] Workflow Failure Alert!", + message: "Your workflow run for the certificate monitoring has failed. Please check the details.", + } as WorkflowNodeConfigForNotify, + }); + + current = monitorNode.next!.branches![0]; + const branchNode = newNode(WorkflowNodeType.Branch); + current.next = branchNode; + + current = branchNode.branches![0]; + current.name = i18n.t("workflow_node.condition.default_name.template_certtest_on_expire_soon"); + current.config = { + expression: { + left: { + left: { + selector: { + id: monitorNode.id, + name: "certificate.validity", + type: "boolean", + }, + type: "var", + }, + operator: "eq", + right: { + type: "const", + value: "true", + valueType: "boolean", + }, + type: "comparison", + }, + operator: "and", + right: { + left: { + selector: { + id: monitorNode.id, + name: "certificate.daysLeft", + type: "number", + }, + type: "var", + }, + operator: "lte", + right: { + type: "const", + value: "30", + valueType: "number", + }, + type: "comparison", + }, + type: "logical", + }, + } as WorkflowNodeConfigForCondition; + current.next = newNode(WorkflowNodeType.Notify, { + nodeConfig: { + subject: "[Certimate] Certificate Expiry Alert!", + message: "The certificate will expire soon. Please pay attention to your website.", + } as WorkflowNodeConfigForNotify, + }); + + current = branchNode.branches![1]; + current.name = i18n.t("workflow_node.condition.default_name.template_certtest_on_expired"); + current.config = { + expression: { + left: { + selector: { + id: monitorNode.id, + name: "certificate.validity", + type: "boolean", + }, + type: "var", + }, + operator: "eq", + right: { + type: "const", + value: "false", + valueType: "boolean", + }, + type: "comparison", + }, + } as WorkflowNodeConfigForCondition; + current.next = newNode(WorkflowNodeType.Notify, { + nodeConfig: { + subject: "[Certimate] Certificate Expiry Alert!", + message: "The certificate has already expired. Please pay attention to your website.", + } as WorkflowNodeConfigForNotify, + }); + } + break; } return { @@ -275,6 +402,8 @@ export const initWorkflow = (options: InitWorkflowOptions = {}): WorkflowModel = }; type NewNodeOptions = { + nodeName?: string; + nodeConfig?: Record; branchIndex?: number; }; @@ -284,8 +413,9 @@ export const newNode = (nodeType: WorkflowNodeType, options: NewNodeOptions = {} const node: WorkflowNode = { id: nanoid(), - name: nodeName, + name: options.nodeName ?? nodeName, type: nodeType, + config: options.nodeConfig, }; switch (nodeType) { diff --git a/ui/src/domain/workflowExpr.ts b/ui/src/domain/workflowExpr.ts deleted file mode 100644 index 5f282702..00000000 --- a/ui/src/domain/workflowExpr.ts +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/src/i18n/locales/en/nls.workflow.json b/ui/src/i18n/locales/en/nls.workflow.json index b4f9d7e6..b086e25f 100644 --- a/ui/src/i18n/locales/en/nls.workflow.json +++ b/ui/src/i18n/locales/en/nls.workflow.json @@ -30,6 +30,8 @@ "workflow.new.templates.title": "Choose a Workflow Template", "workflow.new.templates.template.standard.title": "Standard template", "workflow.new.templates.template.standard.description": "A standard operating procedure that includes application, deployment, and notification steps.", + "workflow.new.templates.template.certtest.title": "Monitoring template", + "workflow.new.templates.template.certtest.description": "A monitoring operating procedure that includes monitoring, and notification steps.", "workflow.new.templates.template.blank.title": "Blank template", "workflow.new.templates.template.blank.description": "Customize all the contents of the workflow from the beginning.", "workflow.new.modal.title": "Create workflow", diff --git a/ui/src/i18n/locales/en/nls.workflow.nodes.json b/ui/src/i18n/locales/en/nls.workflow.nodes.json index 626e9b68..a22cd8c4 100644 --- a/ui/src/i18n/locales/en/nls.workflow.nodes.json +++ b/ui/src/i18n/locales/en/nls.workflow.nodes.json @@ -876,6 +876,8 @@ "workflow_node.condition.label": "Branch", "workflow_node.condition.default_name": "Branch", + "workflow_node.condition.default_name.template_certtest_on_expire_soon": "If the certificate will expire soon ...", + "workflow_node.condition.default_name.template_certtest_on_expired": "If the certificate has expired ...", "workflow_node.condition.form.expression.label": "Conditions to enter the branch", "workflow_node.condition.form.expression.logical_operator.errmsg": "Please select logical operator of conditions", "workflow_node.condition.form.expression.logical_operator.option.and.label": "Meeting all of the conditions (AND)", diff --git a/ui/src/i18n/locales/zh/nls.workflow.json b/ui/src/i18n/locales/zh/nls.workflow.json index 46cdc228..9ff12aac 100644 --- a/ui/src/i18n/locales/zh/nls.workflow.json +++ b/ui/src/i18n/locales/zh/nls.workflow.json @@ -29,7 +29,9 @@ "workflow.new.subtitle": "使用工作流来申请证书、部署上传和发送通知", "workflow.new.templates.title": "选择工作流模板", "workflow.new.templates.template.standard.title": "标准模板", - "workflow.new.templates.template.standard.description": "一个包含申请 + 部署 + 通知步骤的标准工作流程。", + "workflow.new.templates.template.standard.description": "一个包含证书申请 + 证书部署 + 消息通知步骤的工作流程。", + "workflow.new.templates.template.certtest.title": "监控模板", + "workflow.new.templates.template.certtest.description": "一个包含证书监控 + 消息通知步骤的工作流程。", "workflow.new.templates.template.blank.title": "空白模板", "workflow.new.templates.template.blank.description": "从零开始自定义工作流的任务内容。", "workflow.new.modal.title": "新建工作流", diff --git a/ui/src/i18n/locales/zh/nls.workflow.nodes.json b/ui/src/i18n/locales/zh/nls.workflow.nodes.json index 7710e386..b568d2ca 100644 --- a/ui/src/i18n/locales/zh/nls.workflow.nodes.json +++ b/ui/src/i18n/locales/zh/nls.workflow.nodes.json @@ -875,6 +875,8 @@ "workflow_node.condition.label": "分支", "workflow_node.condition.default_name": "分支", + "workflow_node.condition.default_name.template_certtest_on_expire_soon": "若网站证书即将到期 ...", + "workflow_node.condition.default_name.template_certtest_on_expired": "若网站证书已到期 ...", "workflow_node.condition.form.expression.label": "分支进入条件", "workflow_node.condition.form.expression.logical_operator.errmsg": "请选择条件组合方式", "workflow_node.condition.form.expression.logical_operator.option.and.label": "满足以下所有条件 (AND)", @@ -900,9 +902,9 @@ "workflow_node.execute_result_branch.label": "执行结果分支", "workflow_node.execute_result_branch.default_name": "执行结果分支", - "workflow_node.execute_success.label": "若前序节点执行成功…", - "workflow_node.execute_success.default_name": "若前序节点执行成功…", + "workflow_node.execute_success.label": "若上一节点执行成功…", + "workflow_node.execute_success.default_name": "若上一节点执行成功…", - "workflow_node.execute_failure.label": "若前序节点执行失败…", - "workflow_node.execute_failure.default_name": "若前序节点执行失败…" + "workflow_node.execute_failure.label": "若上一节点执行失败…", + "workflow_node.execute_failure.default_name": "若上一节点执行失败…" } diff --git a/ui/src/pages/workflows/WorkflowNew.tsx b/ui/src/pages/workflows/WorkflowNew.tsx index 5f6af27b..9877dcc2 100644 --- a/ui/src/pages/workflows/WorkflowNew.tsx +++ b/ui/src/pages/workflows/WorkflowNew.tsx @@ -12,9 +12,10 @@ import { useAntdForm } from "@/hooks"; import { save as saveWorkflow } from "@/repository/workflow"; import { getErrMsg } from "@/utils/error"; -const TEMPLATE_KEY_BLANK = "blank" as const; const TEMPLATE_KEY_STANDARD = "standard" as const; -type TemplateKeys = typeof TEMPLATE_KEY_BLANK | typeof TEMPLATE_KEY_STANDARD; +const TEMPLATE_KEY_CERTTEST = "monitor" as const; +const TEMPLATE_KEY_BLANK = "blank" as const; +type TemplateKeys = typeof TEMPLATE_KEY_BLANK | typeof TEMPLATE_KEY_CERTTEST | typeof TEMPLATE_KEY_STANDARD; const WorkflowNew = () => { const navigate = useNavigate(); @@ -27,8 +28,8 @@ const WorkflowNew = () => { xs: { flex: "100%" }, md: { flex: "100%" }, lg: { flex: "50%" }, - xl: { flex: "50%" }, - xxl: { flex: "50%" }, + xl: { flex: "33.3333%" }, + xxl: { flex: "33.3333%" }, }; const [templateSelectKey, setTemplateSelectKey] = useState(); @@ -64,6 +65,10 @@ const WorkflowNew = () => { workflow = initWorkflow({ template: "standard" }); break; + case TEMPLATE_KEY_CERTTEST: + workflow = initWorkflow({ template: "certtest" }); + break; + default: throw "Invalid state: `templateSelectKey`"; } @@ -116,7 +121,7 @@ const WorkflowNew = () => {
-
+
{t("workflow.new.templates.title")}
@@ -139,6 +144,25 @@ const WorkflowNew = () => {
+ + + } + hoverable + onClick={() => handleTemplateClick(TEMPLATE_KEY_CERTTEST)} + > +
+ + +
+
+ +