Banco de Dados
Arquitetura do Supabase, migrations, geração de tipos, tabelas principais e manutenção do banco de dados.
Arquitetura Supabase#
O Endotech usa o Supabase como backend completo, que inclui:
🐘
PostgreSQL
Banco relacional principal com JSON, FTS e extensões
🔑
Auth
Autenticação JWT, SSO, magic link
📦
Storage
Armazenamento de arquivos e anexos
🛡️
RLS
Row Level Security para controle de acesso granular
Tabelas Principais#
tickets
id, subject, body, status, priority, queue_id, assignee_id, confidence_score, extracted_data (JSONB), customer_email, created_at, updated_at
ticket_messages
id, ticket_id (FK), sender_type, sender_id, body, provider_payload (JSONB), created_at
ticket_comments
id, ticket_id (FK), author_id, body, is_internal, created_at
ticket_history
id, ticket_id (FK), actor_type, actor_id, action, old_value, new_value, created_at
ticket_attachments
id, ticket_id (FK), message_id, filename, content_type, size, storage_path, created_at
queues
id, name, slug, color, icon, description, display_order, is_active, created_at
profiles
id (FK auth.users), full_name, email, role, avatar_url, signature, is_active, created_at
queue_memberships
user_id (FK profiles), queue_id (FK queues), is_default — N:N para permissões de filas
email_accounts
id, email, display_name, imap_host, imap_port, smtp_host, smtp_port, default_queue_id, is_active, last_sync_at
email_patterns
id, name, condition_type, pattern_value, action_type, action_value, priority, email_account_id
agents
id, name, agent_type, model, system_prompt, temperature, max_tokens, confidence_threshold, queue_id (FK)
operational_settings
key (PK), value, description — configurações globais do sistema
audit_log
id, user_id, actor_type, action, resource_type, resource_id, old_data (JSONB), new_data (JSONB), ip_address, user_agent, created_at
Tabela imutável — INSERT apenas, sem UPDATE/DELETE
Migrations#
Todas as mudanças de schema do banco são versionadas como migrations SQL no diretório supabase/migrations/.
Criar nova migration
Execute no terminal, a partir da raiz do repositório:
O arquivo é criado em supabase/migrations/ com timestamp automático.
Edite o arquivo SQL
Escreva as ALTER TABLE, CREATE TABLE, índices, policies RLS, etc. Teste localmente antes de aplicar.
Aplique no banco remoto
Execute a partir do diretório do app:
Sistema aplica migrations pendentes em ordem de timestamp.
Verifique logs
Confirme no terminal que todas as migrations foram aplicadas com sucesso. Se houver erro, NÃO continue — rollback manual.
-- Adiciona fila Comercial ao sistema
INSERT INTO queues (name, slug, color, icon, description, display_order, is_active)
VALUES ('Comercial', 'comercial', '#a855f7', '💼', 'Cotações, contratos e condições', 5, true);
-- Adiciona coluna signature à tabela profiles
ALTER TABLE profiles
ADD COLUMN signature TEXT DEFAULT '';
-- Cria índice para busca por customer_email
CREATE INDEX idx_tickets_customer_email
ON tickets(customer_email);
Geração de Tipos TypeScript#
Após mudanças de schema, você deve regenerar os tipos TypeScript para manter a consistência entre banco e app. Existem dois arquivos que devem ser atualizados:
Arquivo 1: supabase/remote_types.ts
Gerado diretamente pelo Supabase CLI a partir do schema remoto. Nunca edite este arquivo à mão.
Arquivo 2: endotech/src/lib/supabase/types.ts
Cópia do remote_types.ts usada pelo app Next.js. Após gerar o remote_types.ts, copie o conteúdo para este arquivo.
npx tsc --noEmit dentro de endotech/ para verificar se o TypeScript ainda compila com os tipos atualizados.Como Adicionar uma Nova Coluna#
Exemplo completo: adicionar a coluna "signature" à tabela profiles.
- Crie a migration:
npx supabase migration new add_signature_to_profiles - Escreva o SQL:
ALTER TABLE profiles ADD COLUMN signature TEXT DEFAULT ''; - Aplique:
npx supabase db push - Regenere tipos:
npx supabase gen types typescript --linked > supabase/remote_types.ts - Copie tipos: Copie remote_types.ts para endotech/src/lib/supabase/types.ts
- Verifique:
cd endotech && npx tsc --noEmit
Políticas RLS#
Row Level Security é obrigatório em qualquer tabela nova. Use as funções helper já existentes nas policies:
get_user_role()
Retorna o papel do usuário logado (admin, manager, operator). Usada para filtrar permissões em cada policy.
is_admin_manager()
Retorna true se o usuário é admin ou manager. Usada para permitir bypass de filtros de fila em dashboards gerenciais.
ALTER TABLE nova_tabela ENABLE ROW LEVEL SECURITY; imediatamente após criar a tabela.Backups#
Backups automáticos (Supabase)
- Backups diários automáticos (retenção de 7 dias no plano gratuito)
- Point-in-time recovery disponível em planos pagos
- Acesse via Supabase Dashboard → Database → Backups
Backup manual
Para backup sob demanda antes de mudanças grandes:
Restaurando backup
- Acesse Supabase Dashboard → Database → Backups
- Selecione o backup desejado (verifique data/hora)
- Clique em "Restore"
- Confirme a operação (DESTRUTIVO — sobrescreve dados atuais)
Performance e Índices#
Query Performance
Supabase Dashboard → Database → Query Performance mostra queries mais lentas. Filtre por tempo > 1 segundo.
Conexões ativas
Monitore número de conexões. Limite padrão: 60 simultâneas no plano gratuito. Considere connection pooling se estiver chegando perto do limite.
Índices recomendados
Índices aceleram buscas nas colunas mais filtradas:
CREATE INDEX idx_tickets_queue_id ON tickets(queue_id);
CREATE INDEX idx_tickets_customer_email ON tickets(customer_email);
CREATE INDEX idx_ticket_messages_ticket_id ON ticket_messages(ticket_id);
CREATE INDEX idx_ticket_history_ticket_id ON ticket_history(ticket_id);
Sempre adicione índices via migration para versionar a mudança.
Política de Retenção de Dados#
Tickets concluídos
Manter por 2 anos. Após, arquivar ou deletar conforme LGPD.
Logs de auditoria (audit_log)
Manter por 1 ano para conformidade. Exportar antes de deletar.
Anexos (Storage)
Manter enquanto ticket existir. Deletar junto com o ticket.
✅ Resumo
- ✓ Supabase = Postgres + Auth + Storage + RLS
- ✓ Use migrations versionadas para mudanças de schema
- ✓ Regenerar tipos em AMBOS arquivos após migration
- ✓ RLS obrigatório em qualquer tabela nova
- ✓ Backups automáticos diários, manual antes de mudanças grandes
- ✓ Monitore queries lentas e crie índices quando necessário
- ✓ Retenção: tickets 2 anos, audit_log 1 ano