🚀 Initial commit: Versão atual do TrackSteel APP
This commit is contained in:
@@ -0,0 +1,90 @@
|
||||
-- Criar tabela para logs de sessão dos usuários
|
||||
CREATE TABLE public.user_session_logs (
|
||||
id UUID NOT NULL DEFAULT gen_random_uuid() PRIMARY KEY,
|
||||
user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
|
||||
session_start TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
|
||||
session_end TIMESTAMP WITH TIME ZONE NULL,
|
||||
duration_minutes INTEGER NULL,
|
||||
ip_address INET NULL,
|
||||
user_agent TEXT NULL,
|
||||
is_active BOOLEAN NOT NULL DEFAULT true,
|
||||
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
|
||||
updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now()
|
||||
);
|
||||
|
||||
-- Criar índices para performance
|
||||
CREATE INDEX idx_user_session_logs_user_id ON public.user_session_logs(user_id);
|
||||
CREATE INDEX idx_user_session_logs_session_start ON public.user_session_logs(session_start);
|
||||
CREATE INDEX idx_user_session_logs_is_active ON public.user_session_logs(is_active);
|
||||
|
||||
-- Habilitar RLS
|
||||
ALTER TABLE public.user_session_logs ENABLE ROW LEVEL SECURITY;
|
||||
|
||||
-- Políticas RLS
|
||||
CREATE POLICY "Admins can view all session logs"
|
||||
ON public.user_session_logs
|
||||
FOR SELECT
|
||||
USING (has_role(auth.uid(), 'admin'::app_role));
|
||||
|
||||
CREATE POLICY "System can insert session logs"
|
||||
ON public.user_session_logs
|
||||
FOR INSERT
|
||||
WITH CHECK (true);
|
||||
|
||||
CREATE POLICY "System can update session logs"
|
||||
ON public.user_session_logs
|
||||
FOR UPDATE
|
||||
USING (true);
|
||||
|
||||
-- Função para atualizar updated_at
|
||||
CREATE OR REPLACE FUNCTION public.update_user_session_logs_updated_at()
|
||||
RETURNS TRIGGER AS $$
|
||||
BEGIN
|
||||
NEW.updated_at = now();
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
-- Trigger para atualizar updated_at
|
||||
CREATE TRIGGER update_user_session_logs_updated_at
|
||||
BEFORE UPDATE ON public.user_session_logs
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION public.update_user_session_logs_updated_at();
|
||||
|
||||
-- Função para finalizar sessão automaticamente
|
||||
CREATE OR REPLACE FUNCTION public.end_user_session(session_id UUID)
|
||||
RETURNS VOID AS $$
|
||||
BEGIN
|
||||
UPDATE public.user_session_logs
|
||||
SET
|
||||
session_end = now(),
|
||||
duration_minutes = EXTRACT(EPOCH FROM (now() - session_start)) / 60,
|
||||
is_active = false
|
||||
WHERE id = session_id AND is_active = true;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql SECURITY DEFINER;
|
||||
|
||||
-- Função para obter usuários online
|
||||
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.avatar_url,
|
||||
usl.session_start
|
||||
FROM public.profiles p
|
||||
INNER JOIN public.user_session_logs usl ON p.id = usl.user_id
|
||||
WHERE usl.is_active = true
|
||||
AND usl.session_start > (now() - INTERVAL '30 minutes')
|
||||
ORDER BY usl.session_start DESC;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql SECURITY DEFINER;
|
||||
Reference in New Issue
Block a user