#!/usr/bin/env node /** * Script pour vérifier et créer la table professions_feminisations */ import { createClient } from '@supabase/supabase-js'; import { config } from 'dotenv'; // Charger les variables d'environnement config({ path: '.env.local' }); const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL; const supabaseServiceKey = process.env.SUPABASE_SERVICE_ROLE_KEY; if (!supabaseUrl || !supabaseServiceKey) { console.error('❌ Variables d\'environnement manquantes'); process.exit(1); } const supabase = createClient(supabaseUrl, supabaseServiceKey); async function checkAndCreateTable() { try { console.log('🔍 Vérification de la table professions_feminisations...'); // Tester si la table existe en faisant une requête simple const { data, error } = await supabase .from('professions_feminisations') .select('profession_code') .limit(1); if (error) { if (error.message.includes('does not exist')) { console.log('❌ La table n\'existe pas. Création en cours...'); // Créer la table avec SQL direct const createTableSQL = ` -- Créer la table professions_feminisations create table if not exists public.professions_feminisations ( id uuid primary key default gen_random_uuid(), profession_code varchar not null unique, profession_label varchar not null, profession_feminine varchar not null, created_at timestamptz not null default now(), updated_at timestamptz not null default now() ); -- Créer un index sur le code profession create index if not exists idx_professions_feminisations_code on public.professions_feminisations(profession_code); -- Activer RLS alter table public.professions_feminisations enable row level security; -- Policy de lecture drop policy if exists professions_feminisations_read on public.professions_feminisations; create policy professions_feminisations_read on public.professions_feminisations for select using (auth.uid() is not null); -- Policy d'écriture pour le staff drop policy if exists professions_feminisations_staff_write on public.professions_feminisations; create policy professions_feminisations_staff_write on public.professions_feminisations for all using ( exists ( select 1 from public.staff_users s where s.user_id = auth.uid() and coalesce(s.is_staff, false) = true ) ); -- Fonction pour updated_at create or replace function public.handle_updated_at() returns trigger as $$ begin new.updated_at = now(); return new; end; $$ language plpgsql; -- Trigger pour updated_at drop trigger if exists trigger_professions_feminisations_updated_at on public.professions_feminisations; create trigger trigger_professions_feminisations_updated_at before update on public.professions_feminisations for each row execute function public.handle_updated_at(); `; const { error: createError } = await supabase.rpc('exec_sql', { sql: createTableSQL }); if (createError) { console.error('❌ Erreur lors de la création de la table:', createError); // Si rpc n'existe pas, essayons une approche différente console.log('🔧 Tentative de création manuelle...'); console.log('⚠️ Veuillez exécuter manuellement cette migration dans l\'éditeur SQL de Supabase:'); console.log(createTableSQL); return; } console.log('✅ Table créée avec succès !'); } else { console.error('❌ Erreur lors de la vérification:', error); return; } } else { console.log('✅ La table existe déjà'); console.log(`📊 Nombre d'enregistrements: ${data?.length || 0}`); } // Vérifier à nouveau après création const { data: finalData, error: finalError } = await supabase .from('professions_feminisations') .select('profession_code', { count: 'exact' }) .limit(1); if (finalError) { console.error('❌ La table n\'est toujours pas accessible:', finalError); } else { console.log('✅ Table accessible et fonctionnelle'); } } catch (error) { console.error('❌ Erreur:', error); } } checkAndCreateTable();