From 20cdba55f610167cac2ab81be39c9914428013f5 Mon Sep 17 00:00:00 2001 From: Jo Date: Fri, 28 Jun 2024 02:44:36 +0200 Subject: [PATCH] feat: advance the plugin system and create example plugin --- .gitignore | 3 ++- .idea/discord.xml | 2 +- .idea/vcs.xml | 1 - apps/backend/package.json | 1 + apps/backend/src/app.controller.ts | 12 --------- apps/backend/src/app.module.ts | 15 ++++++----- apps/backend/src/app.service.ts | 23 ---------------- .../src/common/plugins/plugin.interface.ts | 4 ++- .../src/common/plugins/plugin.loader.ts | 20 ++++++++++++++ .../src/common/plugins/plugin.module.ts | 25 ++++++++++++++++++ .../src/common/plugins/plugin.service.ts | 17 +++++++----- apps/backend/src/main.ts | 4 +-- apps/shared/package.json | 7 +++++ .../example-plugin}/apps/frontend/src/main.js | 0 .../example-plugin/example-plugin.plugin.ts | 8 ++++++ .../plugins/example-plugin}/package.json | 2 +- bun.lockb | Bin 192816 -> 195200 bytes .../blmedia-example/blmedia-example.plugin.ts | 1 - 18 files changed, 88 insertions(+), 57 deletions(-) delete mode 100644 apps/backend/src/app.controller.ts delete mode 100644 apps/backend/src/app.service.ts create mode 100644 apps/backend/src/common/plugins/plugin.loader.ts create mode 100644 apps/backend/src/common/plugins/plugin.module.ts create mode 100644 apps/shared/package.json rename {custom/plugins/blmedia-example => apps/shared/plugins/example-plugin}/apps/frontend/src/main.js (100%) create mode 100644 apps/shared/plugins/example-plugin/example-plugin.plugin.ts rename {custom/plugins/blmedia-example => apps/shared/plugins/example-plugin}/package.json (67%) delete mode 100644 custom/plugins/blmedia-example/blmedia-example.plugin.ts diff --git a/.gitignore b/.gitignore index 03642d8..a58b7b4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .devenv .devenv.flake.nix -.idea \ No newline at end of file +.idea +node_modules \ No newline at end of file diff --git a/.idea/discord.xml b/.idea/discord.xml index 30bab2a..d8e9561 100644 --- a/.idea/discord.xml +++ b/.idea/discord.xml @@ -1,7 +1,7 @@ - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml index afbe93f..35eb1dd 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -2,6 +2,5 @@ - \ No newline at end of file diff --git a/apps/backend/package.json b/apps/backend/package.json index da69ca7..ced3a46 100644 --- a/apps/backend/package.json +++ b/apps/backend/package.json @@ -16,6 +16,7 @@ "@nestjs/core": "^10.0.0", "@nestjs/platform-express": "^10.0.0", "@nestjs/typeorm": "^10.0.1", + "glob": "^10.4.2", "mongodb": "^6.7.0", "pg": "^8.11.3", "typeorm": "^0.3.17" diff --git a/apps/backend/src/app.controller.ts b/apps/backend/src/app.controller.ts deleted file mode 100644 index ae7af0a..0000000 --- a/apps/backend/src/app.controller.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Controller, Get } from '@nestjs/common'; -import { AppService } from './app.service'; - -@Controller() -export class AppController { - constructor(private readonly appService: AppService) {} - - @Get() - createUser() { - return this.appService.createUser(); - } -} diff --git a/apps/backend/src/app.module.ts b/apps/backend/src/app.module.ts index 7c9a4e6..2fab81f 100644 --- a/apps/backend/src/app.module.ts +++ b/apps/backend/src/app.module.ts @@ -1,8 +1,7 @@ -import { Module } from '@nestjs/common'; +import { Module, type Type } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { AppController } from './app.controller'; -import { AppService } from './app.service'; import { User } from './entities/user.entity'; +import { PluginModule } from "./common/plugins/plugin.module"; const userForFeature = TypeOrmModule.forFeature([User]); @@ -10,18 +9,20 @@ const userForFeature = TypeOrmModule.forFeature([User]); imports: [ TypeOrmModule.forRoot({ type: "mongodb", - host: "localhost", + host: "127.0.0.1", port: 27017, username: "homespace", password: "homespace", - database: "homespace", + database: "test", + authSource: "admin", synchronize: true, logging: false, entities: [User], }), userForFeature, + PluginModule.register() ], - controllers: [AppController], - providers: [AppService], + controllers: [], + providers: [], }) export class AppModule {} diff --git a/apps/backend/src/app.service.ts b/apps/backend/src/app.service.ts deleted file mode 100644 index 58a6ac5..0000000 --- a/apps/backend/src/app.service.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Injectable } from '@nestjs/common'; -import { InjectRepository } from '@nestjs/typeorm'; -import type { Repository } from 'typeorm'; -import { User } from './entities/user.entity'; - -@Injectable() -export class AppService { - constructor( - @InjectRepository(User) - private readonly userRepository: Repository, - ) {} - - async createUser() { - const user = this.userRepository.create({ - firstName: 'Johannes', - lastName: 'Reckers', - age: 18, - }); - - const entity = await this.userRepository.save(user); - return entity; - } -} diff --git a/apps/backend/src/common/plugins/plugin.interface.ts b/apps/backend/src/common/plugins/plugin.interface.ts index ffe1d28..3c8e041 100644 --- a/apps/backend/src/common/plugins/plugin.interface.ts +++ b/apps/backend/src/common/plugins/plugin.interface.ts @@ -1,3 +1,5 @@ +import {INestApplication} from "@nestjs/common"; + export interface Plugin { - register(): void + register(app: INestApplication): void } \ No newline at end of file diff --git a/apps/backend/src/common/plugins/plugin.loader.ts b/apps/backend/src/common/plugins/plugin.loader.ts new file mode 100644 index 0000000..f4ac565 --- /dev/null +++ b/apps/backend/src/common/plugins/plugin.loader.ts @@ -0,0 +1,20 @@ +import { glob } from 'glob'; +import { join } from 'path'; + +export async function loadPlugins(): Promise { + return new Promise(async (resolve, reject) => { + const files = await glob('homespace-shared/plugins/**/*.plugin.{ts,js}'); + + console.log(files) + + const plugins = []; + for (const file of files) { + const filePath = join(process.cwd(), file); + const pluginModule = await import(filePath); + const pluginClass = Object.values(pluginModule)[0]; + plugins.push(pluginClass); + } + + resolve(plugins); + }); +} diff --git a/apps/backend/src/common/plugins/plugin.module.ts b/apps/backend/src/common/plugins/plugin.module.ts new file mode 100644 index 0000000..97c7c09 --- /dev/null +++ b/apps/backend/src/common/plugins/plugin.module.ts @@ -0,0 +1,25 @@ +import { Module, DynamicModule, Global, type Type } from '@nestjs/common'; +import { PluginService } from './plugin.service'; +import { type Plugin } from './plugin.interface'; +import { loadPlugins } from './plugin.loader'; + +@Global() +@Module({}) +export class PluginModule { + static async register(): Promise { + const plugins = await loadPlugins(); + + return { + module: PluginModule, + providers: [ + PluginService, + ...plugins, + { + provide: 'PLUGIN_PROVIDERS', + useValue: plugins, + }, + ], + exports: [PluginService], + }; + } +} \ No newline at end of file diff --git a/apps/backend/src/common/plugins/plugin.service.ts b/apps/backend/src/common/plugins/plugin.service.ts index 77be46c..ea9c1df 100644 --- a/apps/backend/src/common/plugins/plugin.service.ts +++ b/apps/backend/src/common/plugins/plugin.service.ts @@ -1,15 +1,18 @@ -import { Injectable, OnModuleInit } from "@nestjs/common"; +import {Injectable, OnModuleInit, Inject, type Type, INestApplication} from '@nestjs/common'; import { type Plugin } from './plugin.interface'; @Injectable() -export class PluginService implements OnModuleInit { - private plugins: Plugin[] = []; +export class PluginService { + private plugins: Type[] = []; - public registerPlugin(plugin: Plugin) { - this.plugins.push(plugin); + constructor(@Inject('PLUGIN_PROVIDERS') private readonly pluginProviders: Type[]) { + this.plugins = pluginProviders; } - onModuleInit() { - this.plugins.forEach((plugin) => plugin.register()); + initializePlugins(app: INestApplication) { + this.plugins.forEach(plugin => { + const pluginInstance = new plugin(); + pluginInstance.register(app); + }); } } \ No newline at end of file diff --git a/apps/backend/src/main.ts b/apps/backend/src/main.ts index 3fb330f..8eb642d 100644 --- a/apps/backend/src/main.ts +++ b/apps/backend/src/main.ts @@ -1,12 +1,12 @@ import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; -import { PluginService } from './common/plugins/plugin.service'; +import { PluginService } from "./common/plugins/plugin.service"; async function bootstrap() { const app = await NestFactory.create(AppModule); const pluginService = app.get(PluginService); - pluginService.onModuleInit(); // Initialize plugins + pluginService.initializePlugins(app); await app.listen(4300); } diff --git a/apps/shared/package.json b/apps/shared/package.json new file mode 100644 index 0000000..5083a4e --- /dev/null +++ b/apps/shared/package.json @@ -0,0 +1,7 @@ +{ + "name": "homespace-shared", + "version": "0.0.1", + "workspaces": [ + "plugins/*" + ] +} \ No newline at end of file diff --git a/custom/plugins/blmedia-example/apps/frontend/src/main.js b/apps/shared/plugins/example-plugin/apps/frontend/src/main.js similarity index 100% rename from custom/plugins/blmedia-example/apps/frontend/src/main.js rename to apps/shared/plugins/example-plugin/apps/frontend/src/main.js diff --git a/apps/shared/plugins/example-plugin/example-plugin.plugin.ts b/apps/shared/plugins/example-plugin/example-plugin.plugin.ts new file mode 100644 index 0000000..dbcfac3 --- /dev/null +++ b/apps/shared/plugins/example-plugin/example-plugin.plugin.ts @@ -0,0 +1,8 @@ +// Todo: create example plugin +import { type Plugin } from "homespace-backend/src/common/plugins/plugin.interface"; + +export class ExamplePlugin implements Plugin { + register() { + console.log("plugin registered: ExamplePlugin"); + } +} \ No newline at end of file diff --git a/custom/plugins/blmedia-example/package.json b/apps/shared/plugins/example-plugin/package.json similarity index 67% rename from custom/plugins/blmedia-example/package.json rename to apps/shared/plugins/example-plugin/package.json index 7add712..6a6f3d9 100644 --- a/custom/plugins/blmedia-example/package.json +++ b/apps/shared/plugins/example-plugin/package.json @@ -1,5 +1,5 @@ { - "name": "blmedia-example", + "name": "example-plugin", "version": "0.0.1", "workspaces": [ "apps/*" diff --git a/bun.lockb b/bun.lockb index b2dbe57356cd1d3607806dc07acb1b0347a4f364..d941ab861535d88d69b65be47c126a70822c1827 100755 GIT binary patch delta 35932 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 b_YBQ2f3KqsEH*>-L@zem=c`fq#;X4h=FQ&K diff --git a/custom/plugins/blmedia-example/blmedia-example.plugin.ts b/custom/plugins/blmedia-example/blmedia-example.plugin.ts deleted file mode 100644 index fab40f0..0000000 --- a/custom/plugins/blmedia-example/blmedia-example.plugin.ts +++ /dev/null @@ -1 +0,0 @@ -// Todo: create example plugin \ No newline at end of file