Tous les projetsProjet 06 / 06

Shoply

Année
2024
Rôle
E-commerce · Design & dev
Stack
Next.js, TypeScript, TailwindCSS, Drizzle ORM, Turso, Better-Auth, Zustand, next-intl

E-commerce de lampes de poche : catalogue, fiches produit, panier persistant, commande, comptes clients et adresses, en français et en anglais. Refonte complète en 2026 : direction artistique « Faisceau » (la nuit, une seule lumière ambrée), lampes dessinées en SVG, hero où la lampe suit la souris et éclaire le titre, modes éco à turbo sur la fiche produit, comparatif et explorateur de portée. Côté serveur : contrôle du stock dans une transaction et correction de failles d'accès aux adresses. Paiement simulé.

Étude de cas

Le contexte

Une boutique de démonstration pour aller au bout d'un vrai parcours e-commerce : catalogue, panier, commande, comptes et adresses, en français et en anglais.

Mon rôle

Seul, puis refonte complète en 2026 (direction « Faisceau »).

Défis techniques

  1. 01

    Un stock toujours juste

    La commande vérifie le stock dans une transaction et le décrémente de façon atomique : s'il a bougé entre-temps, toute la commande est annulée.

  2. 02

    L'accès aux adresses

    Une faille permettait de modifier ou supprimer l'adresse d'un autre client (IDOR) : chaque requête vérifie maintenant le propriétaire.

  3. 03

    Des lampes dessinées en code

    Lampes en SVG paramétriques ; dans le hero, la lampe suit la souris et éclaire le titre à travers un masque.

Extrait de code

actions/checkout.tsVoir le fichier sur GitHub
// Décrément atomique : échoue (et annule tout) si le stock a bougé entre-tempsconst updated = await tx    .update(productTable)    .set({ stock: sql`${productTable.stock} - ${quantity}`, updatedAt: new Date() })    .where(and(eq(productTable.id, p.id), gte(productTable.stock, quantity)));if (updated.rowsAffected === 0) throw new ActionError(`OUT_OF_STOCK|${p.name}`);
Le « WHERE stock >= quantité » rend le décrément atomique : zéro ligne touchée, et la transaction annule tout.

Résultat

En ligne sur shoply-zeta.vercel.app, code public sur GitHub. Paiement simulé.

Shoply — Page d'accueil
Fig. 01Page d'accueil
Shoply — Fiche produit
Fig. 02Fiche produit
Shoply — La gamme
Fig. 03La gamme
Shoply — Explorateur de portée
Fig. 04Explorateur de portée
Shoply — Comparatif
Fig. 05Comparatif
Shoply — Panier
Fig. 06Panier
Shoply — Commande
Fig. 07Commande
Shoply — Confirmation
Fig. 08Confirmation
Shoply — Thème jour
Fig. 09Thème jour
© 2026 Giovanni Salcuni · Conçu & développé par moi-mêmeHeure locale (Suisse) ·
Mode présentationConfidentialité