Files
photobooth-qr/docs/architecture.md
T
KevinLecou 9b1461978b Ajoute la V1 fonctionnelle : upload invité, galerie admin, QR code, backend Supabase
Schéma dédié `photobooth` (jamais exposé via PostgREST, accès exclusivement
via fonctions SECURITY DEFINER dans public) avec RLS, policies Storage sur
bucket privé event-photos, Edge Functions admin-gallery et expire-events,
et job pg_cron d'expiration J+7. Le tout déployé et testé en conditions
réelles sur le projet Supabase kevin-lecou-hub avant relecture sécurité
(faille d'abus sur insert_public_photo corrigée en cours de route).

Côté front : page upload invité (compression + HEIC + RGPD), galerie admin
avec export ZIP, générateur de QR code autonome. Workflow n8n de purge
Storage J+7 fourni (à activer manuellement côté n8n).
2026-09-16 11:32:31 +02:00

2.4 KiB

Architecture

Vue d'ensemble

Le système repose sur un flux simple, sans compte invité, avec Supabase comme unique backend (base de données + stockage de fichiers).

  1. Un événement est créé dans la table events avec un slug unique (utilisé dans l'URL publique) et un admin_token (utilisé pour l'accès admin).
  2. Un QR code pointe vers l'URL publique d'upload de l'événement (/e/<slug>).
  3. Un invité scanne le QR code, arrive sur la page d'upload, compresse ses photos côté client, puis les envoie vers Supabase Storage. Une ligne est créée dans la table photos pour chaque fichier.
  4. L'organisateur (admin) accède à la galerie via une URL contenant son admin_token (/admin/<slug>?token=...), consulte les photos, et peut déclencher un export ZIP de l'ensemble des photos de l'événement.
  5. À J+7 après la date de l'événement (pas la date de création), les photos et les métadonnées associées sont automatiquement supprimées, que le ZIP ait été téléchargé ou non (voir rgpd.md et decisions.md).

Schéma de flux

flowchart TD
    A[Invité scanne le QR code] --> B[Page d'upload publique /e/slug]
    B --> C[Compression image côté client]
    C --> D[(Supabase Storage\nbucket photos)]
    C --> E[(Table photos\nSupabase DB)]
    D --> F[Galerie admin /admin/slug?token=...]
    E --> F
    F --> G[Export ZIP de toutes les photos]
    H[Date événement + 7 jours] --> I[Suppression automatique\nphotos + storage]
    E -.expire_at atteint.-> I
    D -.expire_at atteint.-> I

Composants

Composant Rôle Techno
Page upload (publique) Formulaire de dépôt photo, sans auth HTML/CSS/JS léger
Compression image Réduction de poids avant envoi Canvas API / lib légère côté client
Supabase Storage Stockage des fichiers photo Supabase Storage (bucket photos)
Supabase DB Métadonnées événements et photos Supabase Postgres
Page galerie admin Consultation + export ZIP HTML/CSS/JS léger
Job d'expiration Suppression auto à J+7 Fonction planifiée (Supabase Edge Function / cron), à définir

Points à trancher avec Kévin avant implémentation

  • Mécanisme exact du job d'expiration (cron Supabase, Edge Function planifiée, ou script sur le VPS existant).
  • Génération et hébergement du QR code (généré à la volée ou stocké).