Edit: /opt/mawid/apps/api/src/app.module.ts (2317B)
import { randomUUID } from 'node:crypto';
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { APP_GUARD } from '@nestjs/core';
import { ThrottlerGuard, ThrottlerModule } from '@nestjs/throttler';
import { LoggerModule } from 'nestjs-pino';
import { AgentModule } from './agent/agent.module';
import { AppointmentsModule } from './appointments/appointments.module';
import { AuthModule } from './auth/auth.module';
import { ConversationsModule } from './conversations/conversations.module';
import { PatientsModule } from './patients/patients.module';
import { SummaryModule } from './summary/summary.module';
import { validateEnv } from './config/env';
import { ClinicModule } from './clinic/clinic.module';
import { HealthController } from './health/health.controller';
import { PrismaModule } from './prisma/prisma.module';
import { ServicesModule } from './services/services.module';
import { StaffModule } from './staff/staff.module';
import { WhatsappModule } from './whatsapp/whatsapp.module';
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
validate: validateEnv,
}),
// Structured JSON logs with request ids; PII discipline: no bodies, no auth
// headers (PROJECT_PLAN Phase 7 tasks 1 & 4).
LoggerModule.forRoot({
pinoHttp: {
level: process.env.NODE_ENV === 'production' ? 'info' : 'debug',
genReqId: (req) => (req.headers['x-request-id'] as string) ?? randomUUID(),
redact: {
paths: ['req.headers.authorization', 'req.headers.cookie'],
remove: true,
},
serializers: {
req: (req: { id: string; method: string; url: string }) => ({
id: req.id,
method: req.method,
url: req.url,
}),
},
},
}),
// Baseline API rate limit per IP; webhook and login have their own caps.
ThrottlerModule.forRoot([{ ttl: 60_000, limit: 300 }]),
PrismaModule,
AuthModule,
ClinicModule,
StaffModule,
ServicesModule,
AgentModule,
WhatsappModule,
AppointmentsModule,
PatientsModule,
ConversationsModule,
SummaryModule,
],
controllers: [HealthController],
providers: [{ provide: APP_GUARD, useClass: ThrottlerGuard }],
})
export class AppModule {}