openapi: 3.0.3 info: title: Certigo Addon API description: API für die Verwaltung von Spaces, FQDNs, Certificate Signing Requests (CSRs), Zertifikaten, Benutzern, Berechtigungen und automatischer Zertifikatserneuerung version: 2.0.0 contact: name: Certigo Addon servers: - url: http://localhost:8080/api description: Local development server security: - basicAuth: [] paths: /health: get: summary: System Health Check description: Prüft den Systemstatus des Backends tags: - System responses: '200': description: System ist erreichbar content: application/json: schema: $ref: '#/components/schemas/HealthResponse' /stats: get: summary: Statistiken abrufen description: Ruft Statistiken über die Anzahl der Spaces, FQDNs und CSRs ab tags: - System responses: '200': description: Statistiken erfolgreich abgerufen content: application/json: schema: $ref: '#/components/schemas/StatsResponse' /spaces: get: summary: Alle Spaces abrufen description: Ruft eine Liste aller Spaces ab tags: - Spaces responses: '200': description: Liste der Spaces content: application/json: schema: type: array items: $ref: '#/components/schemas/Space' post: summary: Space erstellen description: Erstellt einen neuen Space tags: - Spaces requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateSpaceRequest' responses: '201': description: Space erfolgreich erstellt content: application/json: schema: $ref: '#/components/schemas/Space' '400': description: Ungültige Anfrage /spaces/{id}: delete: summary: Space löschen description: Löscht einen Space. Wenn der Space FQDNs enthält, muss der Parameter deleteFqdns=true gesetzt werden. tags: - Spaces parameters: - name: id in: path required: true schema: type: string format: uuid - name: deleteFqdns in: query required: false schema: type: boolean default: false description: Wenn true, werden alle FQDNs des Spaces mitgelöscht responses: '200': description: Space erfolgreich gelöscht content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '404': description: Space nicht gefunden '409': description: Space enthält noch FQDNs /spaces/{id}/fqdns/count: get: summary: FQDN-Anzahl abrufen description: Ruft die Anzahl der FQDNs für einen Space ab tags: - FQDNs parameters: - name: id in: path required: true schema: type: string format: uuid responses: '200': description: Anzahl der FQDNs content: application/json: schema: $ref: '#/components/schemas/CountResponse' /spaces/{id}/fqdns: get: summary: Alle FQDNs eines Spaces abrufen description: Ruft alle FQDNs für einen Space ab tags: - FQDNs parameters: - name: id in: path required: true schema: type: string format: uuid responses: '200': description: Liste der FQDNs content: application/json: schema: type: array items: $ref: '#/components/schemas/FQDN' '404': description: Space nicht gefunden post: summary: FQDN erstellen description: Erstellt einen neuen FQDN innerhalb eines Spaces tags: - FQDNs parameters: - name: id in: path required: true schema: type: string format: uuid requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateFQDNRequest' responses: '201': description: FQDN erfolgreich erstellt content: application/json: schema: $ref: '#/components/schemas/FQDN' '400': description: Ungültige Anfrage '404': description: Space nicht gefunden '409': description: FQDN existiert bereits in diesem Space delete: summary: Alle FQDNs eines Spaces löschen description: Löscht alle FQDNs eines Spaces tags: - FQDNs parameters: - name: id in: path required: true schema: type: string format: uuid responses: '200': description: Alle FQDNs erfolgreich gelöscht content: application/json: schema: $ref: '#/components/schemas/DeleteResponse' /spaces/{id}/fqdns/{fqdnId}: delete: summary: FQDN löschen description: Löscht einen einzelnen FQDN tags: - FQDNs parameters: - name: id in: path required: true schema: type: string format: uuid - name: fqdnId in: path required: true schema: type: string format: uuid responses: '200': description: FQDN erfolgreich gelöscht content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '404': description: FQDN nicht gefunden /fqdns: delete: summary: Alle FQDNs global löschen description: Löscht alle FQDNs aus allen Spaces. Erfordert confirm=true Query-Parameter. tags: - FQDNs parameters: - name: confirm in: query required: true schema: type: string description: Muss "true" sein, um die Operation auszuführen example: "true" responses: '200': description: Alle FQDNs erfolgreich gelöscht content: application/json: schema: $ref: '#/components/schemas/DeleteResponse' '400': description: Bestätigung erforderlich /spaces/{spaceId}/fqdns/{fqdnId}/csr: post: summary: CSR hochladen description: Lädt einen CSR (Certificate Signing Request) im PEM-Format hoch tags: - CSRs parameters: - name: spaceId in: path required: true schema: type: string format: uuid - name: fqdnId in: path required: true schema: type: string format: uuid requestBody: required: true content: multipart/form-data: schema: type: object required: - csr - spaceId - fqdn properties: csr: type: string format: binary description: CSR-Datei im PEM-Format spaceId: type: string description: ID des Spaces fqdn: type: string description: Name des FQDNs responses: '201': description: CSR erfolgreich hochgeladen content: application/json: schema: $ref: '#/components/schemas/CSR' '400': description: Ungültige Anfrage oder ungültiges CSR-Format '404': description: Space oder FQDN nicht gefunden get: summary: CSR(s) abrufen description: Ruft CSR(s) für einen FQDN ab. Mit latest=true wird nur der neueste CSR zurückgegeben. tags: - CSRs parameters: - name: spaceId in: path required: true schema: type: string format: uuid - name: fqdnId in: path required: true schema: type: string format: uuid - name: latest in: query required: false schema: type: boolean default: false description: Wenn true, wird nur der neueste CSR zurückgegeben responses: '200': description: CSR(s) erfolgreich abgerufen content: application/json: schema: oneOf: - $ref: '#/components/schemas/CSR' - type: array items: $ref: '#/components/schemas/CSR' '404': description: FQDN nicht gefunden /spaces/{spaceId}/fqdns/{fqdnId}/csr/sign: post: summary: CSR signieren lassen description: Sendet einen CSR an einen Provider zur Signierung tags: - CSRs parameters: - name: spaceId in: path required: true schema: type: string format: uuid - name: fqdnId in: path required: true schema: type: string format: uuid requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/SignCSRRequest' responses: '200': description: CSR erfolgreich signiert content: application/json: schema: $ref: '#/components/schemas/SignCSRResponse' '400': description: Ungültige Anfrage '404': description: FQDN, CSR oder Provider nicht gefunden /spaces/{spaceId}/fqdns/{fqdnId}/certificates: get: summary: Zertifikate abrufen description: Ruft alle Zertifikate für einen FQDN ab tags: - Certificates parameters: - name: spaceId in: path required: true schema: type: string format: uuid - name: fqdnId in: path required: true schema: type: string format: uuid responses: '200': description: Liste der Zertifikate content: application/json: schema: type: array items: $ref: '#/components/schemas/Certificate' '404': description: FQDN nicht gefunden /spaces/{spaceId}/fqdns/{fqdnId}/certificates/{certId}/refresh: post: summary: Zertifikat aktualisieren description: Aktualisiert die Informationen eines Zertifikats vom Provider tags: - Certificates parameters: - name: spaceId in: path required: true schema: type: string format: uuid - name: fqdnId in: path required: true schema: type: string format: uuid - name: certId in: path required: true schema: type: string format: uuid responses: '200': description: Zertifikat erfolgreich aktualisiert content: application/json: schema: $ref: '#/components/schemas/Certificate' '404': description: Zertifikat nicht gefunden /spaces/{spaceId}/fqdns/{fqdnId}/request-certificate: post: summary: Zertifikat beantragen (ACME) description: Beantragt ein neues Zertifikat über das ACME-Protokoll für einen FQDN tags: - Certificates parameters: - name: spaceId in: path required: true schema: type: string format: uuid - name: fqdnId in: path required: true schema: type: string format: uuid requestBody: required: false content: application/json: schema: $ref: '#/components/schemas/RequestCertificateRequest' responses: '200': description: Zertifikat erfolgreich beantragt content: application/json: schema: $ref: '#/components/schemas/RequestCertificateResponse' '400': description: Ungültige Anfrage '404': description: FQDN nicht gefunden /spaces/{spaceId}/fqdns/{fqdnId}/renewal-enabled: put: summary: Auto-Renewal für FQDN aktivieren/deaktivieren description: Aktiviert oder deaktiviert die automatische Erneuerung für einen FQDN tags: - FQDNs parameters: - name: spaceId in: path required: true schema: type: string format: uuid - name: fqdnId in: path required: true schema: type: string format: uuid requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateRenewalEnabledRequest' responses: '200': description: Auto-Renewal Status erfolgreich aktualisiert content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '404': description: FQDN nicht gefunden /csrs: delete: summary: Alle CSRs global löschen description: Löscht alle CSRs aus allen Spaces. Erfordert confirm=true Query-Parameter. tags: - CSRs parameters: - name: confirm in: query required: true schema: type: string description: Muss "true" sein, um die Operation auszuführen example: "true" responses: '200': description: Alle CSRs erfolgreich gelöscht content: application/json: schema: $ref: '#/components/schemas/DeleteResponse' '400': description: Bestätigung erforderlich /renewal-queue: get: summary: Renewal Queue abrufen description: Ruft alle Einträge in der Renewal Queue ab tags: - Renewal Queue responses: '200': description: Liste der Renewal Queue Einträge content: application/json: schema: type: object properties: success: type: boolean example: true queue: type: array items: $ref: '#/components/schemas/RenewalQueueEntry' '401': description: Nicht authentifiziert delete: summary: Alle Renewal Queue Einträge löschen description: Löscht alle Einträge aus der Renewal Queue. Erfordert confirm=true Query-Parameter. tags: - Renewal Queue parameters: - name: confirm in: query required: true schema: type: string description: Muss "true" sein, um die Operation auszuführen example: "true" responses: '200': description: Alle Renewal Queue Einträge erfolgreich gelöscht content: application/json: schema: type: object properties: success: type: boolean example: true message: type: string example: "Alle Renewal Queue-Einträge erfolgreich gelöscht" deletedCount: type: integer example: 42 '400': description: Bestätigung erforderlich '401': description: Nicht authentifiziert /renewal-queue/test/create: post: summary: Test-Queue-Eintrag erstellen description: Erstellt einen Test-Eintrag in der Renewal Queue (nur für Administratoren) tags: - Renewal Queue requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateTestRenewalQueueEntryRequest' responses: '201': description: Test-Queue-Eintrag erfolgreich erstellt content: application/json: schema: $ref: '#/components/schemas/CreateTestRenewalQueueEntryResponse' '400': description: Ungültige Anfrage '403': description: Nur Administratoren dürfen Test-Einträge erstellen /renewal-queue/test/trigger: post: summary: Renewal Queue manuell auslösen description: Löst die manuelle Verarbeitung der Renewal Queue aus (nur für Administratoren) tags: - Renewal Queue responses: '200': description: Queue-Verarbeitung erfolgreich ausgelöst content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '403': description: Nur Administratoren dürfen die Queue manuell auslösen /users: get: summary: Alle Benutzer abrufen description: Ruft eine Liste aller Benutzer ab (nur für Administratoren) tags: - Users responses: '200': description: Liste der Benutzer content: application/json: schema: type: array items: $ref: '#/components/schemas/User' '403': description: Nur Administratoren dürfen Benutzer abrufen post: summary: Benutzer erstellen description: Erstellt einen neuen Benutzer (nur für Administratoren) tags: - Users requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateUserRequest' responses: '201': description: Benutzer erfolgreich erstellt content: application/json: schema: $ref: '#/components/schemas/User' '400': description: Ungültige Anfrage '403': description: Nur Administratoren dürfen Benutzer erstellen /users/{id}: get: summary: Benutzer abrufen description: Ruft einen einzelnen Benutzer ab (nur für Administratoren) tags: - Users parameters: - name: id in: path required: true schema: type: string format: uuid responses: '200': description: Benutzer erfolgreich abgerufen content: application/json: schema: $ref: '#/components/schemas/User' '404': description: Benutzer nicht gefunden '403': description: Nur Administratoren dürfen Benutzer abrufen put: summary: Benutzer aktualisieren description: Aktualisiert einen Benutzer (nur für Administratoren) tags: - Users parameters: - name: id in: path required: true schema: type: string format: uuid requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateUserRequest' responses: '200': description: Benutzer erfolgreich aktualisiert content: application/json: schema: $ref: '#/components/schemas/User' '400': description: Ungültige Anfrage '404': description: Benutzer nicht gefunden '403': description: Nur Administratoren dürfen Benutzer aktualisieren delete: summary: Benutzer löschen description: Löscht einen Benutzer (nur für Administratoren) tags: - Users parameters: - name: id in: path required: true schema: type: string format: uuid responses: '200': description: Benutzer erfolgreich gelöscht content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '404': description: Benutzer nicht gefunden '403': description: Nur Administratoren dürfen Benutzer löschen /users/{id}/avatar: get: summary: Avatar abrufen description: Ruft das Profilbild eines Benutzers ab tags: - Users parameters: - name: id in: path required: true schema: type: string format: uuid responses: '200': description: Avatar erfolgreich abgerufen content: image/png: schema: type: string format: binary '404': description: Avatar nicht gefunden post: summary: Avatar hochladen description: Lädt ein Profilbild für einen Benutzer hoch tags: - Users parameters: - name: id in: path required: true schema: type: string format: uuid requestBody: required: true content: multipart/form-data: schema: type: object required: - avatar properties: avatar: type: string format: binary description: Bilddatei (PNG, JPG, etc.) responses: '200': description: Avatar erfolgreich hochgeladen content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': description: Ungültige Datei /user/permissions: get: summary: Benutzer-Berechtigungen abrufen description: Ruft die Berechtigungen des aktuell authentifizierten Benutzers ab tags: - Users responses: '200': description: Berechtigungen erfolgreich abgerufen content: application/json: schema: $ref: '#/components/schemas/UserPermissions' /permission-groups: get: summary: Alle Berechtigungsgruppen abrufen description: Ruft eine Liste aller Berechtigungsgruppen ab (nur für Administratoren) tags: - Permission Groups responses: '200': description: Liste der Berechtigungsgruppen content: application/json: schema: type: array items: $ref: '#/components/schemas/PermissionGroup' '403': description: Nur Administratoren dürfen Berechtigungsgruppen abrufen post: summary: Berechtigungsgruppe erstellen description: Erstellt eine neue Berechtigungsgruppe (nur für Administratoren) tags: - Permission Groups requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreatePermissionGroupRequest' responses: '201': description: Berechtigungsgruppe erfolgreich erstellt content: application/json: schema: $ref: '#/components/schemas/PermissionGroup' '400': description: Ungültige Anfrage '403': description: Nur Administratoren dürfen Berechtigungsgruppen erstellen /permission-groups/{id}: get: summary: Berechtigungsgruppe abrufen description: Ruft eine einzelne Berechtigungsgruppe ab (nur für Administratoren) tags: - Permission Groups parameters: - name: id in: path required: true schema: type: string format: uuid responses: '200': description: Berechtigungsgruppe erfolgreich abgerufen content: application/json: schema: $ref: '#/components/schemas/PermissionGroup' '404': description: Berechtigungsgruppe nicht gefunden '403': description: Nur Administratoren dürfen Berechtigungsgruppen abrufen put: summary: Berechtigungsgruppe aktualisieren description: Aktualisiert eine Berechtigungsgruppe (nur für Administratoren) tags: - Permission Groups parameters: - name: id in: path required: true schema: type: string format: uuid requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdatePermissionGroupRequest' responses: '200': description: Berechtigungsgruppe erfolgreich aktualisiert content: application/json: schema: $ref: '#/components/schemas/PermissionGroup' '400': description: Ungültige Anfrage '404': description: Berechtigungsgruppe nicht gefunden '403': description: Nur Administratoren dürfen Berechtigungsgruppen aktualisieren delete: summary: Berechtigungsgruppe löschen description: Löscht eine Berechtigungsgruppe (nur für Administratoren) tags: - Permission Groups parameters: - name: id in: path required: true schema: type: string format: uuid responses: '200': description: Berechtigungsgruppe erfolgreich gelöscht content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '404': description: Berechtigungsgruppe nicht gefunden '403': description: Nur Administratoren dürfen Berechtigungsgruppen löschen /providers: get: summary: Alle Provider abrufen description: Ruft eine Liste aller Provider ab tags: - Providers responses: '200': description: Liste der Provider content: application/json: schema: type: array items: $ref: '#/components/schemas/Provider' /providers/{id}: get: summary: Provider abrufen description: Ruft einen einzelnen Provider ab tags: - Providers parameters: - name: id in: path required: true schema: type: string format: uuid responses: '200': description: Provider erfolgreich abgerufen content: application/json: schema: $ref: '#/components/schemas/Provider' '404': description: Provider nicht gefunden /providers/{id}/enabled: put: summary: Provider aktivieren/deaktivieren description: Aktiviert oder deaktiviert einen Provider tags: - Providers parameters: - name: id in: path required: true schema: type: string format: uuid requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/SetProviderEnabledRequest' responses: '200': description: Provider Status erfolgreich aktualisiert content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '404': description: Provider nicht gefunden /providers/{id}/config: put: summary: Provider-Konfiguration aktualisieren description: Aktualisiert die Konfiguration eines Providers tags: - Providers parameters: - name: id in: path required: true schema: type: string format: uuid requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateProviderConfigRequest' responses: '200': description: Provider-Konfiguration erfolgreich aktualisiert content: application/json: schema: $ref: '#/components/schemas/MessageResponse' '400': description: Ungültige Konfiguration '404': description: Provider nicht gefunden /providers/{id}/test: post: summary: Provider-Verbindung testen description: Testet die Verbindung zu einem Provider tags: - Providers parameters: - name: id in: path required: true schema: type: string format: uuid requestBody: required: false content: application/json: schema: type: object responses: '200': description: Verbindungstest erfolgreich content: application/json: schema: $ref: '#/components/schemas/ProviderTestResponse' '404': description: Provider nicht gefunden /audit-logs: get: summary: Audit-Logs abrufen description: Ruft Audit-Logs ab mit optionalen Filtern tags: - Audit Logs parameters: - name: limit in: query required: false schema: type: integer default: 100 description: Maximale Anzahl der Einträge - name: offset in: query required: false schema: type: integer default: 0 description: Offset für Paginierung responses: '200': description: Audit-Logs erfolgreich abgerufen content: application/json: schema: $ref: '#/components/schemas/AuditLogsResponse' delete: summary: Alle Audit-Logs löschen description: Löscht alle Audit-Logs tags: - Audit Logs responses: '200': description: Alle Audit-Logs erfolgreich gelöscht content: application/json: schema: $ref: '#/components/schemas/MessageResponse' /audit-logs/test: post: summary: Test-Audit-Log erstellen description: Erstellt einen Test-Audit-Log-Eintrag tags: - Audit Logs requestBody: required: false content: application/json: schema: type: object responses: '200': description: Test-Audit-Log erfolgreich erstellt content: application/json: schema: $ref: '#/components/schemas/MessageResponse' components: schemas: HealthResponse: type: object properties: status: type: string example: "ok" message: type: string example: "Backend ist erreichbar" time: type: string format: date-time example: "2024-01-15T10:30:00Z" StatsResponse: type: object properties: spaces: type: integer example: 5 fqdns: type: integer example: 12 csrs: type: integer example: 7 Space: type: object properties: id: type: string format: uuid example: "550e8400-e29b-41d4-a716-446655440000" name: type: string example: "Mein Space" description: type: string example: "Beschreibung des Spaces" createdAt: type: string format: date-time example: "2024-01-15T10:30:00Z" CreateSpaceRequest: type: object required: - name properties: name: type: string example: "Mein Space" description: type: string example: "Beschreibung des Space" FQDN: type: object properties: id: type: string format: uuid example: "660e8400-e29b-41d4-a716-446655440000" spaceId: type: string format: uuid example: "550e8400-e29b-41d4-a716-446655440000" fqdn: type: string example: "example.com" description: type: string example: "Beschreibung des FQDN" createdAt: type: string format: date-time example: "2024-01-15T10:30:00Z" renewalEnabled: type: boolean example: true description: Auto-Renewal aktiviert CreateFQDNRequest: type: object required: - fqdn properties: fqdn: type: string example: "example.com" description: type: string example: "Beschreibung des FQDN" providerId: type: string format: uuid example: "770e8400-e29b-41d4-a716-446655440000" UpdateRenewalEnabledRequest: type: object required: - renewalEnabled properties: renewalEnabled: type: boolean example: true description: Auto-Renewal aktivieren/deaktivieren Extension: type: object properties: id: type: string example: "2.5.29.37" oid: type: string example: "2.5.29.37" name: type: string example: "X509v3 Extended Key Usage" critical: type: boolean example: false value: type: string example: "301406082b0601050507030106082b06010505070302" description: type: string example: "TLS Web Server Authentication\n TLS Web Client Authentication" purposes: type: array items: type: string example: ["TLS Web Server Authentication", "TLS Web Client Authentication"] CSR: type: object properties: id: type: string format: uuid example: "770e8400-e29b-41d4-a716-446655440000" fqdnId: type: string format: uuid example: "660e8400-e29b-41d4-a716-446655440000" spaceId: type: string format: uuid example: "550e8400-e29b-41d4-a716-446655440000" fqdn: type: string example: "example.com" csrPem: type: string example: "-----BEGIN CERTIFICATE REQUEST-----\n...\n-----END CERTIFICATE REQUEST-----" subject: type: string example: "CN=example.com" publicKeyAlgorithm: type: string example: "RSA" signatureAlgorithm: type: string example: "SHA256-RSA" keySize: type: integer example: 2048 dnsNames: type: array items: type: string example: ["example.com", "www.example.com"] emailAddresses: type: array items: type: string example: ["admin@example.com"] ipAddresses: type: array items: type: string example: ["192.168.1.1"] uris: type: array items: type: string example: ["https://example.com"] extensions: type: array items: $ref: '#/components/schemas/Extension' createdAt: type: string format: date-time example: "2024-01-15T10:30:00Z" SignCSRRequest: type: object required: - providerId properties: providerId: type: string format: uuid example: "880e8400-e29b-41d4-a716-446655440000" SignCSRResponse: type: object properties: success: type: boolean example: true message: type: string example: "CSR erfolgreich signiert" certificate: type: string example: "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----" Certificate: type: object properties: id: type: string format: uuid example: "990e8400-e29b-41d4-a716-446655440000" fqdnId: type: string format: uuid example: "660e8400-e29b-41d4-a716-446655440000" spaceId: type: string format: uuid example: "550e8400-e29b-41d4-a716-446655440000" pem: type: string example: "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----" issuer: type: string example: "Let's Encrypt" expiresAt: type: string format: date-time example: "2025-01-15T10:30:00Z" createdAt: type: string format: date-time example: "2024-01-15T10:30:00Z" RequestCertificateRequest: type: object properties: confirmed: type: boolean example: false description: Bestätigung für bereits gültiges Zertifikat RequestCertificateResponse: type: object properties: success: type: boolean example: true message: type: string example: "Zertifikat erfolgreich beantragt" certificate: type: object properties: id: type: string format: uuid pem: type: string stepStatus: type: object description: Status der einzelnen Schritte des Zertifikatsanfrage-Prozesses RenewalQueueEntry: type: object properties: id: type: string format: uuid example: "aa0e8400-e29b-41d4-a716-446655440000" certificateId: type: string format: uuid example: "990e8400-e29b-41d4-a716-446655440000" fqdnId: type: string format: uuid example: "660e8400-e29b-41d4-a716-446655440000" spaceId: type: string format: uuid example: "550e8400-e29b-41d4-a716-446655440000" scheduledAt: type: string format: date-time example: "2025-01-24T03:25:13Z" status: type: string enum: [pending, processing, completed, failed] example: "pending" createdAt: type: string format: date-time example: "2024-01-15T10:30:00Z" CreateTestRenewalQueueEntryRequest: type: object required: - certificateId - fqdnId - spaceId - minutesFromNow properties: certificateId: type: string format: uuid example: "990e8400-e29b-41d4-a716-446655440000" fqdnId: type: string format: uuid example: "660e8400-e29b-41d4-a716-446655440000" spaceId: type: string format: uuid example: "550e8400-e29b-41d4-a716-446655440000" minutesFromNow: type: integer example: 5 description: Anzahl der Minuten ab jetzt, wann der Renewal ausgeführt werden soll CreateTestRenewalQueueEntryResponse: type: object properties: success: type: boolean example: true message: type: string example: "Test-Queue-Eintrag erstellt" queueId: type: string format: uuid example: "test-aa0e8400-e29b-41d4-a716-446655440000" scheduledAt: type: string format: date-time example: "2024-01-15T10:35:00Z" User: type: object properties: id: type: string format: uuid example: "bb0e8400-e29b-41d4-a716-446655440000" username: type: string example: "admin" email: type: string example: "admin@example.com" isAdmin: type: boolean example: true enabled: type: boolean example: true createdAt: type: string format: date-time example: "2024-01-15T10:30:00Z" CreateUserRequest: type: object required: - username - email - password properties: username: type: string example: "newuser" email: type: string example: "user@example.com" password: type: string example: "securePassword123" isAdmin: type: boolean example: false UpdateUserRequest: type: object properties: username: type: string example: "updateduser" email: type: string example: "updated@example.com" password: type: string example: "newPassword123" isAdmin: type: boolean example: false enabled: type: boolean example: true UserPermissions: type: object properties: isAdmin: type: boolean example: true hasFullAccess: type: boolean example: false accessibleSpaces: type: array items: type: string format: uuid example: ["550e8400-e29b-41d4-a716-446655440000"] permissions: type: object properties: canCreateSpace: type: boolean canDeleteSpace: type: boolean canCreateFqdn: type: object canDeleteFqdn: type: object canUploadCSR: type: object canSignCSR: type: object groups: type: array items: $ref: '#/components/schemas/PermissionGroup' PermissionGroup: type: object properties: id: type: string format: uuid example: "cc0e8400-e29b-41d4-a716-446655440000" name: type: string example: "Developers" description: type: string example: "Entwickler-Gruppe" permission: type: string enum: [READ, READ_WRITE, FULL_ACCESS] example: "READ_WRITE" spaceIds: type: array items: type: string format: uuid example: ["550e8400-e29b-41d4-a716-446655440000"] createdAt: type: string format: date-time example: "2024-01-15T10:30:00Z" CreatePermissionGroupRequest: type: object required: - name - permission properties: name: type: string example: "Developers" description: type: string example: "Entwickler-Gruppe" permission: type: string enum: [READ, READ_WRITE, FULL_ACCESS] example: "READ_WRITE" spaceIds: type: array items: type: string format: uuid example: ["550e8400-e29b-41d4-a716-446655440000"] UpdatePermissionGroupRequest: type: object properties: name: type: string example: "Developers" description: type: string example: "Entwickler-Gruppe" permission: type: string enum: [READ, READ_WRITE, FULL_ACCESS] example: "READ_WRITE" spaceIds: type: array items: type: string format: uuid example: ["550e8400-e29b-41d4-a716-446655440000"] Provider: type: object properties: id: type: string format: uuid example: "dd0e8400-e29b-41d4-a716-446655440000" name: type: string example: "Let's Encrypt" displayName: type: string example: "Let's Encrypt (Production)" description: type: string example: "Let's Encrypt Production CA" enabled: type: boolean example: true config: type: object description: Provider-spezifische Konfiguration SetProviderEnabledRequest: type: object required: - enabled properties: enabled: type: boolean example: true UpdateProviderConfigRequest: type: object properties: config: type: object description: Provider-spezifische Konfiguration ProviderTestResponse: type: object properties: success: type: boolean example: true message: type: string example: "Verbindung erfolgreich" AuditLogsResponse: type: object properties: logs: type: array items: $ref: '#/components/schemas/AuditLog' total: type: integer example: 100 limit: type: integer example: 100 offset: type: integer example: 0 AuditLog: type: object properties: id: type: string format: uuid example: "ee0e8400-e29b-41d4-a716-446655440000" action: type: string example: "CREATE" resourceType: type: string example: "fqdn" resourceId: type: string format: uuid example: "660e8400-e29b-41d4-a716-446655440000" userId: type: string format: uuid example: "bb0e8400-e29b-41d4-a716-446655440000" username: type: string example: "admin" details: type: object ipAddress: type: string example: "192.168.1.1" userAgent: type: string example: "Mozilla/5.0..." timestamp: type: string format: date-time example: "2024-01-15T10:30:00Z" MessageResponse: type: object properties: message: type: string example: "Operation erfolgreich" CountResponse: type: object properties: count: type: integer example: 5 DeleteResponse: type: object properties: message: type: string example: "Alle FQDNs erfolgreich gelöscht" deletedCount: type: integer example: 5 securitySchemes: basicAuth: type: http scheme: basic description: Basic HTTP Authentication