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 ce4ada14..bca2aab6 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 @@ -48,7 +48,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( idGenerator, @@ -120,7 +120,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, @@ -144,7 +144,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/PersistenceEntityMapperConfig.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/config/PersistenceEntityMapperConfig.java index fa355019..8bb38d6f 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,72 +12,88 @@ import io.edpn.backend.trade.adapter.persistence.filter.mapper.MybatisPersistenceFindStationFilterMapper; 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.PersistenceFindStationFilterMapper; import io.edpn.backend.trade.application.dto.persistence.filter.mapper.PersistenceFindSystemFilterMapper; +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 PersistenceFindSystemFilterMapper persistenceFindSystemFilterMapper(){ + public PersistenceFindSystemFilterMapper persistenceFindSystemFilterMapper() { 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); } @Bean(name = "tradePersistenceFindStationFilterMapper") - public PersistenceFindStationFilterMapper persistenceFindStationFilterMapper(){ + public PersistenceFindStationFilterMapper persistenceFindStationFilterMapper() { return new MybatisPersistenceFindStationFilterMapper(); } + + @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 9efebab9..f71d893b 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 @@ -37,6 +37,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; @@ -69,8 +70,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 ee8f59ab..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 @@ -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; @@ -93,8 +94,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") @@ -228,7 +230,7 @@ public RequestMissingSystemCoordinatesService requestMissingSystemCoordinatesUse CreateSystemCoordinateRequestPort createSystemCoordinateRequestPort, SendKafkaMessagePort sendKafkaMessagePort, @Qualifier("tradeRetryTemplate") RetryTemplate retryTemplate, - @Qualifier("tradeThreadPoolTaskExecutor") Executor executor, + @Qualifier("tradeForkJoinPool") Executor executor, ObjectMapper objectMapper, MessageMapper messageMapper ) { @@ -241,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 ) { 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..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 @@ -2,15 +2,19 @@ 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.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; 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.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; @@ -19,44 +23,54 @@ @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 = "tradePageInfoDtoMapper") + public PageInfoDtoMapper pageInfoDtoMapper() { + return new RestPageInfoDtoMapper(); + } + @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/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/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..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 @@ -12,11 +12,10 @@ @RequiredArgsConstructor public class MybatisLocateCommodityEntityMapper implements LocateCommodityEntityMapper { - + private final ValidatedCommodityEntityMapper validatedCommodityEntityMapper; private final StationEntityMapper stationEntityMapper; - @Override public LocateCommodity map(LocateCommodityEntity locateCommodityEntity) { return new LocateCommodity( @@ -30,7 +29,7 @@ public LocateCommodity map(LocateCommodityEntity locateCommodityEntity) { locateCommodityEntity.getDistance() ); } - + @Override public MybatisLocateCommodityEntity map(LocateCommodity locateCommodity) { return MybatisLocateCommodityEntity.builder() 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/persistence/filter/MybatisLocateCommodityFilter.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/persistence/filter/MybatisLocateCommodityFilter.java index 31846cc8..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 @@ -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; @@ -25,7 +26,8 @@ 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/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..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 @@ -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() @@ -16,9 +22,10 @@ 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)) .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..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 @@ -17,26 +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), @@ -48,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 = "page_size", javaType = Integer.class), + @Result(property = "currentPage", column = "page_number", 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 87a0b5e0..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 @@ -4,6 +4,8 @@ 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.RestPagedLocateCommodityDto; import io.edpn.backend.trade.adapter.web.dto.object.RestValidatedCommodityDto; import io.edpn.backend.trade.application.port.incomming.commoditymarketinfo.GetFullCommodityMarketInfoUseCase; import io.edpn.backend.trade.application.port.incomming.locatecommodity.LocateCommodityUseCase; @@ -17,6 +19,7 @@ import java.util.List; import java.util.Optional; +import java.util.function.BiFunction; @RequiredArgsConstructor @RequestMapping("/api/v1/trade") @@ -33,7 +36,7 @@ public class TradeModuleController { public List findAll() { return findAllValidatedCommodityUseCase.findAll() .stream() - .map(x -> (RestValidatedCommodityDto)x) + .map(x -> (RestValidatedCommodityDto) x) .toList(); } @@ -42,7 +45,7 @@ public List findByFilter(RestFindCommodityFilterDto f return findValidatedCommodityByFilterUseCase .findByFilter(findCommodityRequest) .stream() - .map(x -> (RestValidatedCommodityDto)x) + .map(x -> (RestValidatedCommodityDto) x) .toList(); } @@ -50,24 +53,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){ - return locateCommodityUseCase - .locateCommodityOrderByDistance(locateCommodityFilterDto) - .stream() - .map(x -> (RestLocateCommodityDto)x) - .toList(); + + @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") 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 e5d2f42b..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 @@ -12,7 +12,10 @@ public record RestLocateCommodityFilterDto( Boolean includePlanetary, Boolean includeOdyssey, Boolean includeFleetCarriers, - String maxLandingPadSize, + String shipSize, Long minSupply, - Long minDemand) implements LocateCommodityFilterDto { + Long minDemand, + Integer size, + Integer page +) implements LocateCommodityFilterDto { } 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..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 @@ -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( @@ -16,9 +23,16 @@ public LocateCommodityFilter map(LocateCommodityFilterDto locateCommodityFilterD locateCommodityFilterDto.includePlanetary(), locateCommodityFilterDto.includeOdyssey(), locateCommodityFilterDto.includeFleetCarriers(), - LandingPadSize.valueOf(locateCommodityFilterDto.maxLandingPadSize()), + getShipSize(locateCommodityFilterDto), locateCommodityFilterDto.minSupply(), - locateCommodityFilterDto.minDemand() + locateCommodityFilterDto.minDemand(), + 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 new file mode 100644 index 00000000..f5c30565 --- /dev/null +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestPageFilterDtoMapper.java @@ -0,0 +1,33 @@ +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; + +import java.util.Objects; + +public class RestPageFilterDtoMapper implements PageFilterDtoMapper { + @Override + public PageFilter map(PageFilterDto pageFilterDto) { + PageFilter.PageFilterBuilder builder = getDefaultFilterBuilder(); + if (Objects.nonNull(pageFilterDto.size()) && pageFilterDto.size() > 0) { + builder.size(pageFilterDto.size()); + } + if (Objects.nonNull(pageFilterDto.page()) && pageFilterDto.page() >= 0) { + builder.page(pageFilterDto.page()); + } + return builder.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/adapter/web/dto/object/RestLocateCommodityDto.java b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/object/RestLocateCommodityDto.java index 897783bf..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 @@ -18,5 +18,6 @@ public record RestLocateCommodityDto( Long demand, Long buyPrice, Long sellPrice, - Double distance) implements LocateCommodityDto { + Double distance +) 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/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 new file mode 100644 index 00000000..0edc1d1c --- /dev/null +++ b/trade-module/src/main/java/io/edpn/backend/trade/adapter/web/dto/object/RestPagedResultDto.java @@ -0,0 +1,51 @@ +package io.edpn.backend.trade.adapter.web.dto.object; + +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 + ']'; + } + +} 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..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 @@ -4,7 +4,6 @@ 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.StationDtoMapper; import io.edpn.backend.trade.application.dto.web.object.mapper.ValidatedCommodityDtoMapper; @@ -12,22 +11,22 @@ @RequiredArgsConstructor public class RestLocateCommodityDtoMapper implements LocateCommodityDtoMapper { - + private final StationDtoMapper stationDtoMapper; private final ValidatedCommodityDtoMapper commodityDtoMapper; - + @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() - ); } } 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/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/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/domain/filter/LocateCommodityFilter.java b/trade-module/src/main/java/io/edpn/backend/trade/application/domain/filter/LocateCommodityFilter.java index 6c48c194..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,8 @@ 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/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/entity/LocateCommodityEntity.java b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/persistence/entity/LocateCommodityEntity.java index 7aaf452e..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,21 +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(); + } 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/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/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..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,24 +1,24 @@ package io.edpn.backend.trade.application.dto.web.filter; -public interface LocateCommodityFilterDto { - +public interface LocateCommodityFilterDto extends PageFilterDto { + String commodityDisplayName(); - + Double xCoordinate(); - + Double yCoordinate(); - + Double zCoordinate(); - + Boolean includePlanetary(); - + Boolean includeOdyssey(); - + Boolean includeFleetCarriers(); - - String maxLandingPadSize(); - + + String shipSize(); + Long minSupply(); - + Long minDemand(); } 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..397da753 --- /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 { + Integer size(); + + Integer 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/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..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 @@ -3,20 +3,20 @@ import java.time.LocalDateTime; public interface LocateCommodityDto { - + ValidatedCommodityDto commodity(); - + StationDto station(); - + LocalDateTime priceUpdatedAt(); - + Long supply(); - + Long demand(); - + Long buyPrice(); - + Long sellPrice(); - + Double distance(); } 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/PagedResultDto.java b/trade-module/src/main/java/io/edpn/backend/trade/application/dto/web/object/PagedResultDto.java new file mode 100644 index 00000000..4fe43d2c --- /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 new file mode 100644 index 00000000..b703703a --- /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 { + + 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..e89fcffa --- /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..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 @@ -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..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 @@ -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/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/PersistenceLocateCommodityFilterMapperTest.java b/trade-module/src/test/java/io/edpn/backend/trade/adapter/persistence/filter/mapper/PersistenceLocateCommodityFilterMapperTest.java index 13668327..c0759950 100644 --- a/trade-module/src/test/java/io/edpn/backend/trade/adapter/persistence/filter/mapper/PersistenceLocateCommodityFilterMapperTest.java +++ b/trade-module/src/test/java/io/edpn/backend/trade/adapter/persistence/filter/mapper/PersistenceLocateCommodityFilterMapperTest.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 PersistenceLocateCommodityFilterMapperTest { 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) + .shipSize(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.getShipSize(), 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) @@ -32,13 +76,16 @@ public void testMap_givenDomainObject_shouldReturnEntity() { .includePlanetary(true) .includeOdyssey(false) .includeFleetCarriers(true) - .maxLandingPadSize(LandingPadSize.MEDIUM) + .shipSize(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)); @@ -46,9 +93,9 @@ 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()); } } \ 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/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..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 @@ -3,26 +3,72 @@ import io.edpn.backend.trade.adapter.web.dto.filter.RestLocateCommodityFilterDto; 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 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) 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() { + LocateCommodityFilterDto dto = new RestLocateCommodityFilterDto( + "Display Name", + 1.0, + 2.0, + 3.0, + true, + false, + true, + String.valueOf(LandingPadSize.MEDIUM), + 123L, + 321L, + 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()); + + 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.getShipSize(), 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() { LocateCommodityFilterDto dto = new RestLocateCommodityFilterDto( @@ -35,10 +81,16 @@ public void testMap_givenDto_shouldReturnDomainObject() { true, String.valueOf(LandingPadSize.MEDIUM), 123L, - 321L); - + 321L, + 20, + 0); + when(pageFilterDtoMapper.map(dto)).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)); @@ -46,8 +98,10 @@ 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)); + 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..e2bf513c --- /dev/null +++ b/trade-module/src/test/java/io/edpn/backend/trade/adapter/web/dto/filter/mapper/RestPageFilterDtoMapperTest.java @@ -0,0 +1,75 @@ +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; +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; + +@ExtendWith(MockitoExtension.class) +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(); + } + + @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.getSize(), is(expectedSize)); + assertThat(domainObject.getPage(), is(expectedPage)); + } + + @Test + public void testMap_givenDto_shouldReturnDomainObject() { + PageFilterDto pageFilterDto = buildPageFilterDto(20, 1); + + PageFilter domainObject = underTest.map(pageFilterDto); + + assertThat(domainObject.getPage(), is(1)); + assertThat(domainObject.getSize(), is(20)); + } + + private PageFilterDto buildPageFilterDto(Integer size, Integer page) { + return new PageFilterDto() { + @Override + public Integer size() { + return size; + } + + @Override + public Integer page() { + return page; + } + }; + } +} \ 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..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 @@ -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.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; 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, RestPagedLocateCommodityDto> constructor = RestPagedLocateCommodityDto::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))); } - + }