---
name: Modèle plateforme — détenteur & logo
description: Évolutions récentes du modèle Plateforme : investisseur_id (détenteur), date_ouverture, logo_filename, contrainte UNIQUE modifiée
type: project
originSessionId: b87fd892-4ff2-4b8b-b3e6-f0f92e303c8e
---
Trois champs ajoutés à la table `plateformes` via migrations dans `backend/src/db/index.js` :

- `investisseur_id` INTEGER FK → investisseurs (détenteur de la plateforme) — backfillé sur le compte principal
- `date_ouverture` TEXT (ISO)
- `logo_filename` TEXT — fichier stocké dans `data/logos/`, servi via `GET /api/logos/:filename` (statique, sans auth)

**Contrainte UNIQUE modifiée** : `UNIQUE(user_id, nom)` → `UNIQUE(user_id, nom, investisseur_id)` pour permettre la même plateforme détenue par deux investisseurs différents. Migration par recréation de table dans `index.js` (SQLite ne supporte pas DROP CONSTRAINT).

**Logo** : nommage `logo_{nom_sanitisé}_{timestamp}.{ext}` (timestamp pour éviter le cache navigateur). Upload via `POST /api/plateformes/:id/logo` (multer), suppression via `DELETE /api/plateformes/:id/logo`. Helmet configuré avec `crossOriginResourcePolicy: cross-origin`.

**Frontend** : `LOGO_BASE = (VITE_API_URL || '/api').replace(/\/api$/, '') + '/api/logos/'`. Helper `platInvestisseur(p)` reconstruit l'objet investisseur depuis les colonnes dénormalisées du JOIN.

**Why:** Permettre à plusieurs membres de la famille/entreprise de détenir chacun un compte sur la même plateforme (ex. deux comptes Tantiem).

**How to apply:** Toute requête SQL sur `plateformes` doit faire un `LEFT JOIN investisseurs inv ON inv.id = p.investisseur_id` et exposer `inv.nom AS investisseur_nom` etc. Les selects de plateforme dans les formulaires affichent `{p.nom} — {p.investisseur_nom}` pour disambiguïser.
