Files
tracksteel_app/supabase/migrations/20250719163337-c8c7e589-d0d0-4d7b-a120-aa488ed4cb95.sql

64 lines
1.8 KiB
PL/PgSQL

-- Adicionar coluna online na tabela profiles
ALTER TABLE public.profiles ADD COLUMN IF NOT EXISTS online boolean DEFAULT false;
-- Criar função para marcar usuário como online
CREATE OR REPLACE FUNCTION public.set_user_online(user_id_param uuid)
RETURNS void AS $$
BEGIN
UPDATE public.profiles
SET online = true, updated_at = now()
WHERE id = user_id_param;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;
-- Criar função para marcar usuário como offline
CREATE OR REPLACE FUNCTION public.set_user_offline(user_id_param uuid)
RETURNS void AS $$
BEGIN
UPDATE public.profiles
SET online = false, updated_at = now()
WHERE id = user_id_param;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;
-- Atualizar função get_online_users para usar a nova coluna
CREATE OR REPLACE FUNCTION public.get_online_users()
RETURNS TABLE(
user_id UUID,
email TEXT,
full_name TEXT,
avatar_url TEXT,
session_start TIMESTAMP WITH TIME ZONE
) AS $$
BEGIN
RETURN QUERY
SELECT
p.id,
p.email,
p.full_name,
p.profile_image_url as avatar_url,
p.updated_at as session_start
FROM public.profiles p
WHERE p.online = true
ORDER BY p.updated_at DESC;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;
-- Criar função para verificar e limpar usuários offline (executada periodicamente)
CREATE OR REPLACE FUNCTION public.cleanup_offline_users()
RETURNS void AS $$
BEGIN
-- Marcar como offline usuários que não tem sessão ativa há mais de 5 minutos
UPDATE public.profiles
SET online = false, updated_at = now()
WHERE online = true
AND id NOT IN (
SELECT DISTINCT usl.user_id
FROM public.user_session_logs usl
WHERE usl.is_active = true
AND usl.session_start > (now() - INTERVAL '5 minutes')
);
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;