riseup-squad18/SISTEMA-MENSAGENS-README.md
Seu Nome 04c6de47d5 feat: update Supabase connection details and enhance messaging functionality
- 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.
2025-11-26 00:06:50 -03:00

9.3 KiB

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:

-- ========================================
-- 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

  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:

-- 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)
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);
  1. Adicionar Realtime (mensagens instantâneas)
ALTER PUBLICATION supabase_realtime ADD TABLE public.messages;
  1. Implementar notificações

    • Badge com contador de mensagens não lidas
    • Som ao receber mensagem
    • Desktop notifications
  2. 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