import { join } from "node:path"; import { APP_INTERCEPTOR, APP_PIPE } from "@nestjs/core"; import { Module, ValidationPipe } from "@nestjs/common"; import { ConfigModule, ConfigService } from "@nestjs/config"; import { UnicodeDigitsNormalizeInterceptor } from "./common/interceptors/unicode-digits-normalize.interceptor"; import { MongooseModule } from "@nestjs/mongoose"; import { ServeStaticModule } from "@nestjs/serve-static"; import { AiModule } from "./ai/ai.module"; import { AuthModule } from "./auth/auth.module"; import { ClaimRequestManagementModule } from "./claim-request-management/claim-request-management.module"; import { ClientModule } from "./client/client.module"; import { ExpertBlameModule } from "./expert-blame/expert-blame.module"; import { ExpertClaimModule } from "./expert-claim/expert-claim.module"; import { ExpertInsurerModule } from "./expert-insurer/expert-insurer.module"; import { LookupsModule } from "./lookups/lookups.module"; import { PlatesModule } from "./plates/plates.module"; import { ProfileModule } from "./profile/profile.module"; import { SandHubModule } from "./sand-hub/sand-hub.module"; import { SystemSettingsModule } from "./system-settings/system-settings.module"; import { ReportsModule } from "./reports/reports.module"; import { RequestManagementModule } from "./request-management/request-management.module"; import { UsersModule } from "./users/users.module"; import { applyIranFaTimestampPlugin } from "./helpers/mongoose-fa-timestamps.plugin"; import { CronModule } from "./utils/cron/cron.module"; import { WorkflowStepManagementModule } from "./workflow-step-management/workflow-step-management.module"; import * as Joi from "joi"; @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true, validationSchema: Joi.object({ NODE_ENV: Joi.string() .valid("development", "production") .default("development"), PORT: Joi.number().port().default(9001), URL: Joi.string().uri().required(), BASE_URL_DEV: Joi.string() .uri() .when("NODE_ENV", { is: Joi.string().valid("development"), then: Joi.required(), otherwise: Joi.optional(), }), SWAGGER_USER_DEV: Joi.string().when("NODE_ENV", { is: Joi.string().valid("development"), then: Joi.required(), otherwise: Joi.optional(), }), SWAGGER_PASSWORD_DEV: Joi.string().when("NODE_ENV", { is: Joi.string().valid("development"), then: Joi.required(), otherwise: Joi.optional(), }), MONGO_HOST: Joi.string().required(), MONGO_PORT: Joi.number().port().required(), MONGO_USER: Joi.string().required(), MONGO_PASS: Joi.string().required(), MONGO_DB_NAME: Joi.string().required(), JWT_SECRET: Joi.string().required(), SANHUB_BASE_URL: Joi.string().uri(), SANHUB_URL_LOGIN: Joi.string().uri(), SANHUB_USERNAME: Joi.string(), SANHUB_PASSWORD: Joi.string(), AI_URL: Joi.string().uri(), AI_URL_V2: Joi.string().uri(), AI_USERNAME: Joi.string(), AI_PASSWORD: Joi.string(), SMS_PROVIDER: Joi.string() .valid("kavenegar", "parsian") .default("kavenegar"), SMS_API_KEY: Joi.string(), AUTH_SMS_TEMPLATE: Joi.string(), EXP_OTP_TIME: Joi.number(), }), }), CronModule, ServeStaticModule.forRoot({ rootPath: join(__dirname, "..", "files"), serveRoot: "/files", }), MongooseModule.forRootAsync({ inject: [ConfigService], useFactory: (configService: ConfigService) => { return { uri: `mongodb://${configService.get("MONGO_USER")}:${configService.get("MONGO_PASS")}@${configService.get("MONGO_HOST")}:${configService.get("MONGO_PORT")}/${configService.get("MONGO_DB_NAME")}?authSource=admin&${configService.get("MONGO_OPTIONS")}`, tls: configService.get("MONGO_TLS") === "true", tlsAllowInvalidCertificates: configService.get("MONGO_TLS_ALLOW_INVALID_CERTS") === "true", autoIndex: configService.get("NODE_ENV") !== "production", connectionFactory: (connection) => { applyIranFaTimestampPlugin(connection); return connection; }, }; }, }), UsersModule, AuthModule, ClientModule, ProfileModule, PlatesModule, RequestManagementModule, SandHubModule, SystemSettingsModule, ExpertBlameModule, ClaimRequestManagementModule, ExpertClaimModule, AiModule, ReportsModule, ExpertInsurerModule, LookupsModule, WorkflowStepManagementModule, ], controllers: [], providers: [ { provide: APP_INTERCEPTOR, useClass: UnicodeDigitsNormalizeInterceptor, }, // { // provide: APP_PIPE, // useValue: new ValidationPipe({ // transform: true, // whitelist: true, // forbidNonWhitelisted: false, // }), // }, ], }) export class AppModule {}