-- Migración 005: Sistema de roles de usuario -- Roles definidos para ser extensibles sin reescribir lógica: -- admin: acceso total -- internal_staff: acceso completo, sin gestión de usuarios (futuro uso) -- external_availability_viewer: solo ve ocupado/libre (Teneriffa) CREATE TYPE user_role AS ENUM ('admin', 'internal_staff', 'external_availability_viewer'); CREATE TABLE public.user_profiles ( id UUID PRIMARY KEY REFERENCES auth.users(id) ON DELETE CASCADE, email TEXT NOT NULL, role user_role NOT NULL DEFAULT 'admin', display_name TEXT, created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL ); ALTER TABLE public.user_profiles ENABLE ROW LEVEL SECURITY; -- Los usuarios pueden leer su propio perfil CREATE POLICY "Users can read own profile" ON public.user_profiles FOR SELECT TO authenticated USING (auth.uid() = id); -- Solo admin puede gestionar perfiles (INSERT/UPDATE/DELETE se hace via service_role en el API) -- Función para obtener el rol del usuario actual (usada en otras policies RLS) CREATE OR REPLACE FUNCTION public.get_user_role() RETURNS user_role AS $$ SELECT role FROM public.user_profiles WHERE id = auth.uid(); $$ LANGUAGE sql SECURITY DEFINER STABLE; COMMENT ON FUNCTION public.get_user_role IS 'Devuelve el rol del usuario autenticado actual. Usada en políticas RLS.'; -- ============================================================ -- ACCIÓN MANUAL REQUERIDA antes de ejecutar migración 009: -- Insertar perfil admin para el usuario actual: -- -- INSERT INTO public.user_profiles (id, email, role) -- SELECT id, email, 'admin' -- FROM auth.users -- WHERE email = 'tu-email@ejemplo.com'; -- ============================================================