import { Module, Provider } from '@nestjs/common'; import { CqrsModule } from '@nestjs/cqrs'; import { AD_MESSAGE_PUBLISHER, AD_REPOSITORY, AD_DIRECTION_ENCODER, AD_CARPOOL_ROUTE_PROVIDER, AD_GET_BASIC_ROUTE_CONTROLLER, PARAMS_PROVIDER, TIMEZONE_FINDER, TIME_CONVERTER, INPUT_DATETIME_TRANSFORMER, } from './ad.di-tokens'; import { MessageBrokerPublisher } from '@mobicoop/message-broker-module'; import { AdRepository } from './infrastructure/ad.repository'; import { PrismaService } from './infrastructure/prisma.service'; import { AdMapper } from './ad.mapper'; import { AdCreatedMessageHandler } from './interface/message-handlers/ad-created.message-handler'; import { PostgresDirectionEncoder } from '@modules/geography/infrastructure/postgres-direction-encoder'; import { GetBasicRouteController } from '@modules/geography/interface/controllers/get-basic-route.controller'; import { CarpoolRouteProvider } from './infrastructure/carpool-route-provider'; import { GeographyModule } from '@modules/geography/geography.module'; import { CreateAdService } from './core/application/commands/create-ad/create-ad.service'; import { MatchGrpcController } from './interface/grpc-controllers/match.grpc-controller'; import { MatchQueryHandler } from './core/application/queries/match/match.query-handler'; import { DefaultParamsProvider } from './infrastructure/default-params-provider'; import { TimezoneFinder } from './infrastructure/timezone-finder'; import { TimeConverter } from './infrastructure/time-converter'; import { InputDateTimeTransformer } from './infrastructure/input-datetime-transformer'; const grpcControllers = [MatchGrpcController]; const messageHandlers = [AdCreatedMessageHandler]; const commandHandlers: Provider[] = [CreateAdService]; const queryHandlers: Provider[] = [MatchQueryHandler]; const mappers: Provider[] = [AdMapper]; const repositories: Provider[] = [ { provide: AD_REPOSITORY, useClass: AdRepository, }, ]; const messagePublishers: Provider[] = [ { provide: AD_MESSAGE_PUBLISHER, useExisting: MessageBrokerPublisher, }, ]; const orms: Provider[] = [PrismaService]; const adapters: Provider[] = [ { provide: AD_DIRECTION_ENCODER, useClass: PostgresDirectionEncoder, }, { provide: AD_CARPOOL_ROUTE_PROVIDER, useClass: CarpoolRouteProvider, }, { provide: AD_GET_BASIC_ROUTE_CONTROLLER, useClass: GetBasicRouteController, }, { provide: PARAMS_PROVIDER, useClass: DefaultParamsProvider, }, { provide: TIMEZONE_FINDER, useClass: TimezoneFinder, }, { provide: TIME_CONVERTER, useClass: TimeConverter, }, { provide: INPUT_DATETIME_TRANSFORMER, useClass: InputDateTimeTransformer, }, ]; @Module({ imports: [CqrsModule, GeographyModule], controllers: [...grpcControllers], providers: [ ...messageHandlers, ...commandHandlers, ...queryHandlers, ...mappers, ...repositories, ...messagePublishers, ...orms, ...adapters, ], exports: [ PrismaService, AdMapper, AD_REPOSITORY, AD_DIRECTION_ENCODER, AD_MESSAGE_PUBLISHER, ], }) export class AdModule {}