# PdfEditor — Frontend (Angular) Application web d'édition de PDF auto-hébergée. Frontend Angular (standalone components, routing, lazy-loading) consommant l'API REST décrite dans `../docs/API.md`. L'API est toujours appelée en chemin **relatif** `/api/...`, afin que le proxy nginx (prod) comme le proxy Angular (dev) fonctionnent sans configuration d'URL. ## Prérequis - Node.js 20+ (testé avec Node 22/24) et npm. - Angular CLI (`npm install -g @angular/cli`) ou via `npx ng`. ## Installation ```bash npm install ``` > Le fichier `package-lock.json` n'est pas fourni : il sera généré au premier > `npm install`. Pensez à le commiter ensuite (le Dockerfile l'utilise via > `npm ci` s'il est présent). ## Développement local (`ng serve` + proxy) Le backend est exposé en local sur `http://localhost:8081` par `../docker-compose.local.yml`. Le fichier `proxy.conf.json` redirige `/api` vers ce port. 1. Démarrer la base + le backend : ```bash # à la racine du dépôt docker compose -f docker-compose.local.yml up --build db backend ``` 2. Lancer le serveur de dev Angular (utilise automatiquement le proxy) : ```bash npm start # équivaut à : ng serve --proxy-config proxy.conf.json ``` 3. Ouvrir http://localhost:4200. ## Build de production ```bash npm run build # Sortie : dist/pdfeditor-frontend/browser ``` ## Docker `Dockerfile` (multi-stage : build Angular puis service nginx) et `nginx.conf` (SPA + proxy `/api` -> `http://backend:8080`) sont prévus pour `../docker-compose.yml` et `../docker-compose.local.yml` (service `frontend`, exposé sur le port 80 de l'image). ```bash # build local de l'image (depuis le dossier frontend) docker build -t pdfeditor-frontend . ``` ## Architecture ``` src/app/ ├── core/ # services transverses │ ├── auth.service.ts # login/register/refresh/logout + état utilisateur │ ├── auth.interceptor.ts # Bearer + refresh automatique sur 401 │ ├── auth.guard.ts # garde des routes protégées │ ├── documents.service.ts # CRUD /api/documents │ └── models.ts # types alignés sur le contrat d'API └── features/ ├── auth/ # pages login + register ├── dashboard/ # liste des documents sauvegardés └── editor/ # éditeur PDF (cœur du produit) ├── editor.component.* # orchestration (drag&drop, toolbar, export) ├── page-layer.component.ts # rendu d'une page + couche d'annotations ├── pdf.service.ts # rendu pdf.js + export pdf-lib ├── signature-dialog.component.ts └── annotation.model.ts ``` ## Librairies clés - **pdfjs-dist** : rendu des pages PDF dans un `` (navigation, zoom). - **pdf-lib** : aplatissement des annotations dans le PDF à l'export. - **signature_pad** : capture de la signature à main levée. - Couche d'annotations : **DOM/CSS maison** (pas de fabric/konva) — éléments simples, édition de texte et rendu d'images natifs, dépendance évitée. ## Authentification - `access_token` conservé **en mémoire** (perdu au rechargement, restauré par un refresh) ; `refresh_token` persisté dans `localStorage`. - L'intercepteur ajoute le Bearer et, sur `401`, tente un `/api/auth/refresh` unique (les requêtes concurrentes attendent puis sont rejouées).