From 07043aff0ca7fd29c56dd3c363002cb15d78b464 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Mon, 14 Oct 2024 03:17:10 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20EAB=E6=8E=88=E6=9D=83=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E7=BB=91=E5=AE=9A=E9=82=AE=E7=AE=B1=EF=BC=8C=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=85=AC=E5=85=B1EAB=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/core/pipeline/src/core/executor.ts | 8 ++ packages/core/pipeline/src/plugin/api.ts | 5 +- packages/core/pipeline/src/service/config.ts | 4 +- .../libs/lib-server/src/basic/base-service.ts | 2 +- .../plugin-cert/src/access/eab-access.ts | 10 +++ .../src/plugin/cert-plugin/index.ts | 27 +++++-- .../src/router/source/modules/sys.ts | 14 ++++ .../ui/certd-client/src/style/common.less | 5 ++ .../access/access-selector/access/crud.tsx | 31 +++++++- .../access/access-selector/access/index.vue | 2 +- .../certd/access/access-selector/index.vue | 4 +- .../src/views/certd/access/api.ts | 3 +- .../src/views/certd/access/index.vue | 2 +- .../src/views/certd/pipeline/api.plugin.ts | 9 +++ .../views/certd/pipeline/certd-form/crud.tsx | 19 ++++- .../pipeline/component/step-form/index.vue | 16 +++- .../src/views/certd/pipeline/pipeline/type.ts | 2 +- .../certd-client/src/views/sys/plugin/api.ts | 37 ++++++++- .../src/views/sys/plugin/config.vue | 62 +++++++++++++++ .../src/views/sys/settings/index.vue | 2 +- .../db/migration/v10010__plugin.sql | 2 +- .../cname/cname-record-controller.ts | 2 +- .../controller/pipeline/access-controller.ts | 2 +- .../controller/pipeline/history-controller.ts | 4 +- .../pipeline/pipeline-controller.ts | 2 +- .../controller/pipeline/plugin-controller.ts | 12 ++- .../sys/plugin/plugin-controller.ts | 15 ++++ .../pipeline/service/pipeline-service.ts | 12 ++- .../pipeline/service/plugin-config-service.ts | 13 --- .../src/modules/plugin/entity/plugin.ts | 2 +- .../plugin/service/plugin-config-getter.ts | 22 ++++++ .../plugin/service/plugin-config-service.ts | 79 +++++++++++++++++++ 32 files changed, 374 insertions(+), 57 deletions(-) create mode 100644 packages/ui/certd-client/src/views/sys/plugin/config.vue delete mode 100644 packages/ui/certd-server/src/modules/pipeline/service/plugin-config-service.ts create mode 100644 packages/ui/certd-server/src/modules/plugin/service/plugin-config-getter.ts create mode 100644 packages/ui/certd-server/src/modules/plugin/service/plugin-config-service.ts diff --git a/packages/core/pipeline/src/core/executor.ts b/packages/core/pipeline/src/core/executor.ts index 2d7edfc4..79159f82 100644 --- a/packages/core/pipeline/src/core/executor.ts +++ b/packages/core/pipeline/src/core/executor.ts @@ -217,6 +217,8 @@ export class Executor { const instance: ITaskPlugin = new plugin.target(); // @ts-ignore const define: PluginDefine = plugin.define; + const pluginName = define.name; + const pluginConfig = await this.options.pluginConfigService.getPluginConfig(pluginName); //从outputContext读取输入参数 const input = cloneDeep(step.input); Decorator.inject(define.input, instance, input, (item, key) => { @@ -238,6 +240,12 @@ export class Executor { } }); + const sysInput = pluginConfig.sysSetting?.input || {}; + //注入系统设置参数 + for (const sysInputKey in sysInput) { + input[sysInputKey] = sysInput[sysInputKey]; + } + const newInputHash = hashUtils.md5(JSON.stringify(input)); step.status!.inputHash = newInputHash; //判断是否需要跳过 diff --git a/packages/core/pipeline/src/plugin/api.ts b/packages/core/pipeline/src/plugin/api.ts index 8e9b1484..ab5e02ac 100644 --- a/packages/core/pipeline/src/plugin/api.ts +++ b/packages/core/pipeline/src/plugin/api.ts @@ -26,7 +26,10 @@ export type TaskOutputDefine = { type?: string; }; -export type TaskInputDefine = FormItemProps; +export type TaskInputDefine = { + required?: boolean; + isSys?: boolean; +} & FormItemProps; export type PluginDefine = Registrable & { default?: any; diff --git a/packages/core/pipeline/src/service/config.ts b/packages/core/pipeline/src/service/config.ts index 6ac929fe..a1f256d5 100644 --- a/packages/core/pipeline/src/service/config.ts +++ b/packages/core/pipeline/src/service/config.ts @@ -2,11 +2,11 @@ export type PluginConfig = { name: string; disabled: boolean; sysSetting: { - [key: string]: any; + input: Record; }; }; //插件配置服务 export type IPluginConfigService = { - getPluginConfig: (pluginName: string) => Promise; + getPluginConfig: (pluginName: string) => Promise; }; diff --git a/packages/libs/lib-server/src/basic/base-service.ts b/packages/libs/lib-server/src/basic/base-service.ts index 929962f8..98bf0dfd 100644 --- a/packages/libs/lib-server/src/basic/base-service.ts +++ b/packages/libs/lib-server/src/basic/base-service.ts @@ -167,7 +167,7 @@ export abstract class BaseService { index++; }); if (index > 0) { - qb.where(whereSql, query); + qb.andWhere(whereSql, query); } } //自定义query diff --git a/packages/plugins/plugin-cert/src/access/eab-access.ts b/packages/plugins/plugin-cert/src/access/eab-access.ts index 36df7178..d4eb4079 100644 --- a/packages/plugins/plugin-cert/src/access/eab-access.ts +++ b/packages/plugins/plugin-cert/src/access/eab-access.ts @@ -26,6 +26,16 @@ export class EabAccess extends BaseAccess { encrypt: true, }) hmacKey = ""; + + @AccessInput({ + title: "email", + component: { + placeholder: "绑定一个邮箱", + }, + helper: "Google EAB 申请证书绑定邮箱后,不能更换,否则会导致EAB失效", + required: false, + }) + email = ""; } new EabAccess(); diff --git a/packages/plugins/plugin-cert/src/plugin/cert-plugin/index.ts b/packages/plugins/plugin-cert/src/plugin/cert-plugin/index.ts index f73aa7e5..6b9539ce 100644 --- a/packages/plugins/plugin-cert/src/plugin/cert-plugin/index.ts +++ b/packages/plugins/plugin-cert/src/plugin/cert-plugin/index.ts @@ -6,6 +6,7 @@ import { createDnsProvider, DnsProviderContext, IDnsProvider } from "../../dns-p import { CertReader } from "./cert-reader.js"; import { CertApplyBasePlugin } from "./base.js"; import { GoogleClient } from "../../libs/google.js"; +import { EabAccess } from "../../access"; export type { CertInfo }; export * from "./cert-reader.js"; @@ -138,6 +139,13 @@ export class CertApplyPlugin extends CertApplyBasePlugin { }) sslProvider!: SSLProvider; + @TaskInput({ + title: "Google公共EAB授权", + isSys: true, + show: false, + }) + googleCommonEabAccessId!: number; + @TaskInput({ title: "EAB授权", component: { @@ -151,7 +159,7 @@ export class CertApplyPlugin extends CertApplyBasePlugin { mergeScript: ` return { show: ctx.compute(({form})=>{ - return form.sslProvider === 'zerossl' || form.sslProvider === 'google' + return form.sslProvider === 'zerossl' || (form.sslProvider === 'google' && !form.googleCommonEabAccessId) }) } `, @@ -171,7 +179,7 @@ export class CertApplyPlugin extends CertApplyBasePlugin { mergeScript: ` return { show: ctx.compute(({form})=>{ - return form.sslProvider === 'google' + return form.sslProvider === 'google' && !form.googleCommonEabAccessId }) } `, @@ -233,10 +241,12 @@ export class CertApplyPlugin extends CertApplyBasePlugin { acme!: AcmeService; + eab!: EabAccess; async onInit() { - let eab: any = null; + let eab: EabAccess = null; if (this.sslProvider === "google") { + const eabAccessId = this.eabAccessId || this.googleCommonEabAccessId; if (this.googleAccessId) { this.logger.info("您正在使用google服务账号授权"); const googleAccess = await this.ctx.accessService.getById(this.googleAccessId); @@ -245,9 +255,9 @@ export class CertApplyPlugin extends CertApplyBasePlugin { logger: this.logger, }); eab = await googleClient.getEab(); - } else if (this.eabAccessId) { + } else if (eabAccessId) { this.logger.info("您正在使用google EAB授权"); - eab = await this.ctx.accessService.getById(this.eabAccessId); + eab = await this.ctx.accessService.getById(eabAccessId); } else { this.logger.error("google需要配置EAB授权或服务账号授权"); return; @@ -260,7 +270,7 @@ export class CertApplyPlugin extends CertApplyBasePlugin { return; } } - + this.eab = eab; this.acme = new AcmeService({ userContext: this.userContext, logger: this.logger, @@ -276,7 +286,10 @@ export class CertApplyPlugin extends CertApplyBasePlugin { } async doCertApply() { - const email = this["email"]; + let email = this.email; + if (this.eab && this.eab.email) { + email = this.eab.email; + } const domains = this["domains"]; const csrInfo = _.merge( diff --git a/packages/ui/certd-client/src/router/source/modules/sys.ts b/packages/ui/certd-client/src/router/source/modules/sys.ts index 517be413..b866d5ca 100644 --- a/packages/ui/certd-client/src/router/source/modules/sys.ts +++ b/packages/ui/certd-client/src/router/source/modules/sys.ts @@ -96,6 +96,20 @@ export const sysResources = [ permission: "sys:settings:view" } }, + { + title: "证书插件配置", + name: "SysPluginConfig", + path: "/sys/plugin/config", + component: "/sys/plugin/config.vue", + meta: { + show: () => { + const settingStore = useSettingStore(); + return settingStore.isComm; + }, + icon: "ion:extension-puzzle-outline", + permission: "sys:settings:view" + } + }, { title: "账号绑定", name: "AccountBind", diff --git a/packages/ui/certd-client/src/style/common.less b/packages/ui/certd-client/src/style/common.less index 28783bc0..8835d6f7 100644 --- a/packages/ui/certd-client/src/style/common.less +++ b/packages/ui/certd-client/src/style/common.less @@ -222,3 +222,8 @@ h1, h2, h3, h4, h5, h6 { /* right: 0; */ } } + +.settings-form { + width: 800px; + margin: 20px; +} diff --git a/packages/ui/certd-client/src/views/certd/access/access-selector/access/crud.tsx b/packages/ui/certd-client/src/views/certd/access/access-selector/access/crud.tsx index eed3459e..9bcd93ec 100644 --- a/packages/ui/certd-client/src/views/certd/access/access-selector/access/crud.tsx +++ b/packages/ui/certd-client/src/views/certd/access/access-selector/access/crud.tsx @@ -1,11 +1,11 @@ // @ts-ignore import { ref } from "vue"; import { getCommonColumnDefine } from "/@/views/certd/access/common"; -import { AddReq, CreateCrudOptionsProps, CreateCrudOptionsRet, DelReq, EditReq, UserPageQuery, UserPageRes } from "@fast-crud/fast-crud"; +import { AddReq, CreateCrudOptionsProps, CreateCrudOptionsRet, DelReq, dict, EditReq, UserPageQuery, UserPageRes } from "@fast-crud/fast-crud"; export default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet { const { crudBinding } = crudExpose; - const { props, ctx } = context; + const { props, ctx, api } = context; const lastResRef = ref(); const pageRequest = async (query: UserPageQuery): Promise => { return await context.api.GetList(query); @@ -108,6 +108,33 @@ export default function ({ crudExpose, context }: CreateCrudOptionsProps): Creat width: 200 } }, + from: { + title: "级别", + type: "dict-select", + dict: dict({ + data: [ + { label: "系统", value: "sys" }, + { label: "用户", value: "user" } + ] + }), + search: { + show: false + }, + form: { + show: false + }, + column: { + width: 100, + align: "center", + component: { + color: "auto" + }, + order: 10 + }, + valueBuilder: ({ row, key, value }) => { + row[key] = row.userId > 0 ? "user" : "sys"; + } + }, ...commonColumnsDefine } } diff --git a/packages/ui/certd-client/src/views/certd/access/access-selector/access/index.vue b/packages/ui/certd-client/src/views/certd/access/access-selector/access/index.vue index f5737f26..9472faaa 100644 --- a/packages/ui/certd-client/src/views/certd/access/access-selector/access/index.vue +++ b/packages/ui/certd-client/src/views/certd/access/access-selector/access/index.vue @@ -25,7 +25,7 @@ export default defineComponent({ }, emits: ["update:modelValue"], setup(props, ctx) { - const api = createAccessApi(props.from === "sys" ? "/sys/access" : "/pi/access"); + const api = createAccessApi(props.from); const context: any = { props, ctx, api }; const { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions, context }); diff --git a/packages/ui/certd-client/src/views/certd/access/access-selector/index.vue b/packages/ui/certd-client/src/views/certd/access/access-selector/index.vue index e1071585..a1a006cf 100644 --- a/packages/ui/certd-client/src/views/certd/access/access-selector/index.vue +++ b/packages/ui/certd-client/src/views/certd/access/access-selector/index.vue @@ -9,7 +9,7 @@
- +
@@ -48,7 +48,7 @@ export default defineComponent({ }, emits: ["update:modelValue"], setup(props, ctx) { - const api = createAccessApi(props.from === "sys" ? "/sys/access" : "/pi/access"); + const api = createAccessApi(props.from); const target = ref({}); const selectedId = ref(); diff --git a/packages/ui/certd-client/src/views/certd/access/api.ts b/packages/ui/certd-client/src/views/certd/access/api.ts index 731991fa..903f9c31 100644 --- a/packages/ui/certd-client/src/views/certd/access/api.ts +++ b/packages/ui/certd-client/src/views/certd/access/api.ts @@ -1,6 +1,7 @@ import { request } from "/src/api/service"; -export function createAccessApi(apiPrefix = "/pi/access") { +export function createAccessApi(from = "user") { + const apiPrefix = from === "sys" ? "/sys/access" : "/pi/access"; return { async GetList(query: any) { return await request({ diff --git a/packages/ui/certd-client/src/views/certd/access/index.vue b/packages/ui/certd-client/src/views/certd/access/index.vue index fe33c8fe..be097592 100644 --- a/packages/ui/certd-client/src/views/certd/access/index.vue +++ b/packages/ui/certd-client/src/views/certd/access/index.vue @@ -19,7 +19,7 @@ import { createAccessApi } from "/@/views/certd/access/api"; export default defineComponent({ name: "AccessManager", setup() { - const api = createAccessApi("/pi/access"); + const api = createAccessApi("user"); const { crudBinding, crudRef, crudExpose } = useFs({ createCrudOptions, context: { api } }); // 页面打开后获取列表数据 diff --git a/packages/ui/certd-client/src/views/certd/pipeline/api.plugin.ts b/packages/ui/certd-client/src/views/certd/pipeline/api.plugin.ts index d64106f1..3ea26a0e 100644 --- a/packages/ui/certd-client/src/views/certd/pipeline/api.plugin.ts +++ b/packages/ui/certd-client/src/views/certd/pipeline/api.plugin.ts @@ -1,5 +1,6 @@ import { request } from "/src/api/service"; import _ from "lodash-es"; +import { PluginConfigBean, PluginSysSetting } from "/@/views/sys/plugin/api"; const apiPrefix = "/pi/plugin"; const defaultInputDefine = { @@ -54,3 +55,11 @@ export async function GetGroups(query: any) { initPlugins(plugins); return groups; } + +export async function GetPluginConfig(req: { id?: number; name: string; type: string }): Promise { + return await request({ + url: apiPrefix + "/config", + method: "post", + data: req + }); +} diff --git a/packages/ui/certd-client/src/views/certd/pipeline/certd-form/crud.tsx b/packages/ui/certd-client/src/views/certd/pipeline/certd-form/crud.tsx index e5228eb8..dd893124 100644 --- a/packages/ui/certd-client/src/views/certd/pipeline/certd-form/crud.tsx +++ b/packages/ui/certd-client/src/views/certd/pipeline/certd-form/crud.tsx @@ -1,10 +1,10 @@ import { compute, CreateCrudOptionsRet, dict } from "@fast-crud/fast-crud"; import { PluginGroup } from "@certd/pipeline"; import { useReference } from "/@/use/use-refrence"; -import _ from "lodash-es"; +import _, { merge } from "lodash-es"; import { useUserStore } from "/@/store/modules/user"; import { useSettingStore } from "/@/store/modules/settings"; - +import * as api from "../api.plugin"; export default function (certPluginGroup: PluginGroup, formWrapperRef: any): CreateCrudOptionsRet { const inputs: any = {}; const userStore = useUserStore(); @@ -46,7 +46,7 @@ export default function (certPluginGroup: PluginGroup, formWrapperRef: any): Cre crudOptions: { form: { wrapper: { - width: "1150px", + width: 1350, saveRemind: false, title: "创建证书申请流水线" } @@ -73,6 +73,19 @@ export default function (certPluginGroup: PluginGroup, formWrapperRef: any): Cre ); } + }, + valueChange: { + handle: async ({ form, value }) => { + debugger; + const config = await api.GetPluginConfig({ + name: value, + type: "builtIn" + }); + if (config.sysSetting?.input) { + merge(form, config.sysSetting.input); + } + }, + immediate: true } } }, diff --git a/packages/ui/certd-client/src/views/certd/pipeline/pipeline/component/step-form/index.vue b/packages/ui/certd-client/src/views/certd/pipeline/pipeline/component/step-form/index.vue index 9620b8a3..62f5b856 100644 --- a/packages/ui/certd-client/src/views/certd/pipeline/pipeline/component/step-form/index.vue +++ b/packages/ui/certd-client/src/views/certd/pipeline/pipeline/component/step-form/index.vue @@ -116,7 +116,7 @@ import { useUserStore } from "/@/store/modules/user"; import { compute, useCompute } from "@fast-crud/fast-crud"; import { useReference } from "/@/use/use-refrence"; import { useSettingStore } from "/@/store/modules/settings"; - +import * as pluginApi from "../../../api.plugin"; export default { name: "PiStepForm", // eslint-disable-next-line vue/no-unused-components @@ -163,7 +163,7 @@ export default { console.log("currentStepTypeChanged:", currentStep.value); }; - const stepTypeSave = () => { + const stepTypeSave = async () => { currentStep.value._isAdd = false; if (currentStep.value.type == null) { message.warn("请先选择类型"); @@ -171,7 +171,7 @@ export default { } // 给step的input设置默认值 - changeCurrentPlugin(currentStep.value); + await changeCurrentPlugin(currentStep.value); //合并默认值 _.merge(currentStep.value, { input: {}, strategy: { runStrategy: 0 } }, currentPlugin.value.default, currentStep.value); @@ -229,7 +229,7 @@ export default { const currentPlugin = doComputed(() => { return currentPluginDefine.value; }, getContext); - const changeCurrentPlugin = (step: any) => { + const changeCurrentPlugin = async (step: any) => { const stepType = step.type; step.type = stepType; step._isAdd = false; @@ -255,6 +255,14 @@ export default { currentStep.value.input[key] = column.default ?? column.value; } } + //设置系统初始值 + debugger; + const pluginSysConfig = await pluginApi.GetPluginConfig({ name: pluginDefine.name, type: "builtIn" }); + if (pluginSysConfig.sysSetting?.input) { + for (const key in pluginSysConfig.sysSetting?.input) { + currentStep.value.input[key] = pluginSysConfig.sysSetting?.input[key]; + } + } console.log("currentStepTypeChanged:", currentStep.value); console.log("currentStepPlugin:", currentPlugin.value); diff --git a/packages/ui/certd-client/src/views/certd/pipeline/pipeline/type.ts b/packages/ui/certd-client/src/views/certd/pipeline/pipeline/type.ts index f17c3167..dd043848 100644 --- a/packages/ui/certd-client/src/views/certd/pipeline/pipeline/type.ts +++ b/packages/ui/certd-client/src/views/certd/pipeline/pipeline/type.ts @@ -20,7 +20,7 @@ export type PluginGroup = { }; export type PluginDefine = { - key: string; + name: string; title: string; desc?: string; input: { diff --git a/packages/ui/certd-client/src/views/sys/plugin/api.ts b/packages/ui/certd-client/src/views/sys/plugin/api.ts index 99d66fb7..40916053 100644 --- a/packages/ui/certd-client/src/views/sys/plugin/api.ts +++ b/packages/ui/certd-client/src/views/sys/plugin/api.ts @@ -58,10 +58,43 @@ export async function DeleteBatch(ids: any[]) { }); } -export async function SetDisabled(bean: { id?: number; name?: string; type?: string; disabled: boolean }) { +export async function SetDisabled(data: { id?: number; name?: string; type?: string; disabled: boolean }) { return await request({ url: apiPrefix + "/setDisabled", method: "post", - data: bean + data: data + }); +} + +export type PluginConfigBean = { + name: string; + disabled: boolean; + sysSetting: { + input?: Record; + }; +}; + +export type CertApplyPluginSysInput = { + googleCommonEabAccessId: number; +}; +export type PluginSysSetting = { + input?: T; +}; +export type CommPluginConfig = { + CertApply?: PluginSysSetting; +}; + +export async function GetCommPluginConfigs(): Promise { + return await request({ + url: apiPrefix + "/getCommPluginConfigs", + method: "post" + }); +} + +export async function SaveCommPluginConfigs(data: CommPluginConfig): Promise { + return await request({ + url: apiPrefix + "/saveCommPluginConfigs", + method: "post", + data }); } diff --git a/packages/ui/certd-client/src/views/sys/plugin/config.vue b/packages/ui/certd-client/src/views/sys/plugin/config.vue new file mode 100644 index 00000000..97fbdfde --- /dev/null +++ b/packages/ui/certd-client/src/views/sys/plugin/config.vue @@ -0,0 +1,62 @@ + + + + diff --git a/packages/ui/certd-client/src/views/sys/settings/index.vue b/packages/ui/certd-client/src/views/sys/settings/index.vue index 904b937c..144af2e6 100644 --- a/packages/ui/certd-client/src/views/sys/settings/index.vue +++ b/packages/ui/certd-client/src/views/sys/settings/index.vue @@ -3,7 +3,7 @@ -
+
{ const bq = qb => { if (domain) { - qb.where('domain like :domain', { domain: `%${domain}%` }); + qb.andWhere('domain like :domain', { domain: `%${domain}%` }); } }; diff --git a/packages/ui/certd-server/src/controller/pipeline/access-controller.ts b/packages/ui/certd-server/src/controller/pipeline/access-controller.ts index 4004c765..e05864e8 100644 --- a/packages/ui/certd-server/src/controller/pipeline/access-controller.ts +++ b/packages/ui/certd-server/src/controller/pipeline/access-controller.ts @@ -21,7 +21,7 @@ export class AccessController extends CrudController { body.query = body.query ?? {}; delete body.query.userId; const buildQuery = qb => { - qb.where('user_id = :userId', { userId: this.getUserId() }); + qb.andWhere('user_id = :userId', { userId: this.getUserId() }); }; const res = await this.service.page({ query: body.query, diff --git a/packages/ui/certd-server/src/controller/pipeline/history-controller.ts b/packages/ui/certd-server/src/controller/pipeline/history-controller.ts index 55985c79..ab449d98 100644 --- a/packages/ui/certd-server/src/controller/pipeline/history-controller.ts +++ b/packages/ui/certd-server/src/controller/pipeline/history-controller.ts @@ -51,7 +51,7 @@ export class HistoryController extends CrudController { const pipelines = await this.pipelineService.list({ query: pipelineQuery, buildQuery: qb => { - qb.where('title like :title', { title: `%${pipelineTitle}%` }); + qb.andWhere('title like :title', { title: `%${pipelineTitle}%` }); }, }); pipelineIds = pipelines.map(p => p.id); @@ -59,7 +59,7 @@ export class HistoryController extends CrudController { const buildQuery = qb => { if (pipelineIds) { - qb.where({ + qb.andWhere({ pipelineId: In(pipelineIds), }); } diff --git a/packages/ui/certd-server/src/controller/pipeline/pipeline-controller.ts b/packages/ui/certd-server/src/controller/pipeline/pipeline-controller.ts index e3417512..a7b6153a 100644 --- a/packages/ui/certd-server/src/controller/pipeline/pipeline-controller.ts +++ b/packages/ui/certd-server/src/controller/pipeline/pipeline-controller.ts @@ -37,7 +37,7 @@ export class PipelineController extends CrudController { const buildQuery = qb => { if (title) { - qb.where('title like :title', { title: `%${title}%` }); + qb.andWhere('title like :title', { title: `%${title}%` }); } }; if (!body.sort || !body.sort?.prop) { diff --git a/packages/ui/certd-server/src/controller/pipeline/plugin-controller.ts b/packages/ui/certd-server/src/controller/pipeline/plugin-controller.ts index aa3bfeaa..0315d83a 100644 --- a/packages/ui/certd-server/src/controller/pipeline/plugin-controller.ts +++ b/packages/ui/certd-server/src/controller/pipeline/plugin-controller.ts @@ -1,6 +1,7 @@ -import { ALL, Controller, Inject, Post, Provide, Query } from '@midwayjs/core'; +import { ALL, Body, Controller, Inject, Post, Provide, Query } from '@midwayjs/core'; import { BaseController, Constants } from '@certd/lib-server'; import { PluginService } from '../../modules/plugin/service/plugin-service.js'; +import { PluginConfigService } from '../../modules/plugin/service/plugin-config-service.js'; /** * 插件 @@ -11,6 +12,9 @@ export class PluginController extends BaseController { @Inject() service: PluginService; + @Inject() + pluginConfigService: PluginConfigService; + @Post('/list', { summary: Constants.per.authOnly }) async list(@Query(ALL) query: any) { query.userId = this.getUserId(); @@ -24,4 +28,10 @@ export class PluginController extends BaseController { const group = await this.service.getEnabledBuildInGroup(); return this.ok(group); } + + @Post('/config', { summary: Constants.per.authOnly }) + async config(@Body(ALL) body: { id?: number; name?: string; type: string }) { + const config = await this.pluginConfigService.getPluginConfig(body); + return this.ok(config); + } } diff --git a/packages/ui/certd-server/src/controller/sys/plugin/plugin-controller.ts b/packages/ui/certd-server/src/controller/sys/plugin/plugin-controller.ts index 25ddd405..a4728886 100644 --- a/packages/ui/certd-server/src/controller/sys/plugin/plugin-controller.ts +++ b/packages/ui/certd-server/src/controller/sys/plugin/plugin-controller.ts @@ -3,6 +3,7 @@ import { merge } from 'lodash-es'; import { CrudController } from '@certd/lib-server'; import { PluginService } from '../../../modules/plugin/service/plugin-service.js'; import { checkComm } from '@certd/pipeline'; +import { CommPluginConfig, PluginConfigService } from '../../../modules/plugin/service/plugin-config-service.js'; /** * 插件 @@ -13,6 +14,9 @@ export class PluginController extends CrudController { @Inject() service: PluginService; + @Inject() + pluginConfigService: PluginConfigService; + getService() { checkComm(); return this.service; @@ -65,4 +69,15 @@ export class PluginController extends CrudController { await this.service.setDisabled(body); return this.ok(); } + @Post('/getCommPluginConfigs', { summary: 'sys:settings:edit' }) + async getCommPluginConfigs() { + const res = await this.pluginConfigService.getCommPluginConfig(); + return this.ok(res); + } + + @Post('/saveCommPluginConfigs', { summary: 'sys:settings:edit' }) + async saveCommPluginConfigs(@Body(ALL) body: CommPluginConfig) { + const res = await this.pluginConfigService.saveCommPluginConfig(body); + return this.ok(res); + } } diff --git a/packages/ui/certd-server/src/modules/pipeline/service/pipeline-service.ts b/packages/ui/certd-server/src/modules/pipeline/service/pipeline-service.ts index f4f5dbbf..9f81a31d 100644 --- a/packages/ui/certd-server/src/modules/pipeline/service/pipeline-service.ts +++ b/packages/ui/certd-server/src/modules/pipeline/service/pipeline-service.ts @@ -1,10 +1,10 @@ import { Config, Inject, Provide, Scope, ScopeEnum, sleep } from '@midwayjs/core'; import { InjectEntityModel } from '@midwayjs/typeorm'; import { In, Repository } from 'typeorm'; -import { BaseService, PageReq } from '@certd/lib-server'; +import { BaseService, NeedVIPException, PageReq } from '@certd/lib-server'; import { PipelineEntity } from '../entity/pipeline.js'; import { PipelineDetail } from '../entity/vo/pipeline-detail.js'; -import { Executor, isPlus, Pipeline, ResultType, RunHistory, UserInfo } from '@certd/pipeline'; +import { Executor, isPlus, logger, Pipeline, ResultType, RunHistory, UserInfo } from '@certd/pipeline'; import { AccessService } from './access-service.js'; import { DbStorage } from './db-storage.js'; import { StorageService } from './storage-service.js'; @@ -13,14 +13,12 @@ import { HistoryService } from './history-service.js'; import { HistoryEntity } from '../entity/history.js'; import { HistoryLogEntity } from '../entity/history-log.js'; import { HistoryLogService } from './history-log-service.js'; -import { logger } from '@certd/pipeline'; import { EmailService } from '../../basic/service/email-service.js'; -import { NeedVIPException } from '@certd/lib-server'; import { UserService } from '../../sys/authority/service/user-service.js'; import { AccessGetter } from './access-getter.js'; import { CnameRecordService } from '../../cname/service/cname-record-service.js'; import { CnameProxyService } from './cname-proxy-service.js'; -import { PluginConfigService } from './plugin-config-service.js'; +import { PluginConfigGetter } from '../../plugin/service/plugin-config-getter.js'; const runningTasks: Map = new Map(); const freeCount = 10; @@ -47,7 +45,7 @@ export class PipelineService extends BaseService { historyLogService: HistoryLogService; @Inject() - pluginConfigService: PluginConfigService; + pluginConfigGetter: PluginConfigGetter; @Inject() userService: UserService; @@ -360,7 +358,7 @@ export class PipelineService extends BaseService { onChanged, accessService: accessGetter, cnameProxyService, - pluginConfigService: this.pluginConfigService, + pluginConfigService: this.pluginConfigGetter, storage: new DbStorage(userId, this.storageService), emailService: this.emailService, fileRootDir: this.certdConfig.fileRootDir, diff --git a/packages/ui/certd-server/src/modules/pipeline/service/plugin-config-service.ts b/packages/ui/certd-server/src/modules/pipeline/service/plugin-config-service.ts deleted file mode 100644 index 32f46fbb..00000000 --- a/packages/ui/certd-server/src/modules/pipeline/service/plugin-config-service.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Provide, Scope, ScopeEnum } from '@midwayjs/core'; -import { IPluginConfigService } from '@certd/pipeline'; - -/** - * 授权 - */ -@Provide() -@Scope(ScopeEnum.Singleton) -export class PluginConfigService implements IPluginConfigService { - getPluginConfig(pluginName: string) { - return Promise.resolve({}); - } -} diff --git a/packages/ui/certd-server/src/modules/plugin/entity/plugin.ts b/packages/ui/certd-server/src/modules/plugin/entity/plugin.ts index 41ce9879..6fea1f6e 100644 --- a/packages/ui/certd-server/src/modules/plugin/entity/plugin.ts +++ b/packages/ui/certd-server/src/modules/plugin/entity/plugin.ts @@ -23,7 +23,7 @@ export class PluginEntity { @Column({ comment: '配置', length: 40960 }) setting: string; - @Column({ comment: '系统配置', length: 40960 }) + @Column({ name: 'sys_setting', comment: '系统配置', length: 40960 }) sysSetting: string; @Column({ comment: '脚本', length: 40960 }) diff --git a/packages/ui/certd-server/src/modules/plugin/service/plugin-config-getter.ts b/packages/ui/certd-server/src/modules/plugin/service/plugin-config-getter.ts new file mode 100644 index 00000000..6c5be060 --- /dev/null +++ b/packages/ui/certd-server/src/modules/plugin/service/plugin-config-getter.ts @@ -0,0 +1,22 @@ +import { Inject, Provide, Scope, ScopeEnum } from '@midwayjs/core'; +import { IPluginConfigService, PluginConfig } from '@certd/pipeline'; +import { PluginConfigService } from './plugin-config-service.js'; + +@Provide() +@Scope(ScopeEnum.Singleton) +export class PluginConfigGetter implements IPluginConfigService { + @Inject() + pluginConfigService: PluginConfigService; + + async getPluginConfig(pluginName: string): Promise { + const res = await this.pluginConfigService.getPluginConfig({ + name: pluginName, + type: 'builtIn', + }); + return { + name: res.name, + disabled: res.disabled, + sysSetting: res.sysSetting, + }; + } +} diff --git a/packages/ui/certd-server/src/modules/plugin/service/plugin-config-service.ts b/packages/ui/certd-server/src/modules/plugin/service/plugin-config-service.ts new file mode 100644 index 00000000..a8b9d126 --- /dev/null +++ b/packages/ui/certd-server/src/modules/plugin/service/plugin-config-service.ts @@ -0,0 +1,79 @@ +import { Inject, Provide, Scope, ScopeEnum } from '@midwayjs/core'; +import { PluginService } from './plugin-service.js'; + +export type PluginConfig = { + name: string; + disabled: boolean; + sysSetting: { + input?: Record; + }; +}; + +export type CommPluginConfig = { + CertApply?: PluginConfig; +}; + +export type PluginFindReq = { + id?: number; + name?: string; + type: string; +}; +@Provide() +@Scope(ScopeEnum.Singleton) +export class PluginConfigService { + @Inject() + pluginService: PluginService; + + async getCommPluginConfig() { + const configs: CommPluginConfig = {}; + + configs.CertApply = await this.getPluginConfig({ + name: 'CertApply', + type: 'builtIn', + }); + return configs; + } + + async saveCommPluginConfig(body: CommPluginConfig) { + const certApplyConfig = body.CertApply; + const CertApply = await this.pluginService.getRepository().findOne({ + where: { name: 'CertApply' }, + }); + if (!CertApply) { + await this.pluginService.add({ + name: 'CertApply', + sysSetting: JSON.stringify(certApplyConfig), + type: 'builtIn', + disabled: false, + }); + } else { + await this.pluginService.getRepository().update({ name: 'CertApply' }, { sysSetting: JSON.stringify(certApplyConfig) }); + } + } + + async get(req: PluginFindReq) { + if (!req.name && !req.id) { + throw new Error('plugin s name or id is required'); + } + return await this.pluginService.getRepository().findOne({ + where: { + id: req.id, + name: req.name, + type: req.type, + }, + }); + } + + async getPluginConfig(req: PluginFindReq) { + const plugin = await this.get(req); + let sysSetting: any = {}; + if (plugin && plugin.sysSetting) { + sysSetting = JSON.parse(plugin.sysSetting); + } + return { + name: plugin.name, + disabled: plugin.disabled, + sysSetting, + }; + } +}