🚀 Initial commit: Versão atual do TrackSteel APP
This commit is contained in:
@@ -0,0 +1,95 @@
|
||||
|
||||
-- Create function to check if user can be safely deleted
|
||||
CREATE OR REPLACE FUNCTION public.can_delete_user(_user_id uuid)
|
||||
RETURNS boolean
|
||||
LANGUAGE plpgsql
|
||||
SECURITY DEFINER
|
||||
AS $$
|
||||
DECLARE
|
||||
has_dependencies boolean := false;
|
||||
BEGIN
|
||||
-- Check if user has any data in critical tables
|
||||
SELECT EXISTS (
|
||||
-- Check ficha_tecnica_contratos
|
||||
SELECT 1 FROM public.ficha_tecnica_contratos WHERE user_id = _user_id
|
||||
UNION ALL
|
||||
-- Check ordens_fabricacao
|
||||
SELECT 1 FROM public.ordens_fabricacao WHERE user_id = _user_id
|
||||
UNION ALL
|
||||
-- Check tasks created or assigned
|
||||
SELECT 1 FROM public.tasks WHERE created_by = _user_id OR assigned_to = _user_id
|
||||
UNION ALL
|
||||
-- Check pecas
|
||||
SELECT 1 FROM public.pecas WHERE user_id = _user_id
|
||||
UNION ALL
|
||||
-- Check componentes_peca
|
||||
SELECT 1 FROM public.componentes_peca WHERE user_id = _user_id
|
||||
UNION ALL
|
||||
-- Check apontamentos_producao
|
||||
SELECT 1 FROM public.apontamentos_producao WHERE created_by = _user_id
|
||||
UNION ALL
|
||||
-- Check estoque_materiais
|
||||
SELECT 1 FROM public.estoque_materiais WHERE created_by = _user_id
|
||||
UNION ALL
|
||||
-- Check movimentacoes_estoque
|
||||
SELECT 1 FROM public.movimentacoes_estoque WHERE created_by = _user_id
|
||||
UNION ALL
|
||||
-- Check empenhos_material
|
||||
SELECT 1 FROM public.empenhos_material WHERE created_by = _user_id
|
||||
UNION ALL
|
||||
-- Check cronogramas_of
|
||||
SELECT 1 FROM public.cronogramas_of WHERE created_by = _user_id OR gestor_id = _user_id
|
||||
UNION ALL
|
||||
-- Check diarios_producao
|
||||
SELECT 1 FROM public.diarios_producao WHERE created_by = _user_id
|
||||
UNION ALL
|
||||
-- Check contratos_obra
|
||||
SELECT 1 FROM public.contratos_obra WHERE created_by = _user_id
|
||||
UNION ALL
|
||||
-- Check diario_obra_rdo
|
||||
SELECT 1 FROM public.diario_obra_rdo WHERE usuario_rdo = _user_id
|
||||
UNION ALL
|
||||
-- Check catalogos
|
||||
SELECT 1 FROM public.catalogos WHERE created_by = _user_id
|
||||
UNION ALL
|
||||
-- Check json_codes
|
||||
SELECT 1 FROM public.json_codes WHERE created_by = _user_id
|
||||
) INTO has_dependencies;
|
||||
|
||||
RETURN NOT has_dependencies;
|
||||
END;
|
||||
$$;
|
||||
|
||||
-- Create function to delete user and all related data (only if safe)
|
||||
CREATE OR REPLACE FUNCTION public.admin_delete_user(_user_id uuid)
|
||||
RETURNS boolean
|
||||
LANGUAGE plpgsql
|
||||
SECURITY DEFINER
|
||||
AS $$
|
||||
BEGIN
|
||||
-- Check if current user is admin
|
||||
IF NOT public.has_role(auth.uid(), 'admin'::app_role) THEN
|
||||
RAISE EXCEPTION 'Only admins can delete users';
|
||||
END IF;
|
||||
|
||||
-- Check if user can be safely deleted
|
||||
IF NOT public.can_delete_user(_user_id) THEN
|
||||
RAISE EXCEPTION 'User cannot be deleted due to existing dependencies';
|
||||
END IF;
|
||||
|
||||
-- Delete from user_roles table
|
||||
DELETE FROM public.user_roles WHERE user_id = _user_id;
|
||||
|
||||
-- Delete from profiles table
|
||||
DELETE FROM public.profiles WHERE id = _user_id;
|
||||
|
||||
-- Delete from auth.users table (this will cascade)
|
||||
DELETE FROM auth.users WHERE id = _user_id;
|
||||
|
||||
RETURN true;
|
||||
END;
|
||||
$$;
|
||||
|
||||
-- Grant execute permission to authenticated users (the function itself checks for admin role)
|
||||
GRANT EXECUTE ON FUNCTION public.can_delete_user TO authenticated;
|
||||
GRANT EXECUTE ON FUNCTION public.admin_delete_user TO authenticated;
|
||||
Reference in New Issue
Block a user