88import com .loopers .domain .product .ProductService ;
99import com .loopers .domain .supply .Supply ;
1010import com .loopers .domain .supply .SupplyService ;
11+ import com .loopers .support .error .CoreException ;
12+ import com .loopers .support .error .ErrorType ;
1113import lombok .RequiredArgsConstructor ;
14+ import org .apache .commons .lang3 .StringUtils ;
1215import org .springframework .data .domain .Page ;
16+ import org .springframework .data .domain .PageRequest ;
1317import org .springframework .data .domain .Pageable ;
18+ import org .springframework .data .domain .Sort ;
1419import org .springframework .stereotype .Component ;
1520import org .springframework .transaction .annotation .Transactional ;
1621
1722import java .util .List ;
1823import java .util .Map ;
1924import java .util .Set ;
25+ import java .util .stream .Collectors ;
2026
2127@ RequiredArgsConstructor
2228@ Component
@@ -28,6 +34,14 @@ public class ProductFacade {
2834
2935 @ Transactional (readOnly = true )
3036 public Page <ProductInfo > getProductList (Pageable pageable ) {
37+ String sortStr = pageable .getSort ().toString ().split (":" )[0 ];
38+ if (StringUtils .equals (sortStr , "like_desc" )) {
39+ int page = pageable .getPageNumber ();
40+ int size = pageable .getPageSize ();
41+ Sort sort = Sort .by (Sort .Direction .DESC , "likeCount" );
42+ return getProductsByLikeCount (PageRequest .of (page , size , sort ));
43+ }
44+
3145 Page <Product > products = productService .getProducts (pageable );
3246
3347 List <Long > productIds = products .map (Product ::getId ).toList ();
@@ -39,8 +53,50 @@ public Page<ProductInfo> getProductList(Pageable pageable) {
3953
4054 return products .map (product -> {
4155 ProductMetrics metrics = metricsMap .get (product .getId ());
56+ if (metrics == null ) {
57+ throw new CoreException (ErrorType .NOT_FOUND , "해당 상품의 메트릭 정보를 찾을 수 없습니다." );
58+ }
59+ Brand brand = brandMap .get (product .getBrandId ());
60+ if (brand == null ) {
61+ throw new CoreException (ErrorType .NOT_FOUND , "해당 상품의 브랜드 정보를 찾을 수 없습니다." );
62+ }
63+ Supply supply = supplyMap .get (product .getId ());
64+ if (supply == null ) {
65+ throw new CoreException (ErrorType .NOT_FOUND , "해당 상품의 재고 정보를 찾을 수 없습니다." );
66+ }
67+
68+ return new ProductInfo (
69+ product .getId (),
70+ product .getName (),
71+ brand .getName (),
72+ product .getPrice ().amount (),
73+ metrics .getLikeCount (),
74+ supply .getStock ().quantity ()
75+ );
76+ });
77+ }
78+
79+ public Page <ProductInfo > getProductsByLikeCount (Pageable pageable ) {
80+ Page <ProductMetrics > metricsPage = productMetricsService .getMetrics (pageable );
81+ List <Long > productIds = metricsPage .map (ProductMetrics ::getProductId ).toList ();
82+ Map <Long , Product > productMap = productService .getProductMapByIds (productIds );
83+ Set <Long > brandIds = productMap .values ().stream ().map (Product ::getBrandId ).collect (Collectors .toSet ());
84+ Map <Long , Brand > brandMap = brandService .getBrandMapByBrandIds (brandIds );
85+ Map <Long , Supply > supplyMap = supplyService .getSupplyMapByProductIds (productIds );
86+
87+ return metricsPage .map (metrics -> {
88+ Product product = productMap .get (metrics .getProductId ());
89+ if (product == null ) {
90+ throw new CoreException (ErrorType .NOT_FOUND , "해당 상품 정보를 찾을 수 없습니다." );
91+ }
4292 Brand brand = brandMap .get (product .getBrandId ());
93+ if (brand == null ) {
94+ throw new CoreException (ErrorType .NOT_FOUND , "해당 상품의 브랜드 정보를 찾을 수 없습니다." );
95+ }
4396 Supply supply = supplyMap .get (product .getId ());
97+ if (supply == null ) {
98+ throw new CoreException (ErrorType .NOT_FOUND , "해당 상품의 재고 정보를 찾을 수 없습니다." );
99+ }
44100
45101 return new ProductInfo (
46102 product .getId (),
0 commit comments