-
Notifications
You must be signed in to change notification settings - Fork 2
Plugin System

Das Backend bietet einen Endpunkt, über den sich Plugins registrieren können. Damit ein Plugin erfolgreich registriert werden kann, muss es sich zunächst mit einer Client ID und einem Client Secret am System authentifizieren. Nach erfolgreicher Registrierung erhält das Plugin folgende Authentifizierungs-Token:
-
Access Token: Wird für den Zugriff auf geschützte Ressourcen verwendet und hat eine begrenzte Lebensdauer.
- Refresh Token: Ermöglicht die Erneuerung eines abgelaufenen Access Tokens, ohne dass eine erneute Authentifizierung notwendig ist.
Provider und Additional Information erläutern... Provider => eindeutiger Key zum Plugin (z.B. slug) Additional Info => beliebige json informationen können hier gespeichert werden
Plugins können sich zur Laufzeit dynamisch am System registrieren. Um sicherzustellen, dass ein Plugin weiterhin aktiv ist, wird ein Heartbeat-Mechanismus verwendet.
- Heartbeat-Funktionalität: Ein registriertes Plugin sendet in regelmäßigen Abständen (z. B. jede Minute) ein Heartbeat-Signal an das Backend.
- Deregistrierung: Bleibt der Heartbeat eines Plugins aus (z. B. über ein definiertes Intervall hinaus), wird das Plugin als inaktiv markiert, automatisch deregistriert und aus der Plugin-Liste entfernt.
| Parameter | Beschreibung |
|---|---|
| Slug | Der Teil der URL, unter dem das Plugin erreichbar ist (z. B. /api/v1/plugin/[slug]). |
| Name | Der Name des Plugins, der zur Identifikation dient. |
| Version | Die Version des Plugins, um Kompatibilität sicherzustellen. |
| Description | Eine kurze Beschreibung des Plugins und seiner Funktionalität. |
| PluginHostPath | Die Host-Adresse des Plugins, z. B. https://plugin.xyz.com. |
Das Backend nutzt einen internen Reverse Proxy, um Anfragen, die an Plugins gerichtet sind, transparent weiterzuleiten. Der Prozess funktioniert wie folgt:
- Ein Plugin hostet seine Funktionalität beispielsweise unter
https://plugin.xyz.com. - Das Backend ist erreichbar unter
https://app.green-ecolution.de. - Kommt eine Anfrage an die URL
https://app.green-ecolution.de/api/v1/plugin/[slug](wobei[slug]der spezifische Slug des Plugins ist), wird diese Anfrage automatisch über den Reverse Proxy an die Adresse des Plugins (z. B.https://plugin.xyz.com) weitergeleitet.
Beispiel
Ein Plugin mit dem Slug csv_import hostet seine Funktionalität unter https://csv.example.com. Wenn ein Nutzer eine Anfrage an folgende URL stellt:
https://app.green-ecolution.de/api/v1/plugin/csv_import
... leitet das Backend die Anfrage intern an:
https://csv.example.com
Green Ecolution stellt ein Go-Package bereit, das die wichtigsten Standardfunktionen für die Plugin-Integration implementiert. Dazu gehören unter anderem:
- Registrierung: Automatische Anmeldung des Plugins am Backend.
- Heartbeat-Mechanismus: Regelmäßiges Senden von Heartbeats, um die Aktivität des Plugins sicherzustellen.
-
Authentifizierung und Token Refresh: Plugin kann sich am Backend Registrieren. Zudem steht eine
RefreshTokenfunktion bereits, welche einen neuen Token für das Plugin generiert.
Das Package kann einfach in ein Go-Projekt integriert werden. Installation:
go get github.com/green-ecolution/green-ecolution-backend/pkg/pluginNote
Das Go-Package ist aktuell noch nicht final veröffentlicht. Während der Entwicklungsphase muss es wie folgt importiert werden, um direkt auf die entsprechende Develop-Branch-Version zuzugreifen:
GOPROXY=direct go get github.com/green-ecolution/green-ecolution-backend/pkg/plugin@develop
Eine vollständige Dokumentation des Packages, inklusive Code-Beispielen und API-Beschreibungen, finden Sie unter folgendem Link: GoDoc: Green Ecolution Plugin Package
-
"@green-ecolution/plugin-interface": "^0.0.1"-> dependecies -
"@module-federation/vite": "^1.1.9",-> devDependencies - react version muss mit frontend identisch sein (aktuell
"react": "^18.3.1"und"react-dom": "^18.3.1")
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import { federation } from "@module-federation/vite";
// https://vite.dev/config/
export default defineConfig({
plugins: [
react(),
federation({
name: "csv-import", // hier slug als name verwenden
filename: "plugin.js", // hier immer plugin.js
exposes: {
"./app": "./src/App.tsx", // hier ./app
},
shared: ["react", "react-dom", "@green-ecolution/plugin-interface"],
}),
],
base: "",
build: {
target: "esnext",
},
});