219 lines
4.9 KiB
Markdown
219 lines
4.9 KiB
Markdown
# REST API Übersicht (aus Client-Calls im Projekt abgeleitet)
|
||
|
||
- **Base URL**: `VITE_WEBHOOK_URL` (siehe `src/lib/config.ts -> getWebhookUrl()`)
|
||
- **Auth**:
|
||
- Cookies werden standardmäßig mitgesendet (`credentials: 'include'`)
|
||
- Falls vorhanden wird `Authorization: Bearer <token>` gesetzt (siehe `apiFetch`)
|
||
- Bei `401` wird automatisch Refresh versucht über `/auth/rnjwt`
|
||
|
||
## Auth
|
||
|
||
- **POST /auth_login**
|
||
- Headers: `Content-Type: application/json`
|
||
- Body:
|
||
```json
|
||
{ "email": "string", "password": "string" }
|
||
```
|
||
- Response:
|
||
```json
|
||
{ "token": "string", "user": { ... } }
|
||
```
|
||
|
||
- **GET /auth/rnjwt**
|
||
- Zweck: JWT Refresh
|
||
- Response:
|
||
```json
|
||
{ "token": "string" }
|
||
```
|
||
|
||
## Events
|
||
|
||
- **POST /event/new_manual**
|
||
- Headers: `Content-Type: application/json`
|
||
- Body:
|
||
```json
|
||
{
|
||
"name": "string",
|
||
"description": "string?",
|
||
"location": "string?",
|
||
"url": "string?",
|
||
"image": "string?",
|
||
"manager_name": "string?",
|
||
"manager_email": "string?",
|
||
"begin_date": "YYYY-MM-DD?",
|
||
"end_date": "YYYY-MM-DD?"
|
||
}
|
||
```
|
||
- Response: beliebiges Event-Objekt
|
||
|
||
- **GET /events/get_current**
|
||
- Response: `Event[]` oder ein einzelnes Event-Objekt
|
||
|
||
- **GET /events**
|
||
- Response: `Event[]` oder ein einzelnes Event-Objekt
|
||
|
||
- **POST /event/new_fromurl**
|
||
- Headers: `Content-Type: application/json`
|
||
- Body:
|
||
```json
|
||
{ "url": "string", "command": "eventmodus_extract_from_url" }
|
||
```
|
||
- Response: `data.message_from_ai` oder Roh-Response
|
||
|
||
## Blog
|
||
|
||
- **GET /blog/new_blog**
|
||
- Response:
|
||
```json
|
||
{ "id": "string" } // oder { "blog_id": "string" }
|
||
```
|
||
|
||
- **POST /blog/publish**
|
||
- Headers: `Content-Type: application/json`
|
||
- Body:
|
||
```json
|
||
{
|
||
"blog_id": "string",
|
||
"publish_date": "YYYY-MM-DD",
|
||
"publish_socialmedia": true,
|
||
"socialmedia_channels": ["string"],
|
||
"socialmedia_languages": ["string"]
|
||
}
|
||
```
|
||
- Response: beliebige Publikations-Infos
|
||
|
||
- **POST /blog/update**
|
||
- Headers: `Content-Type: application/json`
|
||
- Body:
|
||
```json
|
||
{
|
||
"blog_id": "string",
|
||
"content": { ... }
|
||
}
|
||
```
|
||
- Response: Update-Ergebnis
|
||
|
||
- **POST /blog/generate**
|
||
- Headers: `Content-Type: application/json`
|
||
- Body:
|
||
```json
|
||
{
|
||
"blog_Id": "string",
|
||
"topic": "string",
|
||
"tonality": "string",
|
||
"languages": ["string"]
|
||
}
|
||
```
|
||
- Response: generierter Blog-Content
|
||
|
||
- **GET /blog/topic_suggestion**
|
||
- Response:
|
||
```json
|
||
{ "topics": ["string", ...] } | ["string", ...]
|
||
```
|
||
|
||
## Dateien & Medien
|
||
|
||
- **POST /file_upload_blog**
|
||
- Body (FormData):
|
||
- `file`: File
|
||
- `blog_id`: string
|
||
- Response:
|
||
```json
|
||
{ "url": "string", ... }
|
||
```
|
||
|
||
- **POST /file_upload_event**
|
||
- Body (FormData):
|
||
- `file`: File
|
||
- `event_id`: string
|
||
- Response:
|
||
```json
|
||
{ "url": "string", ... }
|
||
```
|
||
|
||
- **POST /upload_tmp**
|
||
- Body (FormData):
|
||
- `file`: File
|
||
- Response:
|
||
```json
|
||
{ "url": "string", ... }
|
||
```
|
||
|
||
- **POST /media/image_generator**
|
||
- Headers: `Content-Type: application/json`
|
||
- Body:
|
||
```json
|
||
{ "blog_id": "string", "title": "string" }
|
||
```
|
||
- Response:
|
||
```json
|
||
{ "url": "string" } // oder { "imageUrl": "string" }
|
||
```
|
||
|
||
- Hinweis: `generateAIImage` ruft aktuell
|
||
- **POST /file_upload**
|
||
- Headers: `Content-Type: application/json`
|
||
- Body:
|
||
```json
|
||
{ "prompt": "string" }
|
||
```
|
||
- Response:
|
||
```json
|
||
{ "imageUrl": "string", ... }
|
||
```
|
||
- Anmerkung: Endpoint-Name wirkt untypisch für Image-Generation.
|
||
|
||
## Tools
|
||
|
||
- **POST /tools/speech2text**
|
||
- Body (FormData):
|
||
- `file`: Audio-Datei
|
||
- Response:
|
||
```json
|
||
{ "transcription": "string" } // oder "text", "result"
|
||
```
|
||
|
||
## Social Media
|
||
|
||
- **POST /socialmedia/post2event**
|
||
- Headers: `Content-Type: application/json`
|
||
- Body: frei, je nach Nutzungsfall (Payload für Generierung)
|
||
- Response: generierte Posts
|
||
|
||
- **POST /socialmedia/publish_post**
|
||
- Headers: `Content-Type: application/json`
|
||
- Body:
|
||
```json
|
||
{
|
||
"postId": "string",
|
||
"posts": { ... },
|
||
"images": { ... },
|
||
"scheduledTime": "string"
|
||
}
|
||
```
|
||
- Response: Veröffentlichungs-Ergebnis
|
||
|
||
## Gemeinsame Aspekte
|
||
|
||
- **Headers**
|
||
- `Content-Type: application/json` bei JSON-Requests
|
||
- FormData-Uploads ohne explizites `Content-Type` (Browser setzt Multi‑Part)
|
||
- **Auth**
|
||
- Cookies via `credentials: 'include'`
|
||
- Optionaler Bearer-Token via `Authorization`
|
||
- Auto-Refresh bei 401 über `/auth/rnjwt`, danach Retry
|
||
- **Statuscodes**
|
||
- Client erwartet `response.ok === true` bei Erfolg, sonst Fehlerwurf
|
||
- **Variabilität**
|
||
- Einige Responses sind polymorph (Array oder Objekt). Umgang entsprechend im Client.
|
||
|
||
# Beispiel: apiFetch Verhalten
|
||
|
||
- Sendet automatisch Cookies
|
||
- Fügt `Authorization: Bearer <token>` hinzu, wenn verfügbar
|
||
- Bei 401:
|
||
- versucht `GET /auth/rnjwt`
|
||
- wiederholt Request mit neuem Token
|
||
- bei erneutem 401: Logout und Fehlermeldung
|