Files
boc/landvex-plugin-architecture.md
T
Bernt 05ed037fe8 pilot.landvex.com: HTTPS + Full Stack Verified
- DNS: pilot.landvex.com -> 16.170.83.169
- TLS: Let's Encrypt certificate (expires 2026-09-30)
- Nginx: reverse proxy with SSL termination
- API: https://pilot.landvex.com/api/v1/missions
- UI: https://pilot.landvex.com/
- Upload: POST /api/v1/missions/import (multipart/form-data)

Verified:
 https://pilot.landvex.com/health
 https://pilot.landvex.com/version
 https://pilot.landvex.com/api/v1/missions (list)
 https://pilot.landvex.com/api/v1/missions/:id (get)
 POST /api/v1/missions/import (video upload)
 UI loads with title 'LandveX Intelligence Lab'

Next: Pilot 001 — Break the system!
2026-07-02 17:34:19 +00:00

19 KiB

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)

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

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

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

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

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)

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)

# 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)

# 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

# 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:

# 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)

# 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

# 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

# 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

# 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