Enaje
Site vitrine et back-office pour deux boutiques de créateurs
- Projet client
- Projet privé

Site des boutiques Enaje et Jane, à Nantes — bijoux de créateurs et objets de décoration. La gérante compose et modifie ses pages depuis un back-office, sans toucher au code et sans pouvoir casser la direction artistique. Le site remplace une version antérieure vulnérable aux injections SQL.
Le besoin de départ
La cliente dépendait d’un tiers pour la moindre modification de contenu, sur un site dont la sécurité était par ailleurs compromise. Elle voulait reprendre la main sans devenir webmestre pour autant.
- Période
- 2026
- Rôle
- Conception et développement, du schéma SQL au back-office
- Technologies
- SvelteKitTypeScriptFastifyZodMariaDBargon2idDocker
Ce que ça fait
Principales fonctionnalités
- Pages composées à partir d’un catalogue de onze blocs prédéfinis
- Galeries filtrables par boutique
- Fiches créateurs, rattachables à l’une ou l’autre boutique
- Back-office intégré au site, accessible sur /admin
- Contenus et réglages modifiables sans intervention technique
Ma contribution
Réalisation complète : schéma SQL, API Fastify, site public en rendu serveur et back-office. Les schémas de validation sont partagés entre le serveur et l’administration, ce qui supprime la duplication des règles.
Aperçu
En images
Ce qui a résisté
Difficultés techniques
Les problèmes qui ont demandé une décision, et ce que j’ai tranché.
Problème 01
Laisser la cliente composer ses pages librement, sans qu’elle puisse casser la direction artistique « chic et épuré » qu’elle avait demandée.
Solution
Plutôt qu’un éditeur libre, un catalogue de onze blocs prédéfinis, chacun repris d’un motif de ses maquettes : carrousel, grille de cartes, texte-image, galerie filtrable, grille de créateurs. Le contenu de chaque bloc est stocké en JSON et validé par le schéma Zod de son type. Elle peut donc tout réorganiser sans que le site cesse de lui ressembler.
Problème 02
L’ancien site était vulnérable aux injections SQL, et je ne voulais pas d’un ORM pour autant.
Solution
Tout passe par trois fonctions unifiées adossées à `execute()` de mysql2 : des requêtes préparées, où les valeurs voyagent séparément du SQL et ne peuvent donc jamais être interprétées comme de la syntaxe. Le SQL reste écrit à la main et lisible, sans couche d’abstraction à déboguer.
Problème 03
Le lien « Administration » du site public devait apparaître pour une session ouverte — sans faire payer une requête de vérification à chaque visiteur ordinaire.
Solution
Le cookie de session est `httpOnly` : seul le rendu serveur peut le voir. Son absence suffit à conclure, aucun appel réseau n’est déclenché pour un visiteur anonyme. La validité, elle, est confirmée auprès de l’API — un cookie falsifié n’affiche rien.