This commit is contained in:
xiaojunnuo
2025-04-06 00:20:05 +08:00
parent 04acd08ad2
commit 61e322678b
6 changed files with 131 additions and 28 deletions

View File

@@ -1,11 +1,14 @@
import { Inject, Provide, Scope, ScopeEnum } from '@midwayjs/core';
import { BaseService, PageReq } from '@certd/lib-server';
import { PluginEntity } from '../entity/plugin.js';
import { InjectEntityModel } from '@midwayjs/typeorm';
import { Repository } from 'typeorm';
import { isComm } from '@certd/plus-core';
import { BuiltInPluginService } from '../../pipeline/service/builtin-plugin-service.js';
import { merge } from 'lodash-es';
import { Inject, Provide, Scope, ScopeEnum } from "@midwayjs/core";
import { BaseService, PageReq } from "@certd/lib-server";
import { PluginEntity } from "../entity/plugin.js";
import { InjectEntityModel } from "@midwayjs/typeorm";
import { Repository } from "typeorm";
import { isComm } from "@certd/plus-core";
import { BuiltInPluginService } from "../../pipeline/service/builtin-plugin-service.js";
import { merge } from "lodash-es";
import { accessRegistry, pluginRegistry } from "@certd/pipeline";
import { dnsProviderRegistry } from "@certd/plugin-cert";
import { logger } from "@certd/basic";
@Provide()
@Scope(ScopeEnum.Request, { allowDowngrade: true })
@@ -28,7 +31,7 @@ export class PluginService extends BaseService<PluginEntity> {
records: builtInList,
total: builtInList.length,
offset: 0,
limit: 99999,
limit: 99999
};
}
@@ -46,9 +49,9 @@ export class PluginService extends BaseService<PluginEntity> {
}
const list = await this.list({
query: {
type: 'builtIn',
disabled: true,
},
type: "builtIn",
disabled: true
}
});
const disabledNames = list.map(it => it.name);
for (const key in groups) {
@@ -60,6 +63,7 @@ export class PluginService extends BaseService<PluginEntity> {
}
return groups;
}
async getEnabledBuiltInList(): Promise<any> {
const builtInList = this.builtInPluginService.getList();
if (!isComm()) {
@@ -68,9 +72,9 @@ export class PluginService extends BaseService<PluginEntity> {
const list = await this.list({
query: {
type: 'builtIn',
disabled: true,
},
type: "builtIn",
disabled: true
}
});
const disabledNames = list.map(it => it.name);
@@ -81,8 +85,8 @@ export class PluginService extends BaseService<PluginEntity> {
const builtInList = this.builtInPluginService.getList();
const list = await this.list({
query: {
type: 'builtIn',
},
type: "builtIn"
}
});
const records: PluginEntity[] = [];
@@ -96,10 +100,10 @@ export class PluginService extends BaseService<PluginEntity> {
merge(record, {
name: item.name,
title: item.title,
type: 'builtIn',
type: "builtIn",
icon: item.icon,
desc: item.desc,
group: item.group,
group: item.group
});
records.push(record);
}
@@ -109,7 +113,7 @@ export class PluginService extends BaseService<PluginEntity> {
async setDisabled(opts: { id?: number; name?: string; type: string; disabled: boolean }) {
const { id, name, type, disabled } = opts;
if (!type) {
throw new Error('参数错误: type 不能为空');
throw new Error("参数错误: type 不能为空");
}
if (id > 0) {
//update
@@ -117,7 +121,7 @@ export class PluginService extends BaseService<PluginEntity> {
return;
}
if (name && type === 'builtIn') {
if (name && type === "builtIn") {
const pluginEntity = new PluginEntity();
pluginEntity.name = name;
pluginEntity.type = type;
@@ -125,10 +129,71 @@ export class PluginService extends BaseService<PluginEntity> {
await this.repository.save(pluginEntity);
return;
}
throw new Error('参数错误: id 和 name 必须有一个');
throw new Error("参数错误: id 和 name 必须有一个");
}
async getDefineByType(type: string) {
return this.builtInPluginService.getByType(type);
}
async getPluginTarget(pluginName: string){
//获取插件类实例对象
let author = undefined;
let name = '';
if(pluginName.includes('/')){
const arr = pluginName.split('/');
author = arr[0];
name = arr[1];
}else {
name = pluginName;
}
const info = await this.find({
where: {
name: name,
author: author
}
});
if (info.length > 0) {
const plugin = info[0];
const AsyncFunction = Object.getPrototypeOf(async () => {}).constructor;
const getPluginClass = new AsyncFunction(plugin.content);
return await getPluginClass();
}
}
/**
* 从数据库加载插件
*/
async registerFromDb() {
const res = await this.list({
buildQuery: ((bq) => {
bq.andWhere( "type != :type", {
type: 'builtIn'
})
})
});
for (const item of res) {
const pluginName = item.author ? item.author +"/"+ item.name : item.name;
let registry = null
if(item.pluginType === 'access'){
registry = accessRegistry;
}else if (item.pluginType === 'plugin'){
registry = pluginRegistry;
}else if (item.pluginType === 'dnsProvider'){
registry = dnsProviderRegistry
}else {
logger.warn(`插件${pluginName}类型错误:${item.pluginType}`)
continue
}
registry.register(pluginName, {
define:item,
target: ()=>{
return this.getPluginTarget(pluginName);
}
});
}
}
}