Introduce `OptionalAuthGuard` to allow conditional authentication for routes. Update `AuthModule` to include `AuthGuard`, `OptionalAuthGuard`, and `RolesGuard` in providers and exports for broader reuse. feat(app): integrate `AdminModule` into app module Add `AdminModule` to the app's main module to enable administration functionalities. feat(users): enhance user profiles with bio and avatar fields Extend `UpdateUserDto` to include optional `bio` and `avatarUrl` fields for better user customization. feat(categories): add functionality to count all categories Implement `countAll` method in `CategoriesRepository` to fetch the total number of categories using raw SQL counting.
82 lines
2.6 KiB
TypeScript
82 lines
2.6 KiB
TypeScript
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 { ApiKeysModule } from "./api-keys/api-keys.module";
|
|
import { AdminModule } from "./admin/admin.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("*");
|
|
}
|
|
}
|