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).
2.4 KiB
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).
- Un événement est créé dans la table
eventsavec unslugunique (utilisé dans l'URL publique) et unadmin_token(utilisé pour l'accès admin). - Un QR code pointe vers l'URL publique d'upload de l'événement
(
/e/<slug>). - 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
photospour chaque fichier. - 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. - À 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.mdetdecisions.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é).