Skip to content

Conexões

O servidor gerencia conexões com bancos de dados e serviços HTTP usados pelos datasources dos relatórios. Conexões são armazenadas com criptografia (quando ENCRYPTION_KEY está configurado) e testadas automaticamente na criação.

Todos os endpoints de conexão requerem a permissão canSettings.

Tipos de conexão

Database

Para PostgreSQL e outros bancos via postgres ou postgrest driver:

json
{
  "name": "my-postgres",
  "type": "database",
  "host": "db.example.com",
  "port": 5432,
  "database": "mydb",
  "username": "user",
  "password": "secret",
  "ssl": true,
  "extra": { "schema": "public" }
}
CampoObrigatórioDefaultDescrição
nameSimIdentificador único da conexão
typeSimdatabase
hostSimHost do banco
portNão5432Porta
databaseSimNome do banco
usernameSimUsuário
passwordSimSenha
sslNãotrueUsar SSL
extraNãoConfigurações extras (driver-specific)

HTTP

Para APIs REST e PostgREST:

json
{
  "name": "my-api",
  "type": "http",
  "baseUrl": "https://api.example.com",
  "defaultHeaders": { "X-Token": "abc123" },
  "extra": { "timeout": 30 }
}
CampoObrigatórioDefaultDescrição
nameSimIdentificador único da conexão
typeSimhttp
baseUrlSimURL base
defaultHeadersNãoHeaders padrão para todas as requests
extraNãoConfigurações extras

Sanitização de respostas

As respostas de GET omitem dados sensíveis:

TipoCampos retornadosCampos omitidos
databasename, type, host, port, database, sslusername, password, extra
httpname, type, baseUrldefaultHeaders, extra

Criptografia at-rest

Quando ENCRYPTION_KEY está configurado, os campos sensíveis são criptografados usando AES-256-GCM (via EnvelopeEncryptor):

TipoCampos criptografados
databasepassword, username, extra
httpdefaultHeaders, extra

Os dados criptografados são armazenados em um campo _encrypted. Suporta rotação de chave via ENCRYPTION_KEY_PREV — entradas legadas em texto plano são migradas automaticamente no próximo upsert.

Endpoints

Listar — GET /api/v1/connections

Query params: ?page=1&limit=20 (paginação opcional)

Resposta 200: Array de conexões sanitizadas.


Detalhes — GET /api/v1/connections/:name

Resposta 200: Conexão sanitizada.

StatusErroQuando
404not_foundNome não encontrado

Criar — POST /api/v1/connections

Body: JSON completo da conexão (veja tipos acima).

Resposta 201: Conexão sanitizada.

Auto-teste

Após armazenar, o servidor testa automaticamente a conexão. Se o teste falha, a conexão é removida e retorna 422 connection_failed.

StatusErroQuando
400missing_namename ausente
400invalid_typetype inválido
409already_existsJá existe uma conexão com esse nome
422connection_failedTeste de conectividade falhou

Atualizar — PUT /api/v1/connections/:name

Body: JSON completo da conexão (o name da URL é usado).

Resposta 200: Conexão sanitizada.

Rollback automático

Se o teste da conexão atualizada falha, a entrada anterior é restaurada.

StatusErroQuando
400invalid_typetype inválido
404not_foundNome não encontrado
422type_change_forbiddenTentativa de mudar databasehttp
422connection_failedTeste de conectividade falhou

Excluir — DELETE /api/v1/connections/:name

Resposta 200:

json
{ "deleted": "my-postgres" }
StatusErroQuando
404not_foundNome não encontrado

Testar — POST /api/v1/connections/:name/test

Testa a conectividade sem modificar a conexão armazenada.

Resposta 200:

json
{ "status": "ok", "latency_ms": 42 }
StatusErroQuando
404not_foundNome não encontrado
422connection_failedTeste falhou (inclui latency_ms)

Mecanismo de teste:

  • Database: executa SELECT 1 AS ping via postgres resolver
  • HTTP: faz GET na URL base via REST resolver

Exemplo

bash
# Criar conexão
curl -X POST http://localhost:8080/api/v1/connections \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "producao",
    "type": "database",
    "host": "db.example.com",
    "port": 5432,
    "database": "mydb",
    "username": "reader",
    "password": "s3cret",
    "ssl": true
  }'

# Listar (sem dados sensíveis)
curl http://localhost:8080/api/v1/connections \
  -H "Authorization: Bearer $TOKEN"

# Testar conectividade
curl -X POST http://localhost:8080/api/v1/connections/producao/test \
  -H "Authorization: Bearer $TOKEN"

Sulfite do 🇧🇷 para o mundo © 2026 Rafael S. Pinheiro