REST API Endpoints¶
Base URL: http://localhost:3001/api
Alle Endpoints (außer /auth/login, /health und /api/info) erfordern Authorization: Bearer <jwt-token>.
Authentication¶
POST /auth/login¶
Login — gibt ein JWT-Token zurück.
Request:
Response:
POST /auth/refresh¶
Erneuert ein JWT-Token.
GET /auth/user¶
Gibt den aktuellen Benutzer zurück.
POST /auth/password¶
Ändert das Passwort des aktuellen Benutzers.
Request:
Agents¶
GET /agents¶
Alle Agenten auflisten.
POST /agents¶
Agent erstellen (Admin only).
Request:
GET /agents/:id¶
Agent-Details abrufen.
PUT /agents/:id¶
Agent aktualisieren (Admin only).
DELETE /agents/:id¶
Agent löschen (Admin only).
POST /agents/:id/test¶
Verbindung zum Agent testen (Admin only).
Jobs¶
GET /jobs¶
Alle Jobs des Benutzers auflisten (gefiltert nach user_id).
POST /jobs¶
Neuen Job erstellen.
Request:
{
"name": "Daily Report Transfer",
"type": "push",
"source_agent_id": 1,
"destination_agent_id": 2,
"source_path": "/data/reports/",
"destination_path": "/incoming/reports/",
"schedule": "0 0 6 * * *",
"description": "Täglicher Report-Transfer um 06:00"
}
GET /jobs/:id¶
Job-Details (Ownership-Prüfung — nur eigene Jobs).
PUT /jobs/:id¶
Job aktualisieren (Ownership-Prüfung).
DELETE /jobs/:id¶
Job löschen (Ownership-Prüfung).
POST /jobs/:id/run¶
Job sofort ausführen (Ownership-Prüfung). Erstellt einen neuen Transfer und dispatcht ihn an den Quell-Agenten.
Transfers¶
GET /transfers¶
Alle Transfers des Benutzers auflisten (gefiltert nach user_id über Job-Zugehörigkeit).
POST /transfers¶
Neuen Transfer erstellen.
Request:
{
"job_id": 1,
"filename": "report.csv",
"size": 1048576,
"source_path": "/data/reports/report.csv",
"destination_path": "/incoming/report.csv",
"source_agent_id": 1,
"destination_agent_id": 2
}
GET /transfers/:id¶
Transfer-Details (Ownership-Prüfung über Job-Zugehörigkeit).
POST /transfers/:id/cancel¶
Laufenden Transfer abbrechen (Ownership-Prüfung).
Tokens¶
GET /tokens¶
Alle Agent-Tokens auflisten.
POST /tokens¶
Neues Agent-Token erstellen (Admin only).
Request:
Response:
{
"token": { "id": 1, "name": "agent-prod-01", "agent_id": 1, "created_at": "...", "expires_at": null },
"value": "ffx_abc123..."
}
Token-Wert wird nur einmal angezeigt
Der value wird nur bei der Erstellung zurückgegeben. Speichern Sie ihn sofort.
DELETE /tokens/:id¶
Token widerrufen (Admin only).
File Transfer (Agent-Authentifizierung)¶
Diese Endpoints nutzen Agent-Token (nicht JWT) im Authorization: Bearer <agent-token> Header. Sie werden vom Agent für den eigentlichen Dateitransfer verwendet.
PUT /files/:transferId/upload¶
Datei hochladen.
Query Parameter:
| Param | Type | Default | Description |
|---|---|---|---|
filename |
string | file.dat |
Dateiname |
Request Body: Raw file bytes (application/octet-stream).
Limits: Max 5 GB Upload-Größe.
Response:
GET /files/:transferId/download¶
Datei herunterladen.
Response: Datei als application/octet-stream mit Content-Disposition: attachment.
Health & Info¶
GET /health¶
Health-Check (keine Authentifizierung). Prüft Datenbank-Konnektivität.
Response (healthy):
Response (unhealthy, HTTP 503):
GET /api/info¶
API-Informationen.
Agent Long-Polling (Fallback)¶
Diese Endpoints werden vom Agent als Fallback-Transport genutzt, wenn keine WebSocket-Verbindung möglich ist.
Authentifizierung erfolgt per Authorization: Bearer <agent-token>.
POST /api/agent/connect¶
Agent-Registrierung über Polling-Transport.
GET /api/agent/poll¶
Long-Polling — wartet auf neue Nachrichten vom Server.
POST /api/agent/messages¶
Agent sendet Nachrichten (Heartbeat, Transfer-Status) an den Server.
POST /api/agent/ack¶
Agent bestätigt den Empfang einer Nachricht.
Error Format¶
Alle Fehler folgen einem einheitlichen Format:
| HTTP Status | Bedeutung |
|---|---|
| 400 | Ungültige Anfrage / Validierungsfehler |
| 401 | Nicht authentifiziert |
| 403 | Unzureichende Berechtigungen |
| 404 | Ressource nicht gefunden (oder kein Zugriff) |
| 413 | Datei zu groß |
| 429 | Rate Limit überschritten |
| 500 | Interner Serverfehler |
IDOR-Schutz
Alle Single-Resource-Endpoints (/jobs/:id, /transfers/:id) prüfen die Besitzverhältnisse.
Zugriffe auf fremde Ressourcen geben 404 Not Found zurück — nicht 403 — um keine Informationen über die Existenz von Ressourcen preiszugeben.