Feature #87
closedFeature #78: Rendre accessibles des pages publiques via liens uniques sans authentification
Backend — modèle SharedLink + endpoints publics + révocation
0%
Description
Parent : #78 (liens publics uniques sans auth).
Créer l'entité Prisma `SharedLink` (token opaque **cryptographiquement aléatoire / non énumérable** + unique, `resourceType` ∈ {feuille_de_route, confirmation_date, contrat, espace_presse}, `resourceId`, `status` actif/révoqué, `createdBy`, timestamps, `expiresAt` optionnel). Endpoints PUBLIC (hors guard JWT) résolvant token→ressource en réutilisant les fonctions PUBLIC existantes (getPublicContract, submitPublicArtistForm, téléchargement dossier presse, feuille de route). Endpoints admin (sous guard) : génération + révocation. Token révoqué/expiré → échec propre (404/403 structuré, sans fuite d'info).
Stack : NestJS + Prisma + Postgres (server/), registre PUBLIC/PRIVATE existant.
## Acceptance criteria
- [ ] Migration Prisma : table SharedLink, token unique, index (resourceType, resourceId).
- [ ] Génération (admin, sous guard) → token opaque non devinable lié à la ressource.
- [ ] Révocation **immédiate** : un token précédemment valide ne résout plus.
- [ ] Endpoints publics fonctionnent sans JWT et ne renvoient que les données déjà exposées par les fonctions PUBLIC correspondantes.
- [ ] La **soumission du formulaire de confirmation** via token **enregistre correctement** les données (AC explicite du ticket).
- [ ] Token inconnu/révoqué/expiré → erreur structurée sans fuite.
- [ ] Tests backend (TDD) + lint/typecheck verts.