diff --git a/src/main/java/com/mango/amango/domain/order/Order.java b/src/main/java/com/mango/amango/domain/order/entity/Order.java similarity index 93% rename from src/main/java/com/mango/amango/domain/order/Order.java rename to src/main/java/com/mango/amango/domain/order/entity/Order.java index cf08378..5b1aa32 100644 --- a/src/main/java/com/mango/amango/domain/order/Order.java +++ b/src/main/java/com/mango/amango/domain/order/entity/Order.java @@ -1,4 +1,4 @@ -package com.mango.amango.domain.order; +package com.mango.amango.domain.order.entity; import com.mango.amango.domain.product.entity.Product; import com.mango.amango.domain.user.entity.User; diff --git a/src/main/java/com/mango/amango/domain/order/repository/OrderRepository.java b/src/main/java/com/mango/amango/domain/order/repository/OrderRepository.java new file mode 100644 index 0000000..bd8d083 --- /dev/null +++ b/src/main/java/com/mango/amango/domain/order/repository/OrderRepository.java @@ -0,0 +1,8 @@ +package com.mango.amango.domain.order.repository; + +import com.mango.amango.domain.order.entity.Order; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface OrderRepository extends JpaRepository { + boolean existsByProductId(Long productId); +} diff --git a/src/main/java/com/mango/amango/domain/order/util/OrderConverter.java b/src/main/java/com/mango/amango/domain/order/util/OrderConverter.java new file mode 100644 index 0000000..2732878 --- /dev/null +++ b/src/main/java/com/mango/amango/domain/order/util/OrderConverter.java @@ -0,0 +1,15 @@ +package com.mango.amango.domain.order.util; + +import com.mango.amango.domain.order.entity.Order; +import com.mango.amango.domain.product.entity.Product; +import com.mango.amango.domain.user.entity.User; + +public abstract class OrderConverter { + + public static Order toEntity (Product product, User user) { + return Order.builder() + .product(product) + .user(user) + .build(); + } +} diff --git a/src/main/java/com/mango/amango/domain/product/exception/ProductAlreadyTradedException.java b/src/main/java/com/mango/amango/domain/product/exception/ProductAlreadyTradedException.java new file mode 100644 index 0000000..db34483 --- /dev/null +++ b/src/main/java/com/mango/amango/domain/product/exception/ProductAlreadyTradedException.java @@ -0,0 +1,10 @@ +package com.mango.amango.domain.product.exception; + +import com.mango.amango.global.exception.CustomErrorCode; +import com.mango.amango.global.exception.CustomException; + +public class ProductAlreadyTradedException extends CustomException { + public ProductAlreadyTradedException() { + super(CustomErrorCode.PRODUCT_ALREADY_TRADED); + } +} diff --git a/src/main/java/com/mango/amango/domain/product/presentation/ProductController.java b/src/main/java/com/mango/amango/domain/product/presentation/ProductController.java index 70718c7..b2628dd 100644 --- a/src/main/java/com/mango/amango/domain/product/presentation/ProductController.java +++ b/src/main/java/com/mango/amango/domain/product/presentation/ProductController.java @@ -3,6 +3,7 @@ import com.mango.amango.domain.product.presentation.dto.request.CreateProductReq; import com.mango.amango.domain.product.presentation.dto.response.GetProductRes; import com.mango.amango.domain.product.presentation.dto.response.FindAllProductRes; +import com.mango.amango.domain.product.service.BuyProductService; import com.mango.amango.domain.product.service.CreateProductService; import com.mango.amango.domain.product.service.GetProductService; import com.mango.amango.domain.product.service.FindAllProductService; @@ -22,9 +23,10 @@ @RequestMapping("/product") public class ProductController { - public final CreateProductService createProductService; - public final GetProductService getProductService; - public final FindAllProductService findAllProductService; + private final CreateProductService createProductService; + private final GetProductService getProductService; + private final FindAllProductService findAllProductService; + private final BuyProductService buyProductService; @PostMapping public ResponseEntity createProduct( @@ -40,6 +42,7 @@ public ResponseEntity getProduct(@PathVariable Long productId) { GetProductRes res = getProductService.execute(productId); return ResponseEntity.ok(res); } + @GetMapping public ResponseEntity> findAllProducts() { List res = findAllProductService.execute(); @@ -47,4 +50,9 @@ public ResponseEntity> findAllProducts() { } + @PostMapping("/{productId}") + public ResponseEntity orderProduct(@PathVariable Long productId) { + buyProductService.execute(productId); + return ResponseEntity.status(CREATED).build(); + } } diff --git a/src/main/java/com/mango/amango/domain/product/service/BuyProductService.java b/src/main/java/com/mango/amango/domain/product/service/BuyProductService.java new file mode 100644 index 0000000..59b8b42 --- /dev/null +++ b/src/main/java/com/mango/amango/domain/product/service/BuyProductService.java @@ -0,0 +1,5 @@ +package com.mango.amango.domain.product.service; + +public interface BuyProductService { + void execute(Long productId); +} diff --git a/src/main/java/com/mango/amango/domain/product/service/impl/BuyProductServiceImpl.java b/src/main/java/com/mango/amango/domain/product/service/impl/BuyProductServiceImpl.java new file mode 100644 index 0000000..92b57b0 --- /dev/null +++ b/src/main/java/com/mango/amango/domain/product/service/impl/BuyProductServiceImpl.java @@ -0,0 +1,39 @@ +package com.mango.amango.domain.product.service.impl; + +import com.mango.amango.domain.order.entity.Order; +import com.mango.amango.domain.order.repository.OrderRepository; +import com.mango.amango.domain.order.util.OrderConverter; +import com.mango.amango.domain.product.entity.Product; +import com.mango.amango.domain.product.exception.NotFoundProductException; +import com.mango.amango.domain.product.exception.ProductAlreadyTradedException; +import com.mango.amango.domain.product.repository.ProductRepository; +import com.mango.amango.domain.product.service.BuyProductService; +import com.mango.amango.domain.user.entity.User; +import com.mango.amango.domain.user.service.UserService; +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +@Transactional +public class BuyProductServiceImpl implements BuyProductService { + + private final ProductRepository productRepository; + private final UserService userService; + private final OrderRepository orderRepository; + + public void execute(Long productId) { + User user = userService.getCurrentUser(); + + Product product = productRepository.findById(productId) + .orElseThrow(NotFoundProductException::new); + + if (orderRepository.existsByProductId(product.getId())) { + throw new ProductAlreadyTradedException(); + } else { + Order order = OrderConverter.toEntity(product, user); + orderRepository.save(order); + } + } +} diff --git a/src/main/java/com/mango/amango/global/exception/CustomErrorCode.java b/src/main/java/com/mango/amango/global/exception/CustomErrorCode.java index 9526608..e5b5b64 100644 --- a/src/main/java/com/mango/amango/global/exception/CustomErrorCode.java +++ b/src/main/java/com/mango/amango/global/exception/CustomErrorCode.java @@ -17,7 +17,9 @@ public enum CustomErrorCode { FILE_PROCESSING_ERROR(HttpStatus.BAD_REQUEST, "처리 할 수 없는 파일입니다."), MAIL_DELIVERY_FAILED(HttpStatus.INTERNAL_SERVER_ERROR, "매일 전송을 실패하였습니다."), - NOT_FOUND_PRODUCT(HttpStatus.NOT_FOUND,"해당 상품을 찾을 수 없습니다.") + NOT_FOUND_PRODUCT(HttpStatus.NOT_FOUND,"해당 상품을 찾을 수 없습니다."), + + PRODUCT_ALREADY_TRADED(HttpStatus.BAD_REQUEST, "이미 거래된 상품입니다.") ; private final HttpStatus statusCode; diff --git a/src/main/java/com/mango/amango/global/security/configs/SecurityConfig.java b/src/main/java/com/mango/amango/global/security/configs/SecurityConfig.java index 93017dc..eacbe4a 100644 --- a/src/main/java/com/mango/amango/global/security/configs/SecurityConfig.java +++ b/src/main/java/com/mango/amango/global/security/configs/SecurityConfig.java @@ -36,6 +36,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti .requestMatchers(POST, "/email").permitAll() .requestMatchers(GET, "/product/**").permitAll() .requestMatchers(POST, "/product").hasAuthority(USER.getKey()) + .requestMatchers(POST, "/product/**").hasAuthority(USER.getKey()) .requestMatchers(POST, "/inquiry/**").hasAuthority(USER.getKey()) .anyRequest().authenticated() )