Files
core/docs/dev/ARCHITECTURE.md
T
hykocx 8e37eb53ff feat(media): add MediaImage wrapper to handle public/private image rendering
- 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
2026-04-26 19:18:35 -04:00

3.0 KiB

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.