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
|
|
|
];
|
2025-08-20 18:02:50 +09:00
|
|
|
|
|
|
|
|
@Module({
|
|
|
|
|
imports: [
|
|
|
|
|
// Configuration
|
|
|
|
|
ConfigModule.forRoot({
|
|
|
|
|
isGlobal: true,
|
2025-08-21 15:24:40 +09:00
|
|
|
envFilePath,
|
|
|
|
|
validate: validateEnv,
|
2025-08-20 18:02:50 +09:00
|
|
|
}),
|
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",
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
}),
|
2025-08-20 18:02:50 +09:00
|
|
|
|
|
|
|
|
// Core modules
|
|
|
|
|
PrismaModule,
|
|
|
|
|
RedisModule,
|
2025-08-21 15:24:40 +09:00
|
|
|
CacheModule,
|
2025-08-20 18:02:50 +09:00
|
|
|
AuditModule,
|
|
|
|
|
VendorsModule,
|
|
|
|
|
JobsModule,
|
|
|
|
|
HealthModule,
|
2025-08-22 17:02:49 +09:00
|
|
|
|
2025-08-20 18:02:50 +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 },
|
|
|
|
|
]),
|
2025-08-20 18:02:50 +09:00
|
|
|
],
|
|
|
|
|
})
|
|
|
|
|
export class AppModule {}
|