plugin factory and powerup plugin sketch
This commit is contained in:
@@ -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} не найден.`);
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -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
@@ -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,3 +1,4 @@
|
||||
link-workspace-packages: true
|
||||
packages:
|
||||
- 'components/*'
|
||||
- 'components/coopback/src/plugins/*'
|
||||
Reference in New Issue
Block a user