-- Extensions and Utility Functions -- This migration creates required extensions and utility functions used across the database -- ============================================= -- 1. EXTENSIONS -- ============================================= -- Enable UUID generation CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; -- Enable password hashing CREATE EXTENSION IF NOT EXISTS "pgcrypto"; -- ============================================= -- 2. UTILITY FUNCTIONS -- ============================================= -- Function to handle updated_at timestamp CREATE OR REPLACE FUNCTION public.handle_updated_at() RETURNS TRIGGER AS $$ BEGIN NEW.updated_at = NOW(); RETURN NEW; END; $$ LANGUAGE plpgsql; -- Helper function to get current user's roles CREATE OR REPLACE FUNCTION public.get_user_roles() RETURNS TEXT[] AS $$ BEGIN RETURN ARRAY( SELECT r.name FROM public.user_roles ur JOIN public.roles r ON ur.role_id = r.id WHERE ur.user_id = auth.uid() ); END; $$ LANGUAGE plpgsql SECURITY DEFINER; -- Helper function to get current user's first role (for backward compatibility) CREATE OR REPLACE FUNCTION public.get_user_role() RETURNS TEXT AS $$ BEGIN -- Return the first role found (for backward compatibility) RETURN ( SELECT r.name FROM public.user_roles ur JOIN public.roles r ON ur.role_id = r.id WHERE ur.user_id = auth.uid() LIMIT 1 ); END; $$ LANGUAGE plpgsql SECURITY DEFINER; -- Helper function to check if user is admin CREATE OR REPLACE FUNCTION public.is_admin() RETURNS BOOLEAN AS $$ BEGIN RETURN 'admin' = ANY(public.get_user_roles()); END; $$ LANGUAGE plpgsql SECURITY DEFINER; -- Helper function to check if user has specific role CREATE OR REPLACE FUNCTION public.has_role(role_name TEXT) RETURNS BOOLEAN AS $$ BEGIN RETURN role_name = ANY(public.get_user_roles()); END; $$ LANGUAGE plpgsql SECURITY DEFINER; -- Helper function to check if user can manage experiments CREATE OR REPLACE FUNCTION public.can_manage_experiments() RETURNS BOOLEAN AS $$ BEGIN RETURN EXISTS ( SELECT 1 FROM public.user_roles ur JOIN public.roles r ON ur.role_id = r.id WHERE ur.user_id = auth.uid() AND r.name IN ('admin', 'conductor') ); END; $$ LANGUAGE plpgsql SECURITY DEFINER;