apps/api/src/app.module.ts
import { accessibleRecordsPlugin } from '@casl/mongoose';
import { Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { MongooseModule, MongooseModuleAsyncOptions } from '@nestjs/mongoose';
import { ServeStaticModule } from '@nestjs/serve-static';
import * as joi from 'joi';
import { WinstonModule } from 'nest-winston';
import { join } from 'path';
import * as winston from 'winston';
import * as winstonFileRotator from 'winston-daily-rotate-file';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { AuthModule } from './auth/auth.module';
import { CaslModule } from './casl/casl.module';
import { UsersModule } from './users/users.module';
@Module({
imports: [
ConfigModule.forRoot({
validationSchema: joi.object({
APP_ENV: joi
.string()
.valid('development', 'production')
.default('development'),
WEBTOKEN_ENCRYPTION_KEY: joi.string().required(),
WEBTOKEN_EXPIRATION_TIME: joi.number().default(1800),
DB_URL: joi.string().required(),
}),
}),
ServeStaticModule.forRootAsync({
imports: [ConfigModule],
inject: [ConfigService],
useFactory: (config: ConfigService) =>
config.get('APP_ENV') === 'production'
? [
{
rootPath: join(__dirname, '..', 'ui'),
},
]
: [],
}),
MongooseModule.forRootAsync({
imports: [ConfigModule],
inject: [ConfigService],
useFactory: (configService: ConfigService) =>
({
uri: configService.get('DB_URL'),
useNewUrlParser: true,
useUnifiedTopology: true,
connectionFactory: (connection) => {
connection.plugin(accessibleRecordsPlugin);
return connection;
},
} as MongooseModuleAsyncOptions),
}),
WinstonModule.forRootAsync({
imports: [ConfigModule],
inject: [ConfigService],
useFactory: (configService: ConfigService) => {
return configService.get('APP_ENV') === 'development'
? {
level: 'info',
format: winston.format.json(),
defaultMeta: { service: 'nest-mongo-service' },
transports: [
new winston.transports.Console({
format: winston.format.simple(),
}),
],
}
: {
level: 'info',
format: winston.format.json(),
defaultMeta: { service: 'nest-mongo-service' },
transports: [
new winston.transports.File({
filename: 'logs/error.log',
level: 'error',
}),
new winston.transports.Console({
format: winston.format.simple(),
}),
new winstonFileRotator({
filename: 'logs/application-%DATE%.log',
datePattern: 'YYYY-MM-DD',
zippedArchive: true,
maxSize: '20m',
maxFiles: '14d',
}),
],
};
},
}),
AuthModule,
UsersModule,
CaslModule,
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}