Skip to content

Commit

Permalink
Merge pull request #93 from f-lab-edu/feature/#92
Browse files Browse the repository at this point in the history
Store에 해당하는 식품들을 조회한다.
  • Loading branch information
koo995 authored Dec 13, 2024
2 parents 7d49deb + 92184d8 commit 9e63d89
Show file tree
Hide file tree
Showing 19 changed files with 272 additions and 20 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ public enum StatusConst {
DUPLICATED_DIARY(4005, "이미 등록된 다이어리입니다."),
VALIDATION_CHECK_FAIL(6001, "유효성 검사에 실패했습니다."),
NOT_ALLOWED_SERVING_UNIT(6002, "허용되지 않은 서빙 단위입니다."),
DUPLICATED_PRODUCT_REVIEW(4006, "이미 등록된 리뷰입니다.");
DUPLICATED_PRODUCT_REVIEW(4006, "이미 등록된 리뷰입니다."),
STORE_PRODUCT_NOT_FOUND(4007, "해당 매장에 등록된 상품이 없습니다."),;

private final int statusCode;
private final String message;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
package flab.nutridiary.product.repository;

import flab.nutridiary.product.domain.Product;
import org.springframework.data.jdbc.repository.query.Query;
import org.springframework.data.repository.CrudRepository;

import java.util.List;

public interface ProductCrudRepository extends CrudRepository<Product, Long> {
int countByProductNormalizedName(String normalizedName);

@Query("SELECT * FROM product WHERE product_id IN (:productIds)")
List<Product> findByIds(List<Long> productIds);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@

import flab.nutridiary.product.domain.Product;

import java.util.List;
import java.util.Optional;

public interface ProductRepository {
Product save(Product product);
Optional<Product> findById(Long id);
List<Product> findByIds(List<Long> ids);
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Optional;

@RequiredArgsConstructor
Expand All @@ -25,6 +26,11 @@ public Optional<Product> findById(Long id) {
return productCrudRepository.findById(id);
}

@Override
public List<Product> findByIds(List<Long> ids) {
return productCrudRepository.findByIds(ids);
}

@Override
public Boolean isExistDuplicatedProductByNormalizedName(String normalizedName) {
return productCrudRepository.countByProductNormalizedName(normalizedName) > 0;
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package flab.nutridiary.productStore;
package flab.nutridiary.productStore.domain;

import flab.nutridiary.product.domain.Product;
import flab.nutridiary.store.domain.Store;
Expand All @@ -14,8 +14,8 @@
@ToString
@Getter
@NoArgsConstructor
public class ProductStore {
@Id @Column("product_store_id")
public class StoreProduct {
@Id @Column("store_product_id")
private Long id;

private AggregateReference<Store, Long> storeId;
Expand All @@ -29,8 +29,16 @@ public class ProductStore {
private LocalDateTime updatedAt;

@Builder
public ProductStore(Long storeId, Long productId) {
public StoreProduct(Long storeId, Long productId) {
this.storeId = AggregateReference.to(storeId);
this.productId = AggregateReference.to(productId);
}

public Long getStoreId() {
return storeId.getId();
}

public Long getProductId() {
return productId.getId();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package flab.nutridiary.productStore.dto;

import flab.nutridiary.product.domain.Product;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

import java.util.List;

@Getter
@RequiredArgsConstructor
public class StoreProductResponse {
private final Long storeId;
private final List<ProductInfo> products;

public static StoreProductResponse of(Long storeId, List<Product> products) {
List<ProductInfo> productInfos = products.stream()
.map(product -> ProductInfo.of(product.getId(), product.getProductName(), product.getProductCorp()))
.toList();

return new StoreProductResponse(storeId, productInfos);
}

@Getter
public static class ProductInfo {
private final Long productId;
private final String productName;
private final String productCorp;

private ProductInfo(Long productId, String productName, String productCorp) {
this.productId = productId;
this.productName = productName;
this.productCorp = productCorp;
}

public static ProductInfo of(Long productId, String productName, String productCorp) {
return new ProductInfo(productId, productName, productCorp);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package flab.nutridiary.productStore.repository;

import flab.nutridiary.productStore.domain.StoreProduct;
import org.springframework.data.repository.CrudRepository;

import java.util.List;

public interface StoreProductCrudRepository extends CrudRepository<StoreProduct, Long> {
List<StoreProduct> findByStoreId(Long storeId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package flab.nutridiary.productStore.repository;

import flab.nutridiary.productStore.domain.StoreProduct;

import java.util.List;

public interface StoreProductRepository {
List<StoreProduct> findByStoreId(Long storeId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package flab.nutridiary.productStore.repository;

import flab.nutridiary.productStore.domain.StoreProduct;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Getter
@RequiredArgsConstructor
@Transactional
@Repository
public class StoreProductRepositoryImpl implements StoreProductRepository {
private final StoreProductCrudRepository storeProductCrudRepository;

@Override
public List<StoreProduct> findByStoreId(Long storeId) {
return storeProductCrudRepository.findByStoreId(storeId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
import flab.nutridiary.file.FileStore;
import flab.nutridiary.productDietTag.ProductDietTag;
import flab.nutridiary.productDietTag.ProductDietTagRepository;
import flab.nutridiary.productStore.ProductStore;
import flab.nutridiary.productStore.ProductStoreRepository;
import flab.nutridiary.productStore.domain.StoreProduct;
import flab.nutridiary.productStore.repository.StoreProductCrudRepository;
import flab.nutridiary.review.domain.Review;
import flab.nutridiary.review.dto.request.CreateReviewRequest;
import flab.nutridiary.review.dto.response.CreateReviewResponse;
Expand All @@ -27,7 +27,7 @@
@RequiredArgsConstructor
@Service
public class ReviewResisterService {
private final ProductStoreRepository productStoreRepository;
private final StoreProductCrudRepository productStoreRepository;
private final ProductDietTagRepository productDietTagRepository;
private final ReviewRepository reviewRepository;
private final FileStore fileStore;
Expand All @@ -46,7 +46,7 @@ public CreateReviewResponse create(Long memberId, CreateReviewRequest createRevi
}

private void saveProductStore(CreateReviewRequest request) {
productStoreRepository.save(ProductStore.builder()
productStoreRepository.save(StoreProduct.builder()
.productId(request.getProductId())
.storeId(request.getStoreId())
.build());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package flab.nutridiary.store.controller;

import flab.nutridiary.commom.dto.ApiResponse;
import flab.nutridiary.productStore.dto.StoreProductResponse;
import flab.nutridiary.store.dto.response.AllStore;
import flab.nutridiary.store.service.StoreReadService;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@Getter
@RequiredArgsConstructor
@RestController
public class StoreController {

private final StoreReadService storeReadService;

@GetMapping("/store")
public ApiResponse<AllStore> getAllStore() {
return ApiResponse.success(storeReadService.getAllStore());
}

@GetMapping("/store/{store_id}")
public ApiResponse<StoreProductResponse> getStoreProduct(@PathVariable(name = "store_id") Long storeId) {
return ApiResponse.success(storeReadService.getStoreProduct(storeId));
}
}
20 changes: 20 additions & 0 deletions src/main/java/flab/nutridiary/store/dto/StoreName.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package flab.nutridiary.store.dto;

import lombok.Getter;
import lombok.ToString;

@ToString
@Getter
public class StoreName {
private final Long id;
private final String name;

private StoreName(Long id, String name) {
this.id = id;
this.name = name;
}

public static StoreName of(Long id, String name) {
return new StoreName(id, name);
}
}
19 changes: 19 additions & 0 deletions src/main/java/flab/nutridiary/store/dto/response/AllStore.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package flab.nutridiary.store.dto.response;

import flab.nutridiary.store.dto.StoreName;
import lombok.Getter;

import java.util.List;

@Getter
public class AllStore {
private final List<StoreName> storeNames;

private AllStore(List<StoreName> storeNames) {
this.storeNames = storeNames;
}

public static AllStore of(List<StoreName> storeNames) {
return new AllStore(storeNames);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package flab.nutridiary.store.repository;

import flab.nutridiary.store.domain.Store;
import org.springframework.data.repository.CrudRepository;

import java.util.List;

public interface StoreCrudRepository extends CrudRepository<Store, Long> {
List<Store> findAll();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package flab.nutridiary.store.repository;

import flab.nutridiary.store.domain.Store;

import java.util.List;

public interface StoreRepository {
List<Store> findAll();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package flab.nutridiary.store.repository;

import flab.nutridiary.store.domain.Store;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Transactional
@Repository
@RequiredArgsConstructor
public class StoreRepositoryImpl implements StoreRepository {

private final StoreCrudRepository storeCrudRepository;

@Override
public List<Store> findAll() {
return storeCrudRepository.findAll();
}
}
47 changes: 47 additions & 0 deletions src/main/java/flab/nutridiary/store/service/StoreReadService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package flab.nutridiary.store.service;

import flab.nutridiary.commom.exception.BusinessException;
import flab.nutridiary.product.domain.Product;
import flab.nutridiary.product.repository.ProductRepository;
import flab.nutridiary.productStore.dto.StoreProductResponse;
import flab.nutridiary.productStore.repository.StoreProductRepository;
import flab.nutridiary.store.dto.StoreName;
import flab.nutridiary.store.dto.response.AllStore;
import flab.nutridiary.store.repository.StoreRepository;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

import static flab.nutridiary.commom.exception.StatusConst.STORE_PRODUCT_NOT_FOUND;

@Getter
@RequiredArgsConstructor
@Transactional
@Service
public class StoreReadService {
private final StoreRepository storeRepository;
private final StoreProductRepository storeProductRepository;
private final ProductRepository productRepository;

public AllStore getAllStore() {
return AllStore.of(storeRepository.findAll()
.stream()
.map(store -> StoreName.of(store.getId(), store.getStoreName()))
.toList());
}

public StoreProductResponse getStoreProduct(Long storeId) {
List<Long> productIds = storeProductRepository.findByStoreId(storeId)
.stream()
.map(storeProduct -> storeProduct.getProductId())
.toList();
if (productIds.isEmpty()) {
throw new BusinessException(STORE_PRODUCT_NOT_FOUND);
}
List<Product> products = productRepository.findByIds(productIds);
return StoreProductResponse.of(storeId, products);
}
}
Loading

0 comments on commit 9e63d89

Please sign in to comment.