Skip to content

Erste Schritte: Modul entwickeln

Voraussetzungen

  • Node.js 20+
  • TypeScript 5.7+
  • Zugang zum prilog-sdk Repository

Neues Modul erstellen

bash
# Modul scaffolden (Typ A = UI-only, B = Backend, C = Integration)
npx @prilog/create-module mein-modul --type=B

cd mein-modul

Das generiert:

mein-modul/
├── prilog-module.json      ← Manifest (Identität, Berechtigungen, Billing)
├── package.json
├── tsconfig.json
├── src/
│   ├── index.ts            ← register() / unregister() / cleanup()
│   ├── types.ts
│   ├── routes/             ← API-Endpunkte (Typ B/C)
│   ├── services/           ← Business-Logik (Typ B/C)
│   └── events/             ← Event-Handler
├── prisma/                 ← DB-Migrationen (Typ B/C)
├── tests/
├── README.md
└── .gitignore

SDK installieren

bash
# Aus lokalen Tarballs (Entwicklung)
npm install /pfad/zu/prilog-sdk/dist/prilog-types-1.0.0.tgz
npm install /pfad/zu/prilog-sdk/dist/prilog-sdk-1.0.0.tgz

# Oder aus GitHub Packages (wenn published)
npm install @prilog/sdk

Manifest anpassen

Bearbeite prilog-module.json:

json
{
  "id": "prilog-mein-modul",
  "name": "Mein Modul",
  "version": "0.1.0",
  "type": "B",
  "prilogCoreVersion": ">=1.0.0",
  "description": "Kurze Beschreibung (max 200 Zeichen).",
  "author": { "name": "Dein Name", "email": "mail@example.com" },
  "license": "proprietary",
  "permissions": ["spaces:read", "events:subscribe"],
  "featureFlag": "mein-modul",
  "storeCategory": "organization"
}

Berechtigungen

Fordere nur Berechtigungen an die du wirklich brauchst. Jede Berechtigung wird dem Tenant-Admin bei der Installation angezeigt und muss genehmigt werden.

Modul implementieren

src/index.ts

typescript
import type { PrilogModuleContext } from '@prilog/sdk';
import { CORE_EVENTS } from '@prilog/sdk';

export async function register(ctx: PrilogModuleContext): Promise<void> {
  // Auf Core-Events reagieren
  ctx.events.on(CORE_EVENTS.SPACE_CREATED, async (event) => {
    if (event.tenantId !== ctx.tenantId) return;
    // Modul-Logik hier...
  });

  // Cache nutzen
  await ctx.cache.set('init', 'true', { ttl: 3600 });
}

export async function unregister(ctx: PrilogModuleContext): Promise<void> {
  // Aufräumen (Feature-Flags, Cache, etc.)
}

// Optional: Wird nach 30-Tage-Frist aufgerufen
export async function cleanup(tenantId: string): Promise<void> {
  // Alle Modul-Daten für diesen Tenant löschen
}

Billing (optional)

Füge eine billing-Sektion zum Manifest hinzu:

json
{
  "billing": {
    "model": "subscription",
    "monthlyPrice": 4.90,
    "currency": "EUR",
    "trialDays": 30
  }
}

Im Code: ctx.billing.reportActive() einmal pro Monat aufrufen.

Für Pay-per-Use: ctx.billing.reportUsage({ type: "sms", quantity: 1 }) bei jedem Nutzungsereignis.

Validieren

bash
npx prilog-validate .

Prüft: Manifest, Dateistruktur, Pflichtdateien, register()/unregister() Exports.

Modul registrieren

Internes Modul (Prilog-Team)

  1. Code nach prilog-backend-api/src/modules/mein-modul/ legen
  2. In lifecycle-manager.tsinternalModules Map erweitern:
    typescript
    'prilog-mein-modul': () => import('../../modules/mein-modul/src/index.js'),
  3. Im Frontend: module-registry.ts → Lazy-Import + MODULES-Eintrag

Externes Modul (Store)

bash
# Modul einreichen
POST /api/platform/v1/store/developer/submit
{
  "manifest": { ... },
  "artifactPath": "s3://prilog-store/modules/mein-modul/0.1.0.tgz"
}

Nach Approval erscheint das Modul im Store-Katalog.