You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
3.6 KiB
99 lines
3.6 KiB
import { Module } from '@nestjs/common'; |
|
import { APP_PIPE } from '@nestjs/core'; |
|
import { ValidationPipe } from '@nestjs/common'; |
|
import { ConfigModule, ConfigService } from '@nestjs/config'; |
|
import { JwtModule } from '@nestjs/jwt'; |
|
import { HttpModule } from '@nestjs/axios'; |
|
import { ScheduleModule } from '@nestjs/schedule'; |
|
import { AuthController } from './presentation/controllers/auth.controller'; |
|
import { ItemsController } from './presentation/controllers/items.controller'; |
|
import { LoginUserCommand } from './application/commands/login-user.command'; |
|
import { AddItemCommand } from './application/commands/add-item.command'; |
|
import { DeleteItemCommand } from './application/commands/delete-item.command'; |
|
import { HandleExpiredItemsCommand } from './application/commands/handle-expired-items.command'; |
|
import { GetItemQuery } from './application/queries/get-item.query'; |
|
import { ListItemsQuery } from './application/queries/list-items.query'; |
|
import { JwtAuthService } from './infrastructure/auth/jwt-auth.service'; |
|
import { FileUserRepository } from './infrastructure/repositories/file-user-repository'; |
|
import { FileItemRepository } from './infrastructure/repositories/file-item-repository'; |
|
import { OrderHttpService } from './infrastructure/http/order-http.service'; |
|
import { SystemTimeProvider } from './infrastructure/services/system-time.provider'; |
|
import { UserInitializationService } from './infrastructure/services/user-initialization.service'; |
|
import { ItemExpirationSpec } from './domain/specifications/item-expiration.spec'; |
|
import { ExpiredItemsSchedulerService } from './infrastructure/services/expired-items-scheduler.service'; |
|
import { LoggerService } from './application/services/logger.service'; |
|
import { NestLoggerService } from './infrastructure/logging/nest-logger.service'; |
|
import { NullLoggerService } from './infrastructure/logging/null-logger.service'; |
|
|
|
@Module({ |
|
imports: [ |
|
ConfigModule.forRoot({ |
|
isGlobal: true, |
|
}), |
|
HttpModule, |
|
ScheduleModule.forRoot(), |
|
JwtModule.registerAsync({ |
|
imports: [ConfigModule], |
|
useFactory: async (configService: ConfigService) => ({ |
|
secret: configService.get<string>('JWT_SECRET') || 'default-secret-key', |
|
signOptions: { |
|
expiresIn: configService.get<string>('JWT_EXPIRATION') || '1h', |
|
}, |
|
}), |
|
inject: [ConfigService], |
|
}), |
|
], |
|
controllers: [AuthController, ItemsController], |
|
providers: [ |
|
LoginUserCommand, |
|
AddItemCommand, |
|
DeleteItemCommand, |
|
HandleExpiredItemsCommand, |
|
GetItemQuery, |
|
ListItemsQuery, |
|
JwtAuthService, |
|
OrderHttpService, |
|
SystemTimeProvider, |
|
ItemExpirationSpec, |
|
UserInitializationService, |
|
ExpiredItemsSchedulerService, |
|
{ |
|
provide: 'IAuthService', |
|
useExisting: JwtAuthService, |
|
}, |
|
{ |
|
provide: 'IUserRepository', |
|
useFactory: (logger: LoggerService) => new FileUserRepository('./data', logger), |
|
inject: [LoggerService], |
|
}, |
|
{ |
|
provide: 'IItemRepository', |
|
useFactory: (logger: LoggerService) => new FileItemRepository('./data', logger), |
|
inject: [LoggerService], |
|
}, |
|
{ |
|
provide: 'IOrderService', |
|
useExisting: OrderHttpService, |
|
}, |
|
{ |
|
provide: 'ITimeProvider', |
|
useExisting: SystemTimeProvider, |
|
}, |
|
{ |
|
provide: LoggerService, |
|
useClass: process.env.NODE_ENV === 'test' ? NullLoggerService : NestLoggerService, |
|
}, |
|
{ |
|
provide: APP_PIPE, |
|
useValue: new ValidationPipe({ |
|
whitelist: true, |
|
forbidNonWhitelisted: true, |
|
transform: true, |
|
transformOptions: { |
|
enableImplicitConversion: true, |
|
}, |
|
}), |
|
}, |
|
], |
|
}) |
|
export class AppModule {} |