diff --git a/web/src/integrationTest/java/de/cotto/lndmanagej/controller/NodeControllerIT.java b/web/src/integrationTest/java/de/cotto/lndmanagej/controller/NodeControllerIT.java index 07cf90e4..fd5c1704 100644 --- a/web/src/integrationTest/java/de/cotto/lndmanagej/controller/NodeControllerIT.java +++ b/web/src/integrationTest/java/de/cotto/lndmanagej/controller/NodeControllerIT.java @@ -8,6 +8,7 @@ import de.cotto.lndmanagej.service.BalanceService; import de.cotto.lndmanagej.service.ChannelService; import de.cotto.lndmanagej.service.FeeService; import de.cotto.lndmanagej.service.NodeService; +import de.cotto.lndmanagej.service.OffChainCostService; import de.cotto.lndmanagej.service.OnChainCostService; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -54,6 +55,9 @@ class NodeControllerIT { @MockBean private OnChainCostService onChainCostService; + @MockBean + private OffChainCostService offChainCostService; + @MockBean @SuppressWarnings("unused") private ChannelIdResolver channelIdResolver; @@ -80,6 +84,8 @@ class NodeControllerIT { when(channelService.getForceClosingChannelsWith(PUBKEY_2)).thenReturn(Set.of(FORCE_CLOSING_CHANNEL_2)); when(onChainCostService.getOpenCostsWith(PUBKEY_2)).thenReturn(Coins.ofSatoshis(123)); when(onChainCostService.getCloseCostsWith(PUBKEY_2)).thenReturn(Coins.ofSatoshis(456)); + when(offChainCostService.getRebalanceSourceCostsForPeer(PUBKEY_2)).thenReturn(Coins.ofMilliSatoshis(1)); + when(offChainCostService.getRebalanceTargetCostsForPeer(PUBKEY_2)).thenReturn(Coins.ofMilliSatoshis(2)); when(balanceService.getBalanceInformationForPeer(PUBKEY_2)).thenReturn(BALANCE_INFORMATION); when(feeService.getFeeReportForPeer(PUBKEY_2)).thenReturn(FEE_REPORT); List channelIds = List.of(CHANNEL_ID.toString(), CHANNEL_ID_2.toString()); @@ -95,6 +101,8 @@ class NodeControllerIT { .andExpect(jsonPath("$.pendingForceClosingChannels", is(forceClosingChannelIds))) .andExpect(jsonPath("$.onChainCosts.openCosts", is("123"))) .andExpect(jsonPath("$.onChainCosts.closeCosts", is("456"))) + .andExpect(jsonPath("$.offChainCosts.rebalanceSource", is("1"))) + .andExpect(jsonPath("$.offChainCosts.rebalanceTarget", is("2"))) .andExpect(jsonPath("$.balance.localBalance", is("1000"))) .andExpect(jsonPath("$.balance.localReserve", is("100"))) .andExpect(jsonPath("$.balance.localAvailable", is("900"))) diff --git a/web/src/main/java/de/cotto/lndmanagej/controller/NodeController.java b/web/src/main/java/de/cotto/lndmanagej/controller/NodeController.java index fa488a6a..c4348875 100644 --- a/web/src/main/java/de/cotto/lndmanagej/controller/NodeController.java +++ b/web/src/main/java/de/cotto/lndmanagej/controller/NodeController.java @@ -6,6 +6,7 @@ import de.cotto.lndmanagej.controller.dto.ChannelsForNodeDto; import de.cotto.lndmanagej.controller.dto.FeeReportDto; import de.cotto.lndmanagej.controller.dto.NodeDetailsDto; import de.cotto.lndmanagej.controller.dto.ObjectMapperConfiguration; +import de.cotto.lndmanagej.controller.dto.OffChainCostsDto; import de.cotto.lndmanagej.controller.dto.OnChainCostsDto; import de.cotto.lndmanagej.model.BalanceInformation; import de.cotto.lndmanagej.model.Channel; @@ -17,6 +18,7 @@ import de.cotto.lndmanagej.service.BalanceService; import de.cotto.lndmanagej.service.ChannelService; import de.cotto.lndmanagej.service.FeeService; import de.cotto.lndmanagej.service.NodeService; +import de.cotto.lndmanagej.service.OffChainCostService; import de.cotto.lndmanagej.service.OnChainCostService; import org.springframework.context.annotation.Import; import org.springframework.web.bind.annotation.GetMapping; @@ -34,6 +36,7 @@ public class NodeController { private final NodeService nodeService; private final ChannelService channelService; private final OnChainCostService onChainCostService; + private final OffChainCostService offChainCostService; private final BalanceService balanceService; private final FeeService feeService; @@ -41,12 +44,14 @@ public class NodeController { NodeService nodeService, ChannelService channelService, OnChainCostService onChainCostService, + OffChainCostService offChainCostService, BalanceService balanceService, FeeService feeService ) { this.nodeService = nodeService; this.channelService = channelService; this.onChainCostService = onChainCostService; + this.offChainCostService = offChainCostService; this.balanceService = balanceService; this.feeService = feeService; } @@ -63,6 +68,8 @@ public class NodeController { Node node = nodeService.getNode(pubkey); Coins openCosts = onChainCostService.getOpenCostsWith(pubkey); Coins closeCosts = onChainCostService.getCloseCostsWith(pubkey); + Coins rebalanceSourceCosts = offChainCostService.getRebalanceSourceCostsForPeer(pubkey); + Coins rebalanceTargetCosts = offChainCostService.getRebalanceTargetCostsForPeer(pubkey); BalanceInformation balanceInformation = balanceService.getBalanceInformationForPeer(pubkey); return new NodeDetailsDto( pubkey, @@ -72,6 +79,7 @@ public class NodeController { toSortedList(channelService.getWaitingCloseChannelsWith(pubkey)), toSortedList(channelService.getForceClosingChannelsWith(pubkey)), new OnChainCostsDto(openCosts, closeCosts), + new OffChainCostsDto(rebalanceSourceCosts, rebalanceTargetCosts), BalanceInformationDto.createFromModel(balanceInformation), node.online(), getFeeReportDto(pubkey) diff --git a/web/src/main/java/de/cotto/lndmanagej/controller/dto/NodeDetailsDto.java b/web/src/main/java/de/cotto/lndmanagej/controller/dto/NodeDetailsDto.java index 3874d50a..76d8f0d6 100644 --- a/web/src/main/java/de/cotto/lndmanagej/controller/dto/NodeDetailsDto.java +++ b/web/src/main/java/de/cotto/lndmanagej/controller/dto/NodeDetailsDto.java @@ -15,6 +15,7 @@ public record NodeDetailsDto( List waitingCloseChannels, List pendingForceClosingChannels, OnChainCostsDto onChainCosts, + OffChainCostsDto offChainCosts, BalanceInformationDto balance, boolean online, FeeReportDto feeReport diff --git a/web/src/test/java/de/cotto/lndmanagej/controller/NodeControllerTest.java b/web/src/test/java/de/cotto/lndmanagej/controller/NodeControllerTest.java index 2822088e..6c64bb71 100644 --- a/web/src/test/java/de/cotto/lndmanagej/controller/NodeControllerTest.java +++ b/web/src/test/java/de/cotto/lndmanagej/controller/NodeControllerTest.java @@ -4,6 +4,7 @@ import de.cotto.lndmanagej.controller.dto.BalanceInformationDto; import de.cotto.lndmanagej.controller.dto.ChannelsForNodeDto; import de.cotto.lndmanagej.controller.dto.FeeReportDto; import de.cotto.lndmanagej.controller.dto.NodeDetailsDto; +import de.cotto.lndmanagej.controller.dto.OffChainCostsDto; import de.cotto.lndmanagej.controller.dto.OnChainCostsDto; import de.cotto.lndmanagej.model.BalanceInformation; import de.cotto.lndmanagej.model.Coins; @@ -14,6 +15,7 @@ import de.cotto.lndmanagej.service.BalanceService; import de.cotto.lndmanagej.service.ChannelService; import de.cotto.lndmanagej.service.FeeService; import de.cotto.lndmanagej.service.NodeService; +import de.cotto.lndmanagej.service.OffChainCostService; import de.cotto.lndmanagej.service.OnChainCostService; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -61,6 +63,9 @@ class NodeControllerTest { @Mock private OnChainCostService onChainCostService; + @Mock + private OffChainCostService offChainCostService; + @Mock private BalanceService balanceService; @@ -78,6 +83,8 @@ class NodeControllerTest { void getNodeDetails_no_channels() { when(onChainCostService.getOpenCostsWith(any())).thenReturn(Coins.NONE); when(onChainCostService.getCloseCostsWith(any())).thenReturn(Coins.NONE); + when(offChainCostService.getRebalanceSourceCostsForPeer(any())).thenReturn(Coins.NONE); + when(offChainCostService.getRebalanceTargetCostsForPeer(any())).thenReturn(Coins.NONE); when(balanceService.getBalanceInformationForPeer(any(Pubkey.class))).thenReturn(BalanceInformation.EMPTY); when(feeService.getFeeReportForPeer(any())).thenReturn(new FeeReport(Coins.NONE, Coins.NONE)); NodeDetailsDto expectedDetails = new NodeDetailsDto( @@ -88,6 +95,7 @@ class NodeControllerTest { List.of(), List.of(), new OnChainCostsDto(Coins.NONE, Coins.NONE), + new OffChainCostsDto(Coins.NONE, Coins.NONE), BalanceInformationDto.createFromModel(BalanceInformation.EMPTY), true, new FeeReportDto("0", "0") @@ -110,8 +118,12 @@ class NodeControllerTest { ); Coins openCosts = Coins.ofSatoshis(123); Coins closeCosts = Coins.ofSatoshis(456); + Coins rebalanceSourceCosts = Coins.ofMilliSatoshis(1); + Coins rebalanceTargetCosts = Coins.ofMilliSatoshis(2); when(onChainCostService.getOpenCostsWith(PUBKEY_2)).thenReturn(openCosts); when(onChainCostService.getCloseCostsWith(PUBKEY_2)).thenReturn(closeCosts); + when(offChainCostService.getRebalanceSourceCostsForPeer(PUBKEY_2)).thenReturn(rebalanceSourceCosts); + when(offChainCostService.getRebalanceTargetCostsForPeer(PUBKEY_2)).thenReturn(rebalanceTargetCosts); when(balanceService.getBalanceInformationForPeer(PUBKEY_2)).thenReturn(BALANCE_INFORMATION); when(feeService.getFeeReportForPeer(PUBKEY_2)).thenReturn(FEE_REPORT); NodeDetailsDto expectedDetails = new NodeDetailsDto( @@ -122,6 +134,7 @@ class NodeControllerTest { List.of(CHANNEL_ID, CHANNEL_ID_2), List.of(CHANNEL_ID, CHANNEL_ID_2, CHANNEL_ID_3), new OnChainCostsDto(openCosts, closeCosts), + new OffChainCostsDto(rebalanceSourceCosts, rebalanceTargetCosts), BalanceInformationDto.createFromModel(BALANCE_INFORMATION), false, new FeeReportDto("1234", "567")