Arquitetura Backend
Multi-tenant e acesso a dados
Um banco MSSQL por empresa e CompanyKnexProvider
O Geiko é multi-tenant por banco de dados: cada empresa (companyId) possui seu próprio servidor MSSQL. O catálogo de empresas e credenciais fica no banco admin.
CompanyKnexProvider
Arquivo: src/infra/database/knex/company-knex.ts
- Resolve conexão Knex via
connectByCompanyId(companyId). - Mantém cache de conexões com TTL de ~10 minutos (
OnModuleInit+setInterval). - Consulta metadados da empresa via
AdminKnexProvider/AdminDynamicKnexProvider.
AdminKnexProvider
Acesso ao banco de catálogo (empresas, servidores, proxies). Usado por middlewares e pelo CompanyKnexProvider para descobrir onde conectar.
Contrato em todos os repositories
Primeiro parâmetro de todo método de gateway/repository: companyId: number.
Isso garante que nenhuma query rode no banco errado, mesmo com conexões cacheadas.
Origem do companyId nos controllers
| App | Fonte |
|---|---|
| Main | req.user.companyId |
| Public | req.company.getId() (via x-company-key) |
| Internal | req.company.getId() (via internal-key + company-id) |
Helpers compartilhados de banco
src/infra/database/knex/utils.ts:
| Função | Uso |
|---|---|
prepareDatesForMssql | Inserts/updates |
chunk | Processamento em lotes |
batchWhereIn | Queries com listas grandes |
runWithConcurrency | Limite de paralelismo |
bitToBoolean / booleanToBit | Colunas bit MSSQL |
Esses helpers são usados por repositories e, em alguns casos, por consumers em infra/reports/.