src/app.module.ts
import { ClassSerializerInterceptor, Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { UsersModule } from './user/users.module';
import appConfig from './config/app.config';
import databaseConfig from './config/database.config';
import envValidation from './config/env.validation';
import { TypeOrmModule } from '@nestjs/typeorm';
import { PaginationModule } from './common/pagination/pagination.module';
import { APP_GUARD, APP_INTERCEPTOR, Reflector } from '@nestjs/core';
import { DataResponseInterceptor } from './common/interceptors/data-response/data-response.interceptor';
import { AuthModule } from './auth/auth.module';
import { AuthenticationGuard } from './auth/guards/authentication.guard';
import { HttpAccessTokenGuard } from './auth/guards/http-access-token.guard';
import jwtConfig from './auth/config/jwt.config';
import { JwtModule } from '@nestjs/jwt';
import { AuthorizationGuard } from './auth/guards/authorization.guard';
import { CheckRoleGuard } from './auth/guards/check-role.guard';
import { TitlesModule } from './titles/titles.module';
import { PeopleModule } from './people/people.module';
import { CommentModule } from './comment/comment.module';
import { SeasonModule } from './season/season.module';
import { EpisodeModule } from './episode/episode.module';
import { CountryModule } from './country/country.module';
import { GenreModule } from './genre/genre.module';
import { LanguageModule } from './language/language.module';
import { VideoLinkModule } from './video-link/video-link.module';
import { UploadCenterModule } from './upload-center/upload-center.module';
import { AiModule } from './ai/ai.module';
import { WsAccessTokenGuard } from './auth/guards/ws-access-token.guard';
/**
* Get the current NODE_ENV
*/
const ENV = process.env.NODE_ENV;
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
envFilePath: !ENV ? '.env' : `.env.${ENV}`,
load: [appConfig, databaseConfig],
validationSchema: envValidation,
}),
TypeOrmModule.forRootAsync({
imports: [ConfigModule],
inject: [ConfigService],
useFactory: (configService: ConfigService) => ({
type: 'postgres',
synchronize: configService.get('database.synchronize'),
port: configService.get('database.port'),
username: configService.get('database.user'),
password: configService.get('database.password'),
host: configService.get('database.host'),
autoLoadEntities: configService.get('database.autoLoadEntities'),
database: configService.get('database.name'),
}),
}),
ConfigModule.forFeature(jwtConfig),
JwtModule.registerAsync(jwtConfig.asProvider()),
UsersModule,
PaginationModule,
AuthModule,
TitlesModule,
PeopleModule,
CommentModule,
SeasonModule,
EpisodeModule,
CountryModule,
GenreModule,
LanguageModule,
VideoLinkModule,
UploadCenterModule,
AiModule,
],
providers: [
{
provide: APP_INTERCEPTOR,
useClass: DataResponseInterceptor,
},
{
provide: APP_GUARD,
useClass: AuthenticationGuard,
},
{
provide: APP_GUARD,
useClass: AuthorizationGuard,
},
{
provide: APP_INTERCEPTOR,
useFactory: (reflector: Reflector) => {
return new ClassSerializerInterceptor(reflector);
},
inject: [Reflector],
},
HttpAccessTokenGuard,
WsAccessTokenGuard,
CheckRoleGuard,
],
})
export class AppModule {}