RuedaPro UNIPAZ uses Supabase as its backend-as-a-service provider for authentication, database, and real-time features. This guide walks through setting up a new Supabase project from scratch.
Stores user profile information for all users (admin, docente, estudiante).
CREATE TABLE public.perfiles ( id UUID PRIMARY KEY REFERENCES auth.users(id) ON DELETE CASCADE, nombre TEXT NOT NULL, rol TEXT NOT NULL CHECK (rol IN ('admin', 'docente', 'estudiante')), avatar_url TEXT, created_at TIMESTAMPTZ DEFAULT NOW(), updated_at TIMESTAMPTZ DEFAULT NOW());-- Enable Row Level SecurityALTER TABLE public.perfiles ENABLE ROW LEVEL SECURITY;-- Create updated_at triggerCREATE OR REPLACE FUNCTION update_updated_at_column()RETURNS TRIGGER AS $$BEGIN NEW.updated_at = NOW(); RETURN NEW;END;$$ LANGUAGE plpgsql;CREATE TRIGGER update_perfiles_updated_at BEFORE UPDATE ON public.perfiles FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
CREATE TABLE public.proyectos ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), nombre TEXT NOT NULL, descripcion TEXT, categoria TEXT NOT NULL CHECK (categoria IN ('Desarrollo', 'Propuesta', 'Aplicación')), semestre TEXT NOT NULL, año INTEGER NOT NULL, estado TEXT NOT NULL DEFAULT 'Pendiente' CHECK (estado IN ('Pendiente', 'En Evaluación', 'Evaluado')), imagen_url TEXT, video_url TEXT, docente_id UUID REFERENCES public.perfiles(id) ON DELETE SET NULL, created_at TIMESTAMPTZ DEFAULT NOW(), updated_at TIMESTAMPTZ DEFAULT NOW());ALTER TABLE public.proyectos ENABLE ROW LEVEL SECURITY;CREATE TRIGGER update_proyectos_updated_at BEFORE UPDATE ON public.proyectos FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
After creating tables, apply security policies to control data access. Copy the contents of sql/rls_security_hardening.sql and run it in the SQL Editor:
-- ==========================================-- RUEDAPRO UNIPAZ: SECURITY HARDENING-- RUN THIS SCRIPT IN YOUR SUPABASE SQL EDITOR-- ==========================================-- 1. Restricciones en tabla 'perfiles'DROP POLICY IF EXISTS "Public read perfiles" ON public.perfiles;-- Los usuarios logueados pueden ver los perfilesCREATE POLICY "Authenticated read perfiles" ON public.perfilesFOR SELECTTO authenticated USING (true);-- Los usuarios no logueados solo pueden leer nombres de estudiantes-- de proyectos ganadores (estado 'Evaluado') para el Ranking Público.CREATE POLICY "Public read evaluated estudiantes" ON public.perfilesFOR SELECTTO anonUSING ( EXISTS ( SELECT 1 FROM public.proyecto_estudiantes pe JOIN public.proyectos p ON p.id = pe.proyecto_id WHERE pe.estudiante_id = perfiles.id AND p.estado = 'Evaluado' ));-- 2. Restricciones en tabla 'evaluaciones'DROP POLICY IF EXISTS "Public read evaluaciones" ON public.evaluaciones;-- Los usuarios autenticados pueden leer evaluacionesCREATE POLICY "Authenticated read evaluaciones" ON public.evaluacionesFOR SELECTTO authenticated USING (true);-- Los usuarios públicos solo pueden consultar evaluaciones -- de proyectos 'Evaluados' (para el tablero público).CREATE POLICY "Public read evaluated evaluaciones" ON public.evaluacionesFOR SELECTTO anonUSING ( EXISTS ( SELECT 1 FROM public.proyectos p WHERE p.id = evaluaciones.proyecto_id AND p.estado = 'Evaluado' ));