diff --git a/src/main/java/group/goforward/ballistic/controllers/ProductController.java b/src/main/java/group/goforward/ballistic/controllers/ProductController.java index d8ba863..1485be0 100644 --- a/src/main/java/group/goforward/ballistic/controllers/ProductController.java +++ b/src/main/java/group/goforward/ballistic/controllers/ProductController.java @@ -3,6 +3,7 @@ package group.goforward.ballistic.controllers; import group.goforward.ballistic.model.Product; import group.goforward.ballistic.model.ProductOffer; import group.goforward.ballistic.repos.ProductOfferRepository; +import group.goforward.ballistic.web.dto.ProductOfferDto; import group.goforward.ballistic.repos.ProductRepository; import group.goforward.ballistic.web.dto.ProductSummaryDto; import group.goforward.ballistic.web.mapper.ProductMapper; @@ -71,6 +72,25 @@ public class ProductController { }) .toList(); } + + @GetMapping("/{id}/offers") + public List getOffersForProduct(@PathVariable("id") Integer productId) { + List offers = productOfferRepository.findByProductId(productId); + + return offers.stream() + .map(offer -> { + ProductOfferDto dto = new ProductOfferDto(); + dto.setId(offer.getId().toString()); + dto.setMerchantName(offer.getMerchant().getName()); + dto.setPrice(offer.getEffectivePrice()); + dto.setOriginalPrice(offer.getOriginalPrice()); + dto.setInStock(Boolean.TRUE.equals(offer.getInStock())); + dto.setBuyUrl(offer.getBuyUrl()); + dto.setLastUpdated(offer.getLastSeenAt()); + return dto; + }) + .toList(); + } private ProductOffer pickBestOffer(List offers) { if (offers == null || offers.isEmpty()) { diff --git a/src/main/java/group/goforward/ballistic/repos/ProductOfferRepository.java b/src/main/java/group/goforward/ballistic/repos/ProductOfferRepository.java index 978dc15..cf4ff64 100644 --- a/src/main/java/group/goforward/ballistic/repos/ProductOfferRepository.java +++ b/src/main/java/group/goforward/ballistic/repos/ProductOfferRepository.java @@ -8,5 +8,8 @@ import java.util.List; public interface ProductOfferRepository extends JpaRepository { + List findByProductId(Integer productId); + + // Used by the /api/products/gunbuilder endpoint List findByProductIdIn(Collection productIds); } \ No newline at end of file diff --git a/src/main/java/group/goforward/ballistic/web/dto/ProductOfferDto.java b/src/main/java/group/goforward/ballistic/web/dto/ProductOfferDto.java new file mode 100644 index 0000000..3fd40d4 --- /dev/null +++ b/src/main/java/group/goforward/ballistic/web/dto/ProductOfferDto.java @@ -0,0 +1,70 @@ +package group.goforward.ballistic.web.dto; + +import java.math.BigDecimal; +import java.time.OffsetDateTime; + +public class ProductOfferDto { + private String id; + private String merchantName; + private BigDecimal price; + private BigDecimal originalPrice; + private boolean inStock; + private String buyUrl; + private OffsetDateTime lastUpdated; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getMerchantName() { + return merchantName; + } + + public void setMerchantName(String merchantName) { + this.merchantName = merchantName; + } + + public BigDecimal getPrice() { + return price; + } + + public void setPrice(BigDecimal price) { + this.price = price; + } + + public BigDecimal getOriginalPrice() { + return originalPrice; + } + + public void setOriginalPrice(BigDecimal originalPrice) { + this.originalPrice = originalPrice; + } + + public boolean isInStock() { + return inStock; + } + + public void setInStock(boolean inStock) { + this.inStock = inStock; + } + + public String getBuyUrl() { + return buyUrl; + } + + public void setBuyUrl(String buyUrl) { + this.buyUrl = buyUrl; + } + + public OffsetDateTime getLastUpdated() { + return lastUpdated; + } + + public void setLastUpdated(OffsetDateTime lastUpdated) { + this.lastUpdated = lastUpdated; + } +} \ No newline at end of file