add plugin related

This commit is contained in:
kingecg 2025-06-09 23:19:43 +08:00
parent 5103327563
commit 9748d89079
5 changed files with 63 additions and 1 deletions

View File

@ -26,6 +26,7 @@
},
"devDependencies": {
"@types/bcrypt": "^5.0.0",
"@types/node": "^22.15.30",
"@types/passport-jwt": "^4.0.1",
"rimraf": "^6.0.1",
"ts-node": "^10.9.2",

View File

@ -7,7 +7,7 @@
"build": "rimraf dist && tsc",
"start": "npm run build && node dist/main.js",
"dev": "ts-node -r tsconfig-paths/register src/main.ts",
"typeorma": "typeorm-ts-node-commonjs -d dist/data-source.js",
"typeorma": "typeorm-ts-node-commonjs -d dist/data-source.js",
"test": "echo \"Error: no test specified\" && exit 1",
"typeorm": "ts-node -r ts-node/register ./node_modules/typeorm/cli.js",
"migration:generate": "npm run typeorm migration:generate -d dist/data-source.js",
@ -34,6 +34,7 @@
},
"devDependencies": {
"@types/bcrypt": "^5.0.0",
"@types/node": "^22.15.30",
"@types/passport-jwt": "^4.0.1",
"rimraf": "^6.0.1",
"ts-node": "^10.9.2",

View File

@ -0,0 +1,16 @@
import { Controller, Post, Body, Param } from '@nestjs/common';
import { PluginService } from './plugin.service';
@Controller('plugins')
export class PluginController {
constructor(private readonly pluginService: PluginService) {}
@Post(':id/execute')
async execute(
@Param('id') pluginId: string,
@Body() executionArgs: Record<string, any>
) {
return this.pluginService.executePlugin(pluginId, executionArgs);
}
}

View File

@ -0,0 +1,7 @@
import { EntityRepository, Repository } from 'typeorm';
import { PluginConfig } from './plugin-config.entity';
@EntityRepository(PluginConfig)
export class PluginRepository extends Repository<PluginConfig> {
// 可以在这里添加自定义查询方法
}

View File

@ -0,0 +1,37 @@
import { Injectable, NotFoundException } from '@nestjs/common';
import { PluginConfig } from './plugin-config.entity';
import { PluginRepository } from './plugin.repository';
@Injectable()
export class PluginService {
constructor(private readonly pluginRepository: PluginRepository) {}
async executePlugin(pluginId: string, args: Record<string, any>): Promise<any> {
// 1. 获取插件配置
const pluginConfig = await this.pluginRepository.findOne({ where: { pluginId } });
if (!pluginConfig) {
throw new NotFoundException(`Plugin ${pluginId} not found`);
}
try {
// 2. 动态加载插件模块假设插件以npm包形式安装
const pluginModule = require.resolve(pluginId);
const plugin = require(pluginModule);
// 3. 验证插件接口假设插件必须实现execute方法
if (typeof plugin.execute !== 'function') {
throw new Error(`Plugin ${pluginId} missing required execute method`);
}
// 4. 执行插件并返回结果
return await plugin.execute({
...args,
config: pluginConfig.settings // 传递插件配置
});
} catch (error) {
throw new Error(`Failed to execute plugin ${pluginId}: ${error}`);
}
}
}