Assist_Design/apps/bff/src/app.module.ts

105 lines
3.4 KiB
TypeScript
Raw Normal View History

2025-08-22 17:02:49 +09:00
import { Module } from "@nestjs/common";
import { RouterModule } from "@nestjs/core";
import { ConfigModule, ConfigService } from "@nestjs/config";
import { ThrottlerModule } from "@nestjs/throttler";
import { AuthModule } from "./auth/auth.module";
import { UsersModule } from "./users/users.module";
import { MappingsModule } from "./mappings/mappings.module";
import { CatalogModule } from "./catalog/catalog.module";
import { OrdersModule } from "./orders/orders.module";
import { InvoicesModule } from "./invoices/invoices.module";
import { SubscriptionsModule } from "./subscriptions/subscriptions.module";
import { CasesModule } from "./cases/cases.module";
import { WebhooksModule } from "./webhooks/webhooks.module";
import { VendorsModule } from "./vendors/vendors.module";
import { JobsModule } from "./jobs/jobs.module";
import { HealthModule } from "./health/health.module";
import { PrismaModule } from "./common/prisma/prisma.module";
import { AuditModule } from "./common/audit/audit.module";
import { RedisModule } from "./common/redis/redis.module";
import { LoggingModule } from "./common/logging/logging.module";
import { CacheModule } from "./common/cache/cache.module";
import * as path from "path";
import { validateEnv } from "./common/config/env.validation";
2025-08-21 15:24:40 +09:00
// Support multiple .env files across environments and run contexts
2025-08-22 17:02:49 +09:00
const repoRoot = path.resolve(__dirname, "../../../..");
const nodeEnv = process.env.NODE_ENV || "development";
2025-08-21 15:24:40 +09:00
const envFilePath = [
// Prefer repo root env files
path.resolve(repoRoot, `.env.${nodeEnv}.local`),
path.resolve(repoRoot, `.env.${nodeEnv}`),
2025-08-22 17:02:49 +09:00
path.resolve(repoRoot, ".env.local"),
path.resolve(repoRoot, ".env"),
2025-08-21 15:24:40 +09:00
// Fallback to local working directory
`.env.${nodeEnv}.local`,
`.env.${nodeEnv}`,
2025-08-22 17:02:49 +09:00
".env.local",
".env",
2025-08-21 15:24:40 +09:00
];
@Module({
imports: [
// Configuration
ConfigModule.forRoot({
isGlobal: true,
2025-08-21 15:24:40 +09:00
envFilePath,
validate: validateEnv,
}),
2025-08-22 17:02:49 +09:00
2025-08-21 15:24:40 +09:00
// Logging
LoggingModule,
2025-08-22 17:02:49 +09:00
// Rate limiting with environment-based configuration
ThrottlerModule.forRootAsync({
imports: [ConfigModule],
inject: [ConfigService],
useFactory: (configService: ConfigService) => [
{
ttl: configService.get("RATE_LIMIT_TTL", 60000),
limit: configService.get("RATE_LIMIT_LIMIT", 100),
},
// Stricter rate limiting for auth endpoints
{
ttl: configService.get("AUTH_RATE_LIMIT_TTL", 900000),
limit: configService.get("AUTH_RATE_LIMIT_LIMIT", 3),
name: "auth",
},
],
}),
// Core modules
PrismaModule,
RedisModule,
2025-08-21 15:24:40 +09:00
CacheModule,
AuditModule,
VendorsModule,
JobsModule,
HealthModule,
2025-08-22 17:02:49 +09:00
// Feature modules
AuthModule,
UsersModule,
MappingsModule,
CatalogModule,
OrdersModule,
InvoicesModule,
SubscriptionsModule,
CasesModule,
WebhooksModule,
2025-08-22 17:02:49 +09:00
// Route grouping: apply "/api" prefix to all feature modules except health
RouterModule.register([
{ path: "api", module: AuthModule },
{ path: "api", module: UsersModule },
{ path: "api", module: MappingsModule },
{ path: "api", module: CatalogModule },
{ path: "api", module: OrdersModule },
{ path: "api", module: InvoicesModule },
{ path: "api", module: SubscriptionsModule },
{ path: "api", module: CasesModule },
{ path: "api", module: WebhooksModule },
]),
],
})
export class AppModule {}