64 lines
1.8 KiB
PL/PgSQL
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;
|