import type { IncomingMessage } from 'node:http'; import { Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; import { APP_FILTER, APP_GUARD } from '@nestjs/core'; import { ThrottlerModule, ThrottlerGuard } from '@nestjs/throttler'; import { LoggerModule } from 'nestjs-pino'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { PrismaModule } from './prisma/prisma.module'; import { RedisModule } from './redis/redis.module'; import { AuditModule } from './audit/audit.module'; import { AuthModule } from './auth/auth.module'; import { UsersModule } from './users/users.module'; import { RolesModule } from './roles/roles.module'; import { HealthModule } from './health/health.module'; import { AuthGuard } from './common/guards/auth.guard'; import { PermissionsGuard } from './common/guards/permissions.guard'; import { GlobalExceptionFilter } from './common/filters/global-exception.filter'; @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true }), // Logs estruturados JSON com request_id de correlação (agente.md seções // 60/61). Nunca loga segredos: senha, tokens, credenciais AMI/ARI/SIP. LoggerModule.forRoot({ pinoHttp: { genReqId: (req) => req.id, redact: { paths: [ 'req.headers.authorization', 'req.headers.cookie', 'req.body.password', 'req.body.currentPassword', 'req.body.newPassword', 'res.headers["set-cookie"]', ], censor: '[REDACTED]', }, customProps: (req: IncomingMessage & { id: string }) => ({ service: 'b2bcall-api', requestId: req.id, }), }, }), // Rate limit global genérico (proteção geral contra abuso). O login tem // sua própria proteção progressiva mais rígida (LoginThrottleService). ThrottlerModule.forRoot([{ ttl: 60_000, limit: 120 }]), PrismaModule, RedisModule, AuditModule, AuthModule, UsersModule, RolesModule, HealthModule, ], controllers: [AppController], providers: [ AppService, { provide: APP_GUARD, useClass: ThrottlerGuard }, { provide: APP_GUARD, useClass: AuthGuard }, { provide: APP_GUARD, useClass: PermissionsGuard }, { provide: APP_FILTER, useClass: GlobalExceptionFilter }, ], }) export class AppModule {}