Multiple implementations of the same back-end application. The aim is to provide quick, side-by-side comparisons of different technologies (languages, frameworks, libraries) while preserving consistent business logic across all implementations.
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

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 {}