# Sistema de Mensagens - MediConnect ## 📋 Status da Implementação ### ✅ Completado 1. **Tabela `messages` criada no Supabase** - Campos: id, sender_id, receiver_id, content, read, created_at - Localização: schema `public` - RLS desabilitado para testes 2. **Funções SQL/RPC criadas** - `send_message(p_sender_id, p_receiver_id, p_content)` - Envia mensagem - `get_messages_between_users(p_user1_id, p_user2_id)` - Busca mensagens entre dois usuários 3. **Código Frontend implementado** - `src/services/messages/messageService.ts` - Serviço atualizado para usar RPC - `src/components/ChatMessages.tsx` - Componente de chat criado - `src/pages/PainelMedico.tsx` - Integrado sistema de mensagens - `src/pages/AcompanhamentoPaciente.tsx` - Integrado sistema de mensagens ### ❌ Problema Atual **O PostgREST do Supabase não está expondo as funções RPC via API REST** Erro: `404 (Not Found)` ao chamar `/rest/v1/rpc/send_message` Mesmo após: - Pausar e retomar o projeto - Desligar e ligar Data API - Executar `NOTIFY pgrst, 'reload schema'` - Verificar que as funções existem no banco (verificado ✓) - Adicionar schema `public` nos Exposed schemas ## 🔧 Soluções Possíveis ### Opção 1: Aguardar Cache Expirar (24-48h) O cache do PostgREST em projetos gratuitos pode levar até 48 horas para atualizar automaticamente. **Passos:** 1. Aguarde 24-48 horas 2. Recarregue a página do aplicativo 3. Teste enviar uma mensagem ### Opção 2: Criar Novo Projeto Supabase Criar tudo do zero em um projeto novo geralmente resolve o problema de cache. **Passos:** 1. Crie um novo projeto no Supabase 2. Execute o script completo abaixo 3. Atualize as credenciais em `src/lib/supabase.ts` ### Opção 3: Contatar Suporte Supabase Peça para o suporte fazer restart manual do PostgREST. **Link:** https://supabase.com/dashboard/support ## 📝 Script SQL Completo Execute este script em um **novo projeto Supabase** ou aguarde o cache expirar: ```sql -- ======================================== -- SCRIPT COMPLETO - SISTEMA DE MENSAGENS -- ======================================== -- 1. Criar tabela messages 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() ); -- 2. Criar índices 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_conversation ON public.messages(sender_id, receiver_id, created_at DESC); -- 3. Desabilitar RLS (para testes) ALTER TABLE public.messages DISABLE ROW LEVEL SECURITY; -- 4. Permissões GRANT ALL ON public.messages TO anon, authenticated, service_role; -- 5. Função para enviar mensagem CREATE OR REPLACE FUNCTION public.send_message( p_sender_id UUID, p_receiver_id UUID, p_content TEXT ) RETURNS TABLE ( id UUID, sender_id UUID, receiver_id UUID, content TEXT, read BOOLEAN, created_at TIMESTAMPTZ ) LANGUAGE plpgsql SECURITY DEFINER AS $$ BEGIN RETURN QUERY INSERT INTO public.messages (sender_id, receiver_id, content, read, created_at) VALUES (p_sender_id, p_receiver_id, p_content, false, now()) RETURNING messages.id, messages.sender_id, messages.receiver_id, messages.content, messages.read, messages.created_at; END; $$; -- 6. Função para buscar mensagens CREATE OR REPLACE FUNCTION public.get_messages_between_users( p_user1_id UUID, p_user2_id UUID ) RETURNS TABLE ( id UUID, sender_id UUID, receiver_id UUID, content TEXT, read BOOLEAN, created_at TIMESTAMPTZ ) LANGUAGE sql SECURITY DEFINER AS $$ SELECT id, sender_id, receiver_id, content, read, created_at FROM public.messages WHERE (sender_id = p_user1_id AND receiver_id = p_user2_id) OR (sender_id = p_user2_id AND receiver_id = p_user1_id) ORDER BY created_at ASC; $$; -- 7. Permissões nas funções GRANT EXECUTE ON FUNCTION public.send_message TO anon, authenticated, service_role; GRANT EXECUTE ON FUNCTION public.get_messages_between_users TO anon, authenticated, service_role; -- 8. Reload do PostgREST NOTIFY pgrst, 'reload schema'; NOTIFY pgrst, 'reload config'; -- 9. Verificação SELECT 'Tabela criada:' as status, COUNT(*) as existe FROM information_schema.tables WHERE table_name = 'messages' AND table_schema = 'public'; SELECT 'Funções criadas:' as status, COUNT(*) as total FROM information_schema.routines WHERE routine_schema = 'public' AND routine_name IN ('send_message', 'get_messages_between_users'); ``` ## ⚙️ Configuração do Dashboard Supabase Após executar o script SQL: ### 1. Settings → Data API - ✅ **Enable Data API** deve estar LIGADO (verde) - ✅ **Exposed schemas** deve conter: `public` - Clique em **Save** ### 2. Testar Função via Dashboard Vá em **SQL Editor** e teste: ```sql -- Teste send_message SELECT * FROM public.send_message( '00000000-0000-0000-0000-000000000001'::uuid, '00000000-0000-0000-0000-000000000002'::uuid, 'Teste de mensagem' ); -- Teste get_messages_between_users SELECT * FROM public.get_messages_between_users( '00000000-0000-0000-0000-000000000001'::uuid, '00000000-0000-0000-0000-000000000002'::uuid ); ``` Se funcionar no SQL Editor mas não via API, é problema de cache do PostgREST. ## 🚀 Como Usar no Aplicativo ### Médico enviando mensagem para Paciente 1. Login como médico no sistema 2. Clique em **"Mensagens"** no menu lateral 3. Na seção **"Iniciar nova conversa"**, clique em um paciente 4. Digite a mensagem no campo inferior 5. Clique em **"Enviar"** ### Paciente enviando mensagem para Médico 1. Login como paciente no sistema 2. Clique em **"Mensagens"** no menu lateral 3. Na seção **"Iniciar nova conversa"**, clique em um médico 4. Digite a mensagem no campo inferior 5. Clique em **"Enviar"** ## 🐛 Troubleshooting ### Erro: "Could not find the function public.send_message" **Causa:** PostgREST não reconhece a função (problema de cache) **Soluções:** 1. Aguarde 24-48 horas 2. Pause e retome o projeto: Settings → General → Pause project 3. Desligue e ligue Data API: Settings → Data API → Toggle switch 4. Crie novo projeto Supabase ### Erro: "404 (Not Found)" **Causa:** PostgREST não está expondo a função via REST API **Verificações:** ```sql -- Verificar se função existe SELECT routine_name FROM information_schema.routines WHERE routine_schema = 'public' AND routine_name = 'send_message'; -- Verificar permissões SELECT grantee, privilege_type FROM information_schema.routine_privileges WHERE routine_name = 'send_message'; ``` ### Erro: "Erro ao carregar conversas" **Status:** Normal - a funcionalidade de listar conversas foi temporariamente desabilitada devido ao problema de cache. Você ainda pode: - Selecionar usuários da lista "Iniciar nova conversa" - Enviar e receber mensagens - As mensagens serão salvas no banco ## 📁 Arquivos Modificados ``` src/ ├── components/ │ └── ChatMessages.tsx ✅ NOVO - Componente de chat ├── services/ │ └── messages/ │ └── messageService.ts ✅ ATUALIZADO - Agora usa RPC ├── pages/ │ ├── PainelMedico.tsx ✅ ATUALIZADO - Integrado chat │ └── AcompanhamentoPaciente.tsx ✅ ATUALIZADO - Integrado chat scripts/ ├── create-messages-table.sql ✅ NOVO - Script inicial ├── force-schema-reload.sql ✅ NOVO - Script de correção └── fix-messages-permissions.sql ✅ NOVO - Script de permissões ``` ## 🎯 Próximos Passos (quando funcionar) 1. **Habilitar RLS (Row Level Security)** ```sql ALTER TABLE public.messages ENABLE ROW LEVEL SECURITY; CREATE POLICY "Users can view their messages" ON public.messages FOR SELECT USING (auth.uid() = sender_id OR auth.uid() = receiver_id); CREATE POLICY "Users can send messages" ON public.messages FOR INSERT WITH CHECK (auth.uid() = sender_id); ``` 2. **Adicionar Realtime (mensagens instantâneas)** ```sql ALTER PUBLICATION supabase_realtime ADD TABLE public.messages; ``` 3. **Implementar notificações** - Badge com contador de mensagens não lidas - Som ao receber mensagem - Desktop notifications 4. **Melhorias de UX** - Upload de arquivos/imagens - Emojis - Indicador "digitando..." - Confirmação de leitura (duas marcas azuis) ## 📞 Suporte Se após 48 horas ainda não funcionar: 1. **Suporte Supabase:** https://supabase.com/dashboard/support 2. **Discord Supabase:** https://discord.supabase.com 3. **GitHub Issues:** Relate o problema de cache do PostgREST ## ✅ Checklist Final Antes de considerar completo: - [ ] Script SQL executado sem erros - [ ] Funções aparecem em `information_schema.routines` - [ ] Data API está habilitada - [ ] Schema `public` está nos Exposed schemas - [ ] Teste via SQL Editor funciona - [ ] Aguardou 24-48h OU criou novo projeto - [ ] Aplicativo consegue enviar mensagem sem erro 404 - [ ] Mensagem aparece no banco de dados - [ ] Mensagem aparece na interface do destinatário --- **Data de criação:** 21/11/2025 **Status:** 99% completo - aguardando resolução de cache do PostgREST **Próxima ação:** Aguardar 24-48h ou criar novo projeto Supabase