Skip to content

Commit

Permalink
feat : 상품 조회 시 카테고리 분류 추가
Browse files Browse the repository at this point in the history
  • Loading branch information
bongsh0112 committed Dec 14, 2023
1 parent cf4263f commit 13ec323
Show file tree
Hide file tree
Showing 7 changed files with 88 additions and 29 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import org.springframework.web.bind.annotation.RestController;
import tify.server.api.common.slice.SliceResponse;
import tify.server.api.product.model.dto.ProductFilterCondition;
import tify.server.api.product.model.vo.ProductRetrieveVo;
import tify.server.api.product.service.CrawlingUseCase;
import tify.server.api.product.service.ProductSearchUseCase;
import tify.server.api.product.service.RetrieveProductListUseCase;
Expand Down Expand Up @@ -62,7 +63,7 @@ public SliceResponse<ProductRetrieveDTO> productSearch(

@Operation(summary = "SmallCategory(FE기준 중분류) 별 상품을 조회합니다.")
@GetMapping("/products/small-category")
public List<ProductRetrieveDTO> getCategoricalProduct(
public List<ProductRetrieveVo> getCategoricalProduct(
@ParameterObject ProductFilterCondition productFilterCondition) {
return retrieveProductListUseCase.executeToSmallCategory(productFilterCondition);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package tify.server.api.product.model.vo;


import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder;
import lombok.Getter;
import tify.server.domain.domains.product.dto.ProductRetrieveDTO;
import tify.server.domain.domains.user.domain.DetailCategory;
import tify.server.domain.domains.user.domain.LargeCategory;
import tify.server.domain.domains.user.domain.SmallCategory;

@Getter
@Builder
public class ProductRetrieveVo {

@Schema(description = "상품의 pk 값입니다.")
private final Long productId;

@Schema(description = "상품의 이름입니다.")
private final String name;

@Schema(description = "상품의 브랜드입니다.")
private final String brand;

@Schema(description = "상품의 속성입니다.", example = "포근한")
private final String characteristic;

@Schema(description = "상품의 가격입니다.")
private final Long price;

@Schema(description = "상품의 옵션입니다.", example = "브라운, 옐로우")
private final String productOption;

@Schema(description = "상품의 이미지 url입니다.")
private final String imageUrl;

@Schema(description = "상품의 구매 링크입니다.")
private final String siteUrl;

@Schema(description = "상품의 대분류입니다.", implementation = LargeCategory.class)
private final LargeCategory largeCategory;

@Schema(description = "상품의 중분류입니다.", implementation = SmallCategory.class)
private final SmallCategory smallCategory;

@Schema(description = "상품의 소분류입니다.", implementation = DetailCategory.class)
private final DetailCategory detailCategory;

@Schema(description = "상품 질문의 카테고리 이름입니다.", example = "BMLIP")
private final String categoryName;

public static ProductRetrieveVo from(ProductRetrieveDTO dto) {
return ProductRetrieveVo.builder()
.productId(dto.getProduct().getId())
.name(dto.getProduct().getName())
.brand(dto.getProduct().getBrand())
.characteristic(dto.getProduct().getCharacteristic())
.price(dto.getProduct().getPrice())
.productOption(dto.getProduct().getProductOption())
.imageUrl(dto.getProduct().getImageUrl())
.siteUrl(dto.getProduct().getCrawlUrl())
.largeCategory(dto.getFavorQuestionCategory().getLargeCategory())
.smallCategory(dto.getFavorQuestionCategory().getSmallCategory())
.detailCategory(dto.getFavorQuestionCategory().getDetailCategory())
.categoryName(dto.getFavorQuestionCategory().getName())
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@
import lombok.RequiredArgsConstructor;
import org.springframework.transaction.annotation.Transactional;
import tify.server.api.product.model.dto.ProductFilterCondition;
import tify.server.api.product.model.vo.ProductRetrieveVo;
import tify.server.core.annotation.UseCase;
import tify.server.domain.domains.product.adaptor.ProductAdaptor;
import tify.server.domain.domains.product.domain.PriceFilter;
import tify.server.domain.domains.product.domain.PriceOrder;
import tify.server.domain.domains.product.domain.Product;
import tify.server.domain.domains.product.dto.ProductCategoryCondition;
import tify.server.domain.domains.product.dto.ProductRetrieveDTO;
import tify.server.domain.domains.question.adaptor.FavorQuestionAdaptor;
Expand All @@ -25,7 +25,7 @@ public class RetrieveProductListUseCase {
private final FavorQuestionAdaptor favorQuestionAdaptor;

@Transactional(readOnly = true)
public List<ProductRetrieveDTO> executeToSmallCategory(
public List<ProductRetrieveVo> executeToSmallCategory(
ProductFilterCondition productFilterCondition) {
List<Long> categoryIdList = new ArrayList<>();
productFilterCondition
Expand All @@ -37,7 +37,7 @@ public List<ProductRetrieveDTO> executeToSmallCategory(
.map(FavorQuestionCategory::getId)
.toList());
});
List<Product> results =
List<ProductRetrieveDTO> results =
productAdaptor.findAllBySmallCategoryId(
new ProductCategoryCondition(
categoryIdList,
Expand All @@ -48,6 +48,6 @@ public List<ProductRetrieveDTO> executeToSmallCategory(
&& productFilterCondition.getPriceFilter().equals(PriceFilter.DEFAULT)) {
Collections.shuffle(results); // TODO : 추천 전략을 적용하는 부분일듯
}
return results.stream().map(ProductRetrieveDTO::from).toList();
return results.stream().map(ProductRetrieveVo::from).toList();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ public Slice<ProductRetrieveDTO> searchBySmallCategoryId(
return productRepository.searchBySmallCategory(productCategoryCondition);
}

public List<Product> findAllBySmallCategoryId(
public List<ProductRetrieveDTO> findAllBySmallCategoryId(
ProductCategoryCondition productCategoryCondition) {
return productRepository.findAllBySmallCategory(productCategoryCondition);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,31 +5,14 @@
import lombok.Builder;
import lombok.Getter;
import tify.server.domain.domains.product.domain.Product;
import tify.server.domain.domains.question.domain.FavorQuestionCategory;

@Getter
@AllArgsConstructor
@Builder
public class ProductRetrieveDTO {

private Long productId;
private String name;
private String brand;
private String characteristic;
private Long price;
private String productOption;
private String imageUrl;
private String siteUrl;
private Product product;

public static ProductRetrieveDTO from(Product product) {
return ProductRetrieveDTO.builder()
.productId(product.getId())
.name(product.getName())
.brand(product.getBrand())
.characteristic(product.getCharacteristic())
.price(product.getPrice())
.productOption(product.getProductOption())
.imageUrl(product.getImageUrl())
.siteUrl(product.getCrawlUrl())
.build();
}
private FavorQuestionCategory favorQuestionCategory;
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,5 +22,6 @@ public interface ProductCustomRepository {
Slice<ProductRetrieveDTO> searchBySmallCategory(
ProductCategoryCondition productCategoryCondition);

List<Product> findAllBySmallCategory(ProductCategoryCondition productCategoryCondition);
List<ProductRetrieveDTO> findAllBySmallCategory(
ProductCategoryCondition productCategoryCondition);
}
Original file line number Diff line number Diff line change
Expand Up @@ -116,9 +116,15 @@ public Slice<ProductRetrieveDTO> searchBySmallCategory(
}

@Override
public List<Product> findAllBySmallCategory(ProductCategoryCondition productCategoryCondition) {
public List<ProductRetrieveDTO> findAllBySmallCategory(
ProductCategoryCondition productCategoryCondition) {
return queryFactory
.selectFrom(product)
.select(
Projections.constructor(
ProductRetrieveDTO.class, product, favorQuestionCategory))
.from(product)
.join(favorQuestionCategory)
.on(product.favorQuestionCategoryId.eq(favorQuestionCategory.id))
.where(
product.favorQuestionCategoryId.in(
productCategoryCondition.getCategoryIdList()),
Expand Down

0 comments on commit 13ec323

Please sign in to comment.