plugin factory and powerup plugin sketch

This commit is contained in:
Alex Ant
2024-10-17 16:18:39 +05:00
parent 1206bd0e98
commit c1c07bff8f
8 changed files with 97 additions and 1 deletions
@@ -0,0 +1,36 @@
import { PluginConfig } from '../models/plugin.model';
import { IPlugin } from '../types/plugin.types';
import { Powerup } from '../plugins/powerup';
import type { Application } from 'express';
const defaultPlugins = [{ name: 'Powerup', enabled: true, config: { optionA: true } }];
export const initializeDefaultPlugins = async () => {
for (const plugin of defaultPlugins) {
const existingPlugin = await PluginConfig.findOne({ name: plugin.name });
if (!existingPlugin) {
await PluginConfig.create(plugin);
console.log(`Дефолтный плагин ${plugin.name} добавлен в базу.`);
}
}
};
// Доступные плагины
const availablePlugins: { [key: string]: IPlugin } = {
Powerup: new Powerup(),
};
export const pluginFactory = async (app: Application) => {
// Загрузка всех активных плагинов из базы данных
const plugins = await PluginConfig.find({ enabled: true });
for (const pluginData of plugins) {
const plugin = availablePlugins[pluginData.name];
if (plugin) {
await plugin.initialize(app, pluginData.config);
console.log(`Плагин ${plugin.name} инициализирован.`);
} else {
console.log(`Плагин ${pluginData.name} не найден.`);
}
}
};
+7
View File
@@ -6,6 +6,7 @@ import config from './config/config';
import logger from './config/logger';
import { connectGenerator } from './services/document.service';
import { initSocketConnection } from './controllers/ws.controller';
import { initializeDefaultPlugins, pluginFactory } from './factories/pluginFactory';
const SERVER_URL: string = process.env.SOCKET_SERVER || 'http://localhost:2222';
@@ -20,6 +21,12 @@ mongoose.connect(config.mongoose.url).then(async () => {
// подключаемся к ws-серверу
await initSocketConnection(SERVER_URL);
// Инициализация дефолтных плагинов
await initializeDefaultPlugins();
// Запуск плагинов
await pluginFactory(app);
server = app.listen(config.port, () => {
logger.info(`Listening to port ${config.port}`);
});
@@ -0,0 +1,11 @@
import { Schema, model } from 'mongoose';
import type { IPluginSchema } from '../types/plugin.types';
const pluginSchema = new Schema({
name: { type: String, required: true },
enabled: { type: Boolean, default: true },
config: { type: Schema.Types.Mixed }, // Своя конфигурация для каждого плагина
});
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export const PluginConfig = model<IPluginSchema<any>>('Plugins', pluginSchema);
@@ -0,0 +1,15 @@
import { Application } from 'express';
import { IPlugin } from '../../types/plugin.types';
export class Powerup implements IPlugin {
name = 'Powerup';
async initialize(app: Application, config: any) {
console.log(`Инициализация ${this.name} с конфигурацией`, config);
// Добавление маршрута для плагина
app.get('/pluginA', (req, res) => {
res.send('Маршрут плагина A');
});
}
}
@@ -0,0 +1,12 @@
{
"name": "powerup",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
@@ -0,0 +1,13 @@
import type { Application } from 'express';
export interface IPlugin {
name: string;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
initialize(app: Application, config: any): Promise<void>;
}
export interface IPluginSchema<T> {
name: string;
enabled: boolean;
config: T;
}
+2 -1
View File
@@ -2,7 +2,8 @@
"$schema": "node_modules/lerna/schemas/lerna-schema.json",
"version": "2.1.0",
"packages": [
"components/*"
"components/*",
"components/coopback/src/plugins/*"
],
"npmClient": "pnpm",
"command": {
+1
View File
@@ -1,3 +1,4 @@
link-workspace-packages: true
packages:
- 'components/*'
- 'components/coopback/src/plugins/*'