20260115212437_b4b309e4-4ba2-42d4-846a-9f006e76b2a6.sql 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. -- Créer une table sécurisée pour stocker les secrets de l'application
  2. CREATE TABLE IF NOT EXISTS public.app_secrets (
  3. key TEXT PRIMARY KEY,
  4. value TEXT NOT NULL,
  5. created_at TIMESTAMPTZ DEFAULT now(),
  6. updated_at TIMESTAMPTZ DEFAULT now()
  7. );
  8. -- Activer RLS
  9. ALTER TABLE public.app_secrets ENABLE ROW LEVEL SECURITY;
  10. -- Aucun accès direct - seulement via SECURITY DEFINER functions
  11. CREATE POLICY "No direct access to app_secrets" ON public.app_secrets
  12. FOR ALL USING (false);
  13. -- Mettre à jour la fonction trigger_fetch_all_feeds pour lire depuis la table
  14. CREATE OR REPLACE FUNCTION public.trigger_fetch_all_feeds()
  15. RETURNS void
  16. LANGUAGE plpgsql
  17. SECURITY DEFINER
  18. SET search_path TO 'public'
  19. AS $func$
  20. DECLARE
  21. feed_record RECORD;
  22. cron_secret TEXT;
  23. BEGIN
  24. -- Récupérer le secret depuis la table app_secrets
  25. SELECT value INTO cron_secret FROM public.app_secrets WHERE key = 'cron_secret';
  26. IF cron_secret IS NULL OR cron_secret = '' THEN
  27. RAISE WARNING 'cron_secret not configured in app_secrets table';
  28. RETURN;
  29. END IF;
  30. FOR feed_record IN
  31. SELECT id, url FROM public.feeds WHERE status = 'active'
  32. LOOP
  33. PERFORM net.http_post(
  34. url := 'https://wftyukugedtojizgatwj.supabase.co/functions/v1/fetch-rss',
  35. headers := jsonb_build_object(
  36. 'Content-Type', 'application/json',
  37. 'x-cron-secret', cron_secret
  38. ),
  39. body := jsonb_build_object(
  40. 'feedId', feed_record.id,
  41. 'feedUrl', feed_record.url
  42. )
  43. );
  44. END LOOP;
  45. END;
  46. $func$;
  47. -- Mettre à jour la fonction trigger_purge_articles pour lire depuis la table
  48. CREATE OR REPLACE FUNCTION public.trigger_purge_articles()
  49. RETURNS void
  50. LANGUAGE plpgsql
  51. SECURITY DEFINER
  52. SET search_path TO 'public'
  53. AS $func$
  54. DECLARE
  55. cron_secret TEXT;
  56. BEGIN
  57. -- Récupérer le secret depuis la table app_secrets
  58. SELECT value INTO cron_secret FROM public.app_secrets WHERE key = 'cron_secret';
  59. IF cron_secret IS NULL OR cron_secret = '' THEN
  60. RAISE WARNING 'cron_secret not configured in app_secrets table';
  61. RETURN;
  62. END IF;
  63. PERFORM net.http_post(
  64. url := 'https://wftyukugedtojizgatwj.supabase.co/functions/v1/purge-articles',
  65. headers := jsonb_build_object(
  66. 'Content-Type', 'application/json',
  67. 'x-cron-secret', cron_secret
  68. ),
  69. body := '{"scheduled": true}'::jsonb
  70. );
  71. END;
  72. $func$;