-- Limpar objetos existentes (se houver) DROP POLICY IF EXISTS "Users can view their own messages" ON public.messages; DROP POLICY IF EXISTS "Users can send messages" ON public.messages; DROP POLICY IF EXISTS "Users can update received messages" ON public.messages; DROP POLICY IF EXISTS "Users can delete sent messages" ON public.messages; DROP TRIGGER IF EXISTS messages_updated_at ON public.messages; DROP FUNCTION IF EXISTS update_messages_updated_at(); DROP TABLE IF EXISTS public.messages; -- Criar tabela de mensagens no schema public CREATE TABLE public.messages ( id UUID DEFAULT gen_random_uuid() PRIMARY KEY, sender_id UUID NOT NULL, receiver_id UUID NOT NULL, content TEXT NOT NULL, read BOOLEAN DEFAULT false, created_at TIMESTAMPTZ DEFAULT now(), updated_at TIMESTAMPTZ DEFAULT now() ); -- Criar índices para melhorar performance CREATE INDEX idx_messages_sender ON public.messages(sender_id); CREATE INDEX idx_messages_receiver ON public.messages(receiver_id); CREATE INDEX idx_messages_created_at ON public.messages(created_at DESC); CREATE INDEX idx_messages_read ON public.messages(read); -- Índice composto para queries de conversas CREATE INDEX idx_messages_conversation ON public.messages(sender_id, receiver_id, created_at DESC); -- Habilitar RLS (Row Level Security) ALTER TABLE public.messages ENABLE ROW LEVEL SECURITY; -- Política: Usuários podem ver mensagens que enviaram ou receberam CREATE POLICY "Users can view their own messages" ON public.messages FOR SELECT USING ( auth.uid() = sender_id OR auth.uid() = receiver_id ); -- Política: Usuários podem inserir mensagens onde são remetentes CREATE POLICY "Users can send messages" ON public.messages FOR INSERT WITH CHECK (auth.uid() = sender_id); -- Política: Usuários podem atualizar mensagens que receberam (para marcar como lida) CREATE POLICY "Users can update received messages" ON public.messages FOR UPDATE USING (auth.uid() = receiver_id); -- Política: Usuários podem deletar mensagens que enviaram CREATE POLICY "Users can delete sent messages" ON public.messages FOR DELETE USING (auth.uid() = sender_id); -- Função para atualizar updated_at automaticamente CREATE OR REPLACE FUNCTION update_messages_updated_at() RETURNS TRIGGER AS $$ BEGIN NEW.updated_at = now(); RETURN NEW; END; $$ LANGUAGE plpgsql; -- Trigger para atualizar updated_at CREATE TRIGGER messages_updated_at BEFORE UPDATE ON public.messages FOR EACH ROW EXECUTE FUNCTION update_messages_updated_at(); -- Habilitar realtime para a tabela messages ALTER PUBLICATION supabase_realtime ADD TABLE public.messages;