Settings API
Über die Settings API werden die allgemeinen Einstellungen (Firmenname, Application-URL), die Nummernkreise, die Anbindung von E-Mail, Microsoft Teams und Webex, die CAPTCHA-Konfiguration und die aktivierten Sprachen verwaltet. Außerdem liefert sie den Status der Benachrichtigungskanäle.
Authentifizierung, Permissions & Aufbau
Jeder Einstellungsschlüssel hat eine Lese- und eine Schreibberechtigung. Lesen darf, wer eine der beiden besitzt: Die Schreibberechtigung schließt das Lesen ein, damit beim Bearbeiten die gespeicherten Werte im Formular stehen und beim Speichern nicht durch Vorgabewerte ersetzt werden. PUT /api/settings/:key erwartet den Wert als { "value": … } und prüft ihn gegen das Schema des Schlüssels (z. B. bei den Nummernkreisen).
- User-only: Alle Settings-Endpoints erfordern einen angemeldeten Benutzer; API-Keys werden abgewiesen. Ausnahmen sind die öffentlichen GETs /captcha und /enabled-languages.
- settings.viewGeneral ist für Administratoren gedacht und in den System-Rollen End User und Agent nicht enthalten. general-settings und ui-settings (Branding, Sprache) darf jeder angemeldete Benutzer lesen.
- Sensible Keys: entra-id-config, webex-settings und teams-settings sind nur über ihre eigenen Endpoints erreichbar (siehe Integration Settings). Diese geben Secrets nie im Klartext zurück.
- Weitere Endpoints:
/api/settings/license(Produktlizenz) und/api/settings/file-settings(Attachments) sind auf den verlinkten Seiten dokumentiert.
Systemwährung & Preismodus: general-settings enthält systemCurrency (einheitliche Währung für alle Beträge, Standard EUR, keine Umrechnung) und priceTaxMode (net | gross, Standard net; kennzeichnet Preisfelder, berechnet keine Steuer). Beide Werte gelten systemweit für Assets, Verträge, Lizenzen, Kostenstellen und Reports. Im Backend wirkt eine Änderung sofort; die Worker-Container übernehmen sie nach spätestens 60 Sekunden.
Globale Suche
Die entitätenübergreifende Suche (GET /api/search) ist eine eigene Domäne und hat eine eigene Seite: Globale Suche →.
Numbering Settings
Entity Number Formats
| Entity | Format | Beispiel | Reset-Policy |
|---|---|---|---|
| Ticket | PREFIX-NNNNNN | TKT-000001 | Nie |
| Problem | PREFIX-NNNNNN | PRB-000001 | Nie |
| Change | PREFIX-NNNNNN | CHG-000001 | Nie |
| Incident | PREFIX-YYYY-NNNNNN | INC-2026-000001 | Jährlich |
Numbering Settings Endpoints
| Method | Endpoint | Beschreibung |
|---|---|---|
GET/PUT | /api/settings/:key | Nummernkreise für Tickets, Probleme, Changes und Incidents (key = ticket-numbering-settings, problem-numbering-settings, change-numbering-settings, incident-numbering-settings). PUT erwartet { "value": {…} } und prüft den Wert gegen das Schema des Schlüssels. |
System & Sprachen
| Method | Endpoint | Beschreibung |
|---|---|---|
GET | /api/settings/captcha | Turnstile CAPTCHA Konfiguration (public) |
GET | /api/settings/enabled-languages | Aktivierte Sprachen (public) |
PUT | /api/settings/enabled-languages | Aktivierte Sprachen konfigurieren |
GET | /api/settings/channel-status | Notification-Channel-Status (E-Mail, Teams, Webex) |
GET | /api/settings/system-banner | System-Banner-Nachricht |
General Settings: Firmenname (companyName) und Application-URL (applicationUrl) werden über PUT /api/settings/general-settings konfiguriert. Beide Werte werden für QR-Codes, PDF-Labels und E-Mail-Templates verwendet. Derselbe Schlüssel trägt die Systemvorgaben für Sprache (defaultLanguage), Zeitzone (timezone, Vorgabe Europe/Berlin) und Datumsform (dateTimeFormat, Vorgabe dd/MM/yyyy HH:mm). Sie gelten für jeden Benutzer ohne eigene Präferenz — in der Oberfläche ebenso wie in den Texten, die der Server erzeugt (E-Mail, Push, Webex, Teams). Es empfiehlt sich, Zeitzone und Datumsform bei der Einrichtung ausdrücklich zu setzen, damit beide Seiten dasselbe Bild zeigen.
Numbering Configuration
// GET Response
GET /api/settings/ticket-numbering-settings
Response:
{
"prefix": "TKT", // 1-10 uppercase letters
"suffixLength": 6, // 1-10 digits (zero-padded)
"lastAssignedNumber": 12345 // read-only: last number handed out (null = none yet)
}
// Generated Ticket Number:
// TKT-012345 (prefix + zero-padded atomic counter)
Numbering aktualisieren
// Custom numbering for tickets
const update = await fetch('/api/settings/ticket-numbering-settings', {
method: 'PUT',
credentials: 'include',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
value: {
prefix: "TICKET", // Custom prefix (only prefix + suffixLength are settable)
suffixLength: 4 // Shorter suffix
}
})
});
const result = await update.json();
console.log(result);
// {
// "prefix": "TICKET",
// "suffixLength": 4,
// "lastAssignedNumber": null // read-only; the atomic counter keeps numbers unique
// }
// Next generated ticket number continues from the atomic counter:
// e.g. TICKET-2175, TICKET-2176, ...
⚠️ Warnung: Numbering-Settings sollten VOR Production-Start konfiguriert werden. Änderungen nach ersten Tickets können zu verwirrenden Nummern führen.
Year-Based Numbering (Incidents)
// Incidents have year-based counters
// Counter key: "incident-number-{YEAR}"
// 2025:
INC-2025-000001
INC-2025-000002
...
INC-2025-012345
// 2026 (automatic reset):
INC-2026-000001
INC-2026-000002
...
// Advantage: easy filtering by year
Application Settings
Settings Endpoints
| Method | Endpoint | Beschreibung |
|---|---|---|
GET | /api/settings | Alle Einstellungen der Kategorie general |
GET | /api/settings/:key | Spezifisches Setting abrufen |
PUT | /api/settings/:key | Setting aktualisieren |
DELETE | /api/settings/:key | Setting löschen |
UI Settings (Application Branding)
// Get UI settings
GET /api/settings/ui-settings
Response:
{
"applicationName": "ACME IT Helpdesk",
"logo": {
"url": "/uploads/logo.png",
"width": 200,
"height": 60
},
"favicon": {
"url": "/uploads/favicon.ico"
},
"theme": {
"primaryColor": "#3b82f6",
"accentColor": "#8b5cf6"
},
"branding": {
"companyName": "ACME Corporation",
"supportEmail": "support@acme.com",
"supportPhone": "+1 555 1234567"
}
}
// Update UI settings
PUT /api/settings/ui-settings
{
"value": {
"applicationName": "New Helpdesk Name",
"logo": {
"url": "/uploads/new-logo.png"
}
}
}
Language Settings
// Available languages (PUBLIC endpoint)
GET /api/settings/enabled-languages
Response:
{
"languages": ["de", "en"]
}
// Update language settings (Admin)
PUT /api/settings/enabled-languages
{
"languages": ["de", "en", "fr"]
}
// The effective default language must stay in the list —
// otherwise 400 DEFAULT_LANGUAGE_NOT_ENABLED
Integration Settings
E-Mail Settings
| Method | Endpoint | Beschreibung |
|---|---|---|
GET | /api/settings/email | E-Mail-Settings (SMTP/Graph; Secrets nur als _has*-Flag) |
POST | /api/settings/email | E-Mail-Settings aktualisieren |
POST | /api/settings/email/test-smtp | SMTP-Verbindung testen |
POST | /api/settings/email/test-graph | Microsoft Graph API-Verbindung testen |
// Update email settings
POST /api/settings/email
{
"isEnabled": true,
"smtp": {
"enabled": true,
"host": "smtp.gmail.com",
"port": 587,
"security": "tls",
"username": "notifications@company.com",
"password": "app-specific-password",
"fromAddress": "notifications@company.com",
"fromName": "IT Helpdesk",
"tlsVerify": true
}
}
// Test SMTP connection
POST /api/settings/email/test-smtp
Response:
{
"connected": true,
"diagnostic": null // optional technical diagnostic from the email worker
}
// Failure: 400 EMAIL_CONNECTION_TEST_FAILED
Teams Settings
| Method | Endpoint | Beschreibung |
|---|---|---|
GET | /api/settings/teams | Teams Bot Framework Settings |
POST | /api/settings/teams | Teams-Settings aktualisieren |
POST | /api/settings/teams/test | Teams Bot-Verbindung testen |
POST | /api/teams/bot | Teams Bot Framework Messaging-Endpoint (von Microsoft aufgerufen) |
// Teams Bot Framework konfigurieren
POST /api/settings/teams
{
"appId": "00000000-0000-0000-0000-000000000000", // Azure App Registration (GUID)
"appPassword": "your-bot-secret",
"tenantId": "your-tenant-id",
"isEnabled": true
}
// Test senden
POST /api/settings/teams/test
Response:
{
"connected": true,
"connectedUsers": 12,
"connectedChannels": 2,
"testMessageSent": true
}
Webex Settings
| Method | Endpoint | Beschreibung |
|---|---|---|
GET | /api/settings/webex | Webex-Bot-Settings (Token nur als _hasToken-Flag) |
POST | /api/settings/webex | Webex-Settings aktualisieren |
POST | /api/settings/webex/test | Webex-Bot-Connection testen |
// Webex Bot konfigurieren
POST /api/settings/webex
{
"botToken": "Bearer_YOUR_BOT_TOKEN_HERE",
"isEnabled": true
}
// Bot-Connection testen
POST /api/settings/webex/test
Response:
{
"connected": true,
"botId": "webex-bot-id",
"botName": "Helpdesk Bot",
"botEmail": "bot@webex.bot"
}
Settings Categories & Permissions
| Category | Settings-Keys | Permissions |
|---|---|---|
| /api/settings/email (eigener Endpoint) | settings.viewEmail, settings.editEmail | |
| Integrations | webex-settings, teams-settings, entra-id-config (eigene Endpoints; Secrets nur als _has*-Flag) | settings.viewIntegrations, settings.editIntegrations |
| Numbering | ticket/problem/change/incident-numbering-settings | settings.viewNumbering, settings.editNumbering |
| Security | captcha/turnstile-settings | settings.editSecurity |
| SLA | sla-settings | settings.editSLA (lesen UND schreiben) |
| General | general-settings, ui-settings (lesbar für alle angemeldeten Benutzer) | settings.viewGeneral (für Administratoren), settings.editGeneral |
SLA-Schwellwerte (sla-settings)
PUT /api/settings/sla-settings
{
"value": {
"warningThresholdPercent": 80, // 50–99
"criticalThresholdMinutes": 60 // 5–1440
}
}
Ab wann ein SLA als WARNING gilt und wann ein Breach zu CRITICAL eskaliert. sla-settings gehört zur Kategorie sla und ist daher nicht in GET /api/settings enthalten; Lesen und Schreiben erfordern settings.editSLA, damit die SLA-Schwellwerte nicht jedem Inhaber von settings.viewGeneral angezeigt werden. Details und Cache-Verhalten: SLA Management API.
Security Features
Secret-Masking
// GET Response maskiert Secrets
GET /api/settings/webex
Response:
{
"isEnabled": true,
"_hasToken": true // Secret never returned — only this boolean flag
}
// GET response for SMTP
{
"smtp": {
"username": "notifications@company.com",
"_hasPassword": true // Secret never returned — only this boolean flag
}
}
Secrets werden im GET nie zurückgegeben — nur ein _has*-Flag zeigt an, ob ein Wert hinterlegt ist. Zusätzlich werden SMTP-Passwort, MS-Graph- und Entra-clientSecret sowie Webex-botToken und Teams-appPassword beim Speichern mit AES-256-GCM verschlüsselt abgelegt. Details auf der Sicherheits-Seite.
RBAC-Integration
- Kritische Einstellungen: Bei jeder Änderung wird die Berechtigung direkt in der Datenbank geprüft, ohne Cache; ein entzogenes Recht greift sofort
SSRF Protection
Die Teams-Bot-Kommunikation akzeptiert nur Service-URLs auf freigegebenen Microsoft-Domains über HTTPS. Die Liste der Domains steht unter Integrations →.
Notification Channel Status
Channel Status Endpoint
// Get status of all notification channels
GET /api/settings/channel-status
Response:
{
"EMAIL": { "enabled": true, "configured": true },
"TEAMS": { "enabled": true, "configured": true },
"WEBEX": { "enabled": false, "configured": false },
"IN_APP": { "enabled": true, "configured": true },
"PUSH": { "enabled": true, "configured": true }
}
Best Practices
- Numbering-Setup: Konfiguriere VOR Production-Start, verwende aussagekräftige Prefixes
- Suffix-Length: 6 Digits für große Deployments (bis 999.999), 4 für kleine
- E-Mail-Test: Immer test-smtp/test-graph nach Settings-Change ausführen
- Channel-Status: Prüfe nach Änderungen per channel-status, ob alle Kanäle aktiviert und konfiguriert sind
- UI-Branding: Logo max. 200x60px, Favicon 32x32px für beste Darstellung
- Secrets: Verwende starke Passwords, rotiere Tokens regelmäßig
- Language-Support: Aktiviere nur Sprachen mit vollständigen Templates
- Permissions: Nur ADMIN sollte settings.editIntegrations haben (kritisch)
Verwandte Dokumentation
- Tickets API - Ticket-Numbering, Search-Integration
- Problems API - Problem-Numbering
- Changes API - Change-Numbering
- Incidents API - Incident-Numbering (Year-Based)
- Globale Suche - entitätenübergreifende Suche über neun Typen
- Integrations - E-Mail, Teams, Webex Integration-Details
- Users & Roles - Settings-Permissions (RBAC)
- Audit System - Settings-Change Audit-Logging
- Reopen & Lifecycle - Reopen-Gründe + Lifecycle-Config (settings.editGeneral)