private TokenValueDto pickIfRefund(final TokenValueDto tokenValue) { return !isFund(tokenValue) ? tokenValue : null; }
public List<UserFundsDto> aggregate(final List<FundsByFunderDto> fundsByFunder) { return fundsByFunder.stream() .collect(Collectors.groupingBy(funds -> funds.getFunderAddress().toLowerCase() + funds.getFunderUserId(), Collectors.mapping(mapToUserFundDto(), Collectors.reducing(mergeFundsAndRefunds())))) .values() .stream() .filter(Optional::isPresent) .map(Optional::get) .collect(Collectors.toList()); }
private List<UserFundsDto> getFundsAndRefundsFor(final Long requestId) { final List<Fund> fundsForRequest = fundRepository.findAllByRequestId(requestId); final List<Refund> refundsForRequest = refundRepository.findAllByRequestId(requestId); return fundsAndRefundsAggregator.aggregate(Stream.concat(fundFundsByFunderAggregator.aggregate(fundsForRequest).stream(), refundFundsByFunderAggregator.aggregate(refundsForRequest).stream()) .collect(Collectors.toList())); }
private Function<FundsByFunderDto, UserFundsDto> mapToUserFundDto() { return fundsByFunder -> UserFundsDto.builder() .funderUserId(fundsByFunder.getFunderUserId()) .funderAddress(fundsByFunder.getFunderAddress()) .fndFunds(pickIfFund(fundsByFunder.getFndValue())) .otherFunds(pickIfFund(fundsByFunder.getOtherValue())) .fndRefunds(pickIfRefund(fundsByFunder.getFndValue())) .otherRefunds(pickIfRefund(fundsByFunder.getOtherValue())) .build(); }
@BeforeEach public void setUp() { fundsAndRefundsAggregator = new FundsAndRefundsAggregator(); }
@Test public void aggregate() { final String funder1UserId = "dgfhj"; final String funder1Address = "0xFHDsad"; final String funder2UserId = "jghf"; final String funder2Address = "0xtrdkl"; final String funder3UserId = "hfg"; final String funder3Address = "0xeytru"; final FundsByFunderDto fundsByFunderDto1 = buildFundsByFunderDto(funder1UserId, funder1Address, "10", "20"); final FundsByFunderDto fundsByFunderDto2 = buildFundsByFunderDto(funder2UserId, funder2Address, null, "-30"); final FundsByFunderDto fundsByFunderDto3 = buildFundsByFunderDto(funder3UserId, funder3Address, "65", null); final FundsByFunderDto fundsByFunderDto4 = buildFundsByFunderDto(funder1UserId, funder1Address.toUpperCase(), "-10", "-10"); final FundsByFunderDto fundsByFunderDto5 = buildFundsByFunderDto(funder2UserId, funder2Address, null, "60"); final FundsByFunderDto fundsByFunderDto6 = buildFundsByFunderDto(funder3UserId, funder3Address, "-35", null); final List<UserFundsDto> result = fundsAndRefundsAggregator.aggregate(Arrays.asList(fundsByFunderDto1, fundsByFunderDto2, fundsByFunderDto3, fundsByFunderDto4, fundsByFunderDto5, fundsByFunderDto6)); assertThat(result).contains(buildUserFundsDtoFrom(fundsByFunderDto1, fundsByFunderDto4), buildUserFundsDtoFrom(fundsByFunderDto5, fundsByFunderDto2), buildUserFundsDtoFrom(fundsByFunderDto3, fundsByFunderDto6)); }
when(fundFundsByFunderAggregator.aggregate(same(funds))).thenReturn(fundsByFunder); when(refundFundsByFunderAggregator.aggregate(same(refunds))).thenReturn(refundsByFunder); when(fundsAndRefundsAggregator.aggregate(Stream.concat(fundsByFunder.stream(), refundsByFunder.stream()).collect(Collectors.toList()))).thenReturn(userFunds);
private TokenValueDto pickIfFund(final TokenValueDto tokenValue) { return isFund(tokenValue) ? tokenValue : null; }