From 9748d89079350921255f5e1b932dad33e08bf495 Mon Sep 17 00:00:00 2001 From: kingecg Date: Mon, 9 Jun 2025 23:19:43 +0800 Subject: [PATCH] add plugin related --- backend/package-lock.json | 1 + backend/package.json | 3 +- backend/src/plugins/plugin.controller.ts | 16 ++++++++++ backend/src/plugins/plugin.repository.ts | 7 +++++ backend/src/plugins/plugin.service.ts | 37 ++++++++++++++++++++++++ 5 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 backend/src/plugins/plugin.controller.ts create mode 100644 backend/src/plugins/plugin.repository.ts create mode 100644 backend/src/plugins/plugin.service.ts diff --git a/backend/package-lock.json b/backend/package-lock.json index 5fdb22b..190cb31 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -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", diff --git a/backend/package.json b/backend/package.json index 3d0ad6b..0ae9208 100644 --- a/backend/package.json +++ b/backend/package.json @@ -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", diff --git a/backend/src/plugins/plugin.controller.ts b/backend/src/plugins/plugin.controller.ts new file mode 100644 index 0000000..4db614a --- /dev/null +++ b/backend/src/plugins/plugin.controller.ts @@ -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 + ) { + return this.pluginService.executePlugin(pluginId, executionArgs); + } +} \ No newline at end of file diff --git a/backend/src/plugins/plugin.repository.ts b/backend/src/plugins/plugin.repository.ts new file mode 100644 index 0000000..6ca5986 --- /dev/null +++ b/backend/src/plugins/plugin.repository.ts @@ -0,0 +1,7 @@ +import { EntityRepository, Repository } from 'typeorm'; +import { PluginConfig } from './plugin-config.entity'; + +@EntityRepository(PluginConfig) +export class PluginRepository extends Repository { + // 可以在这里添加自定义查询方法 +} \ No newline at end of file diff --git a/backend/src/plugins/plugin.service.ts b/backend/src/plugins/plugin.service.ts new file mode 100644 index 0000000..fa349d5 --- /dev/null +++ b/backend/src/plugins/plugin.service.ts @@ -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): Promise { + // 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}`); + } + } +} \ No newline at end of file