Create new user (Admin only)
POST/company/users/
Erstelle einen neuen Benutzer für das Unternehmen. Nur Administratoren können Benutzer erstellen.
Ziel
Administratoren ermöglichen, neue Benutzer zu ihrem Unternehmen hinzuzufügen, mit Kontrolle über das Benutzerlimit gemäß ihrem Abonnementplan.
Anwendungsfälle
- Einen neuen Mitarbeiter zur Plattform hinzufügen
- Ein Konto für einen neuen Manager erstellen
- Administrativnutzer hinzufügen
Authentifizierung & Autorisierung
- Erfordert gültiges JWT (Middleware m.isLoged)
- Erfordert Admin- oder Dev-Rolle (Middleware m.isAdmin)
- Erfordert UTC-Validierung (mTools.checkUTC)
- Überprüft Benutzerlimit des Plans (mPlan.canCreateUser)
Verhalten
- Validiert, dass die E-Mail nicht in der Datenbank existiert
- Wenn kein Passwort angegeben wird, wird automatisch eines mit tools.generatePass() generiert
- Erstellt Benutzer mit model.createData()
- Fügt Benutzer zum Array company.users[] hinzu
- Zeichnet Nutzung im Abrechnungsservice auf (BillingService.recordUsage)
- Sendet E-Mail mit Zugangsdaten unter Verwendung von mail.sendNewPass()
Validierungen
- E-Mail erforderlich und eindeutig
- Benutzer wird zum Unternehmen des Admins hinzugefügt
- Abrechnungsservice überprüft Benutzerlimit des Plans
- Wenn die Erstellung im Unternehmen fehlschlägt, wird der Benutzer gelöscht (Rollback)
Passwortbehandlung
- Wenn ein Passwort im Body angegeben wird, wird dieses verwendet
- Wenn keines angegeben wird, wird es automatisch generiert: 8 Zeichen, Großbuchstaben, Kleinbuchstaben, Zahlen
- Das Passwort wird mit model.getPassword() gehasht
- Es wird per E-Mail an den Benutzer gesendet
Validierungsablauf
flowchart TD
A[POST / empfangen] --> B\{Benutzer Admin?\}
B -->|Nein| C[403 Forbidden]
B -->|Ja| D\{E-Mail angegeben?\}
D
<Heading
id={"request"}
as={"h2"}
className={"openapi-tabs__heading"}
children={"Request"}
>
</Heading>
<ParamsDetails
parameters={undefined}
>
</ParamsDetails>
<RequestSchema
title={"Body"}
body={{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email","description":"E-Mail des neuen Benutzers (eindeutig in der Datenbank)","example":"nuevo_usuario@empresa.com"},"name":{"type":"string","minLength":2,"maxLength":50,"description":"Benutzername","example":"Juan"},"lastname":{"type":"string","minLength":2,"maxLength":100,"description":"Nachname des Benutzers","example":"Pérez García"},"password":{"type":"string","minLength":8,"maxLength":50,"description":"Benutzerpasswort (optional). Falls nicht angegeben,\nwird automatisch eines generiert. Anforderungen: mindestens 8 Zeichen,\ndavon mindestens 1 Großbuchstabe, 1 Kleinbuchstabe, 1 Zahl.","example":"Contraseña123","nullable":true},"role":{"type":"string","enum":["dev","admin","gestor"],"description":"Benutzerrolle (Standard: Manager). Legt Berechtigungen auf der Plattform fest.\n- dev: Superadmin mit vollem Zugriff\n- admin: Vollständige Unternehmensverwaltung\n- manager: Tägliche Betriebsabläufe","example":"gestor","default":"gestor"},"i18n":{"type":"string","enum":["es","en","fr","de"],"description":"Bevorzugte Sprache des Benutzers","example":"es","default":"es"}}},"example":{"email":"nuevo_usuario@empresa.com","name":"Juan","lastname":"Pérez García","password":"MiContraseña123","role":"gestor","i18n":"es"}}}}}
>
</RequestSchema>
<StatusCodes
id={undefined}
label={undefined}
responses={{"200":{"description":"Benutzer erfolgreich erstellt.","content":{"application/json":{"schema":{"type":"object","description":"Stellt einen Unternehmensnutzer (company_user) mit Zugang zur Cargoffer-Plattform dar.\n**Funktionalität**: - Angestellter eines Transportunternehmens, der Auktionen, Lieferungen und Dokumentation verwaltet - Authentifizierung via JWT (Token mit konfigurierbarer Ablaufzeit gemäß refresh_time) - Hierarchisches Rollensystem: dev > admin > manager (absteigende Berechtigungen) - Einem Unternehmen zugeordnet (company.users-Array enthält Referenzen auf _id von Nutzern)\n**Modell**: `src/features/models/company_user.model.js`\n**Controller**: - `src/features/company/users/company_user.account.controller.js` (CRUD, Passwörter) - `src/features/company/users/company_user.profile.controller.js` (Profil, Präferenzen) - `src/features/company/auth/auth.account.controller.js` (Login, Token)\n**Middleware**: `src/features/common/middleware/company.middleware.js` - `m.isLoged` - Prüft gültiges JWT - `m.isGestor` - Erfordert Rolle 'manager' oder höher - `m.isAdmin` - Erfordert Rolle 'admin' oder 'dev'","properties":{"_id":{"type":"string","description":"MongoDB eindeutige Benutzerkennung (24 hexadezimale Zeichen). Wird automatisch bei der Registrierung generiert. Referenziert in: company.users[], auction.user, delivery.user, notifications.user. Im JWT-Payload als Claim '_id' enthalten.","pattern":"^[a-f0-9]{24}$","example":"63d7907cbe76403b35da63df"},"email":{"type":"string","format":"email","description":"Eindeutige E-Mail-Adresse des Benutzers (wird für die Anmeldung verwendet). **Erforderlich** - Eindeutig in der Datenbank (Unique-Index in der Produktion). Wird automatisch in Kleinbuchstaben normalisiert (Pre-Save-Hook). Verwendung bei: Authentifizierung, Passwortwiederherstellung, Benachrichtigungen. Wird mit dem Standard-E-Mail-Format validiert.","example":"usuario@cargoffer.com"},"name":{"type":"string","description":"Name des Benutzers (firstName im internationalen Kontext). Verwendet in: Benutzeroberfläche, CMR-Dokumentenunterschrift, Identifikation in Benachrichtigungen. Mindestens 2 Zeichen (Validierung im Frontend).","minLength":2,"maxLength":50,"example":"Juan"},"lastname":{"type":"string","description":"Nachname des Benutzers (lastName in der API, lastname im Modell). Wird zusammen mit 'name' für die vollständige Identifikation in offiziellen Dokumenten verwendet. Verkettet in: Verträgen, CMR, Rechnungen.","minLength":2,"maxLength":100,"example":"García López"},"role":{"type":"string","enum":["dev","admin","gestor"],"description":"Rolle des Benutzers, die Berechtigungen auf der Plattform definiert. \n**dev**: Vollzugriff + Debugging + Verwaltung aller Unternehmen (Superadmin) \n**admin**: Vollständige Verwaltung des eigenen Unternehmens (Benutzer erstellen, Abrechnung einsehen, Daten ändern) \n**gestor**: Tägliche Operationen (Auktionen/Lieferungen erstellen, Dashboard einsehen, eigenes Profil bearbeiten) \n\n**Middleware-Prüfungen**: \n- m.isGestor akzeptiert: ['gestor', 'admin', 'dev'] \n- m.isAdmin akzeptiert: ['admin', 'dev'] \n\nIm JWT-Payload gespeichert (wird für die Berechtigungsvalidierung verwendet).","default":"gestor","example":"admin"},"status":{"type":"boolean","description":"Aktiv/Inaktiv-Status des Benutzers. **true**: Benutzer kann sich einloggen und normal arbeiten. **false**: Benutzer gesperrt (kann sich nicht einloggen, JWTs ungültig). \nVerwendet in: Middleware m.isLoged prüft status=true, bevor Zugriff erlaubt wird. Geändert über: POST /company/users/status/:id (nur Admin). Unterscheidet sich von 'deleted' (Soft Delete) – dies ist eine reversible Sperrung.","default":true,"example":true},"reason":{"type":"string","enum":["NONE","BAD_USER","PENDING","ACTIVE","BLOCKED"],"description":"Benutzerstatus-Grundcode. **NONE**: Normaler aktiver Nutzer ohne Vorkommnisse **PENDING**: Registrierung abgeschlossen, wartet auf E-Mail-Aktivierung **ACTIVE**: Nutzer verifiziert und betriebsbereit **BAD_USER**: Wegen Fehlverhaltens gesperrt (Meldungen, Betrug) **BLOCKED**: Administrativ gesperrt (Zahlungsverzug, Sicherheit)\nWird zusammen mit 'status' und 'reasonMessage' für die Auditierung verwendet. Wird mit 'reasonDate' (Zeitstempel der Änderung) gespeichert.","default":"NONE","example":"ACTIVE"},"reasonMessage":{"type":"string","description":"Beschreibende Nachricht zum Grund der Sperrung/aktuellen Status. Optional – Vom Admin ausgefüllt, wenn der Status auf 'false' geändert wird. Sichtbar für: Admins im Benutzerpanel, gesperrter Benutzer in der Login-Fehlermeldung. Beispiel: 'Konto wegen Zahlungsrückstands gesperrt', 'Benutzer wegen regelwidrigen Verhaltens gemeldet'.","example":"Usuario bloqueado temporalmente por verificación de documentación"},"reasonDate":{"type":"string","format":"date-time","description":"Zeitstempel, wann das Feld 'reason' zuletzt geändert wurde. Automatisch – Wird im Pre-Save-Hook gesetzt, wenn eine Änderung an 'reason' erkannt wird. Verwendung in: Auditierung, Berechnung der Blockierdauer, Änderungshistorien.","example":"2025-01-15T14:30:00.000Z"},"i18n":{"type":"string","enum":["es","en","fr","de"],"description":"Bevorzugter Sprachcode des Benutzers (Internationalisierung). **es**: Spanisch (Standard für Spanien) **en**: Englisch (internationaler Standard)\nVerwendet in: automatischen E-Mails, Benutzeroberfläche, Fehlermeldungen, CMR-Dokumenten. Im JWT-Payload für Backend-Personalisierung gespeichert. Geändert über: POST /company/users/lang","default":"es","example":"en"},"birthDate":{"type":"string","format":"date-time","description":"Geburtsdatum des Benutzers (optional). Verwendung: Altersüberprüfungen (Mindestalter 18 Jahre für Fahrer), demografische Statistiken. ISO 8601-Format. Kann null sein.","nullable":true,"example":"1990-05-15T00:00:00.000Z"},"emailVerified":{"type":"boolean","description":"Gibt an, ob der Benutzer seine E-Mail-Adresse verifiziert hat. **false**: Benutzer registriert, hat aber nicht auf den Aktivierungslink geklickt **true**: E-Mail über Aktivierungstoken bestätigt\nAblauf: register → E-Mail mit Token → GET /company/auth/activate/:token → emailVerified=true Benutzer mit emailVerified=false können eingeschränkte Funktionen haben (abhängig von der Konfiguration).","default":false,"example":true},"emailVerifiedDate":{"type":"string","format":"date-time","description":"Zeitstempel, wann die E-Mail verifiziert wurde (null, wenn emailVerified=false). Automatisch gesetzt bei Bestätigung des Aktivierungstokens. Verwendet für: Auditierung, Berechnung der Zeit seit der Verifizierung, Anforderungen für eine erneute Verifizierung.","nullable":true,"example":"2025-01-10T09:20:30.000Z"},"phone":{"type":"string","description":"Telefonnummer des Benutzers (optional, aber empfohlen). Format: international bevorzugt (+Ländercode), mindestens 9 Ziffern, maximal 15. Verwendung: logistische Koordination, SMS-Benachrichtigungen, Notfallkontakt. Validierung: `minlength: 9, maxlength: 15` im Modell.","pattern":"^\\+?[0-9]{9,15}$","example":"+34612345678"},"lastSignInAt":{"type":"string","format":"date-time","description":"Zeitstempel der letzten erfolgreichen Anmeldung des Benutzers. Automatisch aktualisiert im Login-Controller (POST /company/auth/login). Verwendet in: Aktivitäts-Dashboard, Erkennung inaktiver Konten, Sicherheitsaudit.","example":"2025-10-23T08:15:45.000Z"},"lastSignInIp":{"type":"string","description":"IP-Adresse, von der aus die letzte Anmeldung erfolgte. Entnommen aus req.ip oder req.headers['x-forwarded-for']. Verwendung bei: Erkennung verdächtiger Zugriffe, Sicherheitsprotokollen, Geolokalisierung von Zugriffen.","format":"ipv4","example":"192.168.1.100"},"country":{"type":"string","description":"ISO 3166-1 alpha-3-Ländercode des Benutzers (3 Kleinbuchstaben). Verwendet in: Zeitzonenfiltern, Datumsformaten, Gebietsschema-Einstellungen, TaxID-Validierungen. Standard: esp (Spanien). Muss in der Collection 'countries' vorhanden sein.","pattern":"^[a-z]{3}$","default":"esp","example":"esp"},"timezone":{"type":"string","description":"Zeitzone des Benutzers im IANA Time Zone Database-Format. Verwendet für: Umwandlung von UTC-Zeitstempeln in Ortszeit, Datumsanzeige, Berechnung von Lade-/Entladezeiten. Muss mit gültigen Zonen der moment-timezone-Bibliothek übereinstimmen. Standard: Europe/Madrid","default":"Europe/Madrid","example":"Europe/Madrid"},"taxid":{"type":"string","description":"Persönliche Steueridentifikationsnummer (NIF, DNI, NIE, etc.). **Eindeutig in der Produktion** (Unique-Index). Mindestens 6 Zeichen, maximal 9. Automatisch in Großbuchstaben normalisiert (uppercase: true im Modell). Verwendet in: Rechnungsstellung, Verträgen, rechtlicher Dokumentation. Temporärer Standardwert: '---------' (9 Bindestriche), um Erstellung ohne Angabe zu ermöglichen.","minLength":6,"maxLength":9,"example":"12345678A"},"img":{"type":"string","format":"uri","description":"URL des Profilbildes des Benutzers (gespeichert in AWS S3). Optional - Hochgeladen über den Dokumenten-Endpunkt mit multerS3. Verwendung: Avatar in der Benutzeroberfläche, visuelle Signatur in Dokumenten. Format: Vollständige S3-Bucket-URL.","nullable":true,"example":"https://cargoffer-storage.s3.amazonaws.com/users/63d7907cbe76403b35da63df.jpg"},"recovery_token":{"type":"string","description":"Temporäres Token zur Passwortwiederherstellung (Hash). \nGeneriert bei: POST /company/auth/recovery (Reset-Anfrage) \nVerwendet bei: GET /company/auth/recovery/:token (Token-Validierung) \nBereinigt nach: Erfolgreicher Passwortänderung oder Ablauf (48h) \nStandard: '' (Leerstring, wenn kein aktiver Wiederherstellungsprozess läuft)","example":"a7f5e8d3c2b9..."},"refresh_time":{"type":"integer","enum":[1,3,5,10],"description":"Gültigkeitsdauer des JWT in Tagen. Verwendet in: Token-Generierung (exp claim = iat + refresh_time * 24h). **1**: Maximale Sicherheit (tägliches Re-Login) - Für sensible Rollen **3**: Standard-Kompromiss Sicherheit/Komfort **5**: Häufige Nutzung **10**: Mobile Apps mit Offline-Funktion\nIm JWT-Payload gespeichert, im Middleware m.isLoged validiert.","default":3,"example":3},"is_bot":{"type":"boolean","description":"Gibt an, ob der Benutzer ein automatisierter Bot ist (für API-Integrationen). **true**: Benutzer für automatische Integration erstellt (Webhooks, Skripte) **false**: Menschlicher, echter Benutzer\nVerwendet in: Statistiken, Auditierung, Ausschluss von Bots aus Metriken menschlicher Aktivität. Bots können spezielle Berechtigungen und andere Rate Limits haben.","default":false,"example":false},"deleted":{"type":"boolean","description":"Flag für Soft Delete (mongoose-delete Plugin). **false**: Benutzer aktiv **true**: Benutzer gelöscht (erscheint nicht in normalen Queries). \nQueries schließen automatisch deleted:false ein (Plugin overrideMethods:true). Wiederherstellbar über: POST /company/users/disabled/reactivate/:id. Verknüpft mit 'deletedAt'-Zeitstempel.","default":false,"example":false},"deletedAt":{"type":"string","format":"date-time","description":"Zeitstempel, wann der Benutzer gelöscht wurde (Soft Delete). Null, wenn deleted=false. Automatisch vom mongoose-delete-Plugin gesetzt. Verwendet für: Löschungsaudit, Benutzerwiederherstellung, GDPR-Compliance.","nullable":true,"example":"2025-10-01T12:00:00.000Z"},"createdAt":{"type":"string","format":"date-time","description":"Zeitstempel der Benutzererstellung (automatisch durch mongoose timestamps). Unveränderlich – kann nach der Erstellung nicht geändert werden. Verwendet in: Sortierung, Wachstumsstatistiken, Auditierung.","example":"2024-12-01T10:30:00.000Z"},"updatedAt":{"type":"string","format":"date-time","description":"Zeitstempel der letzten Benutzeränderung (automatisch durch mongoose timestamps). Wird bei jedem save() aktualisiert – spiegelt die letzte Bearbeitung eines beliebigen Feldes wider. Verwendet für: Synchronisierung, Cache-Invalidierung, Änderungserkennung.","example":"2025-10-20T15:45:30.000Z"},"lastAccess":{"type":"string","format":"date-time","description":"Zeitstempel des letzten registrierten Zugriffs auf jeden authentifizierten Endpunkt. Aktualisiert durch: Middleware m.getAction bei jeder authentifizierten Anfrage. Unterscheidet sich von lastSignInAt (dieser wird bei jeder Anfrage aktualisiert, nicht nur beim Login). Verwendet für: Erkennung von Inaktivität, Engagement-Metriken.","example":"2025-10-23T10:22:15.000Z"}},"title":"User"},"example":{"_id":"63d7907cbe76403b35da70f","email":"nuevo_usuario@empresa.com","name":"Juan","lastname":"Pérez García","role":"gestor","status":true,"i18n":"es","emailVerified":false,"createdAt":"2025-02-12T10:30:00.000Z"}}}},"400":{"description":"Ungültige Anfrage. Mögliche Ursachen:\n- E-Mail nicht angegeben\n- Fehler beim Speichern (automatischer Rollback)","content":{"application/json":{"schema":{"type":"object","required":["status","message"],"properties":{"status":{"type":"integer","description":"HTTP-Statuscode","minimum":400,"maximum":599,"example":400},"message":{"type":"string","description":"Fehlercode vom System.\n\nHäufige Fehlercodes (siehe listado_errores_http.txt für die vollständige Liste):\n- NO_TOKEN (401): JWT-Token nicht bereitgestellt\n- TOKEN_NOT_VALID (401): JWT-Token ist ungültig oder abgelaufen\n- NO_ADMIN_ROLE (401): Benutzer verfügt nicht über Administratorrechte\n- INVALID_PARAMETERS (400): Anforderungsparameter sind ungültig\n- NOT_FOUND (404): Angeforderte Ressource nicht gefunden\n- ALREADY_EXIST (401): Ressource mit gleichem Bezeichner existiert bereits\n- UTC_VALIDATION_FAILED (400): UTC-Zeitstempelvalidierung fehlgeschlagen\n- INTERNAL_ERROR (500): Unerwarteter Serverfehler ist aufgetreten\n\nDie Nachricht wird von `handlerError.getErrorMessage(error)` aufgelöst.","example":"INVALID_PARAMETERS"}},"description":"Standardisierte Fehlerantworten für alle API-Endpunkte.\n\nAlle Fehler folgen dem Schema `{status: number, message: string}`.\nDer Statuscode wird sowohl in der HTTP-Antwort als auch im Antwortkörper wiederholt.\n\nFehlermeldungen sind Konstanten im Code und sollten clientseitig\nmit entsprechenden, benutzerfreundlichen Meldungen behandelt werden.","example":{"status":400,"message":"INVALID_PARAMETERS"},"title":"ErrorResponse"},"example":{"message":"FORM_DATA_NOT_VALID"}}}},"401":{"description":"Nicht autorisiert (Admin- oder Dev-Rolle erforderlich)","content":{"application/json":{"schema":{"type":"object","required":["status","message"],"properties":{"status":{"type":"integer","description":"HTTP-Statuscode","minimum":400,"maximum":599,"example":400},"message":{"type":"string","description":"Fehlercode vom System.\n\nHäufige Fehlercodes (siehe listado_errores_http.txt für die vollständige Liste):\n- NO_TOKEN (401): JWT-Token nicht bereitgestellt\n- TOKEN_NOT_VALID (401): JWT-Token ist ungültig oder abgelaufen\n- NO_ADMIN_ROLE (401): Benutzer verfügt nicht über Administratorrechte\n- INVALID_PARAMETERS (400): Anforderungsparameter sind ungültig\n- NOT_FOUND (404): Angeforderte Ressource nicht gefunden\n- ALREADY_EXIST (401): Ressource mit gleichem Bezeichner existiert bereits\n- UTC_VALIDATION_FAILED (400): UTC-Zeitstempelvalidierung fehlgeschlagen\n- INTERNAL_ERROR (500): Unerwarteter Serverfehler ist aufgetreten\n\nDie Nachricht wird von `handlerError.getErrorMessage(error)` aufgelöst.","example":"INVALID_PARAMETERS"}},"description":"Standardisierte Fehlerantworten für alle API-Endpunkte.\n\nAlle Fehler folgen dem Schema `{status: number, message: string}`.\nDer Statuscode wird sowohl in der HTTP-Antwort als auch im Antwortkörper wiederholt.\n\nFehlermeldungen sind Konstanten im Code und sollten clientseitig\nmit entsprechenden, benutzerfreundlichen Meldungen behandelt werden.","example":{"status":400,"message":"INVALID_PARAMETERS"},"title":"ErrorResponse"},"example":{"message":"NO_TOKEN"}}}},"403":{"description":"Verboten. Mögliche Ursachen:\n- Benutzer ist kein Administrator\n- Tarif erlaubt keine Erstellung weiterer Benutzer","content":{"application/json":{"schema":{"type":"object","required":["status","message"],"properties":{"status":{"type":"integer","description":"HTTP-Statuscode","minimum":400,"maximum":599,"example":400},"message":{"type":"string","description":"Fehlercode vom System.\n\nHäufige Fehlercodes (siehe listado_errores_http.txt für die vollständige Liste):\n- NO_TOKEN (401): JWT-Token nicht bereitgestellt\n- TOKEN_NOT_VALID (401): JWT-Token ist ungültig oder abgelaufen\n- NO_ADMIN_ROLE (401): Benutzer verfügt nicht über Administratorrechte\n- INVALID_PARAMETERS (400): Anforderungsparameter sind ungültig\n- NOT_FOUND (404): Angeforderte Ressource nicht gefunden\n- ALREADY_EXIST (401): Ressource mit gleichem Bezeichner existiert bereits\n- UTC_VALIDATION_FAILED (400): UTC-Zeitstempelvalidierung fehlgeschlagen\n- INTERNAL_ERROR (500): Unerwarteter Serverfehler ist aufgetreten\n\nDie Nachricht wird von `handlerError.getErrorMessage(error)` aufgelöst.","example":"INVALID_PARAMETERS"}},"description":"Standardisierte Fehlerantworten für alle API-Endpunkte.\n\nAlle Fehler folgen dem Schema `{status: number, message: string}`.\nDer Statuscode wird sowohl in der HTTP-Antwort als auch im Antwortkörper wiederholt.\n\nFehlermeldungen sind Konstanten im Code und sollten clientseitig\nmit entsprechenden, benutzerfreundlichen Meldungen behandelt werden.","example":{"status":400,"message":"INVALID_PARAMETERS"},"title":"ErrorResponse"},"example":{"message":"PLAN_LIMIT_REACHED"}}}},"406":{"description":"E-Mail existiert bereits in der Datenbank","content":{"application/json":{"schema":{"type":"object","required":["status","message"],"properties":{"status":{"type":"integer","description":"HTTP-Statuscode","minimum":400,"maximum":599,"example":400},"message":{"type":"string","description":"Fehlercode vom System.\n\nHäufige Fehlercodes (siehe listado_errores_http.txt für die vollständige Liste):\n- NO_TOKEN (401): JWT-Token nicht bereitgestellt\n- TOKEN_NOT_VALID (401): JWT-Token ist ungültig oder abgelaufen\n- NO_ADMIN_ROLE (401): Benutzer verfügt nicht über Administratorrechte\n- INVALID_PARAMETERS (400): Anforderungsparameter sind ungültig\n- NOT_FOUND (404): Angeforderte Ressource nicht gefunden\n- ALREADY_EXIST (401): Ressource mit gleichem Bezeichner existiert bereits\n- UTC_VALIDATION_FAILED (400): UTC-Zeitstempelvalidierung fehlgeschlagen\n- INTERNAL_ERROR (500): Unerwarteter Serverfehler ist aufgetreten\n\nDie Nachricht wird von `handlerError.getErrorMessage(error)` aufgelöst.","example":"INVALID_PARAMETERS"}},"description":"Standardisierte Fehlerantworten für alle API-Endpunkte.\n\nAlle Fehler folgen dem Schema `{status: number, message: string}`.\nDer Statuscode wird sowohl in der HTTP-Antwort als auch im Antwortkörper wiederholt.\n\nFehlermeldungen sind Konstanten im Code und sollten clientseitig\nmit entsprechenden, benutzerfreundlichen Meldungen behandelt werden.","example":{"status":400,"message":"INVALID_PARAMETERS"},"title":"ErrorResponse"},"example":{"message":"USER_ALREADY_EXIST"}}}}}}
>
</StatusCodes>