From b1f547f752f51ca06306817dadae3c480e250b6c Mon Sep 17 00:00:00 2001 From: ta2ye0n Date: Tue, 17 Dec 2024 18:24:36 +0900 Subject: [PATCH 1/6] add :: BuyProductService --- .../product/service/BuyProductService.java | 5 +++ .../service/impl/BuyProductServiceImpl.java | 39 +++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 src/main/java/com/mango/amango/domain/product/service/BuyProductService.java create mode 100644 src/main/java/com/mango/amango/domain/product/service/impl/BuyProductServiceImpl.java 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); + } + } +} From e18ee626afa5a75c1f22648e380f6d63c1655d17 Mon Sep 17 00:00:00 2001 From: ta2ye0n Date: Tue, 17 Dec 2024 18:24:53 +0900 Subject: [PATCH 2/6] add :: OrderRepository --- .../amango/domain/order/repository/OrderRepository.java | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/main/java/com/mango/amango/domain/order/repository/OrderRepository.java 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); +} From f94ac21a824e443dfc29085406d81b77b2f35c2c Mon Sep 17 00:00:00 2001 From: ta2ye0n Date: Tue, 17 Dec 2024 18:25:04 +0900 Subject: [PATCH 3/6] add :: ProductAlreadyTradedException --- .../exception/ProductAlreadyTradedException.java | 10 ++++++++++ .../mango/amango/global/exception/CustomErrorCode.java | 4 +++- 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/mango/amango/domain/product/exception/ProductAlreadyTradedException.java 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/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; From 4f28ac8a478be7f4bf0a012e9f110522c0f55bfb Mon Sep 17 00:00:00 2001 From: ta2ye0n Date: Tue, 17 Dec 2024 18:25:41 +0900 Subject: [PATCH 4/6] add :: OrderConverter --- .../amango/domain/order/util/OrderConverter.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/main/java/com/mango/amango/domain/order/util/OrderConverter.java 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(); + } +} From bbcba78e7725222f49ca9270df3040fe7a011af9 Mon Sep 17 00:00:00 2001 From: ta2ye0n Date: Tue, 17 Dec 2024 18:25:54 +0900 Subject: [PATCH 5/6] =?UTF-8?q?add=20::=20endpoint=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../product/presentation/ProductController.java | 14 +++++++++++--- .../global/security/configs/SecurityConfig.java | 1 + 2 files changed, 12 insertions(+), 3 deletions(-) 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/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() ) From 42607706182ab1e20a418ea5f5fd6e635ae77c4d Mon Sep 17 00:00:00 2001 From: ta2ye0n Date: Tue, 17 Dec 2024 18:26:04 +0900 Subject: [PATCH 6/6] =?UTF-8?q?refactor=20::=20=EA=B5=AC=EC=A1=B0=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/mango/amango/domain/order/{ => entity}/Order.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/java/com/mango/amango/domain/order/{ => entity}/Order.java (93%) 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;