- 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.
316 lines
9.3 KiB
Markdown
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
|