# Contrat d'API — PdfEditor Document de référence **partagé** entre l'agent backend (Go) et l'agent frontend (Angular). Toute évolution doit être répercutée des deux côtés. Base URL : `/api` Auth : JWT Bearer dans l'en-tête `Authorization: Bearer `. Format : JSON (sauf upload/download de fichier). ## Conventions - Codes d'erreur : `400` (validation), `401` (non authentifié), `403` (interdit), `404` (introuvable), `409` (conflit, ex. email déjà pris), `500`. - Corps d'erreur : `{ "error": "message lisible" }`. - Dates : ISO 8601 (RFC 3339). - Les `access_token` sont de courte durée (15 min). Les `refresh_token` permettent d'obtenir un nouveau couple de tokens. ## Authentification ### POST /api/auth/register Req: `{ "email": "a@b.c", "password": "..." }` Res `201`: `{ "user": { "id", "email", "created_at" }, "access_token", "refresh_token" }` ### POST /api/auth/login Req: `{ "email", "password" }` Res `200`: `{ "user": {...}, "access_token", "refresh_token" }` ### POST /api/auth/refresh Req: `{ "refresh_token": "..." }` Res `200`: `{ "access_token", "refresh_token" }` ### POST /api/auth/logout Auth requise. Invalide le refresh token courant. Res `204`. ### GET /api/me Auth requise. Res `200`: `{ "id", "email", "created_at" }` ## Documents Toutes ces routes nécessitent l'authentification. Un utilisateur ne voit que ses propres documents. ### GET /api/documents Res `200`: `{ "documents": [ { "id", "name", "size", "created_at", "updated_at" } ] }` ### POST /api/documents Upload d'un nouveau PDF. `multipart/form-data` : - `file` : le binaire PDF (obligatoire) - `name` : nom affiché (optionnel, défaut = nom du fichier) Res `201`: `{ "id", "name", "size", "created_at", "updated_at" }` ### GET /api/documents/:id Métadonnées. Res `200`: `{ "id", "name", "size", "created_at", "updated_at" }` ### GET /api/documents/:id/file Renvoie le binaire PDF. `Content-Type: application/pdf`. ### PUT /api/documents/:id Met à jour le PDF (après édition) et/ou le nom. `multipart/form-data` : - `file` : nouveau binaire PDF (optionnel) - `name` : nouveau nom (optionnel) Res `200`: métadonnées à jour. ### DELETE /api/documents/:id Res `204`. ## Santé ### GET /api/health Res `200`: `{ "status": "ok" }` — utilisé par les healthchecks/monitoring. ## Modèle de données (backend) - `users` : `id` (uuid), `email` (unique), `password_hash`, `created_at` - `refresh_tokens` : `id`, `user_id`, `token_hash`, `expires_at`, `revoked` - `documents` : `id` (uuid), `user_id` (fk), `name`, `file_path`, `size`, `created_at`, `updated_at` ## Notes d'intégration frontend - Le frontend stocke `access_token` en mémoire et `refresh_token` de façon persistante ; un intercepteur HTTP ajoute le Bearer et tente un `/auth/refresh` sur `401`. - En prod, nginx (image frontend) proxifie `/api/*` vers le service `backend:8080`. En dev (`docker-compose.local.yml`), même comportement via nginx, ou proxy Angular vers `http://localhost:8081`.