44 lines
1.7 KiB
PL/PgSQL
44 lines
1.7 KiB
PL/PgSQL
-- 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';
|
|
-- ============================================================
|