From 6d7657c807b89ee00c7df81b0bb771bae1c8cf33 Mon Sep 17 00:00:00 2001 From: TaprootFreak <142087526+TaprootFreak@users.noreply.github.com> Date: Sat, 14 Feb 2026 21:21:00 +0100 Subject: [PATCH] Fix cross-module dependency between MonitoringModule and UserModule MonitoringModule was directly importing LightningWalletEntity and LightningWalletRepository from the user subdomain, bypassing module boundaries. Use forwardRef to properly declare the circular dependency between MonitoringModule and UserModule. Access balance data through LightningWalletService instead of the repository directly, keeping database access encapsulated in the service layer. --- src/subdomains/monitoring/monitoring.module.ts | 9 ++++----- .../monitoring/services/monitoring.service.ts | 11 ++++++----- .../application/services/lightning-wallet.service.ts | 8 ++++++++ src/subdomains/user/user.module.ts | 4 ++-- 4 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/subdomains/monitoring/monitoring.module.ts b/src/subdomains/monitoring/monitoring.module.ts index be777fefc..0a688eef7 100644 --- a/src/subdomains/monitoring/monitoring.module.ts +++ b/src/subdomains/monitoring/monitoring.module.ts @@ -1,4 +1,4 @@ -import { Module } from '@nestjs/common'; +import { forwardRef, Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { BlockchainModule } from 'src/integration/blockchain/blockchain.module'; import { EvmRegistryModule } from 'src/integration/blockchain/shared/evm/registry/evm-registry.module'; @@ -8,8 +8,7 @@ import { AlchemyWebhookModule } from '../alchemy/alchemy-webhook.module'; import { BoltzModule } from '../boltz/boltz.module'; import { AssetModule } from '../master-data/asset/asset.module'; import { PricingModule } from '../pricing/pricing.module'; -import { LightningWalletEntity } from '../user/domain/entities/lightning-wallet.entity'; -import { LightningWalletRepository } from '../user/application/repositories/lightning-wallet.repository'; +import { UserModule } from '../user/user.module'; import { MonitoringController } from './controllers/monitoring.controller'; import { MonitoringBalanceEntity } from './entities/monitoring-balance.entity'; import { MonitoringEvmBalanceEntity } from './entities/monitoring-evm-balance.entity'; @@ -23,7 +22,8 @@ import { MonitoringService } from './services/monitoring.service'; @Module({ imports: [ - TypeOrmModule.forFeature([MonitoringEntity, MonitoringBalanceEntity, MonitoringEvmBalanceEntity, LightningWalletEntity]), + TypeOrmModule.forFeature([MonitoringEntity, MonitoringBalanceEntity, MonitoringEvmBalanceEntity]), + forwardRef(() => UserModule), SharedModule, PricingModule, AssetModule, @@ -38,7 +38,6 @@ import { MonitoringService } from './services/monitoring.service'; MonitoringRepository, MonitoringBalanceRepository, MonitoringEvmBalanceRepository, - LightningWalletRepository, MonitoringService, MonitoringEvmService, BalanceAlertService, diff --git a/src/subdomains/monitoring/services/monitoring.service.ts b/src/subdomains/monitoring/services/monitoring.service.ts index efb935af5..15db0b832 100644 --- a/src/subdomains/monitoring/services/monitoring.service.ts +++ b/src/subdomains/monitoring/services/monitoring.service.ts @@ -1,4 +1,4 @@ -import { Injectable, InternalServerErrorException, OnModuleInit } from '@nestjs/common'; +import { forwardRef, Inject, Injectable, InternalServerErrorException, OnModuleInit } from '@nestjs/common'; import { Cron, CronExpression } from '@nestjs/schedule'; import { Config, Process } from 'src/config/config'; import { BitcoinClient } from 'src/integration/blockchain/bitcoin/bitcoin-client'; @@ -15,7 +15,7 @@ import { QueueHandler } from 'src/shared/utils/queue-handler'; import { AssetService } from 'src/subdomains/master-data/asset/services/asset.service'; import { CoinGeckoService } from 'src/subdomains/pricing/services/coingecko.service'; import { LightningWalletTotalBalanceDto } from 'src/subdomains/user/application/dto/lightning-wallet.dto'; -import { LightningWalletRepository } from 'src/subdomains/user/application/repositories/lightning-wallet.repository'; +import { LightningWalletService } from 'src/subdomains/user/application/services/lightning-wallet.service'; import { MonitoringBlockchainBalance } from '../dto/monitoring.dto'; import { MonitoringBalanceEntity } from '../entities/monitoring-balance.entity'; import { MonitoringBalanceRepository } from '../repositories/monitoring-balance.repository'; @@ -39,7 +39,8 @@ export class MonitoringService implements OnModuleInit { private readonly evmRegistryService: EvmRegistryService, private readonly monitoringRepository: MonitoringRepository, private readonly monitoringBalanceRepository: MonitoringBalanceRepository, - private readonly lightningWalletRepository: LightningWalletRepository, + @Inject(forwardRef(() => LightningWalletService)) + private readonly lightningWalletService: LightningWalletService, ) { this.bitcoinClient = bitcoinservice.getDefaultClient(); this.lightningClient = lightningService.getDefaultClient(); @@ -76,8 +77,8 @@ export class MonitoringService implements OnModuleInit { try { const internalWalletIds = Config.blockchain.lightning.lnbits.internalWalletIds; - const internalBalances = await this.lightningWalletRepository.getInternalBalances(internalWalletIds); - const customerBalances = await this.lightningWalletRepository.getCustomerBalances(internalWalletIds); + const internalBalances = await this.lightningWalletService.getInternalBalances(internalWalletIds); + const customerBalances = await this.lightningWalletService.getCustomerBalances(internalWalletIds); await this.processBalanceMonitoring(internalBalances, customerBalances); } catch (e) { diff --git a/src/subdomains/user/application/services/lightning-wallet.service.ts b/src/subdomains/user/application/services/lightning-wallet.service.ts index 79fcd5f67..b6f0b36ad 100644 --- a/src/subdomains/user/application/services/lightning-wallet.service.ts +++ b/src/subdomains/user/application/services/lightning-wallet.service.ts @@ -67,6 +67,14 @@ export class LightningWalletService { return this.lightningWalletRepository.getByWalletId(walletId); } + async getInternalBalances(internalWalletIds: string[]) { + return this.lightningWalletRepository.getInternalBalances(internalWalletIds); + } + + async getCustomerBalances(excludeWalletIds: string[]) { + return this.lightningWalletRepository.getCustomerBalances(excludeWalletIds); + } + async updateLightningWalletBalances(): Promise { const userTransactionBalances = await this.userTransactionRepository.getBalances(); diff --git a/src/subdomains/user/user.module.ts b/src/subdomains/user/user.module.ts index a72a254fa..e35c8f023 100644 --- a/src/subdomains/user/user.module.ts +++ b/src/subdomains/user/user.module.ts @@ -1,4 +1,4 @@ -import { Module } from '@nestjs/common'; +import { forwardRef, Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { LnbitsWebhookModule } from 'src/integration/blockchain/lightning/lnbits-webhook.module'; import { IntegrationModule } from 'src/integration/integration.module'; @@ -43,7 +43,7 @@ import { WalletEntity } from './domain/entities/wallet.entity'; ]), SharedModule, IntegrationModule, - MonitoringModule, + forwardRef(() => MonitoringModule), BoltzModule, AssetModule, LnbitsWebhookModule,