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

316 lines
9.3 KiB
Markdown

# 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