Banco de dados
Configuração TypeORM com PostgreSQL via DatabaseModule e DataSource factory.A infraestrutura de banco usa TypeORM com PostgreSQL. A conexão é gerenciada por um DataSource singleton injetado via token customizado.
DatabaseModule
@Module({
providers: [
EnvService,
{
provide: DATA_SOURCE_PROVIDER_TOKEN,
useFactory: dataSourceFactory,
inject: [EnvService],
},
],
exports: [EnvService, DATA_SOURCE_PROVIDER_TOKEN],
})
export class DatabaseModule {}
Factory do DataSource
import { DbContext } from '@/core/database/db-context';
import path from 'node:path';
export const DATA_SOURCE_PROVIDER_TOKEN = 'DATA_SOURCE';
export async function dataSourceFactory(env: EnvService) {
const dataSource = new DataSource({
type: 'postgres',
url: env.get('DATABASE_URL'),
schema: env.get('DATABASE_SCHEMA'),
entities: Array.from(DbContext.entities.values()),
migrations: [path.join(__dirname, 'migrations', '[0-9]*.{ts,js}')],
migrationsTableName: 'migrations',
migrationsTransactionMode: 'all',
invalidWhereValuesBehavior: {
undefined: 'ignore',
},
});
await dataSource.initialize();
await dataSource.runMigrations();
return dataSource;
}
Migrations pendentes são aplicadas automaticamente no start da API. Os scripts migration:run / migration:revert permanecem disponíveis para CI e operações manuais.
Token de injeção
Repositórios recebem o DataSource via token, não pela classe diretamente:
constructor(@Inject(DATA_SOURCE_PROVIDER_TOKEN) dataSource: DataSource) {
super(dataSource, Person);
}
Variável de ambiente
A URL de conexão vem de DATABASE_URL, validada no schema Zod (formato do .env.example):
DATABASE_URL=postgresql://postgres:root@localhost:5432/koala_nest
Adicionar novas entidades
- Crie a entidade em
src/domain/entities/com@Entityde@/core/database/entity. - Gere a migration e reinicie a API (ou use
migration:run).
O decorador @Entity registra a classe em DbContext.entities. No runtime, o Nest importa as entidades via repositórios; no CLI, load-all-entities.ts carrega os arquivos de src/domain/entities/ para popular o mesmo DbContext usado por migration-datasource.ts — não é necessário listar entidades manualmente.
InfraModule
O InfraModule agrega repositórios e exporta o RepositoryModule:
@Module({
imports: [RepositoryModule],
exports: [RepositoryModule],
})
export class InfraModule {}