import { CacheModule } from "@nestjs/cache-manager"; import { MiddlewareConsumer, Module, NestModule } from "@nestjs/common"; import { ConfigModule, ConfigService } from "@nestjs/config"; import { ScheduleModule } from "@nestjs/schedule"; import { ThrottlerModule } from "@nestjs/throttler"; import { redisStore } from "cache-manager-redis-yet"; import { AdminModule } from "./admin/admin.module"; import { ApiKeysModule } from "./api-keys/api-keys.module"; import { AppController } from "./app.controller"; import { AppService } from "./app.service"; import { AuthModule } from "./auth/auth.module"; import { CategoriesModule } from "./categories/categories.module"; import { CommonModule } from "./common/common.module"; import { CrawlerDetectionMiddleware } from "./common/middlewares/crawler-detection.middleware"; import { validateEnv } from "./config/env.schema"; import { ContentsModule } from "./contents/contents.module"; import { CryptoModule } from "./crypto/crypto.module"; import { DatabaseModule } from "./database/database.module"; import { FavoritesModule } from "./favorites/favorites.module"; import { HealthController } from "./health.controller"; import { MailModule } from "./mail/mail.module"; import { MediaModule } from "./media/media.module"; import { ReportsModule } from "./reports/reports.module"; import { S3Module } from "./s3/s3.module"; import { SessionsModule } from "./sessions/sessions.module"; import { TagsModule } from "./tags/tags.module"; import { UsersModule } from "./users/users.module"; @Module({ imports: [ DatabaseModule, CryptoModule, CommonModule, S3Module, MailModule, UsersModule, AuthModule, CategoriesModule, ContentsModule, FavoritesModule, TagsModule, MediaModule, SessionsModule, ReportsModule, ApiKeysModule, AdminModule, ScheduleModule.forRoot(), ThrottlerModule.forRootAsync({ imports: [ConfigModule], inject: [ConfigService], useFactory: (config: ConfigService) => [ { ttl: 60000, limit: config.get("NODE_ENV") === "production" ? 100 : 1000, }, ], }), ConfigModule.forRoot({ isGlobal: true, validate: validateEnv, }), CacheModule.registerAsync({ isGlobal: true, imports: [ConfigModule], inject: [ConfigService], useFactory: async (config: ConfigService) => ({ store: await redisStore({ url: `redis://${config.get("REDIS_HOST")}:${config.get("REDIS_PORT")}`, }), ttl: 600, // 10 minutes }), }), ], controllers: [AppController, HealthController], providers: [AppService], }) export class AppModule implements NestModule { configure(consumer: MiddlewareConsumer) { consumer.apply(CrawlerDetectionMiddleware).forRoutes("*"); } }