Files
photobooth-qr/supabase/migrations/20260918101500_harden_generate_unique_slug_search_path.sql
T
KevinLecou 8568b48461 Ajoute la création d'événement via n8n et refond la DA en cartes papier
- Nouvelle Edge Function create-event + RPC public.create_event : génère
  slug/admin_token/expire_at et insère l'event, réservée à service_role,
  appelée par le workflow n8n "Créer un événement" (Form Trigger, publié).
- Passe DA "polaroid poussé à fond" : les cartes d'état (chargement/erreur/
  succès), la modale de bienvenue et le formulaire passent en papier clair
  avec ruban washi tape et léger tilt, plutôt qu'en carte sombre sur fond
  sombre (ombre invisible dans l'ancienne version). Admin resté sobre/sombre
  mais cartes plus lisibles (liseré coloré, contraste renforcé).
- Générateur QR et carton imprimable : lisent maintenant ?slug= et
  ?baseUrl= pour se pré-remplir depuis le lien renvoyé par create-event.
- Correctifs : icône manquante sur "Télécharger" (admin), bug [hidden]
  anticipé sur l'état vide de la galerie invité.
2026-09-18 12:16:25 +02:00

43 lines
1.4 KiB
PL/PgSQL

-- Durcit photobooth.generate_unique_slug : le linter de sécurité Supabase
-- signale un search_path mutable (absent) sur cette fonction, introduite par
-- 20260918100000_create_event_rpc.sql. Même remède que le reste du projet
-- (public.create_event fixe déjà search_path) : figer explicitement, pour
-- empêcher qu'un search_path attaquant (ex: schéma temporaire malveillant)
-- ne fasse résoudre unaccent() ou photobooth.events vers autre chose que
-- prévu.
create or replace function photobooth.generate_unique_slug(p_source text)
returns text
language plpgsql
set search_path = photobooth, extensions, pg_temp
as $$
declare
v_base_slug text;
v_candidate text;
v_suffix integer := 1;
v_max_attempts constant integer := 1000;
begin
v_base_slug := lower(trim(both '-' from
regexp_replace(extensions.unaccent(coalesce(p_source, '')), '[^a-zA-Z0-9]+', '-', 'g')
));
if v_base_slug = '' then
v_base_slug := 'evenement';
end if;
v_candidate := v_base_slug;
while exists (select 1 from photobooth.events where slug = v_candidate) loop
v_suffix := v_suffix + 1;
v_candidate := v_base_slug || '-' || v_suffix;
if v_suffix > v_max_attempts then
raise exception 'slug_generation_failed'
using errcode = 'P0001',
detail = format('Impossible de générer un slug unique pour "%s" après %s tentatives.', p_source, v_max_attempts);
end if;
end loop;
return v_candidate;
end;
$$;