diff --git a/src/main/java/co/orange/ddanzi/common/error/Error.java b/src/main/java/co/orange/ddanzi/common/error/Error.java index 5aed1206..07ecbcbf 100644 --- a/src/main/java/co/orange/ddanzi/common/error/Error.java +++ b/src/main/java/co/orange/ddanzi/common/error/Error.java @@ -50,6 +50,7 @@ public enum Error { ACCOUNT_ALREADY_EXISTS(HttpStatus.CONFLICT, "The account already exists."), AUTHENTICATION_ALREADY_EXISTS(HttpStatus.CONFLICT, "The identity authentication of user already exists."), PAYMENT_CANNOT_CHANGE(HttpStatus.CONFLICT, "The payment status cannot be changed."), + ORDER_STATUS_CANNOT_CHANGE(HttpStatus.CONFLICT, "The order status cannot be changed."), // 500 INTERNAL SERVER ERROR INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "Internal Server Error"), diff --git a/src/main/java/co/orange/ddanzi/common/exception/OrderNotFoundException.java b/src/main/java/co/orange/ddanzi/common/exception/OrderNotFoundException.java new file mode 100644 index 00000000..37dbfd6e --- /dev/null +++ b/src/main/java/co/orange/ddanzi/common/exception/OrderNotFoundException.java @@ -0,0 +1,9 @@ +package co.orange.ddanzi.common.exception; + +import co.orange.ddanzi.common.error.Error; + +public class OrderNotFoundException extends ApiException { + public OrderNotFoundException() { + super(Error.ORDER_NOT_FOUND, Error.ORDER_NOT_FOUND.getMessage()); + } +} diff --git a/src/main/java/co/orange/ddanzi/controller/OrderController.java b/src/main/java/co/orange/ddanzi/controller/OrderController.java index 0c1bbd2b..5c0752d9 100644 --- a/src/main/java/co/orange/ddanzi/controller/OrderController.java +++ b/src/main/java/co/orange/ddanzi/controller/OrderController.java @@ -1,5 +1,6 @@ package co.orange.ddanzi.controller; +import co.orange.ddanzi.domain.order.enums.OrderStatus; import co.orange.ddanzi.dto.order.CreateOrderRequestDto; import co.orange.ddanzi.common.response.ApiResponse; import co.orange.ddanzi.service.OrderService; @@ -21,4 +22,19 @@ ApiResponse checkOrderProduct(@PathVariable("id") String id) { ApiResponse createOrder(@RequestBody CreateOrderRequestDto requestDto){ return orderService.createOrder(requestDto); } + + @GetMapping("/{id}") + ApiResponse getOrder(@PathVariable("id") String id){ + return orderService.getOrder(id); + } + + @PatchMapping("/{id}/buy") + ApiResponse confirmedOrderToBuy(@PathVariable("id") String id){ + return orderService.confirmedOrderToBuy(id); + } + + @PatchMapping("/{id}/sale") + ApiResponse confirmedOrderToSale(@PathVariable("id") String id){ + return orderService.confirmedOrderToSale(id); + } } diff --git a/src/main/java/co/orange/ddanzi/domain/order/Order.java b/src/main/java/co/orange/ddanzi/domain/order/Order.java index 582beff9..e2246828 100644 --- a/src/main/java/co/orange/ddanzi/domain/order/Order.java +++ b/src/main/java/co/orange/ddanzi/domain/order/Order.java @@ -59,4 +59,8 @@ public Order(String id, OrderStatus status, LocalDateTime createdAt, LocalDateTi this.selectedOptionDetail = selectedOptionDetail; } + + public void updateStatus(OrderStatus newStatus) { + this.status = newStatus; + } } diff --git a/src/main/java/co/orange/ddanzi/dto/order/UpdateOrderResponseDto.java b/src/main/java/co/orange/ddanzi/dto/order/UpdateOrderResponseDto.java new file mode 100644 index 00000000..bb706f94 --- /dev/null +++ b/src/main/java/co/orange/ddanzi/dto/order/UpdateOrderResponseDto.java @@ -0,0 +1,12 @@ +package co.orange.ddanzi.dto.order; + +import co.orange.ddanzi.domain.order.enums.OrderStatus; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class UpdateOrderResponseDto { + private String orderId; + private OrderStatus orderStatus; +} diff --git a/src/main/java/co/orange/ddanzi/repository/PaymentRepository.java b/src/main/java/co/orange/ddanzi/repository/PaymentRepository.java index 3a699f4f..40d4f07c 100644 --- a/src/main/java/co/orange/ddanzi/repository/PaymentRepository.java +++ b/src/main/java/co/orange/ddanzi/repository/PaymentRepository.java @@ -1,7 +1,13 @@ package co.orange.ddanzi.repository; import co.orange.ddanzi.domain.order.Payment; +import co.orange.ddanzi.domain.product.Item; +import co.orange.ddanzi.domain.user.User; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; public interface PaymentRepository extends JpaRepository { + @Query("SELECT p from Payment p WHERE p.buyer = :buyer and p.item = :item and p.payStatus = 'PAID'") + Payment findByBuyerAndItem(@Param("buyer") User buyer, @Param("item")Item item); } diff --git a/src/main/java/co/orange/ddanzi/service/OrderService.java b/src/main/java/co/orange/ddanzi/service/OrderService.java index 86838adf..88265ad9 100644 --- a/src/main/java/co/orange/ddanzi/service/OrderService.java +++ b/src/main/java/co/orange/ddanzi/service/OrderService.java @@ -1,11 +1,11 @@ package co.orange.ddanzi.service; import co.orange.ddanzi.common.error.Error; -import co.orange.ddanzi.common.exception.DiscountNotFoundException; -import co.orange.ddanzi.common.exception.PaymentNotFoundException; +import co.orange.ddanzi.common.exception.*; import co.orange.ddanzi.domain.order.Order; import co.orange.ddanzi.domain.order.OrderAgreement; import co.orange.ddanzi.domain.order.Payment; +import co.orange.ddanzi.domain.order.enums.OrderStatus; import co.orange.ddanzi.domain.order.enums.PayStatus; import co.orange.ddanzi.domain.order.pk.OrderAgreementId; import co.orange.ddanzi.domain.product.Discount; @@ -19,11 +19,10 @@ import co.orange.ddanzi.dto.AddressInfo; import co.orange.ddanzi.dto.order.CheckProductResponseDto; import co.orange.ddanzi.dto.order.CreateOrderRequestDto; -import co.orange.ddanzi.common.exception.ItemNotFoundException; -import co.orange.ddanzi.common.exception.ProductNotFoundException; import co.orange.ddanzi.common.response.ApiResponse; import co.orange.ddanzi.common.response.Success; import co.orange.ddanzi.dto.order.OrderResponseDto; +import co.orange.ddanzi.dto.order.UpdateOrderResponseDto; import co.orange.ddanzi.global.jwt.AuthUtils; import co.orange.ddanzi.repository.*; import jakarta.transaction.Transactional; @@ -119,6 +118,48 @@ public ApiResponse createOrder(CreateOrderRequestDto requestDto){ return ApiResponse.onSuccess(Success.CREATE_ORDER_SUCCESS, setOrderResponseDto(user, order, item, payment)); } + @Transactional + public ApiResponse getOrder(String orderId){ + User user = authUtils.getUser(); + Order order = orderRepository.findById(orderId).orElseThrow(() -> new OrderNotFoundException()); + Item item = order.getItem(); + Payment payment = paymentRepository.findByBuyerAndItem(user, item); + return ApiResponse.onSuccess(Success.GET_ORDER_DETAIL_SUCCESS, setOrderResponseDto(user, order, item, payment)); + } + + @Transactional + public ApiResponse confirmedOrderToBuy(String orderId){ + User user = authUtils.getUser(); + Order order = orderRepository.findById(orderId).orElseThrow(() -> new OrderNotFoundException()); + + if(!order.getBuyer().equals(user) || order.getStatus()!=OrderStatus.SHIPPING) + return ApiResponse.onFailure(Error.UNAUTHORIZED_USER,null); + + order.updateStatus(OrderStatus.COMPLETED); + + return ApiResponse.onSuccess(Success.GET_ORDER_DETAIL_SUCCESS, UpdateOrderResponseDto.builder() + .orderId(order.getId()) + .orderStatus(order.getStatus()) + .build()); + } + + @Transactional + public ApiResponse confirmedOrderToSale(String orderId){ + User user = authUtils.getUser(); + Order order = orderRepository.findById(orderId).orElseThrow(() -> new OrderNotFoundException()); + + if(!order.getItem().getSeller().equals(user) || order.getStatus()!=OrderStatus.ORDER_PLACE) + return ApiResponse.onFailure(Error.UNAUTHORIZED_USER,null); + + order.updateStatus(OrderStatus.SHIPPING); + + return ApiResponse.onSuccess(Success.GET_ORDER_DETAIL_SUCCESS, UpdateOrderResponseDto.builder() + .orderId(order.getId()) + .orderStatus(order.getStatus()) + .build()); + } + + private Order createOrderRecord(CreateOrderRequestDto requestDto, User user, Item item, OptionDetail optionDetail){ String orderId = createOrderId(requestDto.getItemId()); Order order = requestDto.toOrder(orderId, user, item, optionDetail); @@ -154,4 +195,5 @@ private OrderResponseDto setOrderResponseDto(User user, Order order, Item item, return responseDto; } + }