Skip to content

Configuração do Banco de Dados

Instruções para executar o schema inicial no Supabase e habilitar as features necessárias.


1. Executar o Schema SQL

Via Supabase SQL Editor (recomendado)

  1. Acesse supabase.com/dashboard e abra seu projeto
  2. Vá em SQL Editor no menu lateral
  3. Clique em New query
  4. Abra o arquivo backend/supabase/migrations/20260518_initial_schema.sql
  5. Cole o conteúdo completo no editor
  6. Clique em Run (ou Ctrl+Enter)

Via Supabase CLI

# Autenticar
supabase login

# Linkar ao projeto (substitua <project-ref> pelo ID do seu projeto)
supabase link --project-ref <project-ref>

# Aplicar migration
supabase db push

2. Verificar as Tabelas Criadas

Após executar o SQL, verifique no Table Editor do Supabase que as seguintes tabelas foram criadas:

Tabela Descrição
profiles Perfis de usuários (admin e driver)
pricing_config Configuração de preço (base_fare, price_per_km, min_km)
deliveries Entregas com status e coordenadas
driver_locations Localização GPS atual de cada driver
wallets Carteira financeira dos drivers
transactions Histórico de créditos e débitos
withdrawals Solicitações de saque via Pix
push_subscriptions Assinaturas de Web Push dos drivers

3. Habilitar Supabase Realtime

O mapa de rastreamento e as atualizações em tempo real dependem do Supabase Realtime.

  1. No dashboard, vá em Database > Replication
  2. Clique em 0 tables ao lado de "Source"
  3. Ative as seguintes tabelas:
Tabela Usado por
driver_locations Mapa do admin (GPS em tempo real)
deliveries Lista de entregas do driver
wallets Saldo do driver em tempo real

4. Configurar Auth

Criar usuário Admin inicial

Via Supabase Dashboard > Authentication > Users > Add user:

  1. Informe email e senha
  2. Em "User Metadata", adicione:
    {
      "role": "admin",
      "full_name": "Administrador"
    }
    

O trigger on_auth_user_created cria automaticamente o registro em profiles.

Criar usuário Driver

Mesmo processo, mas com:

{
  "role": "driver",
  "full_name": "Nome do Motorista",
  "phone": "11999999999"
}

O trigger on_profile_created cria automaticamente a carteira (wallets) do driver.


5. Verificar RLS

Row Level Security (RLS) está habilitado em todas as tabelas. Para verificar:

-- No SQL Editor, execute:
SELECT schemaname, tablename, rowsecurity
FROM pg_tables
WHERE schemaname = 'public'
ORDER BY tablename;

Todas as linhas devem mostrar rowsecurity = true.


6. Pricing Config Inicial

O schema já insere uma configuração padrão:

INSERT INTO public.pricing_config (base_fare, price_per_km, min_km)
VALUES (15.00, 2.00, 5.00);

Isso significa: - Tarifa base: R$ 15,00 (inclui os primeiros 5 km) - Quilômetro adicional: R$ 2,00/km - Mínimo incluído: 5 km

Para alterar, use o endpoint PUT /api/v1/pricing como admin, ou diretamente via SQL.


7. Funções e Triggers Criados

O schema cria automaticamente:

Função/Trigger Descrição
handle_new_user() Cria profiles ao cadastrar usuário no Auth
create_driver_wallet() Cria wallets ao criar profile de driver
increment_wallet_balance(p_driver_id, p_amount) Incrementa saldo (chamada pelo backend via RPC)
decrement_wallet_balance(p_driver_id, p_amount) Decrementa saldo para saques confirmados

8. Índices de Performance

Os seguintes índices são criados automaticamente:

idx_deliveries_status       -- filtrar por status
idx_deliveries_driver       -- entregas de um driver
idx_deliveries_created      -- ordenar por data DESC
idx_deliveries_wait         -- entregas pending (fila)
idx_transactions_driver     -- transações por driver
idx_withdrawals_driver      -- saques por driver
idx_withdrawals_asaas       -- busca por asaas_transfer_id
idx_driver_locations_online -- drivers online (mapa)
idx_push_subs_driver        -- subscriptions por driver

Troubleshooting

Erro: 'relation already exists'

O schema usa CREATE TABLE IF NOT EXISTS, então é seguro re-executar. Se houver conflito em policies, use DROP POLICY IF EXISTS antes.

Resetar o banco em desenvolvimento

No SQL Editor, execute DROP SCHEMA public CASCADE; CREATE SCHEMA public; e depois re-execute o migration completo.