8e37eb53ff
- add `MediaImage.client.js` component that routes to `next/image` for public media and native `<img>` for private media to prevent CDN cache leaking private content - replace direct `<img>` usage in `MediaGrid` and `MediaPage` with `MediaImage` - document `MediaImage` usage and rationale in `src/features/media/README.md` - update `docs/dev/ARCHITECTURE.md` to reference the `MediaImage` wrapper convention
38 lines
3.0 KiB
Markdown
38 lines
3.0 KiB
Markdown
# Architecture partagée
|
|
|
|
Ces modules existent pour éviter la duplication. Avant d'écrire du code utilitaire, vérifier s'il est déjà couvert ici.
|
|
|
|
### Utilitaires serveur
|
|
|
|
| Besoin | Module |
|
|
|--------|--------|
|
|
| Logs serveur | `src/shared/lib/logger.js` |
|
|
| Manipulation de dates | `src/shared/lib/dates.js` |
|
|
| Configuration de l'app | `src/shared/lib/appConfig.js` |
|
|
| Formatage de devises | `src/shared/utils/currency.js` |
|
|
|
|
### Composants et icônes
|
|
|
|
**Icônes** — Toutes les icônes sont centralisées dans `src/shared/Icons.js`. Ne pas créer d'icône directement dans un composant. Si une icône manque, l'ajouter dans `Icons.js`.
|
|
|
|
**Composants** — Utiliser `src/shared/components` en priorité. Si un besoin est réutilisable à plusieurs endroits et que le composant n'existe pas encore, le créer dans `src/shared/components` plutôt que dans le module.
|
|
|
|
### Modules core
|
|
|
|
**Notifications client** — Utiliser `src/core/toast` pour toutes les notifications côté client.
|
|
|
|
**Stockage** — Utiliser `src/core/storage`. Toujours supprimer l'ancien fichier avant d'en écrire un nouveau à la même place. Éviter les fichiers fantômes (présents dans le stockage mais plus référencés dans l'app).
|
|
|
|
**Paiements** — Utiliser `src/core/payments` pour tout ce qui touche au système de paiement.
|
|
|
|
**Courriel** — Utiliser `src/core/email` pour l'envoi d'emails. Les gabarits réutilisables à l'échelle de l'app vont dans `src/core/email/templates`. Les gabarits spécifiques à un module peuvent rester dans les fichiers du module.
|
|
|
|
**Base de données** — Utiliser `src/core/database` pour toutes les communications avec la BD. Toujours utiliser des requêtes paramétrées (voir la section Sécurité ci-dessus).
|
|
|
|
**Tâches planifiées** — Utiliser `src/core/cron` pour créer des tâches cron.
|
|
|
|
**API** — Utiliser `src/core/api` pour l'API admin et publique. Définir les routes avec `defineApiRoutes()` (valide la config au démarrage). L'authentification est déclarée dans la définition de route (`auth: 'public' | 'user' | 'admin'`) — ne jamais la vérifier manuellement dans un handler. Retourner `apiSuccess()` / `apiError()` dans tous les handlers. Voir `src/core/api/README.md` pour le détail.
|
|
|
|
**Médias** — Pour gérer les fichiers attachés au contenu publié (images, PDFs, vidéos), utiliser `src/features/media`. Activable via `ZEN_MEDIA=true`. Expose `uploadMedia`/`deleteMedia`/`attachMedia`/`detachMedia` côté serveur et un composant `MediaPicker` réutilisable côté client. Voir `src/features/media/README.md`. Distinct d'un futur module `files` (style Drive/Dropbox) — ne pas confondre les deux usages.
|
|
|
|
Pour **afficher** une image média, utiliser le wrapper `MediaImage` du module (pas `<img>` direct, pas `next/image` direct). Il route les médias publics via `next/image` (srcset AVIF/WebP, lazy) et garde un `<img>` natif pour les médias privés — `/_next/image` cache la réponse optimisée par URL et fuiterait l'image privée à tous les visiteurs après le premier hit. |