Skip to content

Commit

Permalink
Merge pull request codesquad-members-2022#135 from Louie-03/dev-BE
Browse files Browse the repository at this point in the history
[Team-03][BE][루이&쿠킴] - 로그인 제외한 모든 API 기능 구현, 배포
  • Loading branch information
ku-kim committed Apr 28, 2022
2 parents a773a14 + 97dd386 commit e00348e
Show file tree
Hide file tree
Showing 40 changed files with 1,182 additions and 207 deletions.
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());
}

}
28 changes: 28 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,28 @@
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());
}

}
25 changes: 21 additions & 4 deletions BE/src/main/java/sidedish/com/controller/ProductsController.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package sidedish.com.controller;

import java.util.List;
import javax.validation.constraints.NotEmpty;
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 +21,24 @@ public ProductsController(ProductsService productsService) {
}

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

@GetMapping("/{id}")
public ProductDetailTypeResponse findById(@PathVariable Long id) {
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;
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(stockQuantity);
}
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);
}
stockQuantity -= count;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package sidedish.com.exception;

import java.util.Collections;
import java.util.Map;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class GlobalExceptionHandler {

@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(NotEnoughStockQuantityException.class)
public Map<String, Long> exceptionHandler(NotEnoughStockQuantityException e) {
long stockQuantity = e.getStockQuantity();
return Collections.singletonMap("currentStockQuantity", stockQuantity);
}

@ResponseStatus(value = HttpStatus.NOT_FOUND)
@ExceptionHandler(NoSuchProductsException.class)
public void exceptionHandler(NoSuchProductsException e) {
}
}

0 comments on commit e00348e

Please sign in to comment.