Mapeamento de Banco de Dados — API Keys
Pilar: 04 — Banco de Dados / Tabelas
Status: 🟢 Implementado
Última Revisão Técnica: 2026-08-03
Módulos Conectados:gatein-server(app/models.py,app/api/web/apiKey.py)
1. Visão Geral da Modelagem
Diferente de sistemas que utilizam uma tabela dedicada N:1 para API Keys, a arquitetura do Gatein armazena os pares de chaves de integração diretamente como atributos na tabela companies. Essa decisão simplifica a consulta de middleware e garante acesso em tempo constante O(1) sem JOINs desnecessários nas requisições operacionais de alta frequência.
2. Atributos Físicos de API Keys na Tabela companies
| Nome da Coluna | Tipo SQL | Constraints | Descrição / Regra |
|---|---|---|---|
api_key_prefix | VARCHAR(16) | NULLABLE, INDEX | Prefixo visual de 8 caracteres da chave primária (ex: gt_a1b2c345) |
api_key_hash | VARCHAR(255) | NULLABLE | Hash seguro (bcrypt) da chave primária em texto claro |
api_key_secondary_prefix | VARCHAR(16) | NULLABLE, INDEX | Prefixo visual de 8 caracteres da chave secundária |
api_key_secondary_hash | VARCHAR(255) | NULLABLE | Hash seguro (bcrypt) da chave secundária em texto claro |
3. Índices e Performance
idx_companies_api_key_prefix: Índice B-Tree na colunaapi_key_prefixpara busca acelerada durante a autenticação por chave primária.idx_companies_api_key_secondary_prefix: Índice B-Tree na colunaapi_key_secondary_prefixpara busca por chave secundária.
4. Diagrama ER de Relacionamento de Tenant
erDiagram
COMPANIES ||--o{ APPOINTMENTS : "gerencia"
COMPANIES ||--o{ DRIVERS : "cadastra"
COMPANIES {
uuid id PK
string name
string cnpj
string api_key_prefix "Indexado"
string api_key_hash "Secret Hash"
string api_key_secondary_prefix "Indexado"
string api_key_secondary_hash "Secret Hash"
}
5. Regras de Integridade de Banco de Dados
- Limpeza Simultânea de Par: Ao revogar uma chave, as colunas
api_key_prefixeapi_key_hash(ou o par secundário) são obrigatoriamente setadas paraNULLem uma única transação atômica (db.commit()). - Imutabilidade Direta do Hash: O hash gravado no banco de dados não pode ser editado manualmente; toda alteração deve ser intermediada pelo método
APIKeyManager.generate_key_pair().