Knowledge Base API
Die Knowledge Base API verwaltet Wissensdatenbank-Artikel mit Rich-Text-Content, Kategorien, Zugriffskontrolle über Sichtbarkeit und Status, View-Tracking, Tags und Anhängen. Verknüpfungen zu Tickets/Problems/Incidents/Changes laufen zentral über die Linking-API. Basis-Pfad: /api/knowledge-base.
🔐 Auth: Nur für angemeldete Benutzer; API-Keys werden abgelehnt. Rechte über knowledgeBase.*, Kategorien über settings.manageCategories. status und visibility werden in Ein- und Ausgabe in Großbuchstaben geschrieben (PUBLIC/INTERNAL/RESTRICTED, DRAFT/PUBLISHED/ARCHIVED); Kleinschreibung wird mit 400 abgelehnt. Siehe RBAC →.
Endpunkte — Artikel
| Method | Endpoint | Beschreibung | Permission |
|---|---|---|---|
GET | /api/knowledge-base/articles | Paginierte Liste, nur sichtbare Artikel; ?deleted=1 = Papierkorb | view* (Papierkorb: viewDeleted) |
GET | /api/knowledge-base/articles/stats | Counts: published/draft/archived/total | view* |
GET | /api/knowledge-base/tags | Tags mit Artikel-Count ({data}, auf sichtbare Artikel gescoped) | ≥1 KB-View-Key |
GET | /api/knowledge-base/articles/:id | Einzelartikel (erhöht viewCount) | view* |
POST | /api/knowledge-base/articles | Erstellen (201, schreibt Revision v1) | create (+publish/archive) |
PUT | /api/knowledge-base/articles/:id | Aktualisieren (version-Pflicht → 409 KB_VERSION_CONFLICT; schreibt Revision) | editOwn/editAll (+Transition) |
DELETE | /api/knowledge-base/articles/:id | Soft-Delete → Papierkorb (Links/Tags/Anhänge bleiben) → 204 | delete |
POST | /api/knowledge-base/articles/:id/restore | Aus dem Papierkorb wiederherstellen (kritisch) | restore |
GET / POST / DELETE | /api/knowledge-base/articles/:id/grants (+/:subjectType/:subjectId) | RESTRICTED-Freigaben verwalten (Audit GRANT_ADDED/REMOVED) | Bearbeitungsrecht am Artikel |
GET | /api/knowledge-base/articles/:id/revisions (+/:version, +/:version/restore) | Revisions-History + Snapshot + Restore | Bearbeitungsrecht am Artikel |
* view = der Artikel ist nicht gelöscht und der Aufrufer ist entweder der Autor oder hat sowohl das Visibility- als auch das Status-Recht. Visibility: viewPublic/viewInternal/viewRestricted bzw. bei RESTRICTED eine Freigabe; Status: viewDraft/viewPublished/viewArchived. Eine Rolle mit viewPublished, aber ohne viewInternal sieht INTERNAL-Artikel auch per Direkt-ID nicht. Liste und Einzelabruf wenden dieselbe Regel an.
Endpunkte — Kategorien
| Method | Endpoint | Beschreibung | Permission |
|---|---|---|---|
GET | /api/knowledge-base/categories | Alle Kategorien ({data}, +articleCount); Query includeInactive | KB-view ODER settings.manageCategories |
POST | /api/knowledge-base/categories | Kategorie erstellen (201) | settings.manageCategories |
PUT | /api/knowledge-base/categories/:id | Aktualisieren | settings.manageCategories |
DELETE | /api/knowledge-base/categories/:id | Löschen → 204 (400 wenn Artikel vorhanden) | settings.manageCategories |
KBCategory: name (eindeutig, 1–50), description? (max 200), color (#RRGGBB, Default #3b82f6), isActive, articleCount. DELETE einer Kategorie mit Artikeln → 400 CATEGORY_HAS_ARTICLES.
Zugriffsmodell (Sichtbarkeit und Status)
| Visibility | Sichtbar mit |
|---|---|
PUBLIC | knowledgeBase.viewPublic |
INTERNAL | knowledgeBase.viewInternal |
RESTRICTED | knowledgeBase.viewRestricted oder eine Freigabe: USER = eigene ID · GROUP = eine der eigenen aktiven Gruppen · ROLE = eigene Rolle |
| Status | Sichtbar mit |
|---|---|
DRAFT | knowledgeBase.viewDraft |
PUBLISHED | knowledgeBase.viewPublished |
ARCHIVED | knowledgeBase.viewArchived |
Ein Artikel ist nur sichtbar, wenn der Aufrufer sowohl das Visibility- als auch das Status-Recht besitzt (bzw. bei RESTRICTED eine Freigabe hat). Ausnahme: Der Autor sieht eigene Artikel immer, unabhängig von beiden Rechten. Eine Freigabe ersetzt nur das Visibility-Recht — einen Entwurf sieht weiterhin nur, wer viewDraft hat.
Status-Transitionen
| Übergang | Permission |
|---|---|
| → published (aus ≠ published) | knowledgeBase.publish |
| published → draft | knowledgeBase.unpublish |
| → archived (aus ≠ archived) | knowledgeBase.archive |
Diese Rechte gelten zusätzlich zum Bearbeitungsrecht (editAll, oder editOwn für eigene Artikel) und werden auch beim Anlegen geprüft, sobald der Status vom Standard DRAFT abweicht — „direkt als veröffentlicht anlegen" erfordert also create + publish.
Artikel erstellen
POST /api/knowledge-base/articles
{
"title": "Reset password in the self-service portal",
"summary": "Quick guide for password reset",
"content": "# Password Reset\n\n## Step 1 ...",
"categoryId": "clx-cat-self-service",
"visibility": "PUBLIC",
"status": "DRAFT",
"tags": ["password", "self-service"]
}
Felder: title (5–200), content (10–50 000), summary? (max 500), categoryId (Pflicht), visibility (PUBLIC/INTERNAL/RESTRICTED, Default INTERNAL), status (DRAFT/PUBLISHED/ARCHIVED, Default DRAFT), tags (max 20, je max 50 Zeichen; case-insensitiv, bestehende Schreibweise gewinnt). Die EINGABE ist eine Namensliste; in den Antworten (Liste, Detail, Anlage, Änderung, Wiederherstellung) tragen tags dagegen Referenzen der Form { id, name } — mit der ID filtert die Artikelliste (f.tagIds=hasAny:…). Revisions-Snapshots behalten die historischen NAMEN. Der Autor ist immer der angemeldete Benutzer. RESTRICTED-Freigaben werden NICHT hier gesetzt, sondern über die eigenen /grants-Endpoints. Anhänge separat über POST /api/attachments/KB_ARTICLE/:id.
Artikel aktualisieren
PUT /api/knowledge-base/articles/:id
{
"version": 3,
"title": "Reset password (updated)",
"status": "PUBLISHED"
}
version ist Pflicht (Schutz vor gleichzeitigem Überschreiben, wie bei Tickets): Der Client sendet die zuletzt gelesene Version; hat inzwischen jemand anders gespeichert, antwortet der Server mit 409 KB_VERSION_CONFLICT (expected/actual in details), statt dessen Änderung zu überschreiben. Jeder erfolgreiche PUT erhöht version und schreibt eine Revision. Inhaltsfelder sind optional (mind. eines nötig); eine status-Änderung erfordert das passende Recht (z. B. PUBLISHED → publish). Enums in Großbuchstaben. Freigaben werden hier nicht gesetzt; ein Wechsel weg von RESTRICTED entfernt bestehende Freigaben im selben Speichervorgang (auditiert).
Liste & Filter
GET /api/knowledge-base/articles?q=vpn&f.status=PUBLISHED&f.categoryId=clx-cat&page=1&per=20&sort=viewCount
Die Liste nutzt die einheitliche Filter-Syntax (auch für gespeicherte Ansichten): q (Volltext), f.status/f.visibility/f.categoryId/f.tagIds, page/per (per Default 20, max. 100), sort. search, status, visibility, categoryId, limit, sortBy, sortDirection und sortOrder als einfache Parameter werden mit 400 LEGACY_QUERY_PARAM_REMOVED abgelehnt. Die Liste enthält nur Artikel, die der Aufrufer sehen darf. Die Volltextsuche erkennt Wortstämme und Umlaute. Antwort:
{
"data": [ /* ... */ ],
"pagination": { "page": 1, "limit": 20, "total": 42, "totalPages": 3, "hasMore": true }
}
Freigaben, Papierkorb & Revisionen
- Freigaben: RESTRICTED-Artikel werden über Freigaben geöffnet — Subjekt-Typ USER, GROUP oder ROLE. Verwaltung über GET/POST/DELETE /articles/:id/grants (erfordert Bearbeitungsrecht am Artikel; Audit GRANT_ADDED/GRANT_REMOVED). Liste und Detail tragen einen grantCount; die Freigabeliste selbst erhalten nur Benutzer, die den Artikel bearbeiten dürfen. Rollen für die Freigabe-Auswahl: GET /api/roles/options (id/displayName/color).
- Soft-Delete + Papierkorb: DELETE markiert nur (deletedAt) — Links/Tags/Anhänge bleiben. Der Papierkorb ist GET /articles?deleted=1 (Recht viewDeleted); POST /articles/:id/restore holt zurück (Recht restore, kritisch). Gelöschte Artikel sind überall sonst 404. Nach 90 Tagen (Standardwert der Aufbewahrungsfrist) werden sie samt Revisionen endgültig gelöscht; dabei verwaiste Tags werden mit entfernt.
- Revisionen: Jeder Create/Update schreibt einen Snapshot (Revision.version == article.version). GET /articles/:id/revisions ({data}, ohne content) · GET /revisions/:version (voller Snapshot; unbekannt = 404 KB_REVISION_NOT_FOUND) · POST /revisions/:version/restore (wirkt wie eine normale Änderung: erzeugt eine neue Revision und prüft die Status-Rechte). Alle drei erfordern das Bearbeitungsrecht am Artikel.
Verlinkung zu anderen Entities
Artikel werden zentral über die Linking-API mit Tickets, Problems, Incidents und Changes verknüpft — z.B. POST /api/linking/tickets/:id/link-article bzw. /api/linking/problems/:id/link-article. Auf dem Artikel erscheinen die Verknüpfungen als linkedTickets, linkedProblems, linkedIncidents, linkedChanges.
Sichtbarkeits-Check beim Verlinken: POST /api/linking/{tickets|problems|incidents|changes}/:id/check-article-visibility ({articleIds[]}) prüft je Artikel, ob die Zielgruppe (Ticket→Kunde · Incident/Problem→Melder · Change→Requestor+Approver) ihn überhaupt sehen darf — der Agent bekommt vor dem Speichern einen Warnhinweis „für {Name} nicht sichtbar". Artikel-Titel erscheinen nicht in Timelines/Aktivitäten (Datensparsamkeit); das Frontend löst den Titel nur für Artikel auf, die der Betrachter sehen darf.
🔗 Details, Statusregeln und gestufte Listen: Entity Linking API →.
Permissions (knowledgeBase)
| Permission | Beschreibung |
|---|---|
viewPublic / viewInternal / viewRestricted | Artikel nach Sichtbarkeit sehen (PUBLIC / INTERNAL / RESTRICTED) |
viewDraft / viewPublished / viewArchived | Artikel nach Status sehen (DRAFT / PUBLISHED / ARCHIVED) |
create | Artikel erstellen |
editOwn / editAll | Eigene / alle Artikel bearbeiten; umfasst auch das Verwalten von RESTRICTED-Freigaben |
publish / unpublish / archive | Veröffentlichen / Zurückziehen / Archivieren |
delete | Artikel löschen (Soft-Delete → Papierkorb, kritisch, auditiert) |
viewDeleted / restore | Papierkorb sehen / wiederherstellen (Default nur ADMIN) |
Zum Wiederherstellen sind zwei Rechte nötig: restore für die Aktion und viewDeleted, um den Papierkorb zu sehen — wer den Papierkorb nicht sehen darf, holt auch nichts daraus zurück. Zusätzlich gilt dieselbe Sichtbarkeitsregel wie in der Liste (einschließlich der Autoren-Ausnahme), damit Papierkorb und Wiederherstellen dieselben Artikel umfassen. Dasselbe gilt beim Löschen: Was nicht sichtbar ist, kann auch nicht gelöscht werden.
Kategorien (POST/PUT/DELETE /categories) werden mit settings.manageCategories verwaltet.
KB ↔ Tickets/Problems/Incidents/Changes
Anhänge (entityType KB_ARTICLE)
Dokumenten-Bibliothek (separate Entity)
knowledgeBase.* Rechte-Matrix