EntwicklerMitarbeiter-Handbuch

Architektur

Diese Seite erklärt die Komponenten des sellx Hub und wie sie zusammenspielen - Tauri-Shell, React-Frontend, .NET-Sidecar und die Anbindung an JTL-Wawi sowie sellx Central.

Entwickler-Handbuch · Architektur

Komponenten-Übersicht

textarchitektur-uebersicht.txt
┌─────────────────────────────────────────────────────────────────┐
│ sellx Hub (auf Kunden-Server)                                   │
│                                                                 │
│  ┌──────────────────────┐    ┌──────────────────────────────┐  │
│  │ Tauri Shell (Rust)   │    │ .NET 8 Sidecar (Kestrel)    │  │
│  │  - WebView2 Fenster  │    │  - Port 0 (OS wählt)        │  │
│  │  - Sidecar-Spawning  │◄──►│  - SQL Executor             │  │
│  │  - IPC-Bridge        │    │  - License Validator        │  │
│  │  - Auto-Updater      │    │  - Plugin Engine            │  │
│  └──────────┬───────────┘    │  - EF Core SQLite (lokal)   │  │
│             │                └──────────┬───────────────────┘  │
│             │                           │                      │
│  ┌──────────▼───────────┐               │                      │
│  │ React Frontend       │               │                      │
│  │  - shadcn/ui         │               │                      │
│  │  - Zustand State     │               │                      │
│  │  - TanStack Query    │               │                      │
│  │  - Recharts          │               │                      │
│  └──────────────────────┘               │                      │
│                                          │                      │
└──────────────────────────────────────────┼──────────────────────┘
                                           │
                  ┌────────────────────────┼──────────────┐
                  │                        │              │
                  ▼                        ▼              ▼
        ┌──────────────────┐    ┌──────────────────┐   ┌──────────────┐
        │ JTL-Wawi SQL     │    │ sellx Central    │   │ Lokale       │
        │ Server           │    │ (Cloud)          │   │ SQLite       │
        │ (extern)         │    │                  │   │              │
        │                  │    │ - Katalog        │   │ %APPDATA%   │
        │ - eazybusiness   │    │ - Lizenzen       │   │ sellx-hub   │
        │ - tArtikel,      │    │ - Heartbeat      │   │ data.db      │
        │   tKunde, ...    │    │ - Updates        │   │              │
        └──────────────────┘    └──────────────────┘   └──────────────┘

Drei Schichten

Schicht 1 — Tauri Shell (Rust)

Datei: sellx-hub/src-tauri/src/main.rs

Verantwortlichkeiten:

  • Erzeugt das native WebView2-Fenster
  • Startet und überwacht den .NET-Sidecar-Prozess (tokio::process::Command)
  • Stellt IPC-Bridge bereit (#[tauri::command]-Funktionen)
  • Verwaltet Auto-Updates

Wichtige Konstanten:

KonstanteWertBedeutung
sidecar-dir<exe-dir>/sellx-sidecar/Pfad zum Sidecar
sidecar-port-file%APPDATA%/sellx-hub/sidecar-port.txtSidecar schreibt hier seinen Port hinein
sidecar-startup-timeout15 Sekunden30 Versuche × 500 ms

Schicht 2 — React Frontend (WebView2)

Verzeichnis: sellx-hub/src/

Verantwortlichkeiten:

  • Rendert die gesamte Benutzeroberfläche
  • Kommuniziert über Tauri-IPC oder lokales HTTP mit dem Sidecar
  • Enthält keine Geschäftslogik — reine Darstellungsschicht

Stack:

BibliothekVersionZweck
React18UI-Framework
Vite6Build-Tool, Dev-Server
TypeScript5.6Typsicherheit
Tailwind CSS4Styling
shadcn/uiaktuellUI-Komponenten (kopiert, nicht installiert)
Zustand5Client-State (mit Persist)
TanStack Query5Server-State-Caching
TanStack Table8Sortier-/filterbare Tabellen
Recharts2Diagramme (für Dashboard-Plugins, geplant)
React Router7Navigation

Schicht 3 — .NET 8 Sidecar

Verzeichnis: sellx-sidecar/SellxSidecar/

Verantwortlichkeiten:

  • Lokaler HTTP-Server (Kestrel, zufälliger Port)
  • SQL-Executor gegen JTL-Wawi
  • Plugin-Engine (Loader, Encryptor, Executor)
  • Lizenz-Validator (JWT)
  • Hardware-Fingerprint-Berechnung
  • Lokaler Plugin-Store (verschlüsselte SQL-Files)
  • Heartbeat-Endpoint (gegen sellx Central)

Wichtige Services:

ServiceZweck
SqlExecutorServiceFührt SQL-Queries gegen JTL-DB aus
SqlSecurityValidatorValidiert SQL vor Ausführung
LicenseServiceJWT-Validierung, Token-Version-Check
CentralMockServiceMock für sellx Central (im MVP)
PluginLoader.sellxpkg entpacken, installieren
HubDbContextEF Core gegen lokale SQLite

Datenflüsse

Frontend → Sidecar

textdatenfluss-frontend-sidecar.txt
React invoke("execute_plugin", { pluginId, queryId, parameters })
       │
       ▼
Tauri-IPC: main.rs::execute_plugin()
       │
       ▼
HTTP POST http://localhost:{port}/api/plugins/{id}/execute
       │
       ▼
SqlExecutorService.ExecuteAsync()
       │
       ▼
Microsoft.Data.SqlClient → JTL-Wawi SQL Server
       │
       ▼ (rows)
Response → React → DataTable

Sidecar → sellx Central

textdatenfluss-sidecar-central.txt
Heartbeat-Trigger (alle 24h oder konfiguriert)
       │
       ▼
HTTPS POST https://central.sellx.de/api/hub/heartbeat
       │
       ▼
JWT refresh, Token-Version-Update, Update-Check

Plugin-Installation

textdatenfluss-plugin-install.txt
React: User wählt .sellxpkg-Datei
       │
       ▼
Tauri: install_plugin(filePath)
       │
       ▼
Sidecar: /api/plugins/install
       │
       ▼
1. ZIP entpacken
2. manifest.json parsen + validieren
3. SQL-Files mit AES-256-GCM verschlüsseln
4. In Plugin-Store ablegen (SQLite + Filesystem)

Hardware-Fingerprint

Siehe ADR-0001 (wird nachgepflegt) für die Policy-Entscheidung.

Der Fingerprint setzt sich zusammen aus:

KomponenteQuelle
MachineGUIDHKLM\SOFTWARE\Microsoft\Cryptography\MachineGuid
SQL Server Instance Nameaus Connection-String
Installationspfad-HashSHA-256 von <INSTALL_DIR>

Ergebnis: hexadezimaler String, der die Lizenz an diese spezifische Installation bindet.

Datenpersistenz

DatenSpeicherort
Hub-Config (DB-String, Lizenz-Token, Master-Key-Seed)%APPDATA%\sellx-hub\data.db (Tabelle hub_config)
Plugin-Metadaten%APPDATA%\sellx-hub\data.db (Tabelle plugins)
Verschlüsselte SQL-Queries%APPDATA%\sellx-hub\plugins\<id>\*.sql.enc
Open-Tabs-State%APPDATA%\sellx-hub\data.db (Tabelle open_tabs)
Lizenz-Token (Cache)%APPDATA%\sellx-hub\license.jwt
Logs%APPDATA%\sellx-hub\logs\<date>.log

Sicherheits-Layer

LayerSchutz
SQL-ValidatorSingle-Statement, keine EXEC/xp_/sp_/OPENROWSET, keine Kommentare
ParametrisierungAlle @{Key} → ADO.NET-Parameter, kein String-Concatenation
Hardware-FingerprintLizenz an Maschine gebunden
Token-VersionSofortige Revocation ohne JWT-Ablauf
Grace-Period30 Tage Offline-Toleranz nach Subscription-Ende
AES-256-GCMVerschlüsselung der Plugin-SQL-Queries