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 { MiningAccountRepository } from './persistence/repositories/mining-account.repository'; import { MiningConfigRepository } from './persistence/repositories/mining-config.repository'; import { BlackHoleRepository } from './persistence/repositories/black-hole.repository'; import { PriceSnapshotRepository } from './persistence/repositories/price-snapshot.repository'; import { RedisService } from './redis/redis.service'; @Global() @Module({ imports: [ PrismaModule, ClientsModule.registerAsync([ { name: 'KAFKA_CLIENT', imports: [ConfigModule], useFactory: (configService: ConfigService) => ({ transport: Transport.KAFKA, options: { client: { clientId: 'mining-service', brokers: configService.get('KAFKA_BROKERS', 'localhost:9092').split(','), }, producer: { allowAutoTopicCreation: true, }, }, }), inject: [ConfigService], }, ]), ], providers: [ MiningAccountRepository, MiningConfigRepository, BlackHoleRepository, PriceSnapshotRepository, { 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', 1), }), inject: [ConfigService], }, RedisService, ], exports: [ MiningAccountRepository, MiningConfigRepository, BlackHoleRepository, PriceSnapshotRepository, RedisService, ClientsModule, ], }) export class InfrastructureModule {}