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('JWT_SECRET') || 'default-secret-key', signOptions: { expiresIn: configService.get('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 {}