import { Module, Global } from '@nestjs/common'; import { ConfigModule, ConfigService } from '@nestjs/config'; import { ClientsModule, Transport } from '@nestjs/microservices'; import { PrismaModule } from './persistence/prisma/prisma.module'; import { TradingAccountRepository } from './persistence/repositories/trading-account.repository'; import { OrderRepository } from './persistence/repositories/order.repository'; import { OutboxRepository } from './persistence/repositories/outbox.repository'; import { TradingConfigRepository } from './persistence/repositories/trading-config.repository'; import { BlackHoleRepository } from './persistence/repositories/black-hole.repository'; import { SharePoolRepository } from './persistence/repositories/share-pool.repository'; import { CirculationPoolRepository } from './persistence/repositories/circulation-pool.repository'; import { PriceSnapshotRepository } from './persistence/repositories/price-snapshot.repository'; import { ProcessedEventRepository } from './persistence/repositories/processed-event.repository'; import { RedisService } from './redis/redis.service'; import { KafkaProducerService } from './kafka/kafka-producer.service'; import { UserRegisteredConsumer } from './kafka/consumers/user-registered.consumer'; @Global() @Module({ imports: [ PrismaModule, ClientsModule.registerAsync([ { name: 'KAFKA_CLIENT', imports: [ConfigModule], useFactory: (configService: ConfigService) => ({ transport: Transport.KAFKA, options: { client: { clientId: 'trading-service', brokers: configService .get('KAFKA_BROKERS', 'localhost:9092') .split(','), }, producer: { allowAutoTopicCreation: true }, }, }), inject: [ConfigService], }, ]), ], controllers: [UserRegisteredConsumer], providers: [ TradingAccountRepository, OrderRepository, OutboxRepository, TradingConfigRepository, BlackHoleRepository, SharePoolRepository, CirculationPoolRepository, PriceSnapshotRepository, ProcessedEventRepository, KafkaProducerService, { provide: 'REDIS_OPTIONS', useFactory: (configService: ConfigService) => ({ host: configService.get('REDIS_HOST', 'localhost'), port: configService.get('REDIS_PORT', 6379), password: configService.get('REDIS_PASSWORD'), db: configService.get('REDIS_DB', 12), }), inject: [ConfigService], }, RedisService, ], exports: [ TradingAccountRepository, OrderRepository, OutboxRepository, TradingConfigRepository, BlackHoleRepository, SharePoolRepository, CirculationPoolRepository, PriceSnapshotRepository, ProcessedEventRepository, KafkaProducerService, RedisService, ClientsModule, ], }) export class InfrastructureModule {}