# 16 — API: storage su disco e documenti Leggi `CLAUDE.md`. ## Obiettivo Gestione file su disco VPS con visibilità per ruolo. ## Cosa fare - `StorageService` (interfaccia + implementazione su disco locale, radice da `UPLOAD_DIR`) così in futuro si può passare a S3/MinIO senza toccare le route. - Due aree: `public/` (servita direttamente da Caddy: immagini blog, foto) e `private/` (mai servita da Caddy, solo tramite API). - Upload admin (`@fastify/multipart`): whitelist MIME (immagini, PDF, DWG/DXF, ZIP), limite dimensione da env, nome file rigenerato (uuid) e controllo path traversal. - Route: - `POST /admin/documents` (upload + metadati, visibility), `PATCH`, `DELETE`, `GET /admin/documents`. - `GET /documents` → elenco dei documenti visibili al ruolo dell'utente (pubblici se anonimo). - `GET /documents/:id/download` → stream del file solo se il ruolo lo consente. - `POST /admin/uploads/image` → upload immagine pubblica, restituisce l'URL. ## Criteri di accettazione - Un installatore scarica documenti `installer`; un customer riceve 403 sugli stessi. - File con estensione/MIME non consentiti rifiutati; tentativi di path traversal falliscono. - I file privati non sono raggiungibili via URL statico. - `CLAUDE.md` aggiornato.