import { RabbitMQModule } from '@golevelup/nestjs-rabbitmq'; import { Module } from '@nestjs/common'; import { ConfigModule, ConfigService } from '@nestjs/config'; import { AdMessagerController } from './adapters/primaries/ad-messager.controller'; import { AdProfile } from './mappers/ad.profile'; import { CreateAdUseCase } from './domain/usecases/create-ad.usecase'; import { AdRepository } from './adapters/secondaries/ad.repository'; import { DatabaseModule } from '../database/database.module'; import { CqrsModule } from '@nestjs/cqrs'; import { Messager } from './adapters/secondaries/messager'; import { TimezoneFinder } from './adapters/secondaries/timezone-finder'; import { GeoTimezoneFinder } from '../geography/adapters/secondaries/geo-timezone-finder'; @Module({ imports: [ DatabaseModule, CqrsModule, RabbitMQModule.forRootAsync(RabbitMQModule, { imports: [ConfigModule], useFactory: async (configService: ConfigService) => ({ exchanges: [ { name: configService.get('RMQ_EXCHANGE'), type: 'topic', }, ], handlers: { adCreated: { exchange: configService.get('RMQ_EXCHANGE'), routingKey: 'ad.created', queue: 'matcher-ad-created', }, }, uri: configService.get('RMQ_URI'), connectionInitOptions: { wait: false }, enableControllerDiscovery: true, }), inject: [ConfigService], }), ], controllers: [AdMessagerController], providers: [ AdProfile, Messager, AdRepository, TimezoneFinder, GeoTimezoneFinder, CreateAdUseCase, ], exports: [], }) export class AdModule {}