- Changed Supabase URL and anon key for the connection. - Added a cache buster file for page caching management. - Integrated ChatMessages component into AcompanhamentoPaciente and MensagensMedico pages for improved messaging interface. - Created new MensagensPaciente page for patient messaging. - Updated PainelMedico to include messaging functionality with patients. - Enhanced message service to support conversation retrieval and message sending. - Added a test HTML file for Supabase connection verification and message table interaction.
9.3 KiB
Sistema de Mensagens - MediConnect
📋 Status da Implementação
✅ Completado
-
Tabela
messagescriada no Supabase- Campos: id, sender_id, receiver_id, content, read, created_at
- Localização: schema
public - RLS desabilitado para testes
-
Funções SQL/RPC criadas
send_message(p_sender_id, p_receiver_id, p_content)- Envia mensagemget_messages_between_users(p_user1_id, p_user2_id)- Busca mensagens entre dois usuários
-
Código Frontend implementado
src/services/messages/messageService.ts- Serviço atualizado para usar RPCsrc/components/ChatMessages.tsx- Componente de chat criadosrc/pages/PainelMedico.tsx- Integrado sistema de mensagenssrc/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
publicnos 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:
- Aguarde 24-48 horas
- Recarregue a página do aplicativo
- 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:
- Crie um novo projeto no Supabase
- Execute o script completo abaixo
- 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:
-- ========================================
-- 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:
-- 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
- Login como médico no sistema
- Clique em "Mensagens" no menu lateral
- Na seção "Iniciar nova conversa", clique em um paciente
- Digite a mensagem no campo inferior
- Clique em "Enviar"
Paciente enviando mensagem para Médico
- Login como paciente no sistema
- Clique em "Mensagens" no menu lateral
- Na seção "Iniciar nova conversa", clique em um médico
- Digite a mensagem no campo inferior
- 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:
- Aguarde 24-48 horas
- Pause e retome o projeto: Settings → General → Pause project
- Desligue e ligue Data API: Settings → Data API → Toggle switch
- Crie novo projeto Supabase
Erro: "404 (Not Found)"
Causa: PostgREST não está expondo a função via REST API
Verificações:
-- 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)
- Habilitar RLS (Row Level Security)
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);
- Adicionar Realtime (mensagens instantâneas)
ALTER PUBLICATION supabase_realtime ADD TABLE public.messages;
-
Implementar notificações
- Badge com contador de mensagens não lidas
- Som ao receber mensagem
- Desktop notifications
-
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:
- Suporte Supabase: https://supabase.com/dashboard/support
- Discord Supabase: https://discord.supabase.com
- 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
publicestá 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