146 lines
5.7 KiB
Markdown
146 lines
5.7 KiB
Markdown
# 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`.
|