Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 10 additions & 4 deletions src/main/java/com/bazaar/orders/controller/ReviewsController.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
import com.bazaar.orders.dto.reviews.CreateOrderReviewRequestDTO;
import com.bazaar.orders.dto.reviews.OrderDetailedReviewDTO;
import com.bazaar.orders.dto.reviews.OrderItemReviewDTO;
import com.bazaar.orders.dto.reviews.OrderItemReviewPageDTO;
import com.bazaar.orders.dto.reviews.OrderReviewDTO;
import com.bazaar.orders.dto.reviews.OrderReviewPageDTO;
import com.bazaar.orders.dto.reviews.SellerReputationDTO;
import com.bazaar.orders.service.ReviewsService;
import io.swagger.v3.oas.annotations.Operation;
Expand All @@ -14,13 +16,15 @@
import lombok.RequiredArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.domain.PageRequest;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
Expand Down Expand Up @@ -180,10 +184,11 @@ public OrderItemReviewDTO getOrderItemReview(@PathVariable Long productId, @Path
@ApiResponses(
value = { @ApiResponse(responseCode = "200", description = "Product reviews retrieved successfully") })
@GetMapping("/products/{productId}")
public List<OrderItemReviewDTO> getProductReviews(@PathVariable Long productId) {
public OrderItemReviewPageDTO getProductReviews(@PathVariable Long productId, @RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "20") int size) {
LOGGER.info("Received request to get reviews for product {}", productId);

return reviewsService.getProductReviews(productId);
return reviewsService.getProductReviews(productId, PageRequest.of(page, size));
}

/**
Expand All @@ -194,10 +199,11 @@ public List<OrderItemReviewDTO> getProductReviews(@PathVariable Long productId)
@Operation(summary = "Get seller reviews", description = "Retrieves all reviews associated with a seller.")
@ApiResponses(value = { @ApiResponse(responseCode = "200", description = "Seller reviews retrieved successfully") })
@GetMapping("/seller/{sellerId}")
public List<OrderReviewDTO> getSellerReviews(@PathVariable Long sellerId) {
public OrderReviewPageDTO getSellerReviews(@PathVariable Long sellerId, @RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "20") int size) {
LOGGER.info("Received request to get reviews for seller {}", sellerId);

return reviewsService.getSellerReviews(sellerId);
return reviewsService.getSellerReviews(sellerId, PageRequest.of(page, size));
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.bazaar.orders.dto.reviews;

import java.util.List;

public record OrderItemReviewPageDTO(
List<OrderItemReviewDTO> reviews, int page, int size,
long totalPages
) {

/**
* Creates a new instance of OrderItemReviewPageDTO from a Page of OrderItemReviewDTO.
* @param page page
* @return reviews OrderItemReviewPageDTO
*/
public static OrderItemReviewPageDTO fromPage(org.springframework.data.domain.Page<OrderItemReviewDTO> page) {
return new OrderItemReviewPageDTO(page.getContent(), page.getNumber(), page.getSize(),
page.getTotalPages());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.bazaar.orders.dto.reviews;

import java.util.List;

public record OrderReviewPageDTO(
List<OrderReviewDTO> reviews, int page, int size,
long totalPages
) {

/**
* Creates a new instance of OrderReviewPageDTO from a Page of OrderReviewDTO.
* @param page
* @return reviews OrderReviewPageDTO
*/
public static OrderReviewPageDTO fromPage(org.springframework.data.domain.Page<OrderReviewDTO> page) {
return new OrderReviewPageDTO(page.getContent(), page.getNumber(), page.getSize(),
page.getTotalPages());
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.bazaar.orders.repository;

import com.bazaar.orders.model.OrderItemReview;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;
Expand All @@ -19,25 +21,15 @@ public interface OrderItemReviewRepository extends JpaRepository<OrderItemReview
*/
Optional<OrderItemReview> findByOrderItemId(Long orderItemId);

/**
* Finds a review associated with a specific order item and created by a specific
* user.
* @param orderItemId identifier of the reviewed order item.
* @param userId identifier of the user who created the review.
* @return an {@link Optional} containing the matching {@link OrderItemReview} if
* found; otherwise, {@link Optional#empty()}.
*/
Optional<OrderItemReview> findByOrderItemIdAndUserId(Long orderItemId, Long userId);

/**
* Retrieves all reviews associated with the provided list of order item identifiers.
* @param orderItemIds list of order item identifiers.
* @return list of matching {@link OrderItemReview} entities.
* @return page of matching {@link OrderItemReview} entities.
*/
List<OrderItemReview> findAllByOrderItemIdIn(List<Long> orderItemIds);
Page<OrderItemReview> findAllByOrderItemIdIn(List<Long> orderItemIds, Pageable pageable);

/**
* Retrieves all reviews associated with the provided orderId.
* Retrieves a list of all reviews associated with the provided orderId.
* @param orderId orderId.
*/
List<OrderItemReview> findAllByOrderId(Long orderId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import com.bazaar.orders.dto.reviews.SellerReputationDTO;
import com.bazaar.orders.model.OrderReview;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
Expand All @@ -26,9 +28,9 @@ public interface OrderReviewRepository extends JpaRepository<OrderReview, Long>
/**
* Finds reviews associated with a specific seller.
* @param sellerId identifier of the seller.
* @return an {@link List} containing the matching {@link OrderReview}
* @return an {@link Page} containing the matching {@link OrderReview}
*/
List<OrderReview> findBySellerId(Long sellerId);
Page<OrderReview> findBySellerId(Long sellerId, Pageable pageable);

/**
* Gets reputation associated with a specific seller.
Expand Down
17 changes: 9 additions & 8 deletions src/main/java/com/bazaar/orders/service/ReviewsService.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@
import com.bazaar.orders.dto.reviews.CreateOrderReviewRequestDTO;
import com.bazaar.orders.dto.reviews.OrderDetailedReviewDTO;
import com.bazaar.orders.dto.reviews.OrderItemReviewDTO;
import com.bazaar.orders.dto.reviews.OrderItemReviewPageDTO;
import com.bazaar.orders.dto.reviews.OrderReviewDTO;
import com.bazaar.orders.dto.reviews.OrderReviewPageDTO;
import com.bazaar.orders.dto.reviews.SellerReputationDTO;
import com.bazaar.orders.dto.user.UserProfileResponseDTO;
import com.bazaar.orders.dto.user.UserStatusResponseDTO;
Expand All @@ -25,6 +27,7 @@
import lombok.RequiredArgsConstructor;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.context.MessageSource;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
Expand Down Expand Up @@ -224,28 +227,26 @@ public OrderItemReviewDTO getOrderItemReview(Long productId, Long orderId, Long
* @param productId identifier of the reviewed product.
* @return list of {@link OrderItemReviewDTO}.
*/
public List<OrderItemReviewDTO> getProductReviews(Long productId) {
public OrderItemReviewPageDTO getProductReviews(Long productId, Pageable pageable) {

List<OrderItem> orderItems = orderItemRepository.findByProductId(productId);

List<Long> orderItemIds = orderItems.stream().map(OrderItem::getId).toList();

return orderItemReviewRepository.findAllByOrderItemIdIn(orderItemIds).stream().map(review -> {
return OrderItemReviewPageDTO.fromPage(orderItemReviewRepository.findAllByOrderItemIdIn(orderItemIds, pageable).map(review -> {
var userProfile = getUserProfile(review.getUserId());
return OrderItemReviewDTO.fromOrderItemReview(review, userProfile);
}).toList();
}));
}

/**
* Retrieves all reviews associated with a seller.
* @param sellerId identifier of the reviewed product.
* @return list of {@link OrderReviewDTO}.
*/
public List<OrderReviewDTO> getSellerReviews(final Long sellerId) {
return orderReviewRepository.findBySellerId(sellerId)
.stream()
.map(review -> OrderReviewDTO.fromOrderReview(review, getUserProfile(review.getUserId())))
.toList();
public OrderReviewPageDTO getSellerReviews(final Long sellerId, Pageable pageable) {
return OrderReviewPageDTO.fromPage(orderReviewRepository.findBySellerId(sellerId, pageable)
.map(review -> OrderReviewDTO.fromOrderReview(review, getUserProfile(review.getUserId()))));
}

/**
Expand Down
Loading
Loading