From 4ce3f74f880509a5b74ed5da23c5c06d6e56d17c Mon Sep 17 00:00:00 2001 From: Pieter Van Eeckhout Date: Wed, 30 Aug 2023 01:42:00 +0200 Subject: [PATCH 1/8] #103 - adding pagination --- .../config/PersistenceEntityMapperConfig.java | 39 ++++++----- .../adapter/config/WebDtoMapperConfig.java | 27 +++++--- .../filter/MybatisLocateCommodityFilter.java | 2 + .../persistence/filter/MybatisPageFilter.java | 22 ++++++ ...ersistenceLocateCommodityFilterMapper.java | 9 ++- .../MybatisPersistencePageFilterMapper.java | 16 +++++ .../MybatisLocateCommodityRepository.java | 4 ++ .../filter/RestLocateCommodityFilterDto.java | 5 +- .../web/dto/filter/RestPageFilterDto.java | 9 +++ .../RestLocateCommodityFilterDtoMapper.java | 12 +++- .../mapper/RestPageFilterDtoMapper.java | 31 +++++++++ .../domain/filter/LocateCommodityFilter.java | 1 + .../application/domain/filter/PageFilter.java | 18 +++++ .../filter/PersistencePageFilter.java | 7 ++ .../mapper/PersistencePageFilterMapper.java | 9 +++ .../web/filter/LocateCommodityFilterDto.java | 22 +++--- .../dto/web/filter/PageFilterDto.java | 7 ++ .../filter/mapper/PageFilterDtoMapper.java | 11 +++ .../mapper/MybatisPageFilterMapperTest.java | 36 ++++++++++ ...stenceLocateCommodityFilterMapperTest.java | 63 ++++++++++++++--- ...estLocateCommodityFilterDtoMapperTest.java | 68 ++++++++++++++++--- .../mapper/RestPageFilterDtoMapperTest.java | 53 +++++++++++++++ 22 files changed, 416 insertions(+), 55 deletions(-) create mode 100644 trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/filter/MybatisPageFilter.java create mode 100644 trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/filter/mapper/MybatisPersistencePageFilterMapper.java create mode 100644 trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/RestPageFilterDto.java create mode 100644 trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestPageFilterDtoMapper.java create mode 100644 trade-module/src/main/java/io/edpn/backend/trade/application/domain/filter/PageFilter.java create mode 100644 trade-module/src/main/java/io/edpn/backend/trade/application/dto/persistence/filter/PersistencePageFilter.java create mode 100644 trade-module/src/main/java/io/edpn/backend/trade/application/dto/persistence/filter/mapper/PersistencePageFilterMapper.java create mode 100644 trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/filter/PageFilterDto.java create mode 100644 trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/filter/mapper/PageFilterDtoMapper.java create mode 100644 trade-module/src/test/java/io/edpn/backend/trade/adapter/persistence/filter/mapper/MybatisPageFilterMapperTest.java create mode 100644 trade-module/src/test/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestPageFilterDtoMapperTest.java diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/PersistenceEntityMapperConfig.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/PersistenceEntityMapperConfig.java index 2de1559c..c44539b6 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/PersistenceEntityMapperConfig.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/PersistenceEntityMapperConfig.java @@ -10,68 +10,75 @@ import io.edpn.backend.trade.adapter.persistence.filter.mapper.MybatisPersistenceFindCommodityFilterMapper; import io.edpn.backend.trade.adapter.persistence.filter.mapper.MybatisPersistenceFindSystemFilterMapper; import io.edpn.backend.trade.adapter.persistence.filter.mapper.MybatisPersistenceLocateCommodityFilterMapper; +import io.edpn.backend.trade.adapter.persistence.filter.mapper.MybatisPersistencePageFilterMapper; +import io.edpn.backend.trade.application.dto.persistence.filter.mapper.PersistencePageFilterMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration("TradeModuleEntityMapperConfig") public class PersistenceEntityMapperConfig { - + @Bean(name = "tradeValidatedCommodityEntityMapper") public MybatisValidatedCommodityEntityMapper validatedCommodityEntityMapper() { return new MybatisValidatedCommodityEntityMapper(); } - + @Bean(name = "tradeFindCommodityEntityMapper") public MybatisPersistenceFindCommodityFilterMapper findCommodityFilterMapper() { return new MybatisPersistenceFindCommodityFilterMapper(); } - + @Bean(name = "tradeLocateCommodityEntityMapper") - public MybatisPersistenceLocateCommodityFilterMapper locateCommodityFilterMapper() { - return new MybatisPersistenceLocateCommodityFilterMapper(); + public MybatisPersistenceLocateCommodityFilterMapper locateCommodityFilterMapper(PersistencePageFilterMapper persistencePageFilterMapper) { + return new MybatisPersistenceLocateCommodityFilterMapper(persistencePageFilterMapper); + } + + @Bean(name = "tradePersistencePageFilterMapper") + public MybatisPersistencePageFilterMapper persistencePageFilterMapper() { + return new MybatisPersistencePageFilterMapper(); } - + @Bean(name = "tradePersistenceFindSystemFilterMapper") - public MybatisPersistenceFindSystemFilterMapper findSystemFilterMapper(){ + public MybatisPersistenceFindSystemFilterMapper findSystemFilterMapper() { return new MybatisPersistenceFindSystemFilterMapper(); } - + @Bean(name = "tradeSystemEntityMapper") public MybatisSystemEntityMapper systemEntityMapper() { return new MybatisSystemEntityMapper(); } - + @Bean(name = "tradeCommodityEntityMapper") public MybatisCommodityEntityMapper commodityEntityMapper() { return new MybatisCommodityEntityMapper(); } - + @Bean(name = "tradeMarketDatumEntityMapper") public MybatisMarketDatumEntityMapper marketDatumEntityMapper( MybatisCommodityEntityMapper mybatisCommodityEntityMapper) { return new MybatisMarketDatumEntityMapper(mybatisCommodityEntityMapper); } - + @Bean(name = "tradeStationEntityMapper") public MybatisStationEntityMapper stationEntityMapper( MybatisSystemEntityMapper mybatisSystemEntityMapper, MybatisMarketDatumEntityMapper mybatisMarketDatumEntityMapper) { return new MybatisStationEntityMapper(mybatisSystemEntityMapper, mybatisMarketDatumEntityMapper); } - + @Bean(name = "tradeLocateCommodityFilterMapper") public MybatisLocateCommodityEntityMapper locateCommodityEntityMapper( MybatisValidatedCommodityEntityMapper mybatisValidatedCommodityEntityMapper, MybatisStationEntityMapper mybatisStationEntityMapper) { return new MybatisLocateCommodityEntityMapper(mybatisValidatedCommodityEntityMapper, mybatisStationEntityMapper); } - + @Bean(name = "tradeCommodityMarketInfoEntityMapper") public MybatisCommodityMarketInfoEntityMapper commodityMarketInfoEntityMapper( MybatisValidatedCommodityEntityMapper mybatisValidatedCommodityEntityMapper, - MybatisStationEntityMapper mybatisStationEntityMapper ){ + MybatisStationEntityMapper mybatisStationEntityMapper) { return new MybatisCommodityMarketInfoEntityMapper(mybatisValidatedCommodityEntityMapper, mybatisStationEntityMapper); } - - + + } diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/WebDtoMapperConfig.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/WebDtoMapperConfig.java index 4a81bc00..5759e114 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/WebDtoMapperConfig.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/WebDtoMapperConfig.java @@ -2,6 +2,7 @@ import io.edpn.backend.trade.adapter.web.dto.filter.mapper.RestFindCommodityFilterDtoMapper; import io.edpn.backend.trade.adapter.web.dto.filter.mapper.RestLocateCommodityFilterDtoMapper; +import io.edpn.backend.trade.adapter.web.dto.filter.mapper.RestPageFilterDtoMapper; import io.edpn.backend.trade.adapter.web.dto.object.mapper.RestCommodityMarketInfoDtoMapper; import io.edpn.backend.trade.adapter.web.dto.object.mapper.RestLocateCommodityDtoMapper; import io.edpn.backend.trade.adapter.web.dto.object.mapper.RestStationDtoMapper; @@ -9,6 +10,7 @@ import io.edpn.backend.trade.adapter.web.dto.object.mapper.RestValidatedCommodityDtoMapper; import io.edpn.backend.trade.application.dto.web.filter.mapper.FindCommodityFilterDtoMapper; import io.edpn.backend.trade.application.dto.web.filter.mapper.LocateCommodityFilterDtoMapper; +import io.edpn.backend.trade.application.dto.web.filter.mapper.PageFilterDtoMapper; import io.edpn.backend.trade.application.dto.web.object.mapper.CommodityMarketInfoDtoMapper; import io.edpn.backend.trade.application.dto.web.object.mapper.LocateCommodityDtoMapper; import io.edpn.backend.trade.application.dto.web.object.mapper.StationDtoMapper; @@ -19,44 +21,49 @@ @Configuration("TradeWebDtoMapperConfig") public class WebDtoMapperConfig { - + @Bean(name = "tradeFindCommodityDTOMapper") public FindCommodityFilterDtoMapper findCommodityDTOMapper() { return new RestFindCommodityFilterDtoMapper(); } - + @Bean(name = "tradeValidatedCommodityDTOMapper") public ValidatedCommodityDtoMapper validatedCommodityDTOMapper() { return new RestValidatedCommodityDtoMapper(); } - + @Bean(name = "tradeSystemDtoMapper") public SystemDtoMapper systemDtoMapper() { return new RestSystemDtoMapper(); } - + @Bean(name = "tradeStationDtoMapper") public StationDtoMapper stationDtoMapper( - SystemDtoMapper systemDtoMapper){ + SystemDtoMapper systemDtoMapper) { return new RestStationDtoMapper(systemDtoMapper); } - + @Bean(name = "tradeLocateCommodityDtoMapper") public LocateCommodityDtoMapper locateCommodityDtoMapper( StationDtoMapper stationDtoMapper, ValidatedCommodityDtoMapper validatedCommodityDtoMapper) { return new RestLocateCommodityDtoMapper(stationDtoMapper, validatedCommodityDtoMapper); } - + @Bean(name = "tradeCommodityMarketInfoDtoMapper") public CommodityMarketInfoDtoMapper commodityMarketInfoDtoMapper( ValidatedCommodityDtoMapper validatedCommodityDtoMapper, StationDtoMapper stationDtoMapper) { return new RestCommodityMarketInfoDtoMapper(validatedCommodityDtoMapper, stationDtoMapper); } - + @Bean(name = "tradeLocateCommodityFilterDtoMapper") - public LocateCommodityFilterDtoMapper locateCommodityFilterDtoMapper() { - return new RestLocateCommodityFilterDtoMapper(); + public LocateCommodityFilterDtoMapper locateCommodityFilterDtoMapper(PageFilterDtoMapper pageFilterDtoMapper) { + return new RestLocateCommodityFilterDtoMapper(pageFilterDtoMapper); + } + + @Bean(name = "tradePageFilterDtoMapper") + public PageFilterDtoMapper pageFilterDtoMapper() { + return new RestPageFilterDtoMapper(); } } diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/filter/MybatisLocateCommodityFilter.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/filter/MybatisLocateCommodityFilter.java index 31846cc8..5f5d7081 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/filter/MybatisLocateCommodityFilter.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/filter/MybatisLocateCommodityFilter.java @@ -1,6 +1,7 @@ package io.edpn.backend.trade.adapter.persistence.filter; import io.edpn.backend.trade.application.dto.persistence.filter.PersistenceLocateCommodityFilter; +import io.edpn.backend.trade.application.dto.persistence.filter.PersistencePageFilter; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.EqualsAndHashCode; @@ -28,4 +29,5 @@ public class MybatisLocateCommodityFilter implements PersistenceLocateCommodityF private String maxLandingPadSize; private Long minSupply; private Long minDemand; + private PersistencePageFilter page; } diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/filter/MybatisPageFilter.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/filter/MybatisPageFilter.java new file mode 100644 index 00000000..5e39f19b --- /dev/null +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/filter/MybatisPageFilter.java @@ -0,0 +1,22 @@ +package io.edpn.backend.trade.adapter.persistence.filter; + +import io.edpn.backend.trade.application.dto.persistence.filter.PersistencePageFilter; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString +@AllArgsConstructor +@NoArgsConstructor +@Builder +@EqualsAndHashCode +public class MybatisPageFilter implements PersistencePageFilter { + private int size; + private int page; +} diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/filter/mapper/MybatisPersistenceLocateCommodityFilterMapper.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/filter/mapper/MybatisPersistenceLocateCommodityFilterMapper.java index 26cd87a4..db43f927 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/filter/mapper/MybatisPersistenceLocateCommodityFilterMapper.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/filter/mapper/MybatisPersistenceLocateCommodityFilterMapper.java @@ -3,9 +3,15 @@ import io.edpn.backend.trade.adapter.persistence.filter.MybatisLocateCommodityFilter; import io.edpn.backend.trade.application.domain.filter.LocateCommodityFilter; import io.edpn.backend.trade.application.dto.persistence.filter.mapper.PersistenceLocateCommodityFilterMapper; +import io.edpn.backend.trade.application.dto.persistence.filter.mapper.PersistencePageFilterMapper; +import lombok.RequiredArgsConstructor; +import java.util.Optional; + +@RequiredArgsConstructor public class MybatisPersistenceLocateCommodityFilterMapper implements PersistenceLocateCommodityFilterMapper { - + private final PersistencePageFilterMapper pageFilterMapper; + @Override public MybatisLocateCommodityFilter map(LocateCommodityFilter locateCommodityFilter) { return MybatisLocateCommodityFilter.builder() @@ -19,6 +25,7 @@ public MybatisLocateCommodityFilter map(LocateCommodityFilter locateCommodityFil .maxLandingPadSize(String.valueOf(locateCommodityFilter.getMaxLandingPadSize())) .minSupply(locateCommodityFilter.getMinSupply()) .minDemand(locateCommodityFilter.getMinDemand()) + .page(Optional.ofNullable(locateCommodityFilter.getPageFilter()).map(pageFilterMapper::map).orElse(null)) .build(); } } diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/filter/mapper/MybatisPersistencePageFilterMapper.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/filter/mapper/MybatisPersistencePageFilterMapper.java new file mode 100644 index 00000000..1e7e0a03 --- /dev/null +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/filter/mapper/MybatisPersistencePageFilterMapper.java @@ -0,0 +1,16 @@ +package io.edpn.backend.trade.adapter.persistence.filter.mapper; + +import io.edpn.backend.trade.adapter.persistence.filter.MybatisPageFilter; +import io.edpn.backend.trade.application.domain.filter.PageFilter; +import io.edpn.backend.trade.application.dto.persistence.filter.PersistencePageFilter; +import io.edpn.backend.trade.application.dto.persistence.filter.mapper.PersistencePageFilterMapper; + +public class MybatisPersistencePageFilterMapper implements PersistencePageFilterMapper { + @Override + public PersistencePageFilter map(PageFilter pageFilter) { + return MybatisPageFilter.builder() + .size(pageFilter.getSize()) + .page(pageFilter.getPage()) + .build(); + } +} diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/repository/MybatisLocateCommodityRepository.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/repository/MybatisLocateCommodityRepository.java index f556cecf..8c9c584a 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/repository/MybatisLocateCommodityRepository.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/repository/MybatisLocateCommodityRepository.java @@ -36,6 +36,10 @@ public interface MybatisLocateCommodityRepository { AND max_landing_pad_size = 'LARGE' AND max_landing_pad_size IN ('MEDIUM', 'LARGE') ORDER BY distance + + LIMIT #{page.size} + OFFSET (#{page.size} * #{page.page}) + """ ) @Results(id = "findCommodityResultMap", value = { diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/RestLocateCommodityFilterDto.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/RestLocateCommodityFilterDto.java index e5d2f42b..e340d342 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/RestLocateCommodityFilterDto.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/RestLocateCommodityFilterDto.java @@ -1,6 +1,7 @@ package io.edpn.backend.trade.adapter.web.dto.filter; import io.edpn.backend.trade.application.dto.web.filter.LocateCommodityFilterDto; +import io.edpn.backend.trade.application.dto.web.filter.PageFilterDto; import io.swagger.v3.oas.annotations.media.Schema; @Schema(name = "LocateCommodityFilterDto") @@ -14,5 +15,7 @@ public record RestLocateCommodityFilterDto( Boolean includeFleetCarriers, String maxLandingPadSize, Long minSupply, - Long minDemand) implements LocateCommodityFilterDto { + Long minDemand, + PageFilterDto page +) implements LocateCommodityFilterDto { } diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/RestPageFilterDto.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/RestPageFilterDto.java new file mode 100644 index 00000000..96e563df --- /dev/null +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/RestPageFilterDto.java @@ -0,0 +1,9 @@ +package io.edpn.backend.trade.adapter.web.dto.filter; + +import io.edpn.backend.trade.application.dto.web.filter.PageFilterDto; + +public record RestPageFilterDto( + int size, + int page +) implements PageFilterDto { +} diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestLocateCommodityFilterDtoMapper.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestLocateCommodityFilterDtoMapper.java index 56c103c9..148a0e7b 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestLocateCommodityFilterDtoMapper.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestLocateCommodityFilterDtoMapper.java @@ -4,8 +4,15 @@ import io.edpn.backend.trade.application.domain.filter.LocateCommodityFilter; import io.edpn.backend.trade.application.dto.web.filter.LocateCommodityFilterDto; import io.edpn.backend.trade.application.dto.web.filter.mapper.LocateCommodityFilterDtoMapper; +import io.edpn.backend.trade.application.dto.web.filter.mapper.PageFilterDtoMapper; +import lombok.RequiredArgsConstructor; +import java.util.Optional; + +@RequiredArgsConstructor public class RestLocateCommodityFilterDtoMapper implements LocateCommodityFilterDtoMapper { + private final PageFilterDtoMapper pageFilterDtoMapper; + @Override public LocateCommodityFilter map(LocateCommodityFilterDto locateCommodityFilterDto) { return new LocateCommodityFilter( @@ -18,7 +25,10 @@ public LocateCommodityFilter map(LocateCommodityFilterDto locateCommodityFilterD locateCommodityFilterDto.includeFleetCarriers(), LandingPadSize.valueOf(locateCommodityFilterDto.maxLandingPadSize()), locateCommodityFilterDto.minSupply(), - locateCommodityFilterDto.minDemand() + locateCommodityFilterDto.minDemand(), + Optional.ofNullable(locateCommodityFilterDto.page()) + .map(pageFilterDtoMapper::map) + .orElse(pageFilterDtoMapper.getDefaultFilter()) ); } } diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestPageFilterDtoMapper.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestPageFilterDtoMapper.java new file mode 100644 index 00000000..e5c7de1b --- /dev/null +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestPageFilterDtoMapper.java @@ -0,0 +1,31 @@ +package io.edpn.backend.trade.adapter.web.dto.filter.mapper; + +import io.edpn.backend.trade.application.domain.filter.PageFilter; +import io.edpn.backend.trade.application.dto.web.filter.PageFilterDto; +import io.edpn.backend.trade.application.dto.web.filter.mapper.PageFilterDtoMapper; + +public class RestPageFilterDtoMapper implements PageFilterDtoMapper { + @Override + public PageFilter map(PageFilterDto pageFilterDto) { + PageFilter.PageFilterBuilder bulder = getDefaultFilterBuilder(); + if (pageFilterDto.size() > 0) { + bulder.size(pageFilterDto.size()); + } + if (pageFilterDto.page() >= 0) { + bulder.page(pageFilterDto.page()); + } + return bulder.build(); + } + + @Override + public PageFilter getDefaultFilter() { + return getDefaultFilterBuilder() + .build(); + } + + private PageFilter.PageFilterBuilder getDefaultFilterBuilder() { + return PageFilter.builder() + .size(20) //TODO get from config + .page(0); + } +} \ No newline at end of file diff --git a/trade-module/src/main/java/io/edpn/backend/trade/application/domain/filter/LocateCommodityFilter.java b/trade-module/src/main/java/io/edpn/backend/trade/application/domain/filter/LocateCommodityFilter.java index 6c48c194..e0c449e4 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/application/domain/filter/LocateCommodityFilter.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/application/domain/filter/LocateCommodityFilter.java @@ -23,4 +23,5 @@ public class LocateCommodityFilter { private LandingPadSize maxLandingPadSize; private Long minSupply; private Long minDemand; + private PageFilter pageFilter; } diff --git a/trade-module/src/main/java/io/edpn/backend/trade/application/domain/filter/PageFilter.java b/trade-module/src/main/java/io/edpn/backend/trade/application/domain/filter/PageFilter.java new file mode 100644 index 00000000..e36be5f3 --- /dev/null +++ b/trade-module/src/main/java/io/edpn/backend/trade/application/domain/filter/PageFilter.java @@ -0,0 +1,18 @@ +package io.edpn.backend.trade.application.domain.filter; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString +@AllArgsConstructor +@Builder +public class PageFilter { + private int size; + + private int page; +} diff --git a/trade-module/src/main/java/io/edpn/backend/trade/application/dto/persistence/filter/PersistencePageFilter.java b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/persistence/filter/PersistencePageFilter.java new file mode 100644 index 00000000..e77e3cf9 --- /dev/null +++ b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/persistence/filter/PersistencePageFilter.java @@ -0,0 +1,7 @@ +package io.edpn.backend.trade.application.dto.persistence.filter; + +public interface PersistencePageFilter { + + int getSize(); + int getPage(); +} diff --git a/trade-module/src/main/java/io/edpn/backend/trade/application/dto/persistence/filter/mapper/PersistencePageFilterMapper.java b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/persistence/filter/mapper/PersistencePageFilterMapper.java new file mode 100644 index 00000000..4f5ab68e --- /dev/null +++ b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/persistence/filter/mapper/PersistencePageFilterMapper.java @@ -0,0 +1,9 @@ +package io.edpn.backend.trade.application.dto.persistence.filter.mapper; + +import io.edpn.backend.trade.application.domain.filter.PageFilter; +import io.edpn.backend.trade.application.dto.persistence.filter.PersistencePageFilter; + +public interface PersistencePageFilterMapper { + + PersistencePageFilter map(PageFilter pageFilter); +} diff --git a/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/filter/LocateCommodityFilterDto.java b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/filter/LocateCommodityFilterDto.java index 14973be3..96a1ea51 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/filter/LocateCommodityFilterDto.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/filter/LocateCommodityFilterDto.java @@ -1,24 +1,26 @@ package io.edpn.backend.trade.application.dto.web.filter; public interface LocateCommodityFilterDto { - + String commodityDisplayName(); - + Double xCoordinate(); - + Double yCoordinate(); - + Double zCoordinate(); - + Boolean includePlanetary(); - + Boolean includeOdyssey(); - + Boolean includeFleetCarriers(); - + String maxLandingPadSize(); - + Long minSupply(); - + Long minDemand(); + + PageFilterDto page(); } diff --git a/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/filter/PageFilterDto.java b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/filter/PageFilterDto.java new file mode 100644 index 00000000..aaa476ae --- /dev/null +++ b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/filter/PageFilterDto.java @@ -0,0 +1,7 @@ +package io.edpn.backend.trade.application.dto.web.filter; + +public interface PageFilterDto { + int size(); + + int page(); +} diff --git a/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/filter/mapper/PageFilterDtoMapper.java b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/filter/mapper/PageFilterDtoMapper.java new file mode 100644 index 00000000..3c94766c --- /dev/null +++ b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/filter/mapper/PageFilterDtoMapper.java @@ -0,0 +1,11 @@ +package io.edpn.backend.trade.application.dto.web.filter.mapper; + +import io.edpn.backend.trade.application.domain.filter.PageFilter; +import io.edpn.backend.trade.application.dto.web.filter.PageFilterDto; + +public interface PageFilterDtoMapper { + + PageFilter map(PageFilterDto pageFilterDto); + + PageFilter getDefaultFilter(); +} diff --git a/trade-module/src/test/java/io/edpn/backend/trade/adapter/persistence/filter/mapper/MybatisPageFilterMapperTest.java b/trade-module/src/test/java/io/edpn/backend/trade/adapter/persistence/filter/mapper/MybatisPageFilterMapperTest.java new file mode 100644 index 00000000..a2b87659 --- /dev/null +++ b/trade-module/src/test/java/io/edpn/backend/trade/adapter/persistence/filter/mapper/MybatisPageFilterMapperTest.java @@ -0,0 +1,36 @@ +package io.edpn.backend.trade.adapter.persistence.filter.mapper; + +import io.edpn.backend.trade.application.domain.filter.PageFilter; +import io.edpn.backend.trade.application.dto.persistence.filter.PersistencePageFilter; +import io.edpn.backend.trade.application.dto.persistence.filter.mapper.PersistencePageFilterMapper; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; + +@ExtendWith(MockitoExtension.class) +class MybatisPageFilterMapperTest { + + private PersistencePageFilterMapper underTest; + + @BeforeEach + public void setUp() { + underTest = new MybatisPersistencePageFilterMapper(); + } + + @Test + public void testMap_givenDomainObject_shouldReturnEntity() { + PageFilter pageFilter = PageFilter.builder() + .page(1) + .size(20) + .build(); + + PersistencePageFilter entity = underTest.map(pageFilter); + + assertThat(entity.getPage(), is(1)); + assertThat(entity.getSize(), is(20)); + } +} \ No newline at end of file diff --git a/trade-module/src/test/java/io/edpn/backend/trade/adapter/persistence/filter/mapper/MybatisPersistenceLocateCommodityFilterMapperTest.java b/trade-module/src/test/java/io/edpn/backend/trade/adapter/persistence/filter/mapper/MybatisPersistenceLocateCommodityFilterMapperTest.java index 0072dda8..ae172b16 100644 --- a/trade-module/src/test/java/io/edpn/backend/trade/adapter/persistence/filter/mapper/MybatisPersistenceLocateCommodityFilterMapperTest.java +++ b/trade-module/src/test/java/io/edpn/backend/trade/adapter/persistence/filter/mapper/MybatisPersistenceLocateCommodityFilterMapperTest.java @@ -1,29 +1,73 @@ package io.edpn.backend.trade.adapter.persistence.filter.mapper; import io.edpn.backend.trade.adapter.persistence.filter.MybatisLocateCommodityFilter; +import io.edpn.backend.trade.adapter.persistence.filter.MybatisPageFilter; import io.edpn.backend.trade.application.domain.LandingPadSize; import io.edpn.backend.trade.application.domain.filter.LocateCommodityFilter; +import io.edpn.backend.trade.application.domain.filter.PageFilter; +import io.edpn.backend.trade.application.dto.persistence.filter.mapper.PersistencePageFilterMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.Matchers.nullValue; +import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class MybatisPersistenceLocateCommodityFilterMapperTest { - + private MybatisPersistenceLocateCommodityFilterMapper underTest; + @Mock + private PersistencePageFilterMapper pageFilterMapper; + @BeforeEach - public void setUp(){ - underTest = new MybatisPersistenceLocateCommodityFilterMapper(); + public void setUp() { + underTest = new MybatisPersistenceLocateCommodityFilterMapper(pageFilterMapper); } - + + @Test + public void testMap_givenDomainObject_shouldReturnEntity_nullPageFilter() { + LocateCommodityFilter domainObject = LocateCommodityFilter.builder() + .commodityDisplayName("Display Name") + .xCoordinate(1.0) + .yCoordinate(2.0) + .zCoordinate(3.0) + .includePlanetary(true) + .includeOdyssey(false) + .includeFleetCarriers(true) + .maxLandingPadSize(LandingPadSize.MEDIUM) + .minSupply(123L) + .minDemand(321L) + .pageFilter(null) + .build(); + + MybatisLocateCommodityFilter entity = underTest.map(domainObject); + + assertThat(entity.getCommodityDisplayName(), is("Display Name")); + assertThat(entity.getXCoordinate(), is(1.0)); + assertThat(entity.getYCoordinate(), is(2.0)); + assertThat(entity.getZCoordinate(), is(3.0)); + assertThat(entity.getIncludeFleetCarriers(), is(true)); + assertThat(entity.getIncludeOdyssey(), is(false)); + assertThat(entity.getIncludeFleetCarriers(), is(true)); + assertThat(entity.getMaxLandingPadSize(), is(String.valueOf(LandingPadSize.MEDIUM))); + assertThat(entity.getMinSupply(), is(123L)); + assertThat(entity.getMinDemand(), is(321L)); + assertThat(entity.getPage(), nullValue()); + } + @Test public void testMap_givenDomainObject_shouldReturnEntity() { - + PageFilter pageFilter = PageFilter.builder() + .page(1) + .size(20) + .build(); LocateCommodityFilter domainObject = LocateCommodityFilter.builder() .commodityDisplayName("Display Name") .xCoordinate(1.0) @@ -35,10 +79,13 @@ public void testMap_givenDomainObject_shouldReturnEntity() { .maxLandingPadSize(LandingPadSize.MEDIUM) .minSupply(123L) .minDemand(321L) + .pageFilter(pageFilter) .build(); - + + when(pageFilterMapper.map(pageFilter)).thenReturn(MybatisPageFilter.builder().build()); + MybatisLocateCommodityFilter entity = underTest.map(domainObject); - + assertThat(entity.getCommodityDisplayName(), is("Display Name")); assertThat(entity.getXCoordinate(), is(1.0)); assertThat(entity.getYCoordinate(), is(2.0)); @@ -49,6 +96,6 @@ public void testMap_givenDomainObject_shouldReturnEntity() { assertThat(entity.getMaxLandingPadSize(), is(String.valueOf(LandingPadSize.MEDIUM))); assertThat(entity.getMinSupply(), is(123L)); assertThat(entity.getMinDemand(), is(321L)); - + assertThat(entity.getPage(), notNullValue()); } } \ No newline at end of file diff --git a/trade-module/src/test/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestLocateCommodityFilterDtoMapperTest.java b/trade-module/src/test/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestLocateCommodityFilterDtoMapperTest.java index 74b5b772..6499fd5e 100644 --- a/trade-module/src/test/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestLocateCommodityFilterDtoMapperTest.java +++ b/trade-module/src/test/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestLocateCommodityFilterDtoMapperTest.java @@ -1,30 +1,75 @@ package io.edpn.backend.trade.adapter.web.dto.filter.mapper; import io.edpn.backend.trade.adapter.web.dto.filter.RestLocateCommodityFilterDto; +import io.edpn.backend.trade.adapter.web.dto.filter.RestPageFilterDto; import io.edpn.backend.trade.application.domain.LandingPadSize; import io.edpn.backend.trade.application.domain.filter.LocateCommodityFilter; +import io.edpn.backend.trade.application.domain.filter.PageFilter; import io.edpn.backend.trade.application.dto.web.filter.LocateCommodityFilterDto; import io.edpn.backend.trade.application.dto.web.filter.mapper.LocateCommodityFilterDtoMapper; +import io.edpn.backend.trade.application.dto.web.filter.mapper.PageFilterDtoMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; +import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class RestLocateCommodityFilterDtoMapperTest { - + private LocateCommodityFilterDtoMapper underTest; - + + @Mock + private PageFilterDtoMapper pageFilterDtoMapper; + @BeforeEach - public void setUp(){ - underTest = new RestLocateCommodityFilterDtoMapper(); + public void setUp() { + underTest = new RestLocateCommodityFilterDtoMapper(pageFilterDtoMapper); + } + + @Test + public void testMap_givenDto_shouldReturnDomainObject_nullPageFilter() { + RestPageFilterDto pageFilterDto = null; + LocateCommodityFilterDto dto = new RestLocateCommodityFilterDto( + "Display Name", + 1.0, + 2.0, + 3.0, + true, + false, + true, + String.valueOf(LandingPadSize.MEDIUM), + 123L, + 321L, + pageFilterDto); + when(pageFilterDtoMapper.getDefaultFilter()).thenReturn(PageFilter.builder() + .size(20) + .page(0) + .build()); + + LocateCommodityFilter domainObject = underTest.map(dto); + + assertThat(domainObject.getCommodityDisplayName(), is("Display Name")); + assertThat(domainObject.getXCoordinate(), is(1.0)); + assertThat(domainObject.getYCoordinate(), is(2.0)); + assertThat(domainObject.getZCoordinate(), is(3.0)); + assertThat(domainObject.getIncludePlanetary(), is(true)); + assertThat(domainObject.getIncludeOdyssey(), is(false)); + assertThat(domainObject.getIncludeFleetCarriers(), is(true)); + assertThat(domainObject.getMaxLandingPadSize(), is(LandingPadSize.MEDIUM)); + assertThat(domainObject.getMinSupply(), is(123L)); + assertThat(domainObject.getMinDemand(), is(321L)); + assertThat(domainObject.getPageFilter().getPage(), is(0)); + assertThat(domainObject.getPageFilter().getSize(), is(20)); } - + @Test public void testMap_givenDto_shouldReturnDomainObject() { + RestPageFilterDto pageFilterDto = new RestPageFilterDto(20,4); LocateCommodityFilterDto dto = new RestLocateCommodityFilterDto( "Display Name", 1.0, @@ -35,10 +80,15 @@ public void testMap_givenDto_shouldReturnDomainObject() { true, String.valueOf(LandingPadSize.MEDIUM), 123L, - 321L); - + 321L, + pageFilterDto); + when(pageFilterDtoMapper.map(pageFilterDto)).thenReturn(PageFilter.builder() + .size(20) + .page(4) + .build()); + LocateCommodityFilter domainObject = underTest.map(dto); - + assertThat(domainObject.getCommodityDisplayName(), is("Display Name")); assertThat(domainObject.getXCoordinate(), is(1.0)); assertThat(domainObject.getYCoordinate(), is(2.0)); @@ -49,5 +99,7 @@ public void testMap_givenDto_shouldReturnDomainObject() { assertThat(domainObject.getMaxLandingPadSize(), is(LandingPadSize.MEDIUM)); assertThat(domainObject.getMinSupply(), is(123L)); assertThat(domainObject.getMinDemand(), is(321L)); + assertThat(domainObject.getPageFilter().getPage(), is(4)); + assertThat(domainObject.getPageFilter().getSize(), is(20)); } } \ No newline at end of file diff --git a/trade-module/src/test/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestPageFilterDtoMapperTest.java b/trade-module/src/test/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestPageFilterDtoMapperTest.java new file mode 100644 index 00000000..5b6b51c3 --- /dev/null +++ b/trade-module/src/test/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestPageFilterDtoMapperTest.java @@ -0,0 +1,53 @@ +package io.edpn.backend.trade.adapter.web.dto.filter.mapper; + +import io.edpn.backend.trade.adapter.web.dto.filter.RestPageFilterDto; +import io.edpn.backend.trade.application.domain.filter.PageFilter; +import io.edpn.backend.trade.application.dto.web.filter.mapper.PageFilterDtoMapper; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; + +@ExtendWith(MockitoExtension.class) +class RestPageFilterDtoMapperTest { + + private PageFilterDtoMapper underTest; + + @BeforeEach + public void setUp() { + underTest = new RestPageFilterDtoMapper(); + } + + @Test + public void testMap_givenDto_shouldReturnDomainObject() { + RestPageFilterDto pageFilterDto = new RestPageFilterDto(20, 1); + + PageFilter domainObject = underTest.map(pageFilterDto); + + assertThat(domainObject.getPage(), is(1)); + assertThat(domainObject.getSize(), is(20)); + } + + @Test + public void testMap_givenDto_shouldReturnDomainObject_negativePageShouldBeZero() { + RestPageFilterDto pageFilterDto = new RestPageFilterDto(20, -4); + + PageFilter domainObject = underTest.map(pageFilterDto); + + assertThat(domainObject.getPage(), is(0)); + assertThat(domainObject.getSize(), is(20)); + } + + @Test + public void testMap_givenDto_shouldReturnDomainObject_negativeSizeShouldBeDefault() { + RestPageFilterDto pageFilterDto = new RestPageFilterDto(-20, 8); + + PageFilter domainObject = underTest.map(pageFilterDto); + + assertThat(domainObject.getPage(), is(8)); + assertThat(domainObject.getSize(), is(underTest.getDefaultFilter().getSize())); + } +} \ No newline at end of file From 5dfa58df28a552cddc17d5c072d56c2d65b962d0 Mon Sep 17 00:00:00 2001 From: Pieter Van Eeckhout Date: Wed, 30 Aug 2023 01:47:22 +0200 Subject: [PATCH 2/8] #103 - changing to implementation to facilitate swagger documentation --- .../adapter/web/dto/filter/RestLocateCommodityFilterDto.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/RestLocateCommodityFilterDto.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/RestLocateCommodityFilterDto.java index e340d342..1d1c0fe8 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/RestLocateCommodityFilterDto.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/RestLocateCommodityFilterDto.java @@ -16,6 +16,6 @@ public record RestLocateCommodityFilterDto( String maxLandingPadSize, Long minSupply, Long minDemand, - PageFilterDto page + RestPageFilterDto page ) implements LocateCommodityFilterDto { } From a512ec5a975e5ed2c386f04ef16e01dd41872e9b Mon Sep 17 00:00:00 2001 From: pveechout Date: Wed, 30 Aug 2023 14:36:45 +0200 Subject: [PATCH 3/8] #103 - adding schema --- .../trade/adapter/web/dto/filter/RestPageFilterDto.java | 2 ++ .../web/dto/filter/mapper/RestPageFilterDtoMapper.java | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/RestPageFilterDto.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/RestPageFilterDto.java index 96e563df..7fba4667 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/RestPageFilterDto.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/RestPageFilterDto.java @@ -1,7 +1,9 @@ package io.edpn.backend.trade.adapter.web.dto.filter; import io.edpn.backend.trade.application.dto.web.filter.PageFilterDto; +import io.swagger.v3.oas.annotations.media.Schema; +@Schema(name = "PageFilterDto") public record RestPageFilterDto( int size, int page diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestPageFilterDtoMapper.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestPageFilterDtoMapper.java index e5c7de1b..537216da 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestPageFilterDtoMapper.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestPageFilterDtoMapper.java @@ -7,14 +7,14 @@ public class RestPageFilterDtoMapper implements PageFilterDtoMapper { @Override public PageFilter map(PageFilterDto pageFilterDto) { - PageFilter.PageFilterBuilder bulder = getDefaultFilterBuilder(); + PageFilter.PageFilterBuilder builder = getDefaultFilterBuilder(); if (pageFilterDto.size() > 0) { - bulder.size(pageFilterDto.size()); + builder.size(pageFilterDto.size()); } if (pageFilterDto.page() >= 0) { - bulder.page(pageFilterDto.page()); + builder.page(pageFilterDto.page()); } - return bulder.build(); + return builder.build(); } @Override From c2416368515e90abd43ece1c90a5899551471acc Mon Sep 17 00:00:00 2001 From: pveechout Date: Thu, 31 Aug 2023 13:53:00 +0200 Subject: [PATCH 4/8] #103 - wip returning pageInfo in result --- build.gradle | 4 +- .../adapter/config/AsyncConfig.java | 14 +-- .../adapter/config/ServiceConfig.java | 6 +- .../trade/adapter/config/AsyncConfig.java | 14 +-- .../trade/adapter/config/ServiceConfig.java | 2 +- .../adapter/config/WebDtoMapperConfig.java | 12 +- .../entity/MybatisLocateCommodityEntity.java | 3 + .../MybatisLocateCommodityEntityMapper.java | 16 ++- .../filter/MybatisLocateCommodityFilter.java | 2 +- ...ersistenceLocateCommodityFilterMapper.java | 2 +- .../MybatisLocateCommodityRepository.java | 109 ++++++++++++++---- .../adapter/web/TradeModuleController.java | 18 +-- .../filter/RestLocateCommodityFilterDto.java | 2 +- .../RestLocateCommodityFilterDtoMapper.java | 4 +- .../dto/object/RestLocateCommodityDto.java | 5 +- .../web/dto/object/RestPageInfoDto.java | 10 ++ .../mapper/RestLocateCommodityDtoMapper.java | 10 +- .../object/mapper/RestPageInfoDtoMapper.java | 16 +++ .../application/domain/LocateCommodity.java | 1 + .../trade/application/domain/PageInfo.java | 19 +++ .../domain/filter/LocateCommodityFilter.java | 2 +- .../entity/LocateCommodityEntity.java | 3 + .../PersistenceLocateCommodityFilter.java | 2 +- .../web/filter/LocateCommodityFilterDto.java | 2 +- .../dto/web/object/LocateCommodityDto.java | 3 + .../dto/web/object/PageInfoDto.java | 7 ++ .../web/object/mapper/PageInfoDtoMapper.java | 9 ++ ...stenceLocateCommodityFilterMapperTest.java | 8 +- ...estLocateCommodityFilterDtoMapperTest.java | 6 +- 29 files changed, 230 insertions(+), 81 deletions(-) create mode 100644 trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/object/RestPageInfoDto.java create mode 100644 trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/object/mapper/RestPageInfoDtoMapper.java create mode 100644 trade-module/src/main/java/io/edpn/backend/trade/application/domain/PageInfo.java create mode 100644 trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/PageInfoDto.java create mode 100644 trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/mapper/PageInfoDtoMapper.java diff --git a/build.gradle b/build.gradle index 67a2fc51..dc6887c6 100644 --- a/build.gradle +++ b/build.gradle @@ -79,9 +79,9 @@ subprojects { kafkaVersion = '3.0.8' springdocOpenapiVersion = '2.1.0' prometheusVersion = '1.11.1' - backendUtilVersion = '0.0.2-SNAPSHOT' + backendUtilVersion = '0.0.3-SNAPSHOT' backendMybatisUtilVersion = '0.0.1-SNAPSHOT' - backendMessageProcessorLibVersion = '0.0.3-SNAPSHOT' + backendMessageProcessorLibVersion = '0.0.4-SNAPSHOT' junitJupiterVersion = "5.9.3" mockitoVersion = "5.4.0" hamcrestVersion = "2.2" diff --git a/exploration-module/src/main/java/io/edpn/backend/exploration/adapter/config/AsyncConfig.java b/exploration-module/src/main/java/io/edpn/backend/exploration/adapter/config/AsyncConfig.java index 6d626ea4..990ee0dc 100644 --- a/exploration-module/src/main/java/io/edpn/backend/exploration/adapter/config/AsyncConfig.java +++ b/exploration-module/src/main/java/io/edpn/backend/exploration/adapter/config/AsyncConfig.java @@ -4,9 +4,10 @@ import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.TaskScheduler; import org.springframework.scheduling.annotation.EnableScheduling; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; +import java.util.concurrent.ForkJoinPool; + @Configuration("ExplorationAsyncConfig") @EnableScheduling public class AsyncConfig { @@ -18,13 +19,8 @@ public TaskScheduler taskScheduler() { return taskScheduler; } - @Bean(name = "explorationThreadPoolTaskExecutor") - public ThreadPoolTaskExecutor taskExecutor() { - ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); - taskExecutor.setCorePoolSize(10);// todo Set from config - taskExecutor.setMaxPoolSize(50);// todo Set from config - taskExecutor.setQueueCapacity(500);// todo Set from config - taskExecutor.initialize(); - return taskExecutor; + @Bean(name = "explorationForkJoinPool") + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(50); // todo set from config } } diff --git a/exploration-module/src/main/java/io/edpn/backend/exploration/adapter/config/ServiceConfig.java b/exploration-module/src/main/java/io/edpn/backend/exploration/adapter/config/ServiceConfig.java index 2d295e62..81f6e057 100644 --- a/exploration-module/src/main/java/io/edpn/backend/exploration/adapter/config/ServiceConfig.java +++ b/exploration-module/src/main/java/io/edpn/backend/exploration/adapter/config/ServiceConfig.java @@ -50,7 +50,7 @@ public ReceiveNavRouteService receiveNavRouteService( MessageMapper messageMapper, @Qualifier("explorationObjectMapper") ObjectMapper objectMapper, @Qualifier("explorationRetryTemplate") RetryTemplate retryTemplate, - @Qualifier("explorationThreadPoolTaskExecutor") Executor executor + @Qualifier("explorationForkJoinPool") Executor executor ) { return new ReceiveNavRouteService( createSystemPort, @@ -125,7 +125,7 @@ public ProcessPendingSystemCoordinateRequestService processPendingSystemCoordina MessageMapper messageMapper, @Qualifier("explorationObjectMapper") ObjectMapper objectMapper, @Qualifier("explorationRetryTemplate") RetryTemplate retryTemplate, - @Qualifier("explorationThreadPoolTaskExecutor") Executor executor + @Qualifier("explorationForkJoinPool") Executor executor ) { return new ProcessPendingSystemCoordinateRequestService( loadAllSystemCoordinateRequestPort, @@ -149,7 +149,7 @@ public ProcessPendingSystemEliteIdRequestService processPendingSystemEliteIdRequ MessageMapper messageMapper, @Qualifier("explorationObjectMapper") ObjectMapper objectMapper, @Qualifier("explorationRetryTemplate") RetryTemplate retryTemplate, - @Qualifier("explorationThreadPoolTaskExecutor") Executor executor + @Qualifier("explorationForkJoinPool") Executor executor ) { return new ProcessPendingSystemEliteIdRequestService( loadAllSystemEliteIdRequestPort, diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/AsyncConfig.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/AsyncConfig.java index 4a041fe0..bb109ae7 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/AsyncConfig.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/AsyncConfig.java @@ -4,9 +4,10 @@ import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.TaskScheduler; import org.springframework.scheduling.annotation.EnableScheduling; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; +import java.util.concurrent.ForkJoinPool; + @Configuration("TradeAsyncConfig") @EnableScheduling public class AsyncConfig { @@ -18,13 +19,8 @@ public TaskScheduler taskScheduler() { return taskScheduler; } - @Bean(name = "tradeThreadPoolTaskExecutor") - public ThreadPoolTaskExecutor taskExecutor() { - ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); - taskExecutor.setCorePoolSize(10);// todo Set from config - taskExecutor.setMaxPoolSize(50);// todo Set from config - taskExecutor.setQueueCapacity(500);// todo Set from config - taskExecutor.initialize(); - return taskExecutor; + @Bean(name = "tradeForkJoinPool") + public ForkJoinPool forkJoinPool() { + return new ForkJoinPool(50); // todo Set from config } } \ No newline at end of file diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/ServiceConfig.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/ServiceConfig.java index 47abd2c7..0774ab66 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/ServiceConfig.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/ServiceConfig.java @@ -195,7 +195,7 @@ public RequestMissingSystemCoordinatesService requestMissingSystemCoordinatesUse CreateSystemCoordinateRequestPort createSystemCoordinateRequestPort, SendKafkaMessagePort sendKafkaMessagePort, @Qualifier("tradeRetryTemplate") RetryTemplate retryTemplate, - @Qualifier("tradeThreadPoolTaskExecutor") Executor executor, + @Qualifier("tradeForkJoinPool") Executor executor, ObjectMapper objectMapper, MessageMapper messageMapper ) { diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/WebDtoMapperConfig.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/WebDtoMapperConfig.java index 5759e114..b35caa47 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/WebDtoMapperConfig.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/WebDtoMapperConfig.java @@ -5,6 +5,7 @@ import io.edpn.backend.trade.adapter.web.dto.filter.mapper.RestPageFilterDtoMapper; import io.edpn.backend.trade.adapter.web.dto.object.mapper.RestCommodityMarketInfoDtoMapper; import io.edpn.backend.trade.adapter.web.dto.object.mapper.RestLocateCommodityDtoMapper; +import io.edpn.backend.trade.adapter.web.dto.object.mapper.RestPageInfoDtoMapper; import io.edpn.backend.trade.adapter.web.dto.object.mapper.RestStationDtoMapper; import io.edpn.backend.trade.adapter.web.dto.object.mapper.RestSystemDtoMapper; import io.edpn.backend.trade.adapter.web.dto.object.mapper.RestValidatedCommodityDtoMapper; @@ -13,6 +14,7 @@ import io.edpn.backend.trade.application.dto.web.filter.mapper.PageFilterDtoMapper; import io.edpn.backend.trade.application.dto.web.object.mapper.CommodityMarketInfoDtoMapper; import io.edpn.backend.trade.application.dto.web.object.mapper.LocateCommodityDtoMapper; +import io.edpn.backend.trade.application.dto.web.object.mapper.PageInfoDtoMapper; import io.edpn.backend.trade.application.dto.web.object.mapper.StationDtoMapper; import io.edpn.backend.trade.application.dto.web.object.mapper.SystemDtoMapper; import io.edpn.backend.trade.application.dto.web.object.mapper.ValidatedCommodityDtoMapper; @@ -32,6 +34,11 @@ public ValidatedCommodityDtoMapper validatedCommodityDTOMapper() { return new RestValidatedCommodityDtoMapper(); } + @Bean(name = "tradePageInfoDtoMapper") + public PageInfoDtoMapper pageInfoDtoMapper() { + return new RestPageInfoDtoMapper(); + } + @Bean(name = "tradeSystemDtoMapper") public SystemDtoMapper systemDtoMapper() { return new RestSystemDtoMapper(); @@ -46,8 +53,9 @@ public StationDtoMapper stationDtoMapper( @Bean(name = "tradeLocateCommodityDtoMapper") public LocateCommodityDtoMapper locateCommodityDtoMapper( StationDtoMapper stationDtoMapper, - ValidatedCommodityDtoMapper validatedCommodityDtoMapper) { - return new RestLocateCommodityDtoMapper(stationDtoMapper, validatedCommodityDtoMapper); + ValidatedCommodityDtoMapper validatedCommodityDtoMapper, + PageInfoDtoMapper pageInfoDtoMapper) { + return new RestLocateCommodityDtoMapper(stationDtoMapper, validatedCommodityDtoMapper, pageInfoDtoMapper); } @Bean(name = "tradeCommodityMarketInfoDtoMapper") diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/entity/MybatisLocateCommodityEntity.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/entity/MybatisLocateCommodityEntity.java index dbe90179..70eee617 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/entity/MybatisLocateCommodityEntity.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/entity/MybatisLocateCommodityEntity.java @@ -26,4 +26,7 @@ public class MybatisLocateCommodityEntity implements LocateCommodityEntity { private Long buyPrice; private Long sellPrice; private Double distance; + private Integer pageSize; + private Integer currentPage; + private Integer totalItems; } diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/entity/mapper/MybatisLocateCommodityEntityMapper.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/entity/mapper/MybatisLocateCommodityEntityMapper.java index 770db74e..8f798405 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/entity/mapper/MybatisLocateCommodityEntityMapper.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/entity/mapper/MybatisLocateCommodityEntityMapper.java @@ -4,19 +4,21 @@ import io.edpn.backend.trade.adapter.persistence.entity.MybatisStationEntity; import io.edpn.backend.trade.adapter.persistence.entity.MybatisValidatedCommodityEntity; import io.edpn.backend.trade.application.domain.LocateCommodity; +import io.edpn.backend.trade.application.domain.PageInfo; import io.edpn.backend.trade.application.dto.persistence.entity.LocateCommodityEntity; import io.edpn.backend.trade.application.dto.persistence.entity.mapper.LocateCommodityEntityMapper; import io.edpn.backend.trade.application.dto.persistence.entity.mapper.StationEntityMapper; import io.edpn.backend.trade.application.dto.persistence.entity.mapper.ValidatedCommodityEntityMapper; import lombok.RequiredArgsConstructor; +import java.util.Optional; + @RequiredArgsConstructor public class MybatisLocateCommodityEntityMapper implements LocateCommodityEntityMapper { - + private final ValidatedCommodityEntityMapper validatedCommodityEntityMapper; private final StationEntityMapper stationEntityMapper; - @Override public LocateCommodity map(LocateCommodityEntity locateCommodityEntity) { return new LocateCommodity( @@ -27,10 +29,16 @@ public LocateCommodity map(LocateCommodityEntity locateCommodityEntity) { locateCommodityEntity.getDemand(), locateCommodityEntity.getBuyPrice(), locateCommodityEntity.getSellPrice(), - locateCommodityEntity.getDistance() + locateCommodityEntity.getDistance(), + Optional.ofNullable(locateCommodityEntity.getPageSize()).map(pageSize -> + PageInfo.builder() + .pageSize(pageSize) + .currentPage(locateCommodityEntity.getCurrentPage()) + .totalItems(locateCommodityEntity.getTotalItems()) + .build()).orElse(null) ); } - + @Override public MybatisLocateCommodityEntity map(LocateCommodity locateCommodity) { return MybatisLocateCommodityEntity.builder() diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/filter/MybatisLocateCommodityFilter.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/filter/MybatisLocateCommodityFilter.java index 5f5d7081..4eb72e87 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/filter/MybatisLocateCommodityFilter.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/filter/MybatisLocateCommodityFilter.java @@ -26,7 +26,7 @@ public class MybatisLocateCommodityFilter implements PersistenceLocateCommodityF private Boolean includePlanetary; private Boolean includeOdyssey; private Boolean includeFleetCarriers; - private String maxLandingPadSize; + private String shipSize; private Long minSupply; private Long minDemand; private PersistencePageFilter page; diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/filter/mapper/MybatisPersistenceLocateCommodityFilterMapper.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/filter/mapper/MybatisPersistenceLocateCommodityFilterMapper.java index db43f927..3b8e63de 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/filter/mapper/MybatisPersistenceLocateCommodityFilterMapper.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/filter/mapper/MybatisPersistenceLocateCommodityFilterMapper.java @@ -22,7 +22,7 @@ public MybatisLocateCommodityFilter map(LocateCommodityFilter locateCommodityFil .includePlanetary(locateCommodityFilter.getIncludePlanetary()) .includeOdyssey(locateCommodityFilter.getIncludeOdyssey()) .includeFleetCarriers(locateCommodityFilter.getIncludeFleetCarriers()) - .maxLandingPadSize(String.valueOf(locateCommodityFilter.getMaxLandingPadSize())) + .shipSize(Optional.ofNullable(locateCommodityFilter.getShipSize()).map(Enum::name).orElse(null)) .minSupply(locateCommodityFilter.getMinSupply()) .minDemand(locateCommodityFilter.getMinDemand()) .page(Optional.ofNullable(locateCommodityFilter.getPageFilter()).map(pageFilterMapper::map).orElse(null)) diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/repository/MybatisLocateCommodityRepository.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/repository/MybatisLocateCommodityRepository.java index 8c9c584a..3003bb5f 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/repository/MybatisLocateCommodityRepository.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/repository/MybatisLocateCommodityRepository.java @@ -17,30 +17,86 @@ public interface MybatisLocateCommodityRepository { //TODO: update order by distance function for postgis @Select(""" """ + with filtered_lcv as (SELECT * + FROM locate_commodity_view lcv + + WHERE lcv.commodity_id = (SELECT vcv.id FROM validated_commodity_view vcv WHERE vcv.display_name = #{commodityDisplayName}) + + ), + cte AS (SELECT timestamp, + commodity_id, + station_id, + system_id, + stock, + demand, + buy_price, + sell_price, + x_coordinate, + y_coordinate, + z_coordinate, + planetary, + require_odyssey, + fleet_carrier + FROM filtered_lcv + WHERE 1 = 1 + AND planetary = false + AND require_odyssey = false + AND fleet_carrier = false + AND stock >= #{minSupply} + AND demand >= #{minDemand} + + + AND max_landing_pad_size = 'LARGE' + + + AND max_landing_pad_size IN ('MEDIUM', 'LARGE')\s + + + AND max_landing_pad_size IN ('MEDIUM', 'LARGE', 'SMALL', 'UNKNOWN') + + + ) + SELECT cte.timestamp, + cte.commodity_id, + cte.station_id, + cte.system_id, + cte.stock, + cte.demand, + cte.buy_price, + cte.sell_price, + + + sqrt(pow(cte.x_coordinate, 2) + + pow(cte.y_coordinate, 2) + + pow(z_coordinate, 2)) as distance, + + + sqrt(pow(#{xCoordinate} - cte.x_coordinate, 2) + + pow(#{yCoordinate} - cte.y_coordinate, 2) + + pow(#{zCoordinate} - z_coordinate, 2)) as distance, + + + cte.planetary, + cte.require_odyssey, + cte.fleet_carrier, + + #{page.size} as page_size, + #{page.page} as page_number, + (SELECT count(1) FROM cte) as total_items + + + null as page_size, + null as current_page, + null as total_items + + FROM cte + ORDER BY distance + + LIMIT #{page.size} + OFFSET (#{page.size} * #{page.page}) + + + """ ) @Results(id = "findCommodityResultMap", value = { @Result(property = "priceUpdatedAt", column = "timestamp", javaType = LocalDateTime.class), @@ -52,7 +108,10 @@ public interface MybatisLocateCommodityRepository { @Result(property = "demand", column = "demand", javaType = Long.class), @Result(property = "buyPrice", column = "buy_price", javaType = Long.class), @Result(property = "sellPrice", column = "sell_price", javaType = Long.class), - @Result(property = "distance", column = "distance", javaType = Double.class) + @Result(property = "distance", column = "distance", javaType = Double.class), + @Result(property = "pageSize", column = "pageSize", javaType = Integer.class), + @Result(property = "currentPage", column = "current_page", javaType = Integer.class), + @Result(property = "totalItems", column = "total_items", javaType = Integer.class) }) List locateCommodityByFilter(MybatisLocateCommodityFilter locateCommodityFilterPersistence); diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/TradeModuleController.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/TradeModuleController.java index c32532d9..4e670e86 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/TradeModuleController.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/TradeModuleController.java @@ -33,7 +33,7 @@ public class TradeModuleController { public List findAll() { return findAllValidatedCommodityUseCase.findAll() .stream() - .map(x -> (RestValidatedCommodityDto)x) + .map(x -> (RestValidatedCommodityDto) x) .toList(); } @@ -42,7 +42,7 @@ public List findByFilter(RestFindCommodityFilterDto f return findValidatedCommodityByFilterUseCase .findByFilter(findCommodityRequest) .stream() - .map(x -> (RestValidatedCommodityDto)x) + .map(x -> (RestValidatedCommodityDto) x) .toList(); } @@ -50,24 +50,24 @@ public List findByFilter(RestFindCommodityFilterDto f public Optional findByName(@PathVariable String displayName) { return findValidatedCommodityByNameUseCase .findByName(displayName) - .map(x -> (RestValidatedCommodityDto)x); + .map(x -> (RestValidatedCommodityDto) x); } - - @GetMapping("/locate-commodity/filter") - public List locateCommodityWithFilters(RestLocateCommodityFilterDto locateCommodityFilterDto){ + + @GetMapping("/locate-commodity") + public List locateCommodityWithFilters(RestLocateCommodityFilterDto locateCommodityFilterDto) { return locateCommodityUseCase .locateCommodityOrderByDistance(locateCommodityFilterDto) .stream() - .map(x -> (RestLocateCommodityDto)x) + .map(x -> (RestLocateCommodityDto) x) .toList(); } - + @GetMapping("/best-price") List fullMarketInfo() { return getFullCommodityMarketInfoUseCase .findAll() .stream() - .map(x -> (RestCommodityMarketInfoDto)x) + .map(x -> (RestCommodityMarketInfoDto) x) .toList(); } } diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/RestLocateCommodityFilterDto.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/RestLocateCommodityFilterDto.java index 1d1c0fe8..875a131f 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/RestLocateCommodityFilterDto.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/RestLocateCommodityFilterDto.java @@ -13,7 +13,7 @@ public record RestLocateCommodityFilterDto( Boolean includePlanetary, Boolean includeOdyssey, Boolean includeFleetCarriers, - String maxLandingPadSize, + String shipSize, Long minSupply, Long minDemand, RestPageFilterDto page diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestLocateCommodityFilterDtoMapper.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestLocateCommodityFilterDtoMapper.java index 148a0e7b..afb3e69f 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestLocateCommodityFilterDtoMapper.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestLocateCommodityFilterDtoMapper.java @@ -23,7 +23,9 @@ public LocateCommodityFilter map(LocateCommodityFilterDto locateCommodityFilterD locateCommodityFilterDto.includePlanetary(), locateCommodityFilterDto.includeOdyssey(), locateCommodityFilterDto.includeFleetCarriers(), - LandingPadSize.valueOf(locateCommodityFilterDto.maxLandingPadSize()), + Optional.ofNullable(locateCommodityFilterDto.shipSize()) + .map(LandingPadSize::valueOf) + .orElse(null), locateCommodityFilterDto.minSupply(), locateCommodityFilterDto.minDemand(), Optional.ofNullable(locateCommodityFilterDto.page()) diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/object/RestLocateCommodityDto.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/object/RestLocateCommodityDto.java index 897783bf..983301e8 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/object/RestLocateCommodityDto.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/object/RestLocateCommodityDto.java @@ -1,11 +1,13 @@ package io.edpn.backend.trade.adapter.web.dto.object; import io.edpn.backend.trade.application.dto.web.object.LocateCommodityDto; +import io.edpn.backend.trade.application.dto.web.object.PageInfoDto; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; import lombok.extern.jackson.Jacksonized; import java.time.LocalDateTime; +import java.util.Optional; @Schema(name = "LocateCommodityDto") @Builder @@ -18,5 +20,6 @@ public record RestLocateCommodityDto( Long demand, Long buyPrice, Long sellPrice, - Double distance) implements LocateCommodityDto { + Double distance, + Optional pageInfo) implements LocateCommodityDto { } diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/object/RestPageInfoDto.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/object/RestPageInfoDto.java new file mode 100644 index 00000000..4f06430b --- /dev/null +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/object/RestPageInfoDto.java @@ -0,0 +1,10 @@ +package io.edpn.backend.trade.adapter.web.dto.object; + +import io.edpn.backend.trade.application.dto.web.object.PageInfoDto; + +public record RestPageInfoDto( + int pageSize, + int currentPage, + int totalItems +) implements PageInfoDto { +} diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/object/mapper/RestLocateCommodityDtoMapper.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/object/mapper/RestLocateCommodityDtoMapper.java index 4f2c6c5a..b6669360 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/object/mapper/RestLocateCommodityDtoMapper.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/object/mapper/RestLocateCommodityDtoMapper.java @@ -1,20 +1,25 @@ package io.edpn.backend.trade.adapter.web.dto.object.mapper; import io.edpn.backend.trade.adapter.web.dto.object.RestLocateCommodityDto; +import io.edpn.backend.trade.adapter.web.dto.object.RestPageInfoDto; import io.edpn.backend.trade.adapter.web.dto.object.RestStationDto; import io.edpn.backend.trade.adapter.web.dto.object.RestValidatedCommodityDto; import io.edpn.backend.trade.application.domain.LocateCommodity; import io.edpn.backend.trade.application.dto.web.object.LocateCommodityDto; import io.edpn.backend.trade.application.dto.web.object.mapper.LocateCommodityDtoMapper; +import io.edpn.backend.trade.application.dto.web.object.mapper.PageInfoDtoMapper; import io.edpn.backend.trade.application.dto.web.object.mapper.StationDtoMapper; import io.edpn.backend.trade.application.dto.web.object.mapper.ValidatedCommodityDtoMapper; import lombok.RequiredArgsConstructor; +import java.util.Optional; + @RequiredArgsConstructor public class RestLocateCommodityDtoMapper implements LocateCommodityDtoMapper { private final StationDtoMapper stationDtoMapper; private final ValidatedCommodityDtoMapper commodityDtoMapper; + private final PageInfoDtoMapper pageInfoDtoMapper; @Override public LocateCommodityDto map(LocateCommodity locateCommodity) { @@ -26,8 +31,9 @@ public LocateCommodityDto map(LocateCommodity locateCommodity) { locateCommodity.getDemand(), locateCommodity.getBuyPrice(), locateCommodity.getSellPrice(), - locateCommodity.getDistance() - + locateCommodity.getDistance(), + Optional.ofNullable(locateCommodity.getPageInfo()) + .map(pageInfoDtoMapper::map) ); } } diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/object/mapper/RestPageInfoDtoMapper.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/object/mapper/RestPageInfoDtoMapper.java new file mode 100644 index 00000000..6c70bc82 --- /dev/null +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/object/mapper/RestPageInfoDtoMapper.java @@ -0,0 +1,16 @@ +package io.edpn.backend.trade.adapter.web.dto.object.mapper; + +import io.edpn.backend.trade.adapter.web.dto.object.RestPageInfoDto; +import io.edpn.backend.trade.application.domain.PageInfo; +import io.edpn.backend.trade.application.dto.web.object.mapper.PageInfoDtoMapper; + +public class RestPageInfoDtoMapper implements PageInfoDtoMapper { + @Override + public RestPageInfoDto map(PageInfo pageInfo) { + return new RestPageInfoDto( + pageInfo.getPageSize(), + pageInfo.getCurrentPage(), + pageInfo.getTotalItems() + ); + } +} diff --git a/trade-module/src/main/java/io/edpn/backend/trade/application/domain/LocateCommodity.java b/trade-module/src/main/java/io/edpn/backend/trade/application/domain/LocateCommodity.java index 15d573bc..b6239009 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/application/domain/LocateCommodity.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/application/domain/LocateCommodity.java @@ -22,5 +22,6 @@ public class LocateCommodity { private Long buyPrice; private Long sellPrice; private Double distance; + private PageInfo pageInfo; } diff --git a/trade-module/src/main/java/io/edpn/backend/trade/application/domain/PageInfo.java b/trade-module/src/main/java/io/edpn/backend/trade/application/domain/PageInfo.java new file mode 100644 index 00000000..1ef4e18a --- /dev/null +++ b/trade-module/src/main/java/io/edpn/backend/trade/application/domain/PageInfo.java @@ -0,0 +1,19 @@ +package io.edpn.backend.trade.application.domain; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString +@AllArgsConstructor +@Builder +public class PageInfo { + + private int pageSize; + private int currentPage; + private int totalItems; +} diff --git a/trade-module/src/main/java/io/edpn/backend/trade/application/domain/filter/LocateCommodityFilter.java b/trade-module/src/main/java/io/edpn/backend/trade/application/domain/filter/LocateCommodityFilter.java index e0c449e4..a3710007 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/application/domain/filter/LocateCommodityFilter.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/application/domain/filter/LocateCommodityFilter.java @@ -20,7 +20,7 @@ public class LocateCommodityFilter { private Boolean includePlanetary; private Boolean includeOdyssey; private Boolean includeFleetCarriers; - private LandingPadSize maxLandingPadSize; + private LandingPadSize shipSize; private Long minSupply; private Long minDemand; private PageFilter pageFilter; diff --git a/trade-module/src/main/java/io/edpn/backend/trade/application/dto/persistence/entity/LocateCommodityEntity.java b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/persistence/entity/LocateCommodityEntity.java index 7aaf452e..8e3ecfd1 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/application/dto/persistence/entity/LocateCommodityEntity.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/persistence/entity/LocateCommodityEntity.java @@ -19,4 +19,7 @@ public interface LocateCommodityEntity { Long getSellPrice(); Double getDistance(); + Integer getPageSize(); + Integer getCurrentPage(); + Integer getTotalItems(); } diff --git a/trade-module/src/main/java/io/edpn/backend/trade/application/dto/persistence/filter/PersistenceLocateCommodityFilter.java b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/persistence/filter/PersistenceLocateCommodityFilter.java index cd3fb2e0..75018c63 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/application/dto/persistence/filter/PersistenceLocateCommodityFilter.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/persistence/filter/PersistenceLocateCommodityFilter.java @@ -16,7 +16,7 @@ public interface PersistenceLocateCommodityFilter { Boolean getIncludeFleetCarriers(); - String getMaxLandingPadSize(); + String getShipSize(); Long getMinSupply(); diff --git a/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/filter/LocateCommodityFilterDto.java b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/filter/LocateCommodityFilterDto.java index 96a1ea51..a7746359 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/filter/LocateCommodityFilterDto.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/filter/LocateCommodityFilterDto.java @@ -16,7 +16,7 @@ public interface LocateCommodityFilterDto { Boolean includeFleetCarriers(); - String maxLandingPadSize(); + String shipSize(); Long minSupply(); diff --git a/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/LocateCommodityDto.java b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/LocateCommodityDto.java index 1d3789c0..fa90b12c 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/LocateCommodityDto.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/LocateCommodityDto.java @@ -1,6 +1,7 @@ package io.edpn.backend.trade.application.dto.web.object; import java.time.LocalDateTime; +import java.util.Optional; public interface LocateCommodityDto { @@ -19,4 +20,6 @@ public interface LocateCommodityDto { Long sellPrice(); Double distance(); + + Optional pageInfo(); } diff --git a/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/PageInfoDto.java b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/PageInfoDto.java new file mode 100644 index 00000000..2df364a5 --- /dev/null +++ b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/PageInfoDto.java @@ -0,0 +1,7 @@ +package io.edpn.backend.trade.application.dto.web.object; + +public interface PageInfoDto { + int pageSize(); + int currentPage(); + int totalItems(); +} diff --git a/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/mapper/PageInfoDtoMapper.java b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/mapper/PageInfoDtoMapper.java new file mode 100644 index 00000000..0aca67bd --- /dev/null +++ b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/mapper/PageInfoDtoMapper.java @@ -0,0 +1,9 @@ +package io.edpn.backend.trade.application.dto.web.object.mapper; + +import io.edpn.backend.trade.application.domain.PageInfo; +import io.edpn.backend.trade.application.dto.web.object.PageInfoDto; + +public interface PageInfoDtoMapper { + + PageInfoDto map(PageInfo pageInfo); +} diff --git a/trade-module/src/test/java/io/edpn/backend/trade/adapter/persistence/filter/mapper/MybatisPersistenceLocateCommodityFilterMapperTest.java b/trade-module/src/test/java/io/edpn/backend/trade/adapter/persistence/filter/mapper/MybatisPersistenceLocateCommodityFilterMapperTest.java index ae172b16..099d9677 100644 --- a/trade-module/src/test/java/io/edpn/backend/trade/adapter/persistence/filter/mapper/MybatisPersistenceLocateCommodityFilterMapperTest.java +++ b/trade-module/src/test/java/io/edpn/backend/trade/adapter/persistence/filter/mapper/MybatisPersistenceLocateCommodityFilterMapperTest.java @@ -41,7 +41,7 @@ public void testMap_givenDomainObject_shouldReturnEntity_nullPageFilter() { .includePlanetary(true) .includeOdyssey(false) .includeFleetCarriers(true) - .maxLandingPadSize(LandingPadSize.MEDIUM) + .shipSize(LandingPadSize.MEDIUM) .minSupply(123L) .minDemand(321L) .pageFilter(null) @@ -56,7 +56,7 @@ public void testMap_givenDomainObject_shouldReturnEntity_nullPageFilter() { assertThat(entity.getIncludeFleetCarriers(), is(true)); assertThat(entity.getIncludeOdyssey(), is(false)); assertThat(entity.getIncludeFleetCarriers(), is(true)); - assertThat(entity.getMaxLandingPadSize(), is(String.valueOf(LandingPadSize.MEDIUM))); + assertThat(entity.getShipSize(), is(String.valueOf(LandingPadSize.MEDIUM))); assertThat(entity.getMinSupply(), is(123L)); assertThat(entity.getMinDemand(), is(321L)); assertThat(entity.getPage(), nullValue()); @@ -76,7 +76,7 @@ public void testMap_givenDomainObject_shouldReturnEntity() { .includePlanetary(true) .includeOdyssey(false) .includeFleetCarriers(true) - .maxLandingPadSize(LandingPadSize.MEDIUM) + .shipSize(LandingPadSize.MEDIUM) .minSupply(123L) .minDemand(321L) .pageFilter(pageFilter) @@ -93,7 +93,7 @@ public void testMap_givenDomainObject_shouldReturnEntity() { assertThat(entity.getIncludeFleetCarriers(), is(true)); assertThat(entity.getIncludeOdyssey(), is(false)); assertThat(entity.getIncludeFleetCarriers(), is(true)); - assertThat(entity.getMaxLandingPadSize(), is(String.valueOf(LandingPadSize.MEDIUM))); + assertThat(entity.getShipSize(), is(String.valueOf(LandingPadSize.MEDIUM))); assertThat(entity.getMinSupply(), is(123L)); assertThat(entity.getMinDemand(), is(321L)); assertThat(entity.getPage(), notNullValue()); diff --git a/trade-module/src/test/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestLocateCommodityFilterDtoMapperTest.java b/trade-module/src/test/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestLocateCommodityFilterDtoMapperTest.java index 6499fd5e..369a8b67 100644 --- a/trade-module/src/test/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestLocateCommodityFilterDtoMapperTest.java +++ b/trade-module/src/test/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestLocateCommodityFilterDtoMapperTest.java @@ -60,7 +60,7 @@ public void testMap_givenDto_shouldReturnDomainObject_nullPageFilter() { assertThat(domainObject.getIncludePlanetary(), is(true)); assertThat(domainObject.getIncludeOdyssey(), is(false)); assertThat(domainObject.getIncludeFleetCarriers(), is(true)); - assertThat(domainObject.getMaxLandingPadSize(), is(LandingPadSize.MEDIUM)); + assertThat(domainObject.getShipSize(), is(LandingPadSize.MEDIUM)); assertThat(domainObject.getMinSupply(), is(123L)); assertThat(domainObject.getMinDemand(), is(321L)); assertThat(domainObject.getPageFilter().getPage(), is(0)); @@ -69,7 +69,7 @@ public void testMap_givenDto_shouldReturnDomainObject_nullPageFilter() { @Test public void testMap_givenDto_shouldReturnDomainObject() { - RestPageFilterDto pageFilterDto = new RestPageFilterDto(20,4); + RestPageFilterDto pageFilterDto = new RestPageFilterDto(20, 4); LocateCommodityFilterDto dto = new RestLocateCommodityFilterDto( "Display Name", 1.0, @@ -96,7 +96,7 @@ public void testMap_givenDto_shouldReturnDomainObject() { assertThat(domainObject.getIncludePlanetary(), is(true)); assertThat(domainObject.getIncludeOdyssey(), is(false)); assertThat(domainObject.getIncludeFleetCarriers(), is(true)); - assertThat(domainObject.getMaxLandingPadSize(), is(LandingPadSize.MEDIUM)); + assertThat(domainObject.getShipSize(), is(LandingPadSize.MEDIUM)); assertThat(domainObject.getMinSupply(), is(123L)); assertThat(domainObject.getMinDemand(), is(321L)); assertThat(domainObject.getPageFilter().getPage(), is(4)); From f8562725be9541581a834a05a0e1bcbe339938c0 Mon Sep 17 00:00:00 2001 From: pveechout Date: Mon, 4 Sep 2023 17:17:27 +0200 Subject: [PATCH 5/8] #103 - improving pageInfo returned --- .../config/PersistenceEntityMapperConfig.java | 7 +++ .../adapter/config/RepositoryConfig.java | 6 ++- .../trade/adapter/config/ServiceConfig.java | 6 ++- .../adapter/config/WebDtoMapperConfig.java | 5 +- .../LocateCommodityRepository.java | 21 +++++--- .../MybatisLocateCommodityEntityMapper.java | 11 +--- .../entity/mapper/MybatisPageInfoMapper.java | 17 ++++++ .../adapter/web/TradeModuleController.java | 20 ++++--- .../dto/object/RestLocateCommodityDto.java | 6 +-- .../web/dto/object/RestPagedResultDto.java | 11 ++++ .../mapper/RestLocateCommodityDtoMapper.java | 21 +++----- .../application/domain/LocateCommodity.java | 1 - .../trade/application/domain/PagedResult.java | 9 ++++ .../entity/LocateCommodityEntity.java | 22 ++++---- .../entity/PersistencePageInfo.java | 10 ++++ .../mapper/PersistencePageInfoMapper.java | 8 +++ .../mapper/PersistencePagedResultMapper.java | 31 +++++++++++ .../dto/web/object/LocateCommodityDto.java | 19 +++---- .../dto/web/object/PagedResultDto.java | 8 +++ .../mapper/LocateCommodityDtoMapper.java | 2 +- .../web/object/mapper/PageInfoDtoMapper.java | 2 +- .../object/mapper/PagedResultDtoMapper.java | 23 ++++++++ .../LocateCommodityUseCase.java | 11 ++-- .../LocateCommodityByFilterPort.java | 7 ++- .../service/LocateCommodityService.java | 29 +++++++--- .../mapper/MybatisPageInfoMapperTest.java | 37 +++++++++++++ .../LocateCommodityByFilterPortTest.java | 51 +++++++++--------- .../service/LocateCommodityUseCaseTest.java | 54 +++++++++++++------ 28 files changed, 323 insertions(+), 132 deletions(-) create mode 100644 trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/entity/mapper/MybatisPageInfoMapper.java create mode 100644 trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/object/RestPagedResultDto.java create mode 100644 trade-module/src/main/java/io/edpn/backend/trade/application/domain/PagedResult.java create mode 100644 trade-module/src/main/java/io/edpn/backend/trade/application/dto/persistence/entity/PersistencePageInfo.java create mode 100644 trade-module/src/main/java/io/edpn/backend/trade/application/dto/persistence/entity/mapper/PersistencePageInfoMapper.java create mode 100644 trade-module/src/main/java/io/edpn/backend/trade/application/dto/persistence/entity/mapper/PersistencePagedResultMapper.java create mode 100644 trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/PagedResultDto.java create mode 100644 trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/mapper/PagedResultDtoMapper.java create mode 100644 trade-module/src/test/java/io/edpn/backend/trade/adapter/persistence/entity/mapper/MybatisPageInfoMapperTest.java diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/PersistenceEntityMapperConfig.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/PersistenceEntityMapperConfig.java index c44539b6..78ba8493 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/PersistenceEntityMapperConfig.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/PersistenceEntityMapperConfig.java @@ -4,6 +4,7 @@ import io.edpn.backend.trade.adapter.persistence.entity.mapper.MybatisCommodityMarketInfoEntityMapper; import io.edpn.backend.trade.adapter.persistence.entity.mapper.MybatisLocateCommodityEntityMapper; import io.edpn.backend.trade.adapter.persistence.entity.mapper.MybatisMarketDatumEntityMapper; +import io.edpn.backend.trade.adapter.persistence.entity.mapper.MybatisPageInfoMapper; import io.edpn.backend.trade.adapter.persistence.entity.mapper.MybatisStationEntityMapper; import io.edpn.backend.trade.adapter.persistence.entity.mapper.MybatisSystemEntityMapper; import io.edpn.backend.trade.adapter.persistence.entity.mapper.MybatisValidatedCommodityEntityMapper; @@ -11,6 +12,7 @@ import io.edpn.backend.trade.adapter.persistence.filter.mapper.MybatisPersistenceFindSystemFilterMapper; import io.edpn.backend.trade.adapter.persistence.filter.mapper.MybatisPersistenceLocateCommodityFilterMapper; import io.edpn.backend.trade.adapter.persistence.filter.mapper.MybatisPersistencePageFilterMapper; +import io.edpn.backend.trade.application.dto.persistence.entity.mapper.PersistencePageInfoMapper; import io.edpn.backend.trade.application.dto.persistence.filter.mapper.PersistencePageFilterMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -80,5 +82,10 @@ public MybatisCommodityMarketInfoEntityMapper commodityMarketInfoEntityMapper( return new MybatisCommodityMarketInfoEntityMapper(mybatisValidatedCommodityEntityMapper, mybatisStationEntityMapper); } + @Bean(name = "tradePersistencePageInfoMapper") + public PersistencePageInfoMapper persistencePageInfoMapper() { + return new MybatisPageInfoMapper(); + } + } diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/RepositoryConfig.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/RepositoryConfig.java index 638cac15..66c7280c 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/RepositoryConfig.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/RepositoryConfig.java @@ -28,6 +28,7 @@ import io.edpn.backend.trade.application.dto.persistence.entity.mapper.CommodityEntityMapper; import io.edpn.backend.trade.application.dto.persistence.entity.mapper.CommodityMarketInfoEntityMapper; import io.edpn.backend.trade.application.dto.persistence.entity.mapper.LocateCommodityEntityMapper; +import io.edpn.backend.trade.application.dto.persistence.entity.mapper.PersistencePageInfoMapper; import io.edpn.backend.trade.application.dto.persistence.entity.mapper.StationEntityMapper; import io.edpn.backend.trade.application.dto.persistence.entity.mapper.SystemEntityMapper; import io.edpn.backend.trade.application.dto.persistence.entity.mapper.ValidatedCommodityEntityMapper; @@ -58,8 +59,9 @@ public CommodityRepository commodityRepository( public LocateCommodityRepository locateCommodityRepository( MybatisLocateCommodityRepository mybatisLocateCommodityRepository, LocateCommodityEntityMapper mybatisLocateCommodityEntityMapper, - MybatisPersistenceLocateCommodityFilterMapper mybatisPersistenceLocateCommodityFilterMapper) { - return new LocateCommodityRepository(mybatisLocateCommodityRepository, mybatisLocateCommodityEntityMapper, mybatisPersistenceLocateCommodityFilterMapper); + MybatisPersistenceLocateCommodityFilterMapper mybatisPersistenceLocateCommodityFilterMapper, + PersistencePageInfoMapper persistencePageInfoMapper) { + return new LocateCommodityRepository(mybatisLocateCommodityRepository, mybatisLocateCommodityEntityMapper, mybatisPersistenceLocateCommodityFilterMapper, persistencePageInfoMapper); } @Bean(name = "tradeMarketDatumRepository") diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/ServiceConfig.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/ServiceConfig.java index 0774ab66..745e17c4 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/ServiceConfig.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/ServiceConfig.java @@ -8,6 +8,7 @@ import io.edpn.backend.trade.application.dto.web.object.mapper.CommodityMarketInfoDtoMapper; import io.edpn.backend.trade.application.dto.web.object.mapper.LocateCommodityDtoMapper; import io.edpn.backend.trade.application.dto.web.object.mapper.MessageMapper; +import io.edpn.backend.trade.application.dto.web.object.mapper.PageInfoDtoMapper; import io.edpn.backend.trade.application.dto.web.object.mapper.ValidatedCommodityDtoMapper; import io.edpn.backend.trade.application.port.incomming.kafka.RequestDataUseCase; import io.edpn.backend.trade.application.port.outgoing.commodity.LoadOrCreateCommodityByNamePort; @@ -75,8 +76,9 @@ public FindCommodityMarketInfoService findCommodityMarketInfoService( public LocateCommodityService locateCommodityService( LocateCommodityByFilterPort locateCommodityByFilterPort, LocateCommodityFilterDtoMapper locateCommodityFilterDtoMapper, - LocateCommodityDtoMapper locateCommodityDtoMapper) { - return new LocateCommodityService(locateCommodityByFilterPort, locateCommodityFilterDtoMapper, locateCommodityDtoMapper); + LocateCommodityDtoMapper locateCommodityDtoMapper, + PageInfoDtoMapper pageInfoDtoMapper) { + return new LocateCommodityService(locateCommodityByFilterPort, locateCommodityFilterDtoMapper, locateCommodityDtoMapper, pageInfoDtoMapper); } @Bean(name = "tradeRecieveCommodityMessageUsecase") diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/WebDtoMapperConfig.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/WebDtoMapperConfig.java index b35caa47..35d25962 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/WebDtoMapperConfig.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/WebDtoMapperConfig.java @@ -53,9 +53,8 @@ public StationDtoMapper stationDtoMapper( @Bean(name = "tradeLocateCommodityDtoMapper") public LocateCommodityDtoMapper locateCommodityDtoMapper( StationDtoMapper stationDtoMapper, - ValidatedCommodityDtoMapper validatedCommodityDtoMapper, - PageInfoDtoMapper pageInfoDtoMapper) { - return new RestLocateCommodityDtoMapper(stationDtoMapper, validatedCommodityDtoMapper, pageInfoDtoMapper); + ValidatedCommodityDtoMapper validatedCommodityDtoMapper) { + return new RestLocateCommodityDtoMapper(stationDtoMapper, validatedCommodityDtoMapper); } @Bean(name = "tradeCommodityMarketInfoDtoMapper") diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/LocateCommodityRepository.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/LocateCommodityRepository.java index d91995b4..61fbb7f6 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/LocateCommodityRepository.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/LocateCommodityRepository.java @@ -4,8 +4,11 @@ import io.edpn.backend.trade.adapter.persistence.filter.MybatisLocateCommodityFilter; import io.edpn.backend.trade.adapter.persistence.repository.MybatisLocateCommodityRepository; import io.edpn.backend.trade.application.domain.LocateCommodity; +import io.edpn.backend.trade.application.domain.PagedResult; import io.edpn.backend.trade.application.domain.filter.LocateCommodityFilter; import io.edpn.backend.trade.application.dto.persistence.entity.mapper.LocateCommodityEntityMapper; +import io.edpn.backend.trade.application.dto.persistence.entity.mapper.PersistencePageInfoMapper; +import io.edpn.backend.trade.application.dto.persistence.entity.mapper.PersistencePagedResultMapper; import io.edpn.backend.trade.application.dto.persistence.filter.mapper.PersistenceLocateCommodityFilterMapper; import io.edpn.backend.trade.application.port.outgoing.locatecommodity.LocateCommodityByFilterPort; import lombok.RequiredArgsConstructor; @@ -14,17 +17,19 @@ @RequiredArgsConstructor public class LocateCommodityRepository implements LocateCommodityByFilterPort { - + private final MybatisLocateCommodityRepository mybatisLocateCommodityRepository; private final LocateCommodityEntityMapper mybatisLocateCommodityEntityMapper; private final PersistenceLocateCommodityFilterMapper mybatisPersistenceLocateCommodityFilterMapper; - + private final PersistencePageInfoMapper persistencePageInfoMapper; + @Override - public List locateCommodityByFilter(LocateCommodityFilter locateCommodityFilter) { - return mybatisLocateCommodityRepository - .locateCommodityByFilter((MybatisLocateCommodityFilter) mybatisPersistenceLocateCommodityFilterMapper.map(locateCommodityFilter)) - .stream() - .map(mybatisLocateCommodityEntityMapper::map) - .toList(); + public PagedResult locateCommodityByFilter(LocateCommodityFilter locateCommodityFilter) { + MybatisLocateCommodityFilter filter = (MybatisLocateCommodityFilter) mybatisPersistenceLocateCommodityFilterMapper.map(locateCommodityFilter); + List entities = mybatisLocateCommodityRepository.locateCommodityByFilter(filter); + return PersistencePagedResultMapper.map( + entities, + mybatisLocateCommodityEntityMapper::map, + persistencePageInfoMapper::map); } } diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/entity/mapper/MybatisLocateCommodityEntityMapper.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/entity/mapper/MybatisLocateCommodityEntityMapper.java index 8f798405..1c91e490 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/entity/mapper/MybatisLocateCommodityEntityMapper.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/entity/mapper/MybatisLocateCommodityEntityMapper.java @@ -4,15 +4,12 @@ import io.edpn.backend.trade.adapter.persistence.entity.MybatisStationEntity; import io.edpn.backend.trade.adapter.persistence.entity.MybatisValidatedCommodityEntity; import io.edpn.backend.trade.application.domain.LocateCommodity; -import io.edpn.backend.trade.application.domain.PageInfo; import io.edpn.backend.trade.application.dto.persistence.entity.LocateCommodityEntity; import io.edpn.backend.trade.application.dto.persistence.entity.mapper.LocateCommodityEntityMapper; import io.edpn.backend.trade.application.dto.persistence.entity.mapper.StationEntityMapper; import io.edpn.backend.trade.application.dto.persistence.entity.mapper.ValidatedCommodityEntityMapper; import lombok.RequiredArgsConstructor; -import java.util.Optional; - @RequiredArgsConstructor public class MybatisLocateCommodityEntityMapper implements LocateCommodityEntityMapper { @@ -29,13 +26,7 @@ public LocateCommodity map(LocateCommodityEntity locateCommodityEntity) { locateCommodityEntity.getDemand(), locateCommodityEntity.getBuyPrice(), locateCommodityEntity.getSellPrice(), - locateCommodityEntity.getDistance(), - Optional.ofNullable(locateCommodityEntity.getPageSize()).map(pageSize -> - PageInfo.builder() - .pageSize(pageSize) - .currentPage(locateCommodityEntity.getCurrentPage()) - .totalItems(locateCommodityEntity.getTotalItems()) - .build()).orElse(null) + locateCommodityEntity.getDistance() ); } diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/entity/mapper/MybatisPageInfoMapper.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/entity/mapper/MybatisPageInfoMapper.java new file mode 100644 index 00000000..e275d56f --- /dev/null +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/entity/mapper/MybatisPageInfoMapper.java @@ -0,0 +1,17 @@ +package io.edpn.backend.trade.adapter.persistence.entity.mapper; + +import io.edpn.backend.trade.application.domain.PageInfo; +import io.edpn.backend.trade.application.dto.persistence.entity.PersistencePageInfo; +import io.edpn.backend.trade.application.dto.persistence.entity.mapper.PersistencePageInfoMapper; + +public class MybatisPageInfoMapper implements PersistencePageInfoMapper { + + @Override + public PageInfo map(PersistencePageInfo persistencePageInfo) { + return PageInfo.builder() + .pageSize(persistencePageInfo.getPageSize()) + .currentPage(persistencePageInfo.getCurrentPage()) + .totalItems(persistencePageInfo.getTotalItems()) + .build(); + } +} diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/TradeModuleController.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/TradeModuleController.java index c696a700..0f3dfc79 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/TradeModuleController.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/TradeModuleController.java @@ -4,12 +4,19 @@ import io.edpn.backend.trade.adapter.web.dto.filter.RestLocateCommodityFilterDto; import io.edpn.backend.trade.adapter.web.dto.object.RestCommodityMarketInfoDto; import io.edpn.backend.trade.adapter.web.dto.object.RestLocateCommodityDto; +import io.edpn.backend.trade.adapter.web.dto.object.RestPageInfoDto; +import io.edpn.backend.trade.adapter.web.dto.object.RestPagedResultDto; import io.edpn.backend.trade.adapter.web.dto.object.RestValidatedCommodityDto; +import io.edpn.backend.trade.application.dto.web.object.PagedResultDto; import io.edpn.backend.trade.application.port.incomming.commoditymarketinfo.GetFullCommodityMarketInfoUseCase; import io.edpn.backend.trade.application.port.incomming.locatecommodity.LocateCommodityUseCase; import io.edpn.backend.trade.application.port.incomming.validatedcommodity.FindAllValidatedCommodityUseCase; import io.edpn.backend.trade.application.port.incomming.validatedcommodity.FindValidatedCommodityByFilterUseCase; import io.edpn.backend.trade.application.port.incomming.validatedcommodity.FindValidatedCommodityByNameUseCase; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -17,6 +24,7 @@ import java.util.List; import java.util.Optional; +import java.util.function.BiFunction; @RequiredArgsConstructor @RequestMapping("/api/v1/trade") @@ -52,14 +60,14 @@ public Optional findByName(@PathVariable String displ .findByName(displayName) .map(x -> (RestValidatedCommodityDto) x); } - + @ApiResponses({ + @ApiResponse(responseCode = "200", content = {@Content(schema = @Schema(implementation = RestPagedResultDto.class), mediaType = "application/json")}) + }) @GetMapping("/locate-commodity") - public List locateCommodityWithFilters(RestLocateCommodityFilterDto locateCommodityFilterDto) { + public PagedResultDto locateCommodityWithFilters(RestLocateCommodityFilterDto locateCommodityFilterDto) { + BiFunction, RestPageInfoDto, RestPagedResultDto> constructor = RestPagedResultDto::new; return locateCommodityUseCase - .locateCommodityOrderByDistance(locateCommodityFilterDto) - .stream() - .map(x -> (RestLocateCommodityDto) x) - .toList(); + .locateCommodityOrderByDistance(locateCommodityFilterDto, constructor); } @GetMapping("/best-price") diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/object/RestLocateCommodityDto.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/object/RestLocateCommodityDto.java index 983301e8..1b6502f0 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/object/RestLocateCommodityDto.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/object/RestLocateCommodityDto.java @@ -1,13 +1,11 @@ package io.edpn.backend.trade.adapter.web.dto.object; import io.edpn.backend.trade.application.dto.web.object.LocateCommodityDto; -import io.edpn.backend.trade.application.dto.web.object.PageInfoDto; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; import lombok.extern.jackson.Jacksonized; import java.time.LocalDateTime; -import java.util.Optional; @Schema(name = "LocateCommodityDto") @Builder @@ -20,6 +18,6 @@ public record RestLocateCommodityDto( Long demand, Long buyPrice, Long sellPrice, - Double distance, - Optional pageInfo) implements LocateCommodityDto { + Double distance +) implements LocateCommodityDto { } diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/object/RestPagedResultDto.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/object/RestPagedResultDto.java new file mode 100644 index 00000000..3bb4dcc7 --- /dev/null +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/object/RestPagedResultDto.java @@ -0,0 +1,11 @@ +package io.edpn.backend.trade.adapter.web.dto.object; + +import io.edpn.backend.trade.application.dto.web.object.PagedResultDto; + +import java.util.List; + +public record RestPagedResultDto( + List result, + RestPageInfoDto pageInfo +) implements PagedResultDto { +} diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/object/mapper/RestLocateCommodityDtoMapper.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/object/mapper/RestLocateCommodityDtoMapper.java index b6669360..c595bcb1 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/object/mapper/RestLocateCommodityDtoMapper.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/object/mapper/RestLocateCommodityDtoMapper.java @@ -1,39 +1,32 @@ package io.edpn.backend.trade.adapter.web.dto.object.mapper; import io.edpn.backend.trade.adapter.web.dto.object.RestLocateCommodityDto; -import io.edpn.backend.trade.adapter.web.dto.object.RestPageInfoDto; import io.edpn.backend.trade.adapter.web.dto.object.RestStationDto; import io.edpn.backend.trade.adapter.web.dto.object.RestValidatedCommodityDto; import io.edpn.backend.trade.application.domain.LocateCommodity; -import io.edpn.backend.trade.application.dto.web.object.LocateCommodityDto; import io.edpn.backend.trade.application.dto.web.object.mapper.LocateCommodityDtoMapper; -import io.edpn.backend.trade.application.dto.web.object.mapper.PageInfoDtoMapper; import io.edpn.backend.trade.application.dto.web.object.mapper.StationDtoMapper; import io.edpn.backend.trade.application.dto.web.object.mapper.ValidatedCommodityDtoMapper; import lombok.RequiredArgsConstructor; -import java.util.Optional; - @RequiredArgsConstructor public class RestLocateCommodityDtoMapper implements LocateCommodityDtoMapper { - + private final StationDtoMapper stationDtoMapper; private final ValidatedCommodityDtoMapper commodityDtoMapper; - private final PageInfoDtoMapper pageInfoDtoMapper; - + @Override - public LocateCommodityDto map(LocateCommodity locateCommodity) { + @SuppressWarnings("unchecked") + public RestLocateCommodityDto map(LocateCommodity locateCommodity) { return new RestLocateCommodityDto( - (RestValidatedCommodityDto)commodityDtoMapper.map(locateCommodity.getValidatedCommodity()), - (RestStationDto)stationDtoMapper.map(locateCommodity.getStation()), + (RestValidatedCommodityDto) commodityDtoMapper.map(locateCommodity.getValidatedCommodity()), + (RestStationDto) stationDtoMapper.map(locateCommodity.getStation()), locateCommodity.getPriceUpdatedAt(), locateCommodity.getSupply(), locateCommodity.getDemand(), locateCommodity.getBuyPrice(), locateCommodity.getSellPrice(), - locateCommodity.getDistance(), - Optional.ofNullable(locateCommodity.getPageInfo()) - .map(pageInfoDtoMapper::map) + locateCommodity.getDistance() ); } } diff --git a/trade-module/src/main/java/io/edpn/backend/trade/application/domain/LocateCommodity.java b/trade-module/src/main/java/io/edpn/backend/trade/application/domain/LocateCommodity.java index b6239009..15d573bc 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/application/domain/LocateCommodity.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/application/domain/LocateCommodity.java @@ -22,6 +22,5 @@ public class LocateCommodity { private Long buyPrice; private Long sellPrice; private Double distance; - private PageInfo pageInfo; } diff --git a/trade-module/src/main/java/io/edpn/backend/trade/application/domain/PagedResult.java b/trade-module/src/main/java/io/edpn/backend/trade/application/domain/PagedResult.java new file mode 100644 index 00000000..91a8ab58 --- /dev/null +++ b/trade-module/src/main/java/io/edpn/backend/trade/application/domain/PagedResult.java @@ -0,0 +1,9 @@ +package io.edpn.backend.trade.application.domain; + +import java.util.List; + +public record PagedResult( + List result, + PageInfo pageInfo +) { +} diff --git a/trade-module/src/main/java/io/edpn/backend/trade/application/dto/persistence/entity/LocateCommodityEntity.java b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/persistence/entity/LocateCommodityEntity.java index 8e3ecfd1..40f89ae0 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/application/dto/persistence/entity/LocateCommodityEntity.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/persistence/entity/LocateCommodityEntity.java @@ -2,24 +2,22 @@ import java.time.LocalDateTime; -public interface LocateCommodityEntity { - +public interface LocateCommodityEntity extends PersistencePageInfo { + ValidatedCommodityEntity getValidatedCommodity(); - + StationEntity getStation(); - + LocalDateTime getPriceUpdatedAt(); - + Long getSupply(); - + Long getDemand(); - + Long getBuyPrice(); - + Long getSellPrice(); - + Double getDistance(); - Integer getPageSize(); - Integer getCurrentPage(); - Integer getTotalItems(); + } diff --git a/trade-module/src/main/java/io/edpn/backend/trade/application/dto/persistence/entity/PersistencePageInfo.java b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/persistence/entity/PersistencePageInfo.java new file mode 100644 index 00000000..1d539dc9 --- /dev/null +++ b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/persistence/entity/PersistencePageInfo.java @@ -0,0 +1,10 @@ +package io.edpn.backend.trade.application.dto.persistence.entity; + +public interface PersistencePageInfo { + + Integer getPageSize(); + + Integer getCurrentPage(); + + Integer getTotalItems(); +} diff --git a/trade-module/src/main/java/io/edpn/backend/trade/application/dto/persistence/entity/mapper/PersistencePageInfoMapper.java b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/persistence/entity/mapper/PersistencePageInfoMapper.java new file mode 100644 index 00000000..bfa209be --- /dev/null +++ b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/persistence/entity/mapper/PersistencePageInfoMapper.java @@ -0,0 +1,8 @@ +package io.edpn.backend.trade.application.dto.persistence.entity.mapper; + +import io.edpn.backend.trade.application.domain.PageInfo; +import io.edpn.backend.trade.application.dto.persistence.entity.PersistencePageInfo; + +public interface PersistencePageInfoMapper { + PageInfo map(PersistencePageInfo persistencePageInfo); +} diff --git a/trade-module/src/main/java/io/edpn/backend/trade/application/dto/persistence/entity/mapper/PersistencePagedResultMapper.java b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/persistence/entity/mapper/PersistencePagedResultMapper.java new file mode 100644 index 00000000..d9863846 --- /dev/null +++ b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/persistence/entity/mapper/PersistencePagedResultMapper.java @@ -0,0 +1,31 @@ +package io.edpn.backend.trade.application.dto.persistence.entity.mapper; + +import io.edpn.backend.trade.application.domain.PageInfo; +import io.edpn.backend.trade.application.domain.PagedResult; +import io.edpn.backend.trade.application.dto.persistence.entity.PersistencePageInfo; + +import java.util.List; +import java.util.function.Function; + +import static java.util.Collections.emptyList; + +public interface PersistencePagedResultMapper { + + static PagedResult map(List entities, Function entityMapper, Function pageInfoMapper) { + return entities.stream().findAny() + .map(entity -> new PagedResult<>( + entities.stream() + .map(entityMapper) + .toList(), + pageInfoMapper.apply(entity))) + .orElse(new PagedResult<>( + emptyList(), + PageInfo.builder() + .totalItems(0) + .currentPage(0) + .pageSize(0) + .build())); + + + } +} diff --git a/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/LocateCommodityDto.java b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/LocateCommodityDto.java index fa90b12c..728b08b1 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/LocateCommodityDto.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/LocateCommodityDto.java @@ -1,25 +1,22 @@ package io.edpn.backend.trade.application.dto.web.object; import java.time.LocalDateTime; -import java.util.Optional; public interface LocateCommodityDto { - + ValidatedCommodityDto commodity(); - + StationDto station(); - + LocalDateTime priceUpdatedAt(); - + Long supply(); - + Long demand(); - + Long buyPrice(); - + Long sellPrice(); - - Double distance(); - Optional pageInfo(); + Double distance(); } diff --git a/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/PagedResultDto.java b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/PagedResultDto.java new file mode 100644 index 00000000..6ebec3bd --- /dev/null +++ b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/PagedResultDto.java @@ -0,0 +1,8 @@ +package io.edpn.backend.trade.application.dto.web.object; + +import java.util.List; + +public interface PagedResultDto { + List result(); + F pageInfo(); +} diff --git a/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/mapper/LocateCommodityDtoMapper.java b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/mapper/LocateCommodityDtoMapper.java index c21b1d33..5925b3b6 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/mapper/LocateCommodityDtoMapper.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/mapper/LocateCommodityDtoMapper.java @@ -5,5 +5,5 @@ public interface LocateCommodityDtoMapper { - LocateCommodityDto map(LocateCommodity locateCommodity); + F map(LocateCommodity locateCommodity); } diff --git a/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/mapper/PageInfoDtoMapper.java b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/mapper/PageInfoDtoMapper.java index 0aca67bd..b703703a 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/mapper/PageInfoDtoMapper.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/mapper/PageInfoDtoMapper.java @@ -5,5 +5,5 @@ public interface PageInfoDtoMapper { - PageInfoDto map(PageInfo pageInfo); + T map(PageInfo pageInfo); } diff --git a/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/mapper/PagedResultDtoMapper.java b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/mapper/PagedResultDtoMapper.java new file mode 100644 index 00000000..2696f820 --- /dev/null +++ b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/mapper/PagedResultDtoMapper.java @@ -0,0 +1,23 @@ +package io.edpn.backend.trade.application.dto.web.object.mapper; + +import io.edpn.backend.trade.application.domain.PageInfo; +import io.edpn.backend.trade.application.domain.PagedResult; +import io.edpn.backend.trade.application.dto.web.object.PageInfoDto; +import io.edpn.backend.trade.application.dto.web.object.PagedResultDto; + +import java.util.List; +import java.util.function.BiFunction; +import java.util.function.Function; + +public interface PagedResultDtoMapper { + static > PagedResultDto map( + PagedResult pagedResult, + Function dtoMapper, + Function pageInfoMapper, + BiFunction, Z, U> initializer + ) { + Z pageInfoDto = pageInfoMapper.apply(pagedResult.pageInfo()); + List list = pagedResult.result().stream().map(dtoMapper).toList(); + return initializer.apply(list, pageInfoDto); + } +} diff --git a/trade-module/src/main/java/io/edpn/backend/trade/application/port/incomming/locatecommodity/LocateCommodityUseCase.java b/trade-module/src/main/java/io/edpn/backend/trade/application/port/incomming/locatecommodity/LocateCommodityUseCase.java index fdbbf561..207093e6 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/application/port/incomming/locatecommodity/LocateCommodityUseCase.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/application/port/incomming/locatecommodity/LocateCommodityUseCase.java @@ -1,12 +1,15 @@ package io.edpn.backend.trade.application.port.incomming.locatecommodity; -import io.edpn.backend.trade.application.dto.web.object.LocateCommodityDto; import io.edpn.backend.trade.application.dto.web.filter.LocateCommodityFilterDto; +import io.edpn.backend.trade.application.dto.web.object.LocateCommodityDto; +import io.edpn.backend.trade.application.dto.web.object.PageInfoDto; +import io.edpn.backend.trade.application.dto.web.object.PagedResultDto; import java.util.List; +import java.util.function.BiFunction; public interface LocateCommodityUseCase { - - List locateCommodityOrderByDistance(LocateCommodityFilterDto locateCommodityFilterDto); - + + , R extends PageInfoDto> PagedResultDto locateCommodityOrderByDistance(LocateCommodityFilterDto locateCommodityFilterDto, BiFunction, R, U> pagedResultConstructor); + } diff --git a/trade-module/src/main/java/io/edpn/backend/trade/application/port/outgoing/locatecommodity/LocateCommodityByFilterPort.java b/trade-module/src/main/java/io/edpn/backend/trade/application/port/outgoing/locatecommodity/LocateCommodityByFilterPort.java index ddab26c6..77904858 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/application/port/outgoing/locatecommodity/LocateCommodityByFilterPort.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/application/port/outgoing/locatecommodity/LocateCommodityByFilterPort.java @@ -1,11 +1,10 @@ package io.edpn.backend.trade.application.port.outgoing.locatecommodity; import io.edpn.backend.trade.application.domain.LocateCommodity; +import io.edpn.backend.trade.application.domain.PagedResult; import io.edpn.backend.trade.application.domain.filter.LocateCommodityFilter; -import java.util.List; - public interface LocateCommodityByFilterPort { - - List locateCommodityByFilter(LocateCommodityFilter locateCommodityFilter); + + PagedResult locateCommodityByFilter(LocateCommodityFilter locateCommodityFilter); } diff --git a/trade-module/src/main/java/io/edpn/backend/trade/application/service/LocateCommodityService.java b/trade-module/src/main/java/io/edpn/backend/trade/application/service/LocateCommodityService.java index 6f65cb01..9bc8d06a 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/application/service/LocateCommodityService.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/application/service/LocateCommodityService.java @@ -1,28 +1,41 @@ package io.edpn.backend.trade.application.service; +import io.edpn.backend.trade.application.domain.LocateCommodity; +import io.edpn.backend.trade.application.domain.PagedResult; +import io.edpn.backend.trade.application.domain.filter.LocateCommodityFilter; import io.edpn.backend.trade.application.dto.web.filter.LocateCommodityFilterDto; import io.edpn.backend.trade.application.dto.web.filter.mapper.LocateCommodityFilterDtoMapper; import io.edpn.backend.trade.application.dto.web.object.LocateCommodityDto; +import io.edpn.backend.trade.application.dto.web.object.PageInfoDto; +import io.edpn.backend.trade.application.dto.web.object.PagedResultDto; import io.edpn.backend.trade.application.dto.web.object.mapper.LocateCommodityDtoMapper; +import io.edpn.backend.trade.application.dto.web.object.mapper.PageInfoDtoMapper; +import io.edpn.backend.trade.application.dto.web.object.mapper.PagedResultDtoMapper; import io.edpn.backend.trade.application.port.incomming.locatecommodity.LocateCommodityUseCase; import io.edpn.backend.trade.application.port.outgoing.locatecommodity.LocateCommodityByFilterPort; import lombok.RequiredArgsConstructor; import java.util.List; +import java.util.function.BiFunction; @RequiredArgsConstructor public class LocateCommodityService implements LocateCommodityUseCase { - + private final LocateCommodityByFilterPort locateCommodityByFilterPort; private final LocateCommodityFilterDtoMapper locateCommodityFilterDtoMapper; private final LocateCommodityDtoMapper locateCommodityDtoMapper; - + private final PageInfoDtoMapper pageInfoDtoMapper; + @Override - public List locateCommodityOrderByDistance(LocateCommodityFilterDto locateCommodityFilterDto) { - return locateCommodityByFilterPort.locateCommodityByFilter( - locateCommodityFilterDtoMapper.map(locateCommodityFilterDto)) - .stream() - .map(locateCommodityDtoMapper::map) - .toList(); + public , R extends PageInfoDto> PagedResultDto locateCommodityOrderByDistance(LocateCommodityFilterDto locateCommodityFilterDto, BiFunction, R, U> pagedResultConstructor) { + LocateCommodityFilter filter = locateCommodityFilterDtoMapper.map(locateCommodityFilterDto); + PagedResult locateCommodityPagedResult = locateCommodityByFilterPort.locateCommodityByFilter(filter); + + return PagedResultDtoMapper.map( + locateCommodityPagedResult, + locateCommodityDtoMapper::map, + pageInfoDtoMapper::map, + pagedResultConstructor + ); } } diff --git a/trade-module/src/test/java/io/edpn/backend/trade/adapter/persistence/entity/mapper/MybatisPageInfoMapperTest.java b/trade-module/src/test/java/io/edpn/backend/trade/adapter/persistence/entity/mapper/MybatisPageInfoMapperTest.java new file mode 100644 index 00000000..331cc6f0 --- /dev/null +++ b/trade-module/src/test/java/io/edpn/backend/trade/adapter/persistence/entity/mapper/MybatisPageInfoMapperTest.java @@ -0,0 +1,37 @@ +package io.edpn.backend.trade.adapter.persistence.entity.mapper; + +import io.edpn.backend.trade.application.domain.PageInfo; +import io.edpn.backend.trade.application.dto.persistence.entity.PersistencePageInfo; +import io.edpn.backend.trade.application.dto.persistence.entity.mapper.PersistencePageInfoMapper; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +class MybatisPageInfoMapperTest { + + private PersistencePageInfoMapper underTest; + + @BeforeEach + public void setUp() { + underTest = new MybatisPageInfoMapper(); + } + + @Test + public void testMap_givenEntity_shouldReturnDomainObject() { + PersistencePageInfo entity = mock(PersistencePageInfo.class); + when(entity.getCurrentPage()).thenReturn(1); + when(entity.getPageSize()).thenReturn(20); + when(entity.getTotalItems()).thenReturn(187456); + + PageInfo result = underTest.map(entity); + + assertThat(result.getCurrentPage(), equalTo(1)); + assertThat(result.getPageSize(), equalTo(20)); + assertThat(result.getTotalItems(), equalTo(187456)); + } + +} \ No newline at end of file diff --git a/trade-module/src/test/java/io/edpn/backend/trade/adapter/persistence/locatecommodity/LocateCommodityByFilterPortTest.java b/trade-module/src/test/java/io/edpn/backend/trade/adapter/persistence/locatecommodity/LocateCommodityByFilterPortTest.java index ed5cfd88..fc13b3bd 100644 --- a/trade-module/src/test/java/io/edpn/backend/trade/adapter/persistence/locatecommodity/LocateCommodityByFilterPortTest.java +++ b/trade-module/src/test/java/io/edpn/backend/trade/adapter/persistence/locatecommodity/LocateCommodityByFilterPortTest.java @@ -5,8 +5,11 @@ import io.edpn.backend.trade.adapter.persistence.filter.MybatisLocateCommodityFilter; import io.edpn.backend.trade.adapter.persistence.repository.MybatisLocateCommodityRepository; import io.edpn.backend.trade.application.domain.LocateCommodity; +import io.edpn.backend.trade.application.domain.PageInfo; +import io.edpn.backend.trade.application.domain.PagedResult; import io.edpn.backend.trade.application.domain.filter.LocateCommodityFilter; import io.edpn.backend.trade.application.dto.persistence.entity.mapper.LocateCommodityEntityMapper; +import io.edpn.backend.trade.application.dto.persistence.entity.mapper.PersistencePageInfoMapper; import io.edpn.backend.trade.application.dto.persistence.filter.mapper.PersistenceLocateCommodityFilterMapper; import io.edpn.backend.trade.application.port.outgoing.locatecommodity.LocateCommodityByFilterPort; import org.junit.jupiter.api.BeforeEach; @@ -16,34 +19,36 @@ import org.mockito.junit.jupiter.MockitoExtension; import java.util.Collections; -import java.util.List; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) public class LocateCommodityByFilterPortTest { - + @Mock private MybatisLocateCommodityRepository mybatisLocateCommodityRepository; - + @Mock private LocateCommodityEntityMapper mybatisLocateCommodityEntityMapper; - + @Mock - private PersistenceLocateCommodityFilterMapper mybatisPersistenceLocateCommodityFilterMapper; - + private PersistenceLocateCommodityFilterMapper persistenceLocateCommodityFilterMapper; + + @Mock + private PersistencePageInfoMapper persistencePageInfoMapper; + private LocateCommodityByFilterPort underTest; - + @BeforeEach public void setUp() { - underTest = new LocateCommodityRepository(mybatisLocateCommodityRepository, mybatisLocateCommodityEntityMapper, mybatisPersistenceLocateCommodityFilterMapper); + underTest = new LocateCommodityRepository(mybatisLocateCommodityRepository, mybatisLocateCommodityEntityMapper, persistenceLocateCommodityFilterMapper, persistencePageInfoMapper); } - + @Test void locateCommodityByFilter() { //mock objects @@ -51,20 +56,18 @@ void locateCommodityByFilter() { MybatisLocateCommodityEntity locateCommodityEntity = mock(MybatisLocateCommodityEntity.class); LocateCommodityFilter locateCommodityFilter = mock(LocateCommodityFilter.class); LocateCommodity locateCommodity = mock(LocateCommodity.class); - - when(mybatisPersistenceLocateCommodityFilterMapper.map(locateCommodityFilter)).thenReturn(locateCommodityFilterPersistence); + PageInfo pageInfo = mock(PageInfo.class); + + when(persistenceLocateCommodityFilterMapper.map(locateCommodityFilter)).thenReturn(locateCommodityFilterPersistence); when(mybatisLocateCommodityRepository.locateCommodityByFilter(locateCommodityFilterPersistence)).thenReturn(Collections.singletonList(locateCommodityEntity)); when(mybatisLocateCommodityEntityMapper.map(locateCommodityEntity)).thenReturn(locateCommodity); - - - List result = underTest.locateCommodityByFilter(locateCommodityFilter); - - verify(mybatisPersistenceLocateCommodityFilterMapper).map(locateCommodityFilter); - verify(mybatisLocateCommodityRepository).locateCommodityByFilter(locateCommodityFilterPersistence); - verify(mybatisLocateCommodityEntityMapper).map(locateCommodityEntity); - verifyNoMoreInteractions(mybatisPersistenceLocateCommodityFilterMapper, mybatisLocateCommodityRepository, mybatisLocateCommodityEntityMapper); - - assertThat(result, equalTo(Collections.singletonList(locateCommodity))); - + when(persistencePageInfoMapper.map(locateCommodityEntity)).thenReturn(pageInfo); + + PagedResult result = underTest.locateCommodityByFilter(locateCommodityFilter); + + assertThat(result, notNullValue()); + assertThat(result.pageInfo(), is(pageInfo)); + assertThat(result.result(), equalTo(Collections.singletonList(locateCommodity))); + } } \ No newline at end of file diff --git a/trade-module/src/test/java/io/edpn/backend/trade/application/service/LocateCommodityUseCaseTest.java b/trade-module/src/test/java/io/edpn/backend/trade/application/service/LocateCommodityUseCaseTest.java index 31f8a0ff..31f1b61d 100644 --- a/trade-module/src/test/java/io/edpn/backend/trade/application/service/LocateCommodityUseCaseTest.java +++ b/trade-module/src/test/java/io/edpn/backend/trade/application/service/LocateCommodityUseCaseTest.java @@ -1,11 +1,18 @@ package io.edpn.backend.trade.application.service; +import io.edpn.backend.trade.adapter.web.dto.object.RestLocateCommodityDto; +import io.edpn.backend.trade.adapter.web.dto.object.RestPageInfoDto; +import io.edpn.backend.trade.adapter.web.dto.object.RestPagedResultDto; import io.edpn.backend.trade.application.domain.LocateCommodity; +import io.edpn.backend.trade.application.domain.PageInfo; +import io.edpn.backend.trade.application.domain.PagedResult; import io.edpn.backend.trade.application.domain.filter.LocateCommodityFilter; import io.edpn.backend.trade.application.dto.web.filter.LocateCommodityFilterDto; import io.edpn.backend.trade.application.dto.web.filter.mapper.LocateCommodityFilterDtoMapper; import io.edpn.backend.trade.application.dto.web.object.LocateCommodityDto; +import io.edpn.backend.trade.application.dto.web.object.PagedResultDto; import io.edpn.backend.trade.application.dto.web.object.mapper.LocateCommodityDtoMapper; +import io.edpn.backend.trade.application.dto.web.object.mapper.PageInfoDtoMapper; import io.edpn.backend.trade.application.port.incomming.locatecommodity.LocateCommodityUseCase; import io.edpn.backend.trade.application.port.outgoing.locatecommodity.LocateCommodityByFilterPort; import org.junit.jupiter.api.BeforeEach; @@ -16,52 +23,65 @@ import org.mockito.junit.jupiter.MockitoExtension; import java.util.List; +import java.util.function.BiFunction; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) public class LocateCommodityUseCaseTest { - + @Mock private LocateCommodityByFilterPort locateCommodityByFilterPort; - + @Mock private LocateCommodityFilterDtoMapper locateCommodityFilterDtoMapper; - + @Mock private LocateCommodityDtoMapper locateCommodityDtoMapper; - + + @Mock + private PageInfoDtoMapper pageInfoDtoMapper; + private LocateCommodityUseCase underTest; - + @BeforeEach - public void setUp(){ - underTest = new LocateCommodityService(locateCommodityByFilterPort, locateCommodityFilterDtoMapper, locateCommodityDtoMapper); + public void setUp() { + underTest = new LocateCommodityService(locateCommodityByFilterPort, locateCommodityFilterDtoMapper, locateCommodityDtoMapper, pageInfoDtoMapper); } - + @Test void shouldLocateCommoditiesNearby() { LocateCommodityFilterDto locateCommodityFilterDto = mock(LocateCommodityFilterDto.class); LocateCommodityFilter locateCommodityFilter = mock(LocateCommodityFilter.class); LocateCommodity locateCommodity = mock(LocateCommodity.class); LocateCommodityDto locateCommodityDto = mock(LocateCommodityDto.class); - + PageInfo pageInfo = mock(PageInfo.class); + PagedResult pagedResult = new PagedResult<>(List.of(locateCommodity), pageInfo); + RestPageInfoDto pageInfoDto = mock(RestPageInfoDto.class); + when(locateCommodityFilterDtoMapper.map(locateCommodityFilterDto)).thenReturn(locateCommodityFilter); - when(locateCommodityByFilterPort.locateCommodityByFilter(locateCommodityFilter)).thenReturn(List.of(locateCommodity)); + when(locateCommodityByFilterPort.locateCommodityByFilter(locateCommodityFilter)).thenReturn(pagedResult); when(locateCommodityDtoMapper.map(locateCommodity)).thenReturn(locateCommodityDto); - - List responses = underTest.locateCommodityOrderByDistance(locateCommodityFilterDto); - + when(pageInfoDtoMapper.map(pageInfo)).thenReturn(pageInfoDto); + BiFunction, RestPageInfoDto, RestPagedResultDto> constructor = RestPagedResultDto::new; + + PagedResultDto responses = underTest.locateCommodityOrderByDistance(locateCommodityFilterDto, constructor); + ArgumentCaptor argumentCaptor = ArgumentCaptor.forClass(LocateCommodityFilter.class); verify(locateCommodityByFilterPort).locateCommodityByFilter(argumentCaptor.capture()); - + LocateCommodityFilter capturedLocateCommodity = argumentCaptor.getValue(); - + assertThat(capturedLocateCommodity, equalTo(locateCommodityFilter)); - assertThat(responses, equalTo(List.of(locateCommodityDto))); + assertThat(responses, notNullValue()); + assertThat(responses.pageInfo(), is(pageInfoDto)); + assertThat(responses.result(), equalTo(List.of(locateCommodityDto))); } - + } From 800bebcc856aefbee362e33fe5a0408572bcf602 Mon Sep 17 00:00:00 2001 From: pveeckhout Date: Thu, 14 Sep 2023 13:47:01 +0200 Subject: [PATCH 6/8] #103 - fixing outdated qualifier --- .../io/edpn/backend/trade/adapter/config/ServiceConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/ServiceConfig.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/ServiceConfig.java index af1672b1..5969839f 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/ServiceConfig.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/ServiceConfig.java @@ -243,7 +243,7 @@ public RequestMissingStationRequireOdysseyUseCase requestMissingStationRequireOd CreateStationRequireOdysseyRequestPort createStationRequireOdysseyRequestPort, SendKafkaMessagePort sendKafkaMessagePort, @Qualifier("tradeRetryTemplate") RetryTemplate retryTemplate, - @Qualifier("tradeThreadPoolTaskExecutor") Executor executor, + @Qualifier("tradeForkJoinPool") Executor executor, ObjectMapper objectMapper, MessageMapper messageMapper ) { From 0fc099ab2408c3423e46f047b796d3f77d6068e6 Mon Sep 17 00:00:00 2001 From: pveeckhout Date: Thu, 14 Sep 2023 15:14:20 +0200 Subject: [PATCH 7/8] #103 -adding paging request info directly on the filter object --- .../filter/RestLocateCommodityFilterDto.java | 4 +- .../web/dto/filter/RestPageFilterDto.java | 11 ---- .../RestLocateCommodityFilterDtoMapper.java | 14 ++--- .../mapper/RestPageFilterDtoMapper.java | 6 ++- .../web/filter/LocateCommodityFilterDto.java | 4 +- .../dto/web/filter/PageFilterDto.java | 4 +- ...estLocateCommodityFilterDtoMapperTest.java | 16 +++--- .../mapper/RestPageFilterDtoMapperTest.java | 54 +++++++++++++------ 8 files changed, 64 insertions(+), 49 deletions(-) delete mode 100644 trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/RestPageFilterDto.java diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/RestLocateCommodityFilterDto.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/RestLocateCommodityFilterDto.java index 875a131f..7c028f3c 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/RestLocateCommodityFilterDto.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/RestLocateCommodityFilterDto.java @@ -1,7 +1,6 @@ package io.edpn.backend.trade.adapter.web.dto.filter; import io.edpn.backend.trade.application.dto.web.filter.LocateCommodityFilterDto; -import io.edpn.backend.trade.application.dto.web.filter.PageFilterDto; import io.swagger.v3.oas.annotations.media.Schema; @Schema(name = "LocateCommodityFilterDto") @@ -16,6 +15,7 @@ public record RestLocateCommodityFilterDto( String shipSize, Long minSupply, Long minDemand, - RestPageFilterDto page + Integer size, + Integer page ) implements LocateCommodityFilterDto { } diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/RestPageFilterDto.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/RestPageFilterDto.java deleted file mode 100644 index 7fba4667..00000000 --- a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/RestPageFilterDto.java +++ /dev/null @@ -1,11 +0,0 @@ -package io.edpn.backend.trade.adapter.web.dto.filter; - -import io.edpn.backend.trade.application.dto.web.filter.PageFilterDto; -import io.swagger.v3.oas.annotations.media.Schema; - -@Schema(name = "PageFilterDto") -public record RestPageFilterDto( - int size, - int page -) implements PageFilterDto { -} diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestLocateCommodityFilterDtoMapper.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestLocateCommodityFilterDtoMapper.java index afb3e69f..8629d1d5 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestLocateCommodityFilterDtoMapper.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestLocateCommodityFilterDtoMapper.java @@ -23,14 +23,16 @@ public LocateCommodityFilter map(LocateCommodityFilterDto locateCommodityFilterD locateCommodityFilterDto.includePlanetary(), locateCommodityFilterDto.includeOdyssey(), locateCommodityFilterDto.includeFleetCarriers(), - Optional.ofNullable(locateCommodityFilterDto.shipSize()) - .map(LandingPadSize::valueOf) - .orElse(null), + getShipSize(locateCommodityFilterDto), locateCommodityFilterDto.minSupply(), locateCommodityFilterDto.minDemand(), - Optional.ofNullable(locateCommodityFilterDto.page()) - .map(pageFilterDtoMapper::map) - .orElse(pageFilterDtoMapper.getDefaultFilter()) + pageFilterDtoMapper.map(locateCommodityFilterDto) ); } + + private static LandingPadSize getShipSize(LocateCommodityFilterDto locateCommodityFilterDto) { + return Optional.ofNullable(locateCommodityFilterDto.shipSize()) + .map(LandingPadSize::valueOf) + .orElse(null); + } } diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestPageFilterDtoMapper.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestPageFilterDtoMapper.java index 537216da..f5c30565 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestPageFilterDtoMapper.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestPageFilterDtoMapper.java @@ -4,14 +4,16 @@ import io.edpn.backend.trade.application.dto.web.filter.PageFilterDto; import io.edpn.backend.trade.application.dto.web.filter.mapper.PageFilterDtoMapper; +import java.util.Objects; + public class RestPageFilterDtoMapper implements PageFilterDtoMapper { @Override public PageFilter map(PageFilterDto pageFilterDto) { PageFilter.PageFilterBuilder builder = getDefaultFilterBuilder(); - if (pageFilterDto.size() > 0) { + if (Objects.nonNull(pageFilterDto.size()) && pageFilterDto.size() > 0) { builder.size(pageFilterDto.size()); } - if (pageFilterDto.page() >= 0) { + if (Objects.nonNull(pageFilterDto.page()) && pageFilterDto.page() >= 0) { builder.page(pageFilterDto.page()); } return builder.build(); diff --git a/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/filter/LocateCommodityFilterDto.java b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/filter/LocateCommodityFilterDto.java index a7746359..31e5b87d 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/filter/LocateCommodityFilterDto.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/filter/LocateCommodityFilterDto.java @@ -1,6 +1,6 @@ package io.edpn.backend.trade.application.dto.web.filter; -public interface LocateCommodityFilterDto { +public interface LocateCommodityFilterDto extends PageFilterDto { String commodityDisplayName(); @@ -21,6 +21,4 @@ public interface LocateCommodityFilterDto { Long minSupply(); Long minDemand(); - - PageFilterDto page(); } diff --git a/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/filter/PageFilterDto.java b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/filter/PageFilterDto.java index aaa476ae..397da753 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/filter/PageFilterDto.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/filter/PageFilterDto.java @@ -1,7 +1,7 @@ package io.edpn.backend.trade.application.dto.web.filter; public interface PageFilterDto { - int size(); + Integer size(); - int page(); + Integer page(); } diff --git a/trade-module/src/test/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestLocateCommodityFilterDtoMapperTest.java b/trade-module/src/test/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestLocateCommodityFilterDtoMapperTest.java index 369a8b67..2bc49d9d 100644 --- a/trade-module/src/test/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestLocateCommodityFilterDtoMapperTest.java +++ b/trade-module/src/test/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestLocateCommodityFilterDtoMapperTest.java @@ -1,7 +1,6 @@ package io.edpn.backend.trade.adapter.web.dto.filter.mapper; import io.edpn.backend.trade.adapter.web.dto.filter.RestLocateCommodityFilterDto; -import io.edpn.backend.trade.adapter.web.dto.filter.RestPageFilterDto; import io.edpn.backend.trade.application.domain.LandingPadSize; import io.edpn.backend.trade.application.domain.filter.LocateCommodityFilter; import io.edpn.backend.trade.application.domain.filter.PageFilter; @@ -14,8 +13,11 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import java.util.Objects; + import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; +import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) @@ -33,7 +35,6 @@ public void setUp() { @Test public void testMap_givenDto_shouldReturnDomainObject_nullPageFilter() { - RestPageFilterDto pageFilterDto = null; LocateCommodityFilterDto dto = new RestLocateCommodityFilterDto( "Display Name", 1.0, @@ -45,8 +46,9 @@ public void testMap_givenDto_shouldReturnDomainObject_nullPageFilter() { String.valueOf(LandingPadSize.MEDIUM), 123L, 321L, - pageFilterDto); - when(pageFilterDtoMapper.getDefaultFilter()).thenReturn(PageFilter.builder() + null, + null); + when(pageFilterDtoMapper.map(argThat(argument -> argument != null && Objects.isNull(argument.page()) && Objects.isNull(argument.page())))).thenReturn(PageFilter.builder() .size(20) .page(0) .build()); @@ -69,7 +71,6 @@ public void testMap_givenDto_shouldReturnDomainObject_nullPageFilter() { @Test public void testMap_givenDto_shouldReturnDomainObject() { - RestPageFilterDto pageFilterDto = new RestPageFilterDto(20, 4); LocateCommodityFilterDto dto = new RestLocateCommodityFilterDto( "Display Name", 1.0, @@ -81,8 +82,9 @@ public void testMap_givenDto_shouldReturnDomainObject() { String.valueOf(LandingPadSize.MEDIUM), 123L, 321L, - pageFilterDto); - when(pageFilterDtoMapper.map(pageFilterDto)).thenReturn(PageFilter.builder() + 20, + 0); + when(pageFilterDtoMapper.map(dto)).thenReturn(PageFilter.builder() .size(20) .page(4) .build()); diff --git a/trade-module/src/test/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestPageFilterDtoMapperTest.java b/trade-module/src/test/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestPageFilterDtoMapperTest.java index 5b6b51c3..e2bf513c 100644 --- a/trade-module/src/test/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestPageFilterDtoMapperTest.java +++ b/trade-module/src/test/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestPageFilterDtoMapperTest.java @@ -1,13 +1,18 @@ package io.edpn.backend.trade.adapter.web.dto.filter.mapper; -import io.edpn.backend.trade.adapter.web.dto.filter.RestPageFilterDto; import io.edpn.backend.trade.application.domain.filter.PageFilter; +import io.edpn.backend.trade.application.dto.web.filter.PageFilterDto; import io.edpn.backend.trade.application.dto.web.filter.mapper.PageFilterDtoMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import org.mockito.junit.jupiter.MockitoExtension; +import java.util.stream.Stream; + import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; @@ -16,38 +21,55 @@ class RestPageFilterDtoMapperTest { private PageFilterDtoMapper underTest; + public static Stream testMapSource() { + return Stream.of( + Arguments.of(4, 1, 4, 1), + Arguments.of(-20, 0, 20, 0), + Arguments.of(17, -1, 17, 0), + Arguments.of(0, 8, 20, 8), + Arguments.of(null, 1, 20, 1), + Arguments.of(null, null, 20, 0), + Arguments.of(16, null, 16, 0) + ); + } + @BeforeEach public void setUp() { underTest = new RestPageFilterDtoMapper(); } - @Test - public void testMap_givenDto_shouldReturnDomainObject() { - RestPageFilterDto pageFilterDto = new RestPageFilterDto(20, 1); + @ParameterizedTest + @MethodSource("testMapSource") + public void testMap(Integer size, Integer page, Integer expectedSize, Integer expectedPage) { + PageFilterDto pageFilterDto = buildPageFilterDto(size, page); PageFilter domainObject = underTest.map(pageFilterDto); - assertThat(domainObject.getPage(), is(1)); - assertThat(domainObject.getSize(), is(20)); + assertThat(domainObject.getSize(), is(expectedSize)); + assertThat(domainObject.getPage(), is(expectedPage)); } @Test - public void testMap_givenDto_shouldReturnDomainObject_negativePageShouldBeZero() { - RestPageFilterDto pageFilterDto = new RestPageFilterDto(20, -4); + public void testMap_givenDto_shouldReturnDomainObject() { + PageFilterDto pageFilterDto = buildPageFilterDto(20, 1); PageFilter domainObject = underTest.map(pageFilterDto); - assertThat(domainObject.getPage(), is(0)); + assertThat(domainObject.getPage(), is(1)); assertThat(domainObject.getSize(), is(20)); } - @Test - public void testMap_givenDto_shouldReturnDomainObject_negativeSizeShouldBeDefault() { - RestPageFilterDto pageFilterDto = new RestPageFilterDto(-20, 8); - - PageFilter domainObject = underTest.map(pageFilterDto); + private PageFilterDto buildPageFilterDto(Integer size, Integer page) { + return new PageFilterDto() { + @Override + public Integer size() { + return size; + } - assertThat(domainObject.getPage(), is(8)); - assertThat(domainObject.getSize(), is(underTest.getDefaultFilter().getSize())); + @Override + public Integer page() { + return page; + } + }; } } \ No newline at end of file From 8bd8cde6da5c50deacc972328260fa9701b53064 Mon Sep 17 00:00:00 2001 From: pveeckhout Date: Thu, 14 Sep 2023 17:14:10 +0200 Subject: [PATCH 8/8] #103 - fixing generics issue with swagger --- .../MybatisLocateCommodityRepository.java | 4 +- .../adapter/web/TradeModuleController.java | 21 ++++---- .../object/RestPagedLocateCommodityDto.java | 12 +++++ .../web/dto/object/RestPagedResultDto.java | 48 +++++++++++++++++-- .../dto/web/object/PagedResultDto.java | 4 +- .../object/mapper/PagedResultDtoMapper.java | 2 +- .../LocateCommodityUseCase.java | 2 +- .../service/LocateCommodityService.java | 2 +- .../service/LocateCommodityUseCaseTest.java | 6 +-- 9 files changed, 74 insertions(+), 27 deletions(-) create mode 100644 trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/object/RestPagedLocateCommodityDto.java diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/repository/MybatisLocateCommodityRepository.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/repository/MybatisLocateCommodityRepository.java index 3003bb5f..03a0c700 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/repository/MybatisLocateCommodityRepository.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/repository/MybatisLocateCommodityRepository.java @@ -109,8 +109,8 @@ AND max_landing_pad_size IN ('MEDIUM', 'LARGE', 'SMALL', 'UNKNOWN') @Result(property = "buyPrice", column = "buy_price", javaType = Long.class), @Result(property = "sellPrice", column = "sell_price", javaType = Long.class), @Result(property = "distance", column = "distance", javaType = Double.class), - @Result(property = "pageSize", column = "pageSize", javaType = Integer.class), - @Result(property = "currentPage", column = "current_page", javaType = Integer.class), + @Result(property = "pageSize", column = "page_size", javaType = Integer.class), + @Result(property = "currentPage", column = "page_number", javaType = Integer.class), @Result(property = "totalItems", column = "total_items", javaType = Integer.class) }) diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/TradeModuleController.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/TradeModuleController.java index 0f3dfc79..7d8ff5d1 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/TradeModuleController.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/TradeModuleController.java @@ -5,18 +5,13 @@ import io.edpn.backend.trade.adapter.web.dto.object.RestCommodityMarketInfoDto; import io.edpn.backend.trade.adapter.web.dto.object.RestLocateCommodityDto; import io.edpn.backend.trade.adapter.web.dto.object.RestPageInfoDto; -import io.edpn.backend.trade.adapter.web.dto.object.RestPagedResultDto; +import io.edpn.backend.trade.adapter.web.dto.object.RestPagedLocateCommodityDto; import io.edpn.backend.trade.adapter.web.dto.object.RestValidatedCommodityDto; -import io.edpn.backend.trade.application.dto.web.object.PagedResultDto; import io.edpn.backend.trade.application.port.incomming.commoditymarketinfo.GetFullCommodityMarketInfoUseCase; import io.edpn.backend.trade.application.port.incomming.locatecommodity.LocateCommodityUseCase; import io.edpn.backend.trade.application.port.incomming.validatedcommodity.FindAllValidatedCommodityUseCase; import io.edpn.backend.trade.application.port.incomming.validatedcommodity.FindValidatedCommodityByFilterUseCase; import io.edpn.backend.trade.application.port.incomming.validatedcommodity.FindValidatedCommodityByNameUseCase; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -60,14 +55,14 @@ public Optional findByName(@PathVariable String displ .findByName(displayName) .map(x -> (RestValidatedCommodityDto) x); } - @ApiResponses({ - @ApiResponse(responseCode = "200", content = {@Content(schema = @Schema(implementation = RestPagedResultDto.class), mediaType = "application/json")}) - }) - @GetMapping("/locate-commodity") - public PagedResultDto locateCommodityWithFilters(RestLocateCommodityFilterDto locateCommodityFilterDto) { - BiFunction, RestPageInfoDto, RestPagedResultDto> constructor = RestPagedResultDto::new; - return locateCommodityUseCase + + @GetMapping(value = "/locate-commodity") + public RestPagedLocateCommodityDto locateCommodityWithFilters(RestLocateCommodityFilterDto locateCommodityFilterDto) { + BiFunction, RestPageInfoDto, RestPagedLocateCommodityDto> constructor = RestPagedLocateCommodityDto::new; + var temp = locateCommodityUseCase .locateCommodityOrderByDistance(locateCommodityFilterDto, constructor); + + return (RestPagedLocateCommodityDto) temp; } @GetMapping("/best-price") diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/object/RestPagedLocateCommodityDto.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/object/RestPagedLocateCommodityDto.java new file mode 100644 index 00000000..b94d9f04 --- /dev/null +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/object/RestPagedLocateCommodityDto.java @@ -0,0 +1,12 @@ +package io.edpn.backend.trade.adapter.web.dto.object; + + +import java.io.Serializable; +import java.util.List; + +public class RestPagedLocateCommodityDto extends RestPagedResultDto implements Serializable { + + public RestPagedLocateCommodityDto(List result, RestPageInfoDto pageInfo) { + super(result, pageInfo); + } +} diff --git a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/object/RestPagedResultDto.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/object/RestPagedResultDto.java index 3bb4dcc7..0edc1d1c 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/object/RestPagedResultDto.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/object/RestPagedResultDto.java @@ -3,9 +3,49 @@ import io.edpn.backend.trade.application.dto.web.object.PagedResultDto; import java.util.List; +import java.util.Objects; + +public abstract class RestPagedResultDto implements PagedResultDto { + private final List result; + private final RestPageInfoDto pageInfo; + + public RestPagedResultDto( + List result, + RestPageInfoDto pageInfo + ) { + this.result = result; + this.pageInfo = pageInfo; + } + + @Override + public List result() { + return result; + } + + @Override + public RestPageInfoDto pageInfo() { + return pageInfo; + } + + @Override + public boolean equals(Object obj) { + if (obj == this) return true; + if (obj == null || obj.getClass() != this.getClass()) return false; + var that = (RestPagedResultDto) obj; + return Objects.equals(this.result, that.result) && + Objects.equals(this.pageInfo, that.pageInfo); + } + + @Override + public int hashCode() { + return Objects.hash(result, pageInfo); + } + + @Override + public String toString() { + return "RestPagedResultDto[" + + "result=" + result + ", " + + "pageInfo=" + pageInfo + ']'; + } -public record RestPagedResultDto( - List result, - RestPageInfoDto pageInfo -) implements PagedResultDto { } diff --git a/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/PagedResultDto.java b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/PagedResultDto.java index 6ebec3bd..4fe43d2c 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/PagedResultDto.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/PagedResultDto.java @@ -2,7 +2,7 @@ import java.util.List; -public interface PagedResultDto { +public interface PagedResultDto { List result(); - F pageInfo(); + F pageInfo(); } diff --git a/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/mapper/PagedResultDtoMapper.java b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/mapper/PagedResultDtoMapper.java index 2696f820..e89fcffa 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/mapper/PagedResultDtoMapper.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/mapper/PagedResultDtoMapper.java @@ -10,7 +10,7 @@ import java.util.function.Function; public interface PagedResultDtoMapper { - static > PagedResultDto map( + static > PagedResultDto map( PagedResult pagedResult, Function dtoMapper, Function pageInfoMapper, diff --git a/trade-module/src/main/java/io/edpn/backend/trade/application/port/incomming/locatecommodity/LocateCommodityUseCase.java b/trade-module/src/main/java/io/edpn/backend/trade/application/port/incomming/locatecommodity/LocateCommodityUseCase.java index 207093e6..b141afe9 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/application/port/incomming/locatecommodity/LocateCommodityUseCase.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/application/port/incomming/locatecommodity/LocateCommodityUseCase.java @@ -10,6 +10,6 @@ public interface LocateCommodityUseCase { - , R extends PageInfoDto> PagedResultDto locateCommodityOrderByDistance(LocateCommodityFilterDto locateCommodityFilterDto, BiFunction, R, U> pagedResultConstructor); + , R extends PageInfoDto> PagedResultDto locateCommodityOrderByDistance(LocateCommodityFilterDto locateCommodityFilterDto, BiFunction, R, U> pagedResultConstructor); } diff --git a/trade-module/src/main/java/io/edpn/backend/trade/application/service/LocateCommodityService.java b/trade-module/src/main/java/io/edpn/backend/trade/application/service/LocateCommodityService.java index 9bc8d06a..df169502 100644 --- a/trade-module/src/main/java/io/edpn/backend/trade/application/service/LocateCommodityService.java +++ b/trade-module/src/main/java/io/edpn/backend/trade/application/service/LocateCommodityService.java @@ -27,7 +27,7 @@ public class LocateCommodityService implements LocateCommodityUseCase { private final PageInfoDtoMapper pageInfoDtoMapper; @Override - public , R extends PageInfoDto> PagedResultDto locateCommodityOrderByDistance(LocateCommodityFilterDto locateCommodityFilterDto, BiFunction, R, U> pagedResultConstructor) { + public , R extends PageInfoDto> PagedResultDto locateCommodityOrderByDistance(LocateCommodityFilterDto locateCommodityFilterDto, BiFunction, R, U> pagedResultConstructor) { LocateCommodityFilter filter = locateCommodityFilterDtoMapper.map(locateCommodityFilterDto); PagedResult locateCommodityPagedResult = locateCommodityByFilterPort.locateCommodityByFilter(filter); diff --git a/trade-module/src/test/java/io/edpn/backend/trade/application/service/LocateCommodityUseCaseTest.java b/trade-module/src/test/java/io/edpn/backend/trade/application/service/LocateCommodityUseCaseTest.java index 31f1b61d..d6cbd2db 100644 --- a/trade-module/src/test/java/io/edpn/backend/trade/application/service/LocateCommodityUseCaseTest.java +++ b/trade-module/src/test/java/io/edpn/backend/trade/application/service/LocateCommodityUseCaseTest.java @@ -2,7 +2,7 @@ import io.edpn.backend.trade.adapter.web.dto.object.RestLocateCommodityDto; import io.edpn.backend.trade.adapter.web.dto.object.RestPageInfoDto; -import io.edpn.backend.trade.adapter.web.dto.object.RestPagedResultDto; +import io.edpn.backend.trade.adapter.web.dto.object.RestPagedLocateCommodityDto; import io.edpn.backend.trade.application.domain.LocateCommodity; import io.edpn.backend.trade.application.domain.PageInfo; import io.edpn.backend.trade.application.domain.PagedResult; @@ -69,9 +69,9 @@ void shouldLocateCommoditiesNearby() { when(locateCommodityByFilterPort.locateCommodityByFilter(locateCommodityFilter)).thenReturn(pagedResult); when(locateCommodityDtoMapper.map(locateCommodity)).thenReturn(locateCommodityDto); when(pageInfoDtoMapper.map(pageInfo)).thenReturn(pageInfoDto); - BiFunction, RestPageInfoDto, RestPagedResultDto> constructor = RestPagedResultDto::new; + BiFunction, RestPageInfoDto, RestPagedLocateCommodityDto> constructor = RestPagedLocateCommodityDto::new; - PagedResultDto responses = underTest.locateCommodityOrderByDistance(locateCommodityFilterDto, constructor); + PagedResultDto responses = underTest.locateCommodityOrderByDistance(locateCommodityFilterDto, constructor); ArgumentCaptor argumentCaptor = ArgumentCaptor.forClass(LocateCommodityFilter.class); verify(locateCommodityByFilterPort).locateCommodityByFilter(argumentCaptor.capture());