Skip to content

Commit

Permalink
feat: Product 도메인 객체에 Delivery 객체 연결
Browse files Browse the repository at this point in the history
  • Loading branch information
ku-kim committed Apr 25, 2022
1 parent d63a0f6 commit 5bda672
Show file tree
Hide file tree
Showing 7 changed files with 132 additions and 42 deletions.
14 changes: 14 additions & 0 deletions BE/src/main/java/sidedish/com/domain/DeliveryPolicy.java
@@ -0,0 +1,14 @@
package sidedish.com.domain;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class DeliveryPolicy {

private String deliveryInfo;
private Long deliveryCharge;
private Long freeDeliveryOverAmount;

}
34 changes: 23 additions & 11 deletions BE/src/main/java/sidedish/com/domain/Product.java
@@ -1,32 +1,44 @@
package sidedish.com.domain;

import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
public class Product {
private Long id;
private DiscountPolicy discountPolicy;
private List<Image> images;
private String productName;
private String description;
private long fixedPrice;
private long originalPrice;
private String mealCategory;
private String bestCategory;

public static final long MILEAGE_RATE = 100L;

private final Long id;
private final DiscountPolicy discountPolicy;
private final DeliveryPolicy deliveryPolicy;
private final List<Image> images;
private final String productName;
private final String description;
private final long fixedPrice;
private final long originalPrice;
private final String mealCategory;
private final String bestCategory;
private final long mileage;

public Product(Long id, DiscountPolicy discountPolicy,
List<Image> images, String productName, String description, long originalPrice,
String mealCategory, String bestCategory) {
DeliveryPolicy deliveryPolicy, List<Image> images, String productName,
String description, long originalPrice, String mealCategory, String bestCategory) {
this.id = id;
this.discountPolicy = discountPolicy;
this.deliveryPolicy = deliveryPolicy;
this.images = images;
this.productName = productName;
this.description = description;
this.originalPrice = originalPrice;
this.mealCategory = mealCategory;
this.bestCategory = bestCategory;
this.fixedPrice = calculateFixedPrice();
this.mileage = calculateMileage();
}

private long calculateMileage() {
return fixedPrice / MILEAGE_RATE;
}

private long calculateFixedPrice() {
Expand Down
75 changes: 56 additions & 19 deletions BE/src/main/java/sidedish/com/repository/DomainEntityMapper.java
Expand Up @@ -4,48 +4,76 @@
import java.util.List;
import java.util.stream.Collectors;
import org.springframework.stereotype.Component;
import sidedish.com.domain.DeliveryPolicy;
import sidedish.com.domain.DiscountPolicy;
import sidedish.com.domain.Image;
import sidedish.com.domain.Product;
import sidedish.com.repository.entity.DeliveryPolicyEntity;
import sidedish.com.repository.entity.DiscountPolicyEntity;
import sidedish.com.repository.entity.ProductEntity;

@Component
public class DomainEntityMapper {

public List<Product> toDomainFromProductsEntity(List<ProductEntity> productEntities,
List<DiscountPolicyEntity> discountPolicies) {
List<DiscountPolicyEntity> discountPolicyEntities,
List<DeliveryPolicyEntity> deliveryPolicyEntities) {
List<Product> products = new ArrayList<>();
for (ProductEntity productEntity : productEntities) {
Long discountPolicyId = productEntity.getDiscountPolicyId();
DiscountPolicyEntity discountPolicyEntity = searchDiscountPolicyById(
discountPolicies, discountPolicyId);

Product product = toDomainFromProductEntity(productEntity, discountPolicyEntity);
products.add(product);
products.add(toDomainFromProductEntity(productEntity, discountPolicyEntities,
deliveryPolicyEntities));
}
return products;
}

private DiscountPolicyEntity searchDiscountPolicyById(
List<DiscountPolicyEntity> discountPolicies, Long discountPolicyId) {
public Product toDomainFromProductEntity(ProductEntity productEntity,
List<DiscountPolicyEntity> discountPolicyEntities,
List<DeliveryPolicyEntity> deliveryPolicyEntities) {

DiscountPolicyEntity discountPolicyEntity = searchDiscountPolicyEntity(
discountPolicyEntities, productEntity);
DeliveryPolicyEntity deliveryPolicyEntity = searchDeliveryPolicyEntity(
deliveryPolicyEntities, productEntity);

Product product = createProduct(productEntity, discountPolicyEntity, deliveryPolicyEntity);

return product;
}

private DiscountPolicyEntity searchDiscountPolicyEntity(
List<DiscountPolicyEntity> discountPolicies, ProductEntity productEntity) {
for (DiscountPolicyEntity discountPolicyEntity : discountPolicies) {
if (discountPolicyEntity.isEqualsId(discountPolicyId)) {
if (discountPolicyEntity.isEqualsId(productEntity.getDiscountPolicyId())) {
return discountPolicyEntity;
}
}
return new DiscountPolicyEntity(null, null, 0);
}

private Product toDomainFromProductEntity(ProductEntity productEntity,
DiscountPolicyEntity discountPolicyEntity) {
DiscountPolicy discountPolicy = toDomainFromDiscountPolicyEntity(discountPolicyEntity);
private DeliveryPolicyEntity searchDeliveryPolicyEntity(
List<DeliveryPolicyEntity> deliveryPolicyEntities, ProductEntity productEntity) {

for (DeliveryPolicyEntity deliveryPolicyEntity : deliveryPolicyEntities) {
if (deliveryPolicyEntity.isEqualsId(productEntity.getDeliveryPolicyId())) {
return deliveryPolicyEntity;
}
}
return null;
}

public Product createProduct(ProductEntity productEntity,
DiscountPolicyEntity discountPolicyEntity,
DeliveryPolicyEntity deliveryPolicyEntity) {

DiscountPolicy discountPolicy = toDomainFromDiscountPolicyEntity(discountPolicyEntity);
DeliveryPolicy deliveryPolicy = toDomainFromDeliveryPolicyEntity(
deliveryPolicyEntity);
List<Image> images = toDomainFromImageEntity(productEntity);

return new Product(
productEntity.getId(),
discountPolicy,
deliveryPolicy,
images,
productEntity.getProductName(),
productEntity.getDescription(),
Expand All @@ -54,16 +82,25 @@ private Product toDomainFromProductEntity(ProductEntity productEntity,
productEntity.getBestCategory());
}

private List<Image> toDomainFromImageEntity(ProductEntity productEntity) {
return productEntity.getImageEntities().stream()
.map(imageEntity -> new Image(imageEntity.getImageUrl()))
.collect(Collectors.toList());
}

private DiscountPolicy toDomainFromDiscountPolicyEntity(
DiscountPolicyEntity discountPolicyEntity) {
return new DiscountPolicy(
discountPolicyEntity.getPolicyName(),
discountPolicyEntity.getDiscountRate());
}

private DeliveryPolicy toDomainFromDeliveryPolicyEntity(
DeliveryPolicyEntity deliveryPolicyEntity) {

return new DeliveryPolicy(
deliveryPolicyEntity.getDeliveryInfo(),
deliveryPolicyEntity.getDeliveryCharge(),
deliveryPolicyEntity.getFreeDeliveryOverAmount());
}

private List<Image> toDomainFromImageEntity(ProductEntity productEntity) {
return productEntity.getImageEntities().stream()
.map(imageEntity -> new Image(imageEntity.getImageUrl()))
.collect(Collectors.toList());
}
}
Expand Up @@ -10,7 +10,7 @@
@Repository
public interface ProductsRepository extends CrudRepository<ProductEntity, Long> {

@Query("select id, discount_policy_id, product_name, description, original_price, meal_category "
@Query("select id, discount_policy_id, delivery_policy_id, product_name, description, original_price, meal_category "
+ "from PRODUCT where meal_category = :mealType")
List<ProductEntity> findByMealType(@Param("mealType") String mealType);
}
Expand Up @@ -14,20 +14,24 @@ public class ProductEntity {
@Id
private final Long id;
private final Long discountPolicyId;
@MappedCollection(idColumn = "ID", keyColumn = "ID")
private final Long deliveryPolicyId;
@MappedCollection(idColumn = "PRODUCT_ID", keyColumn = "ID")
private final List<ImageEntity> imageEntities;
private final String productName;
private final String description;
private final long originalPrice;
private final String mealCategory;
private final String bestCategory;


@PersistenceConstructor
public ProductEntity(Long id, Long discountPolicyId,
List<ImageEntity> imageEntities, String productName, String description, long originalPrice,
Long deliveryPolicyId, List<ImageEntity> imageEntities, String productName,
String description, long originalPrice,
String mealCategory, String bestCategory) {
this.id = id;
this.discountPolicyId = discountPolicyId;
this.deliveryPolicyId = deliveryPolicyId;
this.imageEntities = imageEntities;
this.productName = productName;
this.description = description;
Expand Down
22 changes: 13 additions & 9 deletions BE/src/test/java/sidedish/com/domain/ProductTest.java
Expand Up @@ -15,23 +15,25 @@ class ProductTest {
@DisplayName("Product 생성자")
class Describe_constructor {

@Nested
@DisplayName("만약 이벤트특가 Discount Policy가 주어진다면")
class Context_with_event_discount_policy {
@Nested
@DisplayName("만약 이벤트특가 Discount Policy가 주어진다면")
class Context_with_event_discount_policy {

@Test
@DisplayName("20% 할인된 Product를 생성한다.")
void It_returns_a_Product() {
@Test
@DisplayName("20% 할인된 Product를 생성한다.")
void It_returns_a_Product() {
DiscountPolicy discountPolicy = new DiscountPolicy("이벤트특가", 20);
Image image = new Image("https://louie.com/test.jpg");
DeliveryPolicy deliveryPolicy = new DeliveryPolicy("테스트", 2500L, 40000L);

Product sut = new Product(1L, discountPolicy, List.of(image), "김치찌개", "맛있어요",
Product sut = new Product(1L, discountPolicy, deliveryPolicy, List.of(image),
"김치찌개", "맛있어요",
10000, "soup", "meat");

assertThat(sut.getDiscountPolicy().getPolicyName()).isEqualTo("이벤트특가");
assertThat(sut.getFixedPrice()).isEqualTo(8000);
}
}
}

@Nested
@DisplayName("만약 런칭특가 Discount Policy가 주어진다면")
Expand All @@ -42,8 +44,10 @@ class Context_with_launching_discount_policy {
void It_returns_a_Product() {
DiscountPolicy discountPolicy = new DiscountPolicy("런칭특가", 10);
Image image = new Image("https://louie.com/test.jpg");
DeliveryPolicy deliveryPolicy = new DeliveryPolicy("테스트", 2500L, 40000L);

Product sut = new Product(1L, discountPolicy, List.of(image), "김치찌개", "맛있어요",
Product sut = new Product(1L, discountPolicy, deliveryPolicy, List.of(image),
"김치찌개", "맛있어요",
10000, "soup", "meat");

assertThat(sut.getDiscountPolicy().getPolicyName()).isEqualTo("런칭특가");
Expand Down
Expand Up @@ -82,4 +82,23 @@ void It_returns_products_type_side() {
}
}

@Nested
@DisplayName("findById 메서드")
class Describe_findById {

@Nested
@DisplayName("만약 유효한 id가 주어진다면")
class Context_with_valid_id {

@Test
@DisplayName("Product 객체를 리턴한다")
void It_returns_product() {
ProductEntity sut = productsRepository.findById(1L).get();

assertThat(sut.getId()).isEqualTo(1);
assertThat(sut.getDeliveryPolicyId()).isEqualTo(1);
}
}
}

}

0 comments on commit 5bda672

Please sign in to comment.