Skip to content
This repository was archived by the owner on Oct 24, 2025. It is now read-only.

Plugin System

Cedrik Hoffmann edited this page Feb 12, 2025 · 20 revisions

image

Architektur

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

Laufzeitregistrierung und Heartbeat-Mechanismus

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.

Plugin Parameter

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.

Reverse-Proxy-Integration

Das Backend nutzt einen internen Reverse Proxy, um Anfragen, die an Plugins gerichtet sind, transparent weiterzuleiten. Der Prozess funktioniert wie folgt:

  1. Ein Plugin hostet seine Funktionalität beispielsweise unter https://plugin.xyz.com.
  2. Das Backend ist erreichbar unter https://app.green-ecolution.de.
  3. 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

Plugin erstellen

Server

Go package

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 RefreshToken funktion 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/plugin

Note

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

Frontend Plugin (react)

  • "@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",
  },
});

Clone this wiki locally