From 9dce18d00fe28b3feac145ee5278dc3cfe891ebf Mon Sep 17 00:00:00 2001 From: Florian THIERRY Date: Thu, 18 Sep 2025 17:43:15 +0200 Subject: [PATCH] Add marketplace endpoints and implements get all catalogs service method. --- .../domain/catalog/CatalogService.java | 5 ++++ .../domain/catalog/port/CatalogPort.java | 2 ++ .../marketplace/MarketplaceService.java | 28 +++++++++++++++++++ .../domain/marketplace/model/Marketplace.java | 8 ++++++ .../marketplace/MarketplaceController.java | 24 ++++++++++++++++ .../marketplace/model/MarketplaceDto.java | 17 +++++++++++ .../catalog/CatalogJpaAdapter.java | 9 ++++++ 7 files changed, 93 insertions(+) create mode 100644 virtual-threads-app/src/main/java/com/zeenea/experiments/virtualthreads/virtualthreadsapp/domain/marketplace/MarketplaceService.java create mode 100644 virtual-threads-app/src/main/java/com/zeenea/experiments/virtualthreads/virtualthreadsapp/domain/marketplace/model/Marketplace.java create mode 100644 virtual-threads-app/src/main/java/com/zeenea/experiments/virtualthreads/virtualthreadsapp/exposition/marketplace/MarketplaceController.java create mode 100644 virtual-threads-app/src/main/java/com/zeenea/experiments/virtualthreads/virtualthreadsapp/exposition/marketplace/model/MarketplaceDto.java diff --git a/virtual-threads-app/src/main/java/com/zeenea/experiments/virtualthreads/virtualthreadsapp/domain/catalog/CatalogService.java b/virtual-threads-app/src/main/java/com/zeenea/experiments/virtualthreads/virtualthreadsapp/domain/catalog/CatalogService.java index 33c65dd..136da0d 100644 --- a/virtual-threads-app/src/main/java/com/zeenea/experiments/virtualthreads/virtualthreadsapp/domain/catalog/CatalogService.java +++ b/virtual-threads-app/src/main/java/com/zeenea/experiments/virtualthreads/virtualthreadsapp/domain/catalog/CatalogService.java @@ -4,6 +4,7 @@ import com.zeenea.experiments.virtualthreads.virtualthreadsapp.domain.catalog.mo import com.zeenea.experiments.virtualthreads.virtualthreadsapp.domain.catalog.port.CatalogPort; import org.springframework.stereotype.Service; +import java.util.List; import java.util.Optional; import java.util.UUID; @@ -18,4 +19,8 @@ public class CatalogService { public Optional getById(UUID catalogId) { return catalogPort.getById(catalogId); } + + public List getAll() { + return catalogPort.getAll(); + } } diff --git a/virtual-threads-app/src/main/java/com/zeenea/experiments/virtualthreads/virtualthreadsapp/domain/catalog/port/CatalogPort.java b/virtual-threads-app/src/main/java/com/zeenea/experiments/virtualthreads/virtualthreadsapp/domain/catalog/port/CatalogPort.java index 1589ccd..aedd690 100644 --- a/virtual-threads-app/src/main/java/com/zeenea/experiments/virtualthreads/virtualthreadsapp/domain/catalog/port/CatalogPort.java +++ b/virtual-threads-app/src/main/java/com/zeenea/experiments/virtualthreads/virtualthreadsapp/domain/catalog/port/CatalogPort.java @@ -2,9 +2,11 @@ package com.zeenea.experiments.virtualthreads.virtualthreadsapp.domain.catalog.p import com.zeenea.experiments.virtualthreads.virtualthreadsapp.domain.catalog.model.Catalog; +import java.util.List; import java.util.Optional; import java.util.UUID; public interface CatalogPort { Optional getById(UUID catalogId); + List getAll(); } diff --git a/virtual-threads-app/src/main/java/com/zeenea/experiments/virtualthreads/virtualthreadsapp/domain/marketplace/MarketplaceService.java b/virtual-threads-app/src/main/java/com/zeenea/experiments/virtualthreads/virtualthreadsapp/domain/marketplace/MarketplaceService.java new file mode 100644 index 0000000..f8aee9a --- /dev/null +++ b/virtual-threads-app/src/main/java/com/zeenea/experiments/virtualthreads/virtualthreadsapp/domain/marketplace/MarketplaceService.java @@ -0,0 +1,28 @@ +package com.zeenea.experiments.virtualthreads.virtualthreadsapp.domain.marketplace; + +import com.zeenea.experiments.virtualthreads.virtualthreadsapp.domain.catalog.CatalogService; +import com.zeenea.experiments.virtualthreads.virtualthreadsapp.domain.item.ItemService; +import com.zeenea.experiments.virtualthreads.virtualthreadsapp.domain.item.model.Item; +import com.zeenea.experiments.virtualthreads.virtualthreadsapp.domain.marketplace.model.Marketplace; +import org.springframework.stereotype.Service; + +@Service +public class MarketplaceService { + private final CatalogService catalogService; + private final ItemService itemService; + + public MarketplaceService(CatalogService catalogService, ItemService itemService) { + this.catalogService = catalogService; + this.itemService = itemService; + } + + public Marketplace getMarketplace() { + return new Marketplace( + catalogService.getAll(), + itemService.getAllItems() + .stream() + .filter(Item::isShared) + .toList() + ); + } +} diff --git a/virtual-threads-app/src/main/java/com/zeenea/experiments/virtualthreads/virtualthreadsapp/domain/marketplace/model/Marketplace.java b/virtual-threads-app/src/main/java/com/zeenea/experiments/virtualthreads/virtualthreadsapp/domain/marketplace/model/Marketplace.java new file mode 100644 index 0000000..4758cb3 --- /dev/null +++ b/virtual-threads-app/src/main/java/com/zeenea/experiments/virtualthreads/virtualthreadsapp/domain/marketplace/model/Marketplace.java @@ -0,0 +1,8 @@ +package com.zeenea.experiments.virtualthreads.virtualthreadsapp.domain.marketplace.model; + +import com.zeenea.experiments.virtualthreads.virtualthreadsapp.domain.catalog.model.Catalog; +import com.zeenea.experiments.virtualthreads.virtualthreadsapp.domain.item.model.Item; + +import java.util.List; + +public record Marketplace(List catalogs, List sharedItems) {} diff --git a/virtual-threads-app/src/main/java/com/zeenea/experiments/virtualthreads/virtualthreadsapp/exposition/marketplace/MarketplaceController.java b/virtual-threads-app/src/main/java/com/zeenea/experiments/virtualthreads/virtualthreadsapp/exposition/marketplace/MarketplaceController.java new file mode 100644 index 0000000..907fd17 --- /dev/null +++ b/virtual-threads-app/src/main/java/com/zeenea/experiments/virtualthreads/virtualthreadsapp/exposition/marketplace/MarketplaceController.java @@ -0,0 +1,24 @@ +package com.zeenea.experiments.virtualthreads.virtualthreadsapp.exposition.marketplace; + +import com.zeenea.experiments.virtualthreads.virtualthreadsapp.domain.marketplace.MarketplaceService; +import com.zeenea.experiments.virtualthreads.virtualthreadsapp.domain.marketplace.model.Marketplace; +import com.zeenea.experiments.virtualthreads.virtualthreadsapp.exposition.marketplace.model.MarketplaceDto; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/marketplace") +public class MarketplaceController { + private final MarketplaceService marketplaceService; + + public MarketplaceController(MarketplaceService marketplaceService) { + this.marketplaceService = marketplaceService; + } + + @GetMapping + public MarketplaceDto getMarketplace() { + Marketplace marketplace = marketplaceService.getMarketplace(); + return new MarketplaceDto(marketplace); + } +} diff --git a/virtual-threads-app/src/main/java/com/zeenea/experiments/virtualthreads/virtualthreadsapp/exposition/marketplace/model/MarketplaceDto.java b/virtual-threads-app/src/main/java/com/zeenea/experiments/virtualthreads/virtualthreadsapp/exposition/marketplace/model/MarketplaceDto.java new file mode 100644 index 0000000..877a3e4 --- /dev/null +++ b/virtual-threads-app/src/main/java/com/zeenea/experiments/virtualthreads/virtualthreadsapp/exposition/marketplace/model/MarketplaceDto.java @@ -0,0 +1,17 @@ +package com.zeenea.experiments.virtualthreads.virtualthreadsapp.exposition.marketplace.model; + + +import com.zeenea.experiments.virtualthreads.virtualthreadsapp.domain.marketplace.model.Marketplace; +import com.zeenea.experiments.virtualthreads.virtualthreadsapp.exposition.catalog.model.CatalogDto; +import com.zeenea.experiments.virtualthreads.virtualthreadsapp.exposition.item.model.ItemDto; + +import java.util.List; + +public record MarketplaceDto(List catalogs, List sharedItems) { + public MarketplaceDto(Marketplace marketplace) { + this( + marketplace.catalogs().stream().map(CatalogDto::new).toList(), + marketplace.sharedItems().stream().map(ItemDto::new).toList() + ); + } +} diff --git a/virtual-threads-app/src/main/java/com/zeenea/experiments/virtualthreads/virtualthreadsapp/infrastructure/catalog/CatalogJpaAdapter.java b/virtual-threads-app/src/main/java/com/zeenea/experiments/virtualthreads/virtualthreadsapp/infrastructure/catalog/CatalogJpaAdapter.java index f6506a2..f625e38 100644 --- a/virtual-threads-app/src/main/java/com/zeenea/experiments/virtualthreads/virtualthreadsapp/infrastructure/catalog/CatalogJpaAdapter.java +++ b/virtual-threads-app/src/main/java/com/zeenea/experiments/virtualthreads/virtualthreadsapp/infrastructure/catalog/CatalogJpaAdapter.java @@ -6,6 +6,7 @@ import com.zeenea.experiments.virtualthreads.virtualthreadsapp.infrastructure.ca import com.zeenea.experiments.virtualthreads.virtualthreadsapp.infrastructure.catalog.repository.CatalogJpaRepository; import org.springframework.stereotype.Component; +import java.util.List; import java.util.Optional; import java.util.UUID; @@ -22,4 +23,12 @@ public class CatalogJpaAdapter implements CatalogPort { return catalogJpaRepository.findById(catalogId) .map(CatalogJpaEntity::toDomain); } + + @Override + public List getAll() { + return catalogJpaRepository.findAll() + .stream() + .map(CatalogJpaEntity::toDomain) + .toList(); + } }