Files
boc/landvex-plugin-architecture.md
T

546 lines
19 KiB
Markdown
Raw Normal View History

# LandveX Enterprise Platform — Plugin-arkitektur
## Sammanfattning
En modulär, säker och kommunvänlig plugin-arkitektur som gör det enkelt för kommuner att integrera LandveX med befintliga system (ERP, GIS, ärendehantering) utan att kompromissa med säkerhet eller underhållbarhet.
---
## 1. Arkitekturskiss
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ LandveX Enterprise Platform │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ Core │ │ Auth │ │ Events │ │ Plugin Manager │ │
│ │ Engine │ │ Service │ │ Bus │ │ (Lifecycle, API) │ │
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ └──────────┬──────────┘ │
│ │ │ │ │ │
│ └────────────────┴────────────────┴────────────────────┘ │
│ │ │
│ ┌──────────┴──────────┐ │
│ │ Plugin Sandbox │ │
│ │ (Isolerad runtime) │ │
│ └──────────┬──────────┘ │
│ │ │
│ ┌─────────────────────────────────┼─────────────────────────────────────┐ │
│ │ Plugin API Layer │ │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────┴────┐ ┌─────────┐ ┌─────────────┐ │ │
│ │ │ Data │ │ Auth │ │ Events │ │ Config │ │ Logging │ │ │
│ │ │ API │ │ API │ │ API │ │ API │ │ API │ │ │
│ │ └────┬────┘ └────┬────┘ └────┬─────┘ └────┬────┘ └─────┬───────┘ │ │
│ └───────┼───────────┼───────────┼────────────┼────────────┼───────────┘ │
│ │ │ │ │ │ │
│ ┌───────┴───────────┴───────────┴────────────┴────────────┴───────────┐ │
│ │ Plugin Registry & Store │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
│ │ │ Visma │ │ Agresso │ │ ArcGIS ││ QGIS │ │ SUST │ │ │
│ │ │ Plugin │ │ Plugin │ │ Plugin ││ Plugin │ │ Plugin │ │ │
│ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘
```
### Komponenter
| Komponent | Beskrivning |
|-----------|-------------|
| **Core Engine** | LandveX kärnplattform, affärslogik och datahantering |
| **Auth Service** | Centraliserad autentisering och auktorisation (OAuth2/OIDC) |
| **Event Bus** | Asynkron händelsebuss för kommunikation mellan komponenter |
| **Plugin Manager** | Livscykelhantering: installera, starta, stoppa, uppdatera, avinstallera |
| **Plugin Sandbox** | Isolerad runtime (WebAssembly/containers) för plugin-exekvering |
| **Plugin API Layer** | Standardiserade API:er som alla plugins använder |
| **Plugin Registry** | Katalog över tillgängliga och installerade plugins |
---
## 2. Plugin-API-specifikation
### 2.1 Plugin-manifest (`plugin.yaml`)
```yaml
apiVersion: landvex.io/plugin/v1
kind: Plugin
metadata:
name: visma-erp-connector
version: 2.1.0
vendor: LandveX AB
category: erp
tags: [visma, ekonomi, fakturering]
spec:
# Beskrivning för kommunadministratörer
displayName: "Visma Ekonomi Integration"
description: "Integrerar LandveX med Visma Administration och Visma.net"
# Beroenden
requires:
landvex: ">= 4.2.0"
plugins: []
# API-version som plugin använder
apiVersion: "v1"
# Behörigheter som plugin begär
permissions:
- resource: data/economy
actions: [read, write]
- resource: events/economy.*
actions: [publish, subscribe]
- resource: config/plugin/visma-erp
actions: [read, write]
# Konfigurationsschema (JSON Schema)
configSchema:
type: object
properties:
apiEndpoint:
type: string
format: uri
description: "Visma API endpoint"
clientId:
type: string
description: "OAuth2 Client ID"
syncInterval:
type: integer
default: 3600
description: "Synkroniseringsintervall i sekunder"
required: [apiEndpoint, clientId]
# Hälsokontroll
healthCheck:
path: /health
interval: 30
# Resursgränser
resources:
memory: "256Mi"
cpu: "500m"
timeout: 30
```
### 2.2 Core API:er
#### Data API
```typescript
interface DataAPI {
// Läsa data med query
query<T>(collection: string, filter: QueryFilter): Promise<T[]>;
// Läsa enskild entitet
get<T>(collection: string, id: string): Promise<T | null>;
// Skriva data (kräver write-behörighet)
create<T>(collection: string, data: T): Promise<T>;
update<T>(collection: string, id: string, data: Partial<T>): Promise<T>;
delete(collection: string, id: string): Promise<void>;
// Transaktioner
transaction<T>(fn: (tx: Transaction) => Promise<T>): Promise<T>;
}
```
#### Auth API
```typescript
interface AuthAPI {
// Verifiera användartoken
verifyToken(token: string): Promise<UserContext>;
// Kontrollera behörighet
checkPermission(user: UserContext, resource: string, action: string): Promise<boolean>;
// Hämta användarens organisation
getOrganization(user: UserContext): Promise<Organization>;
// Plugin-egen identitet (service account)
getServiceAccount(): Promise<ServiceAccount>;
}
```
#### Events API
```typescript
interface EventsAPI {
// Publicera händelse
publish(event: Event): Promise<void>;
// Prenumerera på händelser
subscribe(pattern: string, handler: EventHandler): Subscription;
// Schemalägg återkommande jobb
schedule(cron: string, job: ScheduledJob): JobHandle;
}
interface Event {
type: string; // t.ex. "economy.invoice.created"
source: string; // plugin-id
timestamp: ISO8601;
payload: unknown;
correlationId?: string;
}
```
#### Config API
```typescript
interface ConfigAPI {
// Hämta plugin-konfiguration (krypterad vid behov)
get<T>(key: string): Promise<T>;
// Sätt konfiguration
set<T>(key: string, value: T): Promise<void>;
// Validera mot schema
validate(config: unknown): Promise<ValidationResult>;
}
```
### 2.3 Plugin SDK (TypeScript)
```typescript
import { Plugin, DataAPI, EventsAPI } from '@landvex/plugin-sdk';
export default class VismaPlugin implements Plugin {
private data: DataAPI;
private events: EventsAPI;
private config: ConfigAPI;
async initialize(context: PluginContext): Promise<void> {
this.data = context.data;
this.events = context.events;
this.config = context.config;
}
async start(): Promise<void> {
// Prenumerera på händelser
this.events.subscribe('economy.invoice.*', async (event) => {
await this.syncToVisma(event.payload);
});
// Schemalägg synkronisering
this.events.schedule('0 */6 * * *', async () => {
await this.fullSync();
});
}
async stop(): Promise<void> {
// Cleanup
}
async health(): Promise<HealthStatus> {
const vismaStatus = await this.checkVismaConnection();
return {
status: vismaStatus.ok ? 'healthy' : 'unhealthy',
details: vismaStatus
};
}
private async syncToVisma(invoice: Invoice): Promise<void> {
// Implementera synkronisering
}
}
```
---
## 3. Färdiga plugins — exempel
### 3.1 Visma Ekonomi Integration (ERP)
```yaml
# plugin.yaml
metadata:
name: visma-erp-connector
category: erp
spec:
displayName: "Visma Ekonomi"
description: "Synkroniserar fakturor, leverantörsreskontra och betalningar med Visma"
permissions:
- resource: data/invoices
actions: [read, write]
- resource: data/suppliers
actions: [read, write]
- resource: events/economy.*
actions: [publish, subscribe]
configSchema:
properties:
vismaProduct:
type: string
enum: ["visma-administration", "visma-net", "visma-business"]
apiEndpoint:
type: string
syncDirection:
type: string
enum: ["to-visma", "from-visma", "bidirectional"]
default: "bidirectional"
```
**Funktioner:**
- Automatisk fakturasynkronisering
- Leverantörsreskontra i realtid
- Stöd för Visma Administration, Visma.net och Visma Business
- Avstämning av betalningar
- Momsrapportering
### 3.2 ArcGIS/QGIS Integration (GIS)
```yaml
# plugin.yaml
metadata:
name: gis-connector
category: gis
spec:
displayName: "GIS Integration"
description: "Kopplar samman fastighetsdata med geografisk information"
permissions:
- resource: data/properties
actions: [read]
- resource: data/maps
actions: [read, write]
- resource: events/property.*
actions: [subscribe]
configSchema:
properties:
gisProvider:
type: string
enum: ["arcgis", "qgis-server", "geoserver"]
wmsEndpoint:
type: string
layerMappings:
type: array
items:
type: object
properties:
landvexType: string
gisLayer: string
```
**Funktioner:**
- Visualisering av fastigheter på karta
- Lagerhantering (byggnader, tomter, zonering)
- Import/export av GeoJSON/Shapefile
- Realtidsuppdatering vid fastighetsförändringar
- Mätk verktyg och areaberäkning
### 3.3 SUST Ärendehantering Integration
```yaml
# plugin.yaml
metadata:
name: sust-case-connector
category: case-management
spec:
displayName: "SUST Ärendehantering"
description: "Integrerar bygglov och förvaltningsärenden med SUST"
permissions:
- resource: data/cases
actions: [read, write]
- resource: data/case-types
actions: [read]
- resource: events/case.*
actions: [publish, subscribe]
configSchema:
properties:
sustEndpoint:
type: string
caseTypeMappings:
type: object
additionalProperties:
type: string
```
**Funktioner:**
- Skapa ärenden i SUST från LandveX
- Statussynkronisering i realtid
- Dokumentöverföring
- Automatiska påminnelser och eskalering
- Rapportering och statistik
---
## 4. Säkerhet och accesskontroll
### 4.1 Säkerhetsmodell
```
┌─────────────────────────────────────────┐
│ Säkerhetslager │
├─────────────────────────────────────────┤
│ 1. Nätverksisolering │
│ - Plugin sandbox i separat nätverk │
│ - Endast utgående trafik till │
│ godkända endpoints │
├─────────────────────────────────────────┤
│ 2. Runtime-isolering │
│ - WebAssembly eller containers │
│ - CPU/minnesgränser per plugin │
│ - Timeout på alla operationer │
├─────────────────────────────────────────┤
│ 3. API-behörigheter │
│ - Deklarativa permissions i manifest│
│ - RBAC (Role-Based Access Control) │
│ - Principen om minsta privilegium │
├─────────────────────────────────────────┤
│ 4. Datakryptering │
│ - Krypterad lagring av secrets │
│ - TLS för all extern kommunikation │
│ - Fältnivåkryptering vid behov │
├─────────────────────────────────────────┤
│ 5. Audit logging │
│ - Alla API-anrop loggas │
│ - Spårbarhet av dataändringar │
│ - SIEM-integration │
└─────────────────────────────────────────┘
```
### 4.2 Autentisering flöde
```
┌─────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────┐
│ Plugin │────▶│ Plugin │────▶│ Auth │────▶│ Core │
│ │ │ Manager │ │ Service │ │ API │
└─────────┘ └─────────────┘ └─────────────┘ └─────────┘
│ │ │ │
│ 1. Starta med │ │ │
│ service acc │ │ │
│───────────────▶│ │ │
│ │ 2. Hämta token │ │
│ │──────────────────▶│ │
│ │ │ 3. Verifiera │
│ │ │ mot IdP │
│ │ │─────────────────▶│
│ │ │◀─────────────────│
│ │◀──────────────────│ │
│◀───────────────│ │ │
│ 4. JWT token │ │ │
│ för API- │ │ │
│ anrop │ │ │
```
### 4.3 Signering och verifiering
Alla plugins måste vara signerade:
```bash
# Signera plugin
landvex plugin sign \
--plugin ./visma-erp-connector.lvpkg \
--key /secure/signing-key.pem \
--cert /secure/signing-cert.pem
# Verifiera vid installation
landvex plugin install \
--source ./visma-erp-connector.lvpkg \
--verify --trust-store /etc/landvex/trusted-certs
```
---
## 5. Drift och underhåll för kommuner
### 5.1 Installation (ett kommando)
```bash
# Via CLI
landvex plugin install visma-erp-connector --version 2.1.0
# Via webbgränssnitt
# Admin → Plugins → Marknadsplats → Installera
# Automatisk uppdatering
landvex plugin update --auto --channel stable
```
### 5.2 Konfiguration
```bash
# Interaktiv konfiguration
landvex plugin config visma-erp-connector --interactive
# Eller via fil
landvex plugin config visma-erp-connector --file ./visma-config.yaml
```
### 5.3 Övervakning
```bash
# Plugin-status
landvex plugin status
# Loggar
landvex plugin logs visma-erp-connector --follow
# Hälsokontroll
landvex plugin health visma-erp-connector
```
### 5.4 Backup/Återställning
```bash
# Exportera plugin-konfiguration
landvex plugin export visma-erp-connector --output ./backup/
# Importera
landvex plugin import ./backup/visma-erp-connector-backup.tar.gz
```
---
## 6. Plugin-paketstruktur
```
visma-erp-connector.lvpkg (zip/tar.gz)
├── plugin.yaml # Manifest
├── dist/
│ ├── index.js # Plugin-kod
│ ├── index.wasm # Om WebAssembly
│ └── assets/ # Statiska resurser
├── migrations/ # Databasmigrationer
│ ├── 001_initial.sql
│ └── 002_add_indexes.sql
├── tests/
│ └── integration.test.js
├── docs/
│ ├── README.md
│ └── CONFIGURATION.md
└── signatures/
└── manifest.sig # Kryptografisk signatur
```
---
## 7. Versionshantering och kompatibilitet
| LandveX-version | API-version | Kompatibilitet |
|----------------|-------------|----------------|
| 4.x | v1 | ✅ Stöds |
| 5.x | v2 | 🔄 Planerad |
Plugins deklarerar vilken LandveX-version de kräver. Plugin Manager verifierar kompatibilitet vid installation.
---
## 8. Sammanfattning av fördelar
| Aspekt | Lösning |
|--------|---------|
| **Enkelhet** | Ett kommando för installation, webbgränssnitt för konfiguration |
| **Standardisering** | Gemensamma API:er för alla integrationer |
| **Säkerhet** | Sandbox, RBAC, signering, audit logging |
| **Skalbarhet** | Isolerade plugins med resursgränser |
| **Underhåll** | Automatiska uppdateringar, health checks |
| **Extensibilitet** | Öppet SDK för tredjepartsutvecklare |
---
*Dokumentversion: 1.0*
*Senast uppdaterad: 2026-07-02*