CRM Docs
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

AppFonte
Mainreq.user.companyId
Publicreq.company.getId() (via x-company-key)
Internalreq.company.getId() (via internal-key + company-id)

Helpers compartilhados de banco

src/infra/database/knex/utils.ts:

FunçãoUso
prepareDatesForMssqlInserts/updates
chunkProcessamento em lotes
batchWhereInQueries com listas grandes
runWithConcurrencyLimite de paralelismo
bitToBoolean / booleanToBitColunas bit MSSQL

Esses helpers são usados por repositories e, em alguns casos, por consumers em infra/reports/.

Próximos tópicos

On this page