Files
ICON-CRM/docs/10-api.md
T

146 lines
5.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 10 API-Referenz
Alles unter `/api`, Antworten sind JSON. Zugriff mit
`Authorization: Bearer <token>`, 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; liefert zusätzlich das gefundene Foto |
| `GET /:id/photo` | das gefundene Bewerbungsfoto, unverändert (die Liste trägt nur `has_photo`) |
| `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 }` |
| `GET /config` | *admin* – Zustand der Einrichtung; der Schlüssel nur verkürzt |
| `PATCH /config` | *admin* – `{ key?, model? }`; `key: ''` entfernt ihn wieder |
| `POST /test` | *admin* – Miniaufruf gegen das Modell |
## 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`.