216 lines
5.4 KiB
Markdown
216 lines
5.4 KiB
Markdown
# Configuração do Supabase Storage para Mensagens
|
|
|
|
## 1. Criar Bucket de Arquivos
|
|
|
|
Execute no Supabase Dashboard ou SQL Editor:
|
|
|
|
```sql
|
|
-- Criar bucket para arquivos de mensagens
|
|
INSERT INTO storage.buckets (id, name, public)
|
|
VALUES ('message-files', 'message-files', true);
|
|
```
|
|
|
|
Ou crie manualmente no painel do Supabase:
|
|
|
|
1. Acesse: Storage > Create bucket
|
|
2. Nome: `message-files`
|
|
3. Marque como "Public bucket"
|
|
4. Clique em "Create bucket"
|
|
|
|
## 2. Configurar Políticas de Storage
|
|
|
|
Execute no SQL Editor:
|
|
|
|
```sql
|
|
-- Política para upload (usuários autenticados podem fazer upload)
|
|
CREATE POLICY "Authenticated users can upload files"
|
|
ON storage.objects FOR INSERT
|
|
TO authenticated
|
|
WITH CHECK (
|
|
bucket_id = 'message-files' AND
|
|
auth.uid()::text = (storage.foldername(name))[1]
|
|
);
|
|
|
|
-- Política para leitura (qualquer pessoa pode baixar arquivos públicos)
|
|
CREATE POLICY "Anyone can download files"
|
|
ON storage.objects FOR SELECT
|
|
TO public
|
|
USING (bucket_id = 'message-files');
|
|
|
|
-- Política para atualização (usuários podem atualizar seus próprios arquivos)
|
|
CREATE POLICY "Users can update their own files"
|
|
ON storage.objects FOR UPDATE
|
|
TO authenticated
|
|
USING (
|
|
bucket_id = 'message-files' AND
|
|
auth.uid()::text = (storage.foldername(name))[1]
|
|
);
|
|
|
|
-- Política para exclusão (usuários podem deletar seus próprios arquivos)
|
|
CREATE POLICY "Users can delete their own files"
|
|
ON storage.objects FOR DELETE
|
|
TO authenticated
|
|
USING (
|
|
bucket_id = 'message-files' AND
|
|
auth.uid()::text = (storage.foldername(name))[1]
|
|
);
|
|
```
|
|
|
|
## 3. Configurar Realtime no Supabase
|
|
|
|
1. Acesse: Database > Replication
|
|
2. Habilite Realtime para as seguintes tabelas:
|
|
- `conversations`
|
|
- `messages`
|
|
- `user_presence`
|
|
- `message_attachments`
|
|
|
|
Ou execute no SQL Editor:
|
|
|
|
```sql
|
|
-- Habilitar Realtime para tabelas
|
|
ALTER PUBLICATION supabase_realtime ADD TABLE conversations;
|
|
ALTER PUBLICATION supabase_realtime ADD TABLE messages;
|
|
ALTER PUBLICATION supabase_realtime ADD TABLE user_presence;
|
|
ALTER PUBLICATION supabase_realtime ADD TABLE message_attachments;
|
|
```
|
|
|
|
## 4. Executar Migrations
|
|
|
|
Execute a migration SQL criada:
|
|
|
|
```bash
|
|
# No terminal do seu projeto
|
|
psql -h <seu-host>.supabase.co -U postgres -d postgres -f supabase/migrations/create_messaging_system.sql
|
|
```
|
|
|
|
Ou copie e cole o conteúdo de `create_messaging_system.sql` no SQL Editor do Supabase Dashboard.
|
|
|
|
## 5. Verificar Instalação
|
|
|
|
Execute no SQL Editor para verificar:
|
|
|
|
```sql
|
|
-- Verificar tabelas criadas
|
|
SELECT table_name
|
|
FROM information_schema.tables
|
|
WHERE table_schema = 'public'
|
|
AND table_name IN ('conversations', 'messages', 'user_presence', 'message_attachments', 'message_notifications');
|
|
|
|
-- Verificar bucket criado
|
|
SELECT * FROM storage.buckets WHERE id = 'message-files';
|
|
|
|
-- Verificar políticas RLS
|
|
SELECT schemaname, tablename, policyname
|
|
FROM pg_policies
|
|
WHERE tablename IN ('conversations', 'messages', 'user_presence');
|
|
|
|
-- Verificar funções criadas
|
|
SELECT routine_name
|
|
FROM information_schema.routines
|
|
WHERE routine_schema = 'public'
|
|
AND routine_name IN ('get_user_conversations', 'get_or_create_conversation', 'mark_messages_as_read');
|
|
```
|
|
|
|
## 6. Testar Sistema
|
|
|
|
Após setup, teste:
|
|
|
|
1. **Login como Paciente**
|
|
|
|
- Acesse `/mensagens-paciente`
|
|
- Deve carregar lista de conversas (vazia inicialmente)
|
|
|
|
2. **Enviar Mensagem de Texto**
|
|
|
|
- Selecione uma conversa ou inicie nova
|
|
- Digite mensagem e envie
|
|
- Deve aparecer em tempo real
|
|
|
|
3. **Upload de Arquivo**
|
|
|
|
- Clique no botão de anexo (📎)
|
|
- Selecione arquivo (máx 10MB)
|
|
- Deve fazer upload e enviar mensagem
|
|
|
|
4. **Verificar Realtime**
|
|
|
|
- Abra em duas abas (paciente e médico)
|
|
- Envie mensagem em uma aba
|
|
- Deve aparecer na outra em tempo real
|
|
|
|
5. **Status Online/Offline**
|
|
- Indicador verde deve aparecer quando usuário está online
|
|
- Deve mudar para offline ao fechar aba
|
|
|
|
## 7. Configurações Opcionais
|
|
|
|
### Limites de Upload
|
|
|
|
Para limitar tamanho de arquivos no bucket:
|
|
|
|
```sql
|
|
-- Configurar limite de 10MB
|
|
UPDATE storage.buckets
|
|
SET file_size_limit = 10485760
|
|
WHERE id = 'message-files';
|
|
```
|
|
|
|
### Tipos de Arquivo Permitidos
|
|
|
|
```sql
|
|
-- Permitir apenas certos tipos de arquivo
|
|
UPDATE storage.buckets
|
|
SET allowed_mime_types = ARRAY[
|
|
'image/jpeg',
|
|
'image/png',
|
|
'image/gif',
|
|
'application/pdf',
|
|
'application/msword',
|
|
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
|
'text/plain'
|
|
]::text[]
|
|
WHERE id = 'message-files';
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### Erro: "new row violates row-level security policy"
|
|
|
|
- Verifique se as políticas RLS estão configuradas corretamente
|
|
- Verifique se o usuário está autenticado
|
|
|
|
### Erro: "storage bucket not found"
|
|
|
|
- Verifique se o bucket `message-files` foi criado
|
|
- Verifique se o nome está correto no código
|
|
|
|
### Mensagens não aparecem em tempo real
|
|
|
|
- Verifique se Realtime está habilitado nas tabelas
|
|
- Verifique se há erros no console do browser
|
|
- Verifique conexão do Supabase Realtime
|
|
|
|
### Upload falha
|
|
|
|
- Verifique políticas de storage
|
|
- Verifique tamanho do arquivo (máx 10MB)
|
|
- Verifique tipo MIME do arquivo
|
|
|
|
## Estrutura de Pastas no Storage
|
|
|
|
```
|
|
message-files/
|
|
├── messages/
|
|
│ ├── {conversation_id}/
|
|
│ │ ├── {user_id}_{timestamp}.pdf
|
|
│ │ ├── {user_id}_{timestamp}.jpg
|
|
│ │ └── ...
|
|
```
|
|
|
|
Cada arquivo é salvo com:
|
|
|
|
- Nome único: `{user_id}_{timestamp}.{extensão}`
|
|
- Path: `messages/{conversation_id}/{nome_unico}`
|
|
- URL pública acessível via Supabase Storage
|