Globales Lizenzmodell
Architektur-Festlegung aus Brainstorm 2026-04-28. Plattform-weit — nicht CMS-spezifisch.
License-Unit-Typen
Eine license_unit ist die kleinste lizenzierbare Einheit. Vier Typen:
| Typ | CMS-Relevanz | Beschreibung |
|---|---|---|
standard | ja | Free-/Cheap-Defaults der Plattform. Jeder Tenant hat sie automatisch. |
theme | ja, nur CMS | Bundle von Page-Editor-Variants quer ueber Section-Types + Demo-Pages. |
premium_section | ja, nur CMS | Standalone Page-Editor-Bundle: 1+ eigene Component (mit speziellem document_json) und/oder 1+ Variants. Beispiel SliderRevolution. |
module | optional | Backend-Modul: Datenmodell + Studio-Admin-UI + Business-Logik. Kann optional CMS-Section-Templates beitragen, muss aber nicht. |
Module mit vs. ohne CMS-Section-Templates
Module mit Section-Templates (Section-Types referenzieren das Modul via required_module_id):
- Blog-Modul →
collection.blog_listing,collection.blog_post_header,collection.related_posts - Event-Modul →
collection.event_listing,collection.event_detail - (zukunftig) Product-Modul →
collection.product_listing,collection.product_detail - (zukunftig) Case-Study-Modul → fuer B2B-Marketing
Module ohne CMS-Section-Templates (pure Backend-/Admin-Funktionalitaet):
- Flows-Modul (Workflow-Engine) — Sidebar-Gruppe, kein Public-Page-Rendering
- Forms-Modul — ggf. spaeter, FormBuilder existiert bereits
- (zukunftig) CRM-Modul, Newsletter-Modul, …
Zentrale Plattform-Features (Auth, RBAC, Tenants, Brand-Tokens, Media-Library, Templates-Editor) sind kein Modul — sie sind Bestandteil der Standard-Plattform und benoetigen keine separate Lizenz.
Datenmodell
license_unit (
license_unit_id INT PK,
license_unit_key TEXT UNIQUE, -- 'theme.atlas', 'module.blog', 'module.flows'
license_unit_label TEXT,
unit_type TEXT CHECK (unit_type IN ('standard','theme','premium_section','module')),
module_namespace TEXT NULL, -- nur fuer module: technical namespace ('blog', 'event', 'flows')
has_cms_sections BOOLEAN NOT NULL DEFAULT FALSE, -- module-only: bringt das Modul Section-Templates mit?
parent_theme_id INT NULL REFERENCES license_unit(license_unit_id), -- nur fuer premium_section: gehoert das Bundle zu einem Theme?
pricing_model TEXT CHECK (pricing_model IN ('free','one_time','subscription')),
price_amount NUMERIC NULL,
price_currency TEXT DEFAULT 'EUR',
designer_id INT NULL REFERENCES designer(designer_id),
isactive BOOLEAN DEFAULT TRUE,
createdat, updatedat
)
tenant_license (
tenant_id, license_unit_id,
status TEXT CHECK (status IN ('active','expired','trial','cancelled')),
licensed_at, licensed_until,
PRIMARY KEY (tenant_id, license_unit_id)
)
-- Section-Types haben optional eine Modul-Lizenz-Anforderung:
section_type.required_module_id INT NULL REFERENCES license_unit(license_unit_id)
-- NULL = Standard-verfuegbar
-- gesetzt = nur fuer Tenants mit aktiver tenant_license auf das ModulLizenz-Permissions
Wenn ein Tenant ein License-Unit lizenziert hat, gilt:
- theme: alle Variants im Theme-Bundle stehen im Page-Editor zur Auswahl
- premium_section: die Components/Variants des Premium-Bundles stehen zur Auswahl
- module mit has_cms_sections=true: alle Section-Types mit
required_module_id = <license_unit_id>werden im Page-Editor verfuegbar; die Backend-Funktionalitaet (Datenmodell, Admin-Views) wird aktiv - module mit has_cms_sections=false: nur die Backend-Funktionalitaet wird aktiv (z.B. Flows ist im Sidebar verfuegbar)
Bestehende Module im Code
Stand 2026-04-28:
Flows(Workflow-Engine) — implementiert, has_cms_sections=falseEvents— implementiert, has_cms_sections=true (aber Section-Templates fehlen noch — Sprint-Aufgabe)Blog— geplant, Blog-ModulPages(Page-Editor) — Plattform-Kern, kein Modul
Marketplace-Implikation
Designer/Drittanbieter koennen liefern:
- Themes (CSS-only Variants-Bundles)
- Premium-Sections (eigene Components + Variants)
- Module (Backend + ggf. Section-Templates) — komplexer, hoehere Curation-Anforderungen
Theme- und Premium-Section-Designer brauchen kein Backend-Wissen. Module-Anbieter sehr wohl.
Zusammenhaenge
- Theme-Marketplace — Marketplace-Strategie
- Theme-Export-Import — Format fuer Theme-Bundles
- Blog-Modul — geplantes Modul
- Page-Cloning — Cloning ist plattform-Feature, kein Modul
- Vier-Schichten-Modell — Component/Variant-Trennung
- Globaler-Tenant-Kontext — tenant_license referenziert tenant_id