diff --git a/docs/10-api.md b/docs/10-api.md new file mode 100644 index 0000000..b62ea36 --- /dev/null +++ b/docs/10-api.md @@ -0,0 +1,141 @@ +# 10 API-Referenz + +Alles unter `/api`, Antworten sind JSON. Zugriff mit +`Authorization: Bearer `, sofern nicht anders vermerkt. Bei `401` +verwirft das Frontend das Token und zeigt den Anmeldeschirm; `403` bedeutet +fehlende Rolle. + +| Vermerk | Bedeutung | +| --- | --- | +| *offen* | ohne Anmeldung erreichbar | +| *admin* | nur Rolle `admin` | +| *Token* | fester Token statt JWT (Systemschnittstelle) | + +## Gesundheit + +| Endpunkt | | +| --- | --- | +| `GET /api/health` | *offen* – `{"ok":true,"db":"up"}` | + +## Anmeldung – `/api/auth` + +| Endpunkt | Zweck | +| --- | --- | +| `POST /login` | *offen* – `{ identifier, password }` → `{ token, user }`; SHA-256-Hashes des Altbestands werden dabei auf bcrypt umgeschrieben | +| `GET /me` | angemeldeter Benutzer | +| `PATCH /me` | Farbe, Foto, Design, hell/dunkel | +| `POST /change-password` | `{ currentPassword, newPassword }` | + +## Benutzer – `/api/users` + +| Endpunkt | Zweck | +| --- | --- | +| `GET /directory` | Liste für Erwähnungen, Zuständigkeiten, Historie – **jede Rolle**, nie mit Hashes | +| `GET /` | *admin* – vollständige Liste | +| `POST /`, `PATCH /:id`, `DELETE /:id` | *admin* – anlegen, ändern, löschen | + +Der letzte aktive Administrator lässt sich nicht degradieren, deaktivieren oder +löschen. + +## Unternehmen – `/api/companies` + +| Endpunkt | Zweck | +| --- | --- | +| `GET /` | Liste mit Filtern | +| `GET /options` | Namen und Gruppen für Auswahlfelder | +| `GET /:id` | Karte samt Kontakten, Werdegang, Gesprächen, Historie | +| `POST /`, `PATCH /:id`, `DELETE /:id` | anlegen, ändern, löschen | +| `POST /:id/interviews` | Gespräch festhalten | + +## Kontakte – `/api/contacts` + +| Endpunkt | Zweck | +| --- | --- | +| `GET /` | Liste mit Filtern | +| `GET /last-employers` | frühere Arbeitgeber je Kontakt (für „Ehemalige") | +| `GET /:id` | Karte samt Werdegang, Gesprächen, Verbindungen, Historie | +| `POST /`, `PATCH /:id`, `DELETE /:id` | anlegen, ändern, löschen | +| `POST /:id/interviews` | Gespräch festhalten | +| `GET /:id/cv` | hochgelegten Lebenslauf herunterladen (Bearer nötig) | +| `POST /linkedin-photo` | Profilfoto aus der öffentlichen Open-Graph-Vorschau | + +## Ausschreibungen – `/api/tenders` + +`GET /`, `GET /:id`, `POST /`, `PATCH /:id`, `DELETE /:id`. Über `PATCH` laufen +auch Phasenwechsel, der Schalter `online` und die Zuweisung von Kontakten. + +## Projekte – `/api/projects` + +`GET /`, `POST /`, `PATCH /:id`, `DELETE /:id`. + +## Leads – `/api/leads` + +| Endpunkt | Zweck | +| --- | --- | +| `GET /` | Pipeline; `archived` entscheidet über Kanban oder Archiv | +| `GET /reminders` | fällige Erinnerungen – vom `ReminderWatcher` beim Anmelden und stündlich | +| `GET /:id` | Karte samt ToDos und Historie | +| `POST /`, `PATCH /:id`, `DELETE /:id` | anlegen, ändern (auch Spalte und Reihenfolge), löschen | +| `POST /:id/acknowledge` | Erinnerung quittieren: erledigt oder in n Tagen erneut | +| `POST /:id/todos`, `PATCH /todos/:todoId`, `DELETE /todos/:todoId` | Checkliste | + +## CV-Import – `/api/cvs` + +| Endpunkt | Zweck | +| --- | --- | +| `GET /` | Eingang, Screening, Auswahl | +| `POST /` | hochladen (mehrere, je 15 MB) | +| `POST /:id/analyze` | auslesen lassen – der einzige Schritt, der die KI ruft | +| `POST /:id/accept` | Vorschlag bestätigen → Kontakt anlegen | +| `POST /:id/reject` | verwerfen | +| `GET /:id/file` | Datei herunterladen | +| `DELETE /:id` | Eintrag entfernen | + +## KI – `/api/ai` + +| Endpunkt | Zweck | +| --- | --- | +| `GET /status` | `{ configured, model }` – steuert, ob die Knöpfe erscheinen | +| `POST /text` | Schreibhilfe: `{ task, text, prompt }` | + +## Suche – `/api/search` + +| Endpunkt | Zweck | +| --- | --- | +| `GET /?q=` | normale Suche über alle Bereiche, `LIKE` | +| `GET /mentions?q=` | Vorschläge für `@` | +| `POST /ai` | erweiterte Suche: `{ question }` → `{ answer, refs, model, truncated }` | + +## Netzwerk, Verbindungen, Historie, Stammdaten, Dashboard + +| Endpunkt | Zweck | +| --- | --- | +| `GET /api/network` | Knoten und Kanten für die Netzwerkansicht | +| `GET/POST/PATCH/DELETE /api/connections` | „kennt"-Verbindungen zwischen Kontakten | +| `GET /api/history`, `POST /api/history`, `DELETE /api/history/:id` | Verlauf lesen, Notiz schreiben, Eintrag entfernen | +| `GET/POST/PATCH/DELETE /api/options` | Stammdaten (Schreiben *admin*) | +| `GET /api/dashboard` | Kennzahlen und letzte Tätigkeiten | + +## perinco – `/api/perinco` + +| Endpunkt | Zweck | +| --- | --- | +| `GET /status` | `{ configured, url }` – ohne Einrichtung bleibt das Häkchen unsichtbar | +| `GET /contacts` | Kontakte des perinco CRM, gelesen über einen gemeinsamen Zwischenspeicher; wirft nie, sondern liefert im Fehlerfall eine leere Liste | + +## Systemschnittstelle – `/api/integrations` + +| Endpunkt | Zweck | +| --- | --- | +| `GET /contacts` | *Token* – die ICON-Kontakte für das perinco CRM. Nur Lesen, `PERINCO_INBOUND_TOKEN`, Vergleich mit `timingSafeEqual` | + +## Öffentlich – `/api/public` + +| Endpunkt | Zweck | +| --- | --- | +| `GET /tenders` | *offen* – Ausschreibungen mit `online = 1` und `status <> 'Archiviert'`, neueste zuerst | +| `GET /tenders/:id` | *offen* – eine davon | + +Beide antworten mit `Access-Control-Allow-Origin: *` und +`Cache-Control: public, max-age=60` und liefern nur `id`, `title`, `status`, +`notes`, `created_at`, `updated_at`.