Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Team-03][BE][루이&쿠킴] - 로그인 제외한 모든 API 기능 구현, 배포 #135

Merged
merged 33 commits into from
Apr 28, 2022
Merged
Show file tree
Hide file tree
Changes from 30 commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
1157fca
feat: DeliveryPolicy 테이블 설계와 Dummy 데이터 추가
ku-kim Apr 25, 2022
d63a0f6
feat: DeliveryPolicy Repository 구현과 테스트
ku-kim Apr 25, 2022
5bda672
feat: Product 도메인 객체에 Delivery 객체 연결
ku-kim Apr 25, 2022
e750413
feat: 특정 id의 음식 조회 기능 구현 (Controller, Service 계층)
ku-kim Apr 25, 2022
b11552c
Merge pull request #27 from Louie-03/BE-feature-GET_api_products_id
ku-kim Apr 25, 2022
5810e2e
Refactor: ProductMealTypeResponse -> ProductBasicTypeResponse 이름 변경
ku-kim Apr 25, 2022
fbb5a66
feat: 추천 음식 조회 기능
ku-kim Apr 25, 2022
52dd9da
Merge pull request #31 from Louie-03/BE-feature-GET_api_products_reco…
Louie-03 Apr 25, 2022
9882c4a
Feat: 특정 베스트 음식 카테고리 조회 기능의 컨트롤러 구현
Louie-03 Apr 25, 2022
1541eb2
Feat: 특정 베스트 카테고리 음식 조회 기능 구현
Louie-03 Apr 25, 2022
a763171
Merge pull request #36 from Louie-03/BE-feature-GET_products_best_cat…
ku-kim Apr 25, 2022
401b9ad
Feat: 특정 음식 주문하기 기능의 컨트롤러 구현
Louie-03 Apr 25, 2022
9f62389
Build: 배포/개발 환경 분리 application 프로파일 설정
ku-kim Apr 26, 2022
b8753ad
Merge pull request #38 from Louie-03/BE-feature-GET_api_products_reco…
ku-kim Apr 26, 2022
c20b925
Feat: orders 테이블 스키마 작성
Louie-03 Apr 26, 2022
0fdbb79
Feat: Order 도메인 객체 구현
Louie-03 Apr 26, 2022
6543cb6
Feat: Product 클래스에 재고 수량 차감 로직 구현
Louie-03 Apr 26, 2022
5ff762d
Feat: OrderEntity 구현
Louie-03 Apr 26, 2022
95511a7
Style: ProductsDtoMapper의 클래스명, 메서드명 변경
Louie-03 Apr 26, 2022
825fb39
Feat: 도메인 객체에 id 필드 추가
Louie-03 Apr 26, 2022
b7fcfef
Feat: 특정 상품 주문하기 기능 구현
Louie-03 Apr 26, 2022
d5c67f6
Feat: 특정 상품 주문하기의 RequestBody 검증 구현
Louie-03 Apr 26, 2022
b67ecc9
Feat: CORS 기능 추가 (시스템 환경변수 활용하여 LOCAL_IP, AWS_IP 추가)
ku-kim Apr 26, 2022
3375244
Merge pull request #41 from Louie-03/BE-feature-CORS
Louie-03 Apr 26, 2022
921e065
Fix: Spring Data Jdbc에서 save 메서드를 통해서 update 할 때 PK를 List의 index 값으로 …
Louie-03 Apr 26, 2022
947bdca
Merge pull request #43 from Louie-03/BE-feature-POST_products_order
ku-kim Apr 26, 2022
c8826e0
Fix: 도메인 설정으로 인한 CORS 문제 해결
Louie-03 Apr 27, 2022
05b9d52
Merge pull request #53 from Louie-03/BE-feature-cors_bug_fix
Louie-03 Apr 27, 2022
dc7383d
Refactor: 도메인 객체의 불필요한 id 필드 제거
Louie-03 Apr 27, 2022
b3cb1eb
Merge pull request #55 from Louie-03/BE-feature-remove_id_field
Louie-03 Apr 27, 2022
ecac1da
Refactor: PR 리뷰 피드백 적용(오타, 사용하지 않는 코드제거(Valid), Long -> long 타입 변환)
ku-kim Apr 28, 2022
d84f4a6
Feat: 주문 실패 시 현재 재고 수량을 반환해주도록 GlobalExceptionHandler 구현
Louie-03 Apr 28, 2022
97dd386
Chore: 운영 DB 더미데이터 추가
ku-kim Apr 28, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
21 changes: 21 additions & 0 deletions BE/src/main/java/sidedish/com/config/WebConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package sidedish.com.config;

import java.util.Map;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

@Override
public void addCorsMappings(CorsRegistry registry) {
Map<String, String> envs = System.getenv();
String awsIp = "http://" + envs.get("AWS_IP");
String localIp = "http://" + envs.get("LOCAL_IP");
String dnsName = envs.get("DNS_NAME");

registry.addMapping("/**")
.allowedOrigins(localIp, awsIp, dnsName);
}
}
55 changes: 55 additions & 0 deletions BE/src/main/java/sidedish/com/controller/DomainDtoMapper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package sidedish.com.controller;

import java.util.List;
import java.util.stream.Collectors;
import org.springframework.stereotype.Component;
import sidedish.com.controller.model.OrderSaveResponse;
import sidedish.com.controller.model.ProductDetailTypeResponse;
import sidedish.com.controller.model.ProductBasicTypeResponse;
import sidedish.com.domain.Product;
import sidedish.com.repository.entity.OrderEntity;

@Component
public class DomainDtoMapper {

public List<ProductBasicTypeResponse> toProductsBasicTypeResponseFromProducts(
List<Product> products) {
return products.stream()
.map(this::toProductMealTypeResponseFromProduct)
.collect(Collectors.toList());
}

private ProductBasicTypeResponse toProductMealTypeResponseFromProduct(
Product product) {
return new ProductBasicTypeResponse(
product.getId(),
product.getImages().get(0).getImageUrl(),
product.getProductName(),
product.getDescription(),
product.getFixedPrice(),
product.getOriginalPrice(),
product.getDiscountPolicy().getPolicyName());
}

public ProductDetailTypeResponse toProductDetailTypeFromProduct(
Product product) {
return new ProductDetailTypeResponse(
product.getId(),
product.getImages(),
product.getProductName(),
product.getDescription(),
product.getFixedPrice(),
product.getOriginalPrice(),
product.getDiscountPolicy().getPolicyName(),
product.getMileage(),
product.getDeliveryPolicy().getDeliveryInfo(),
product.getDeliveryPolicy().getDeliveryCharge(),
product.getDeliveryPolicy().getFreeDeliveryOverAmount()
);
}

public OrderSaveResponse toOrderSaveResponseFromOrder(OrderEntity orderEntity) {
return new OrderSaveResponse(orderEntity.getId());
}

}
26 changes: 26 additions & 0 deletions BE/src/main/java/sidedish/com/controller/OrderController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package sidedish.com.controller;

import javax.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import sidedish.com.controller.model.OrderSaveRequest;
import sidedish.com.controller.model.OrderSaveResponse;
import sidedish.com.service.OrderService;

@RequiredArgsConstructor
@RestController
public class OrderController {

private final OrderService orderService;

@PostMapping("/api/products/{id}/order")
@ResponseStatus(HttpStatus.CREATED)
public OrderSaveResponse order(@PathVariable Long id, @RequestBody @Valid OrderSaveRequest orderSaveRequest) {
return orderService.save(id, orderSaveRequest.getCount());
}
}
24 changes: 22 additions & 2 deletions BE/src/main/java/sidedish/com/controller/ProductsController.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
package sidedish.com.controller;

import java.util.List;
import javax.validation.constraints.Negative;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import sidedish.com.controller.model.ProductMealTypeResponse;
import sidedish.com.controller.model.ProductBasicTypeResponse;
import sidedish.com.controller.model.ProductDetailTypeResponse;
import sidedish.com.service.ProductsService;

@RestController
Expand All @@ -20,8 +24,24 @@ public ProductsController(ProductsService productsService) {
}

@GetMapping
public List<ProductMealTypeResponse> findProductsMealType(
public List<ProductBasicTypeResponse> findProductsMealType(
@RequestParam @NotEmpty String meal) {
return productsService.findByMealType(meal);
}

@GetMapping("/{id}")
public ProductDetailTypeResponse findById(@PathVariable @Negative @NotNull Long id) {
guswns1659 marked this conversation as resolved.
Show resolved Hide resolved
return productsService.findById(id);
}

@GetMapping("/best")
public List<ProductBasicTypeResponse> findAllByBestCategory(
@RequestParam String category) {
return productsService.findAllByBestCategory(category);
}

@GetMapping("/recommendation")
public List<ProductBasicTypeResponse> recommend() {
return productsService.recommend();
}
}
31 changes: 0 additions & 31 deletions BE/src/main/java/sidedish/com/controller/ProductsDtoMapper.java

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package sidedish.com.controller.model;

import javax.validation.constraints.Positive;
import lombok.Getter;

@Getter
public class OrderSaveRequest {

@Positive
private Long count;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package sidedish.com.controller.model;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class OrderSaveResponse {
private Long id;

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

@Getter
@AllArgsConstructor
public class ProductMealTypeResponse {
public class ProductBasicTypeResponse {

private Long id;
private String image;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package sidedish.com.controller.model;


import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Getter;
import sidedish.com.domain.Image;

@Getter
@AllArgsConstructor
public class ProductDetailTypeResponse {

private Long id;
private List<Image> images;
private String productName;
private String description;
private long fixedPrice;
private long originalPrice;
private String event;
private Long mileage;
private String deliveryInfo;
guswns1659 marked this conversation as resolved.
Show resolved Hide resolved
private Long deliveryCharge;
private Long freeDeliveryOverAmount;

}
14 changes: 14 additions & 0 deletions BE/src/main/java/sidedish/com/domain/DeliveryPolicy.java
Original file line number Diff line number Diff line change
@@ -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;

}
4 changes: 2 additions & 2 deletions BE/src/main/java/sidedish/com/domain/DiscountPolicy.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
public class DiscountPolicy {

private String policyName;
private float discountRate;
private long discountRate;

public long calculateFixedPrice(long originalPrice) {
return (long) (originalPrice * ((100 - discountRate) / 100));
return (long) (originalPrice * ((100 - discountRate) / (double) 100));
}
}
29 changes: 29 additions & 0 deletions BE/src/main/java/sidedish/com/domain/Order.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package sidedish.com.domain;

import lombok.Getter;

@Getter
public class Order {
private final Product product;
private final long count;
private final long totalPrice;
private final long deliveryPrice;

public Order(Product product, long count) {
this.product = product;
this.count = count;
this.totalPrice = calculateTotalPrice();
this.deliveryPrice = calculateDeliveryPrice();
}

private long calculateTotalPrice() {
return count * product.getFixedPrice();
}

private long calculateDeliveryPrice() {
if (totalPrice >= product.getDeliveryPolicy().getFreeDeliveryOverAmount()) {
return 0;
}
return product.getDeliveryPolicy().getDeliveryCharge();
}
}
47 changes: 36 additions & 11 deletions BE/src/main/java/sidedish/com/domain/Product.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,34 +2,59 @@

import java.util.List;
import lombok.Getter;
import sidedish.com.exception.NotEnoughStockQuantityException;

@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 long stockQuantity;
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, long stockQuantity, String mealCategory,
String bestCategory) {
if (stockQuantity < 0) {
throw new NotEnoughStockQuantityException("재고가 충분하지 않습니다");
ku-kim marked this conversation as resolved.
Show resolved Hide resolved
}
this.id = id;
this.discountPolicy = discountPolicy;
this.deliveryPolicy = deliveryPolicy;
this.images = images;
this.productName = productName;
this.description = description;
this.originalPrice = originalPrice;
this.stockQuantity = stockQuantity;
this.mealCategory = mealCategory;
this.bestCategory = bestCategory;
this.fixedPrice = calculateFixedPrice();
this.mileage = calculateMileage();
}

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

private long calculateFixedPrice() {
return discountPolicy.calculateFixedPrice(originalPrice);
}

public void minusStockQuantity(long count) {
if (count > stockQuantity) {
throw new NotEnoughStockQuantityException("재고가 충분하지 않습니다");
}
stockQuantity -= count;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package sidedish.com.exception;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

@ResponseStatus(HttpStatus.BAD_REQUEST)
guswns1659 marked this conversation as resolved.
Show resolved Hide resolved
public class NotEnoughStockQuantityException extends RuntimeException {

public NotEnoughStockQuantityException(String message) {
super(message);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package sidedish.com.repository;

import java.util.List;
import org.springframework.data.repository.CrudRepository;
import sidedish.com.repository.entity.DeliveryPolicyEntity;

public interface DeliveryPolicyRepository extends CrudRepository<DeliveryPolicyEntity, Long> {

@Override
List<DeliveryPolicyEntity> findAll();
}