From 0eb7d62fd4a640bea859b763a93707d848c945bf Mon Sep 17 00:00:00 2001 From: Chan Jin Date: Sun, 15 Jan 2023 20:19:52 +0900 Subject: [PATCH 1/4] =?UTF-8?q?feature=20:=20=EC=8A=B9=EC=9D=B8=20?= =?UTF-8?q?=EB=B0=A9=EC=8B=9D=20=EC=A3=BC=EB=AC=B8=20=EA=B0=9C=EB=B0=9C=20?= =?UTF-8?q?(#110)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(domain) : isNeedPayment 인지 구별하는 메소드 생성 * refactor(api/cart) : 카트 반환시 결제 필요여부 반환 * feat(domain/order) : 주문 승인하기 도메인 로직 * refactor(domain/order) : 주문 관련 메서드 정리 * refactor(domain) : 도메인 부분 메서드에 주석 추가 * fix : 권한 제거 * feat : 주문 방식에 따른 환불 방법 제어 * feat : 주문 완료 , 주문 철회 도메인 이벤트 생성 * style :spotless * style: 잘못들어간 host 코드 제거 * fix : isNeedPayment createCartResponse 에 추가 * feat(order) : 주문 철회시 환불 가능 기한 적용 --- .../model/dto/response/CartItemResponse.java | 11 + .../dto/response/CreateCartResponse.java | 10 +- .../api/eventHandlers/OrderEventHandler.java | 33 +++ .../api/order/controller/OrderController.java | 14 +- .../dto/response/OrderPaymentResponse.java | 16 +- .../model/dto/response/OrderResponse.java | 5 + .../order/{ => model}/mapper/OrderMapper.java | 2 +- .../order/service/ApproveOrderUseCase.java | 25 ++ .../api/order/service/CancelOrderUseCase.java | 2 +- .../order/service/ConfirmOrderUseCase.java | 2 +- .../api/order/service/ReadOrderUseCase.java | 2 +- .../api/order/service/RefundOrderUseCase.java | 2 +- .../gosrock/common/exception/ErrorCode.java | 5 +- .../common/events/order/DoneOrderEvent.java | 19 ++ .../events/order/WithDrawOrderEvent.java | 19 ++ .../domain/domains/cart/domain/Cart.java | 23 +- .../domains/cart/domain/CartLineItem.java | 25 +- .../domains/cart/domain/CartOptionAnswer.java | 7 +- .../domain/domains/order/domain/Order.java | 251 +++++++++++------- .../domains/order/domain/OrderLineItem.java | 24 +- .../domains/order/domain/OrderMethod.java | 21 ++ .../order/domain/OrderOptionAnswer.java | 7 +- .../domains/order/domain/OrderStatus.java | 18 +- .../domains/order/domain/PaymentMethod.java | 2 - .../domains/order/domain/PgPaymentInfo.java | 59 ++++ .../exception/NotApprovalOrderException.java | 14 + .../exception/NotPaymentOrderException.java | 14 + .../NotRefundAvailableDateOrderException.java | 14 + .../order/service/CartToOrderService.java | 2 +- .../order/service/OrderApproveService.java | 25 ++ .../order/service/OrderConfirmService.java | 18 +- .../order/service/WithdrawOrderService.java | 19 +- .../ticket_item/domain/TicketItem.java | 4 + .../ticket_item/domain/TicketType.java | 5 + 34 files changed, 563 insertions(+), 156 deletions(-) create mode 100644 DuDoong-Api/src/main/java/band/gosrock/api/eventHandlers/OrderEventHandler.java rename DuDoong-Api/src/main/java/band/gosrock/api/order/{ => model}/mapper/OrderMapper.java (98%) create mode 100644 DuDoong-Api/src/main/java/band/gosrock/api/order/service/ApproveOrderUseCase.java create mode 100644 DuDoong-Domain/src/main/java/band/gosrock/domain/common/events/order/DoneOrderEvent.java create mode 100644 DuDoong-Domain/src/main/java/band/gosrock/domain/common/events/order/WithDrawOrderEvent.java create mode 100644 DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/OrderMethod.java create mode 100644 DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/PgPaymentInfo.java create mode 100644 DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/NotApprovalOrderException.java create mode 100644 DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/NotPaymentOrderException.java create mode 100644 DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/NotRefundAvailableDateOrderException.java create mode 100644 DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/service/OrderApproveService.java diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/cart/model/dto/response/CartItemResponse.java b/DuDoong-Api/src/main/java/band/gosrock/api/cart/model/dto/response/CartItemResponse.java index f261a6c5..2f92ddc8 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/cart/model/dto/response/CartItemResponse.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/cart/model/dto/response/CartItemResponse.java @@ -4,6 +4,7 @@ import band.gosrock.domain.common.vo.Money; import band.gosrock.domain.common.vo.OptionAnswerVo; import band.gosrock.domain.domains.cart.domain.CartLineItem; +import io.swagger.v3.oas.annotations.media.Schema; import java.util.List; import lombok.Builder; import lombok.Getter; @@ -13,19 +14,29 @@ public class CartItemResponse { // 일반티켓(1/3) - 4000원 + @Schema(description = "카트라인의 이름입니다.", defaultValue = "일반티켓(1/3) - 4000원") private String name; // 응답 목록 private List answers; + @Schema(description = "아이템 공급가액입니다.", defaultValue = "3000원") private Money itemPrice; + + @Schema( + description = "카트 라인의 총 가격입니다. 옵션등을 통해서 공급가액에 합산되는 형식입니다. (아이템가격 + 옵션가) * 아이템 개수", + defaultValue = "4000원") private Money cartLinePrice; + @Schema(description = "담은 상품의 개수입니다.", defaultValue = "1") + private Long packedQuantity; + public static CartItemResponse of(String name, CartLineItem cartLineItem) { return CartItemResponse.builder() .answers(cartLineItem.getOptionAnswerVos()) .name(name) .cartLinePrice(cartLineItem.getTotalCartLinePrice()) .itemPrice(cartLineItem.getItemPrice()) + .packedQuantity(cartLineItem.getQuantity()) .build(); } } diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/cart/model/dto/response/CreateCartResponse.java b/DuDoong-Api/src/main/java/band/gosrock/api/cart/model/dto/response/CreateCartResponse.java index b7eba50c..3e71ba23 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/cart/model/dto/response/CreateCartResponse.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/cart/model/dto/response/CreateCartResponse.java @@ -3,6 +3,7 @@ import band.gosrock.domain.common.vo.Money; import band.gosrock.domain.domains.cart.domain.Cart; +import io.swagger.v3.oas.annotations.media.Schema; import java.util.List; import lombok.Builder; import lombok.Getter; @@ -10,24 +11,31 @@ @Getter @Builder public class CreateCartResponse { - + @Schema(description = "장바구니명 입니다.", defaultValue = "") private final String title; // 내티켓 확인하기 private final List items; // 금액 + @Schema(description = "카트라인들의 총 결제금액을 합한 금액입니다", defaultValue = "15000원") private final Money totalPrice; + @Schema(description = "생성한 장바구니의 아이디입니다", defaultValue = "30") private final Long cartId; + @Schema(description = "전체 아이템 수량을 의미합니다", defaultValue = "3") private final Long totalQuantity; + @Schema(description = "결제가 필요한지에 대한 여부를 결정합니다. 필요한 true면 결제창 띄우시면됩니다.", defaultValue = "true") + private final Boolean isNeedPayment; + public static CreateCartResponse of(List cartItemResponses, Cart cart) { return CreateCartResponse.builder() .items(cartItemResponses) .totalPrice(cart.getTotalPrice()) .cartId(cart.getId()) .title(cart.getCartName()) + .isNeedPayment(cart.isNeedPayment()) .totalQuantity(cart.getTotalQuantity()) .build(); } diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/eventHandlers/OrderEventHandler.java b/DuDoong-Api/src/main/java/band/gosrock/api/eventHandlers/OrderEventHandler.java new file mode 100644 index 00000000..d4a0abeb --- /dev/null +++ b/DuDoong-Api/src/main/java/band/gosrock/api/eventHandlers/OrderEventHandler.java @@ -0,0 +1,33 @@ +package band.gosrock.api.eventHandlers; + + +import band.gosrock.domain.common.events.order.DoneOrderEvent; +import band.gosrock.domain.common.events.order.WithDrawOrderEvent; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; +import org.springframework.transaction.event.TransactionPhase; +import org.springframework.transaction.event.TransactionalEventListener; + +@Component +@RequiredArgsConstructor +@Slf4j +public class OrderEventHandler { + + @Async + @TransactionalEventListener( + classes = DoneOrderEvent.class, + phase = TransactionPhase.AFTER_COMMIT) + public void handleDoneOrderEvent(DoneOrderEvent doneOrderEvent) { + log.info(doneOrderEvent.getUuid() + "주문 상태 완료, 티켓 생성필요"); + } + + @Async + @TransactionalEventListener( + classes = WithDrawOrderEvent.class, + phase = TransactionPhase.AFTER_COMMIT) + public void handleRegisterUserEvent(WithDrawOrderEvent withDrawOrderEvent) { + log.info(withDrawOrderEvent.getUuid() + "주문 상태 철회 , 티켓 제거 필요"); + } +} diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/order/controller/OrderController.java b/DuDoong-Api/src/main/java/band/gosrock/api/order/controller/OrderController.java index 0451b18b..470b2e7d 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/order/controller/OrderController.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/order/controller/OrderController.java @@ -5,6 +5,7 @@ import band.gosrock.api.order.model.dto.request.CreateOrderRequest; import band.gosrock.api.order.model.dto.response.CreateOrderResponse; import band.gosrock.api.order.model.dto.response.OrderResponse; +import band.gosrock.api.order.service.ApproveOrderUseCase; import band.gosrock.api.order.service.CancelOrderUseCase; import band.gosrock.api.order.service.ConfirmOrderUseCase; import band.gosrock.api.order.service.CreateOrderUseCase; @@ -34,6 +35,7 @@ public class OrderController { private final CreateOrderUseCase createOrderUseCase; private final ConfirmOrderUseCase confirmOrderUseCase; + private final ApproveOrderUseCase approveOrderUseCase; private final CancelOrderUseCase cancelOrderUseCase; private final RefundOrderUseCase refundOrderUseCase; @@ -49,14 +51,14 @@ public PaymentsResponse createTossOrderUseCase(@PathVariable("order_uuid") Strin } // TODO : 승인 결제 방식 도입하면서 좀더 이쁘게 만들 예정 - @Operation(summary = "카드 주문을 생성합니다. 쿠폰없을때 쿠폰아이디 null 로 보내주세염!") - @PostMapping("/card") + @Operation(summary = "주문을 생성합니다. 장바구니 아이디를 주문서로 변환하는 작업을 합니다.") + @PostMapping("/") public CreateOrderResponse createOrder( @RequestBody @Valid CreateOrderRequest createOrderRequest) { return createOrderUseCase.execute(createOrderRequest); } - @Operation(summary = "결제 승인요청 . successUrl 로 돌아온 웹페이지에서 query 로 받은 응답값을 서버로 보냅니당.") + @Operation(summary = "결제 확인하기 . successUrl 로 돌아온 웹페이지에서 query 로 받은 응답값을 서버로 보냅니당.") @PostMapping("/{order_uuid}/confirm") public OrderResponse confirmOrder( @PathVariable("order_uuid") String orderUuid, @@ -64,6 +66,12 @@ public OrderResponse confirmOrder( return confirmOrderUseCase.execute(orderUuid, confirmOrderRequest); } + @Operation(summary = "주문 승인하기 . 호스트 관리자가 티켓 주문을 승인합니다. ( 어드민 이벤트쪽으로 이동예정 )") + @PostMapping("/{order_uuid}/approve") + public OrderResponse confirmOrder(@PathVariable("order_uuid") String orderUuid) { + return approveOrderUseCase.execute(orderUuid); + } + @Operation(summary = "결제 취소요청. 호스트 관리자가 결제를 취소 시킵니다.! (호스트 관리자용(관리자쪽에서 사용))") @PostMapping("/{order_uuid}/cancel") public OrderResponse cancelOrder(@PathVariable("order_uuid") String orderUuid) { diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/order/model/dto/response/OrderPaymentResponse.java b/DuDoong-Api/src/main/java/band/gosrock/api/order/model/dto/response/OrderPaymentResponse.java index 66ced285..1182dc68 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/order/model/dto/response/OrderPaymentResponse.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/order/model/dto/response/OrderPaymentResponse.java @@ -5,7 +5,6 @@ import band.gosrock.domain.domains.order.domain.Order; import band.gosrock.domain.domains.order.domain.OrderStatus; import band.gosrock.domain.domains.order.domain.PaymentInfo; -import band.gosrock.domain.domains.order.domain.PaymentMethod; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; import lombok.Getter; @@ -13,10 +12,13 @@ @Getter @Builder public class OrderPaymentResponse { - @Schema(description = "결제 수단", defaultValue = "간편결제") - private final PaymentMethod paymentMethod; + @Schema(description = "결제 수단 ( 승인 결제 , 간편 결제 , 카드 결제 등 )", defaultValue = "간편결제") + private final String paymentMethod; - @Schema(description = "공급자", defaultValue = "카카오페이") + @Schema( + description = "공급자 ( 카카오페이 , 현대카드 등 승인결제일경우 null 입니다. )", + defaultValue = "카카오페이", + nullable = true) private final String provider; @Schema(description = "공급가액 (금액)", defaultValue = "12000원") @@ -34,15 +36,15 @@ public class OrderPaymentResponse { @Schema(description = "결제 상태", defaultValue = "결제 완료") private final OrderStatus orderStatus; - @Schema(description = "영수증 주소", defaultValue = "영수증주소") + @Schema(description = "영수증 주소", defaultValue = "영수증주소", nullable = true) private final String receiptUrl; public static OrderPaymentResponse from(Order order) { PaymentInfo totalPaymentInfo = order.getTotalPaymentInfo(); return OrderPaymentResponse.builder() - .paymentMethod(order.getPaymentMethod()) - .provider(order.getPaymentProvider()) + .paymentMethod(order.getMethod()) + .provider(order.getProvider()) .discountAmount(totalPaymentInfo.getDiscountAmount()) .supplyAmount(totalPaymentInfo.getSupplyAmount()) .totalAmount(totalPaymentInfo.getPaymentAmount()) diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/order/model/dto/response/OrderResponse.java b/DuDoong-Api/src/main/java/band/gosrock/api/order/model/dto/response/OrderResponse.java index 9314ee88..b6a0e976 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/order/model/dto/response/OrderResponse.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/order/model/dto/response/OrderResponse.java @@ -3,6 +3,7 @@ import band.gosrock.domain.common.vo.RefundInfoVo; import band.gosrock.domain.domains.order.domain.Order; +import band.gosrock.domain.domains.order.domain.OrderMethod; import io.swagger.v3.oas.annotations.media.Schema; import java.util.List; import lombok.Builder; @@ -29,9 +30,13 @@ public class OrderResponse { @Schema(description = "주문 id") private final Long orderId; + @Schema(description = "주문 방식 ( 결제 방식 , 승인 방식 )") + private final OrderMethod orderMethod; + public static OrderResponse of(Order order, List tickets) { return OrderResponse.builder() .refundInfo(order.getTotalRefundInfo()) + .orderMethod(order.getOrderMethod()) .paymentInfo(OrderPaymentResponse.from(order)) .tickets(tickets) .orderUuid(order.getUuid()) diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/order/mapper/OrderMapper.java b/DuDoong-Api/src/main/java/band/gosrock/api/order/model/mapper/OrderMapper.java similarity index 98% rename from DuDoong-Api/src/main/java/band/gosrock/api/order/mapper/OrderMapper.java rename to DuDoong-Api/src/main/java/band/gosrock/api/order/model/mapper/OrderMapper.java index 3011bf09..f7a06767 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/order/mapper/OrderMapper.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/order/model/mapper/OrderMapper.java @@ -1,4 +1,4 @@ -package band.gosrock.api.order.mapper; +package band.gosrock.api.order.model.mapper; import band.gosrock.api.config.security.SecurityUtils; diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/order/service/ApproveOrderUseCase.java b/DuDoong-Api/src/main/java/band/gosrock/api/order/service/ApproveOrderUseCase.java new file mode 100644 index 00000000..7f224b44 --- /dev/null +++ b/DuDoong-Api/src/main/java/band/gosrock/api/order/service/ApproveOrderUseCase.java @@ -0,0 +1,25 @@ +package band.gosrock.api.order.service; + + +import band.gosrock.api.config.security.SecurityUtils; +import band.gosrock.api.order.model.dto.response.OrderResponse; +import band.gosrock.api.order.model.mapper.OrderMapper; +import band.gosrock.common.annotation.UseCase; +import band.gosrock.domain.domains.order.service.OrderApproveService; +import lombok.RequiredArgsConstructor; + +@UseCase +@RequiredArgsConstructor +public class ApproveOrderUseCase { + + private final OrderApproveService orderApproveService; + + private final OrderMapper orderMapper; + + public OrderResponse execute(String orderUuid) { + // TODO : 권한 체크 ( 호스트 관리자인지 ) + Long currentUserId = SecurityUtils.getCurrentUserId(); + String confirmOrderUuid = orderApproveService.execute(orderUuid, currentUserId); + return orderMapper.toOrderResponse(confirmOrderUuid); + } +} diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/order/service/CancelOrderUseCase.java b/DuDoong-Api/src/main/java/band/gosrock/api/order/service/CancelOrderUseCase.java index 8f365b88..eaa0bd77 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/order/service/CancelOrderUseCase.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/order/service/CancelOrderUseCase.java @@ -2,8 +2,8 @@ import band.gosrock.api.config.security.SecurityUtils; -import band.gosrock.api.order.mapper.OrderMapper; import band.gosrock.api.order.model.dto.response.OrderResponse; +import band.gosrock.api.order.model.mapper.OrderMapper; import band.gosrock.common.annotation.UseCase; import band.gosrock.domain.domains.order.service.WithdrawOrderService; import lombok.RequiredArgsConstructor; diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/order/service/ConfirmOrderUseCase.java b/DuDoong-Api/src/main/java/band/gosrock/api/order/service/ConfirmOrderUseCase.java index 03687ca3..5665792f 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/order/service/ConfirmOrderUseCase.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/order/service/ConfirmOrderUseCase.java @@ -2,9 +2,9 @@ import band.gosrock.api.config.security.SecurityUtils; -import band.gosrock.api.order.mapper.OrderMapper; import band.gosrock.api.order.model.dto.request.ConfirmOrderRequest; import band.gosrock.api.order.model.dto.response.OrderResponse; +import band.gosrock.api.order.model.mapper.OrderMapper; import band.gosrock.common.annotation.UseCase; import band.gosrock.domain.domains.order.service.OrderConfirmService; import band.gosrock.infrastructure.outer.api.tossPayments.dto.request.ConfirmPaymentsRequest; diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/order/service/ReadOrderUseCase.java b/DuDoong-Api/src/main/java/band/gosrock/api/order/service/ReadOrderUseCase.java index bff62800..28e5fac3 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/order/service/ReadOrderUseCase.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/order/service/ReadOrderUseCase.java @@ -1,8 +1,8 @@ package band.gosrock.api.order.service; -import band.gosrock.api.order.mapper.OrderMapper; import band.gosrock.api.order.model.dto.response.OrderResponse; +import band.gosrock.api.order.model.mapper.OrderMapper; import band.gosrock.common.annotation.UseCase; import lombok.RequiredArgsConstructor; import org.springframework.transaction.annotation.Transactional; diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/order/service/RefundOrderUseCase.java b/DuDoong-Api/src/main/java/band/gosrock/api/order/service/RefundOrderUseCase.java index 749f88f8..772da0b1 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/order/service/RefundOrderUseCase.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/order/service/RefundOrderUseCase.java @@ -2,8 +2,8 @@ import band.gosrock.api.config.security.SecurityUtils; -import band.gosrock.api.order.mapper.OrderMapper; import band.gosrock.api.order.model.dto.response.OrderResponse; +import band.gosrock.api.order.model.mapper.OrderMapper; import band.gosrock.common.annotation.UseCase; import band.gosrock.domain.domains.order.service.WithdrawOrderService; import lombok.RequiredArgsConstructor; diff --git a/DuDoong-Common/src/main/java/band/gosrock/common/exception/ErrorCode.java b/DuDoong-Common/src/main/java/band/gosrock/common/exception/ErrorCode.java index c4fc70cb..dce5bfca 100644 --- a/DuDoong-Common/src/main/java/band/gosrock/common/exception/ErrorCode.java +++ b/DuDoong-Common/src/main/java/band/gosrock/common/exception/ErrorCode.java @@ -52,7 +52,10 @@ public enum ErrorCode implements BaseErrorCode { ORDER_CANNOT_CANCEL(BAD_REQUEST, "Order-404-3", "주문을 취소할 수 없는 상태입니다."), ORDER_CANNOT_REFUND(BAD_REQUEST, "Order-404-4", "주문을 환불할 수 없는 상태입니다."), EVENT_NOT_FOUND(NOT_FOUND, "Event-404-1", "Event Not Found"), - HOST_NOT_AUTH_EVENT(FORBIDDEN, "Event-403-1", "Host Not Auth Event"); + ORDER_NOT_APPROVAL(BAD_REQUEST, "Order-400-5", "승인 주문이 아닙니다."), + ORDER_NOT_PAYMENT(BAD_REQUEST, "Order-400-6", "결제 주문이 아닙니다."), + HOST_NOT_AUTH_EVENT(FORBIDDEN, "Event-403-1", "Host Not Auth Event"), + ORDER_NOT_REFUND_DATE(BAD_REQUEST, "Order-400-7", "환불을 할 수 있는 기한을 지났습니다."); private int status; private String code; private String reason; diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/common/events/order/DoneOrderEvent.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/common/events/order/DoneOrderEvent.java new file mode 100644 index 00000000..beace50c --- /dev/null +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/common/events/order/DoneOrderEvent.java @@ -0,0 +1,19 @@ +package band.gosrock.domain.common.events.order; + + +import band.gosrock.domain.common.aop.domainEvent.DomainEvent; +import band.gosrock.domain.domains.order.domain.Order; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public class DoneOrderEvent extends DomainEvent { + + private final String uuid; + private final Order order; + + public static DoneOrderEvent of(String uuid, Order order) { + return new DoneOrderEvent(uuid, order); + } +} diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/common/events/order/WithDrawOrderEvent.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/common/events/order/WithDrawOrderEvent.java new file mode 100644 index 00000000..422383f8 --- /dev/null +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/common/events/order/WithDrawOrderEvent.java @@ -0,0 +1,19 @@ +package band.gosrock.domain.common.events.order; + + +import band.gosrock.domain.common.aop.domainEvent.DomainEvent; +import band.gosrock.domain.domains.order.domain.Order; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public class WithDrawOrderEvent extends DomainEvent { + + private final String uuid; + private final Order order; + + public static WithDrawOrderEvent of(String uuid, Order order) { + return new WithDrawOrderEvent(uuid, order); + } +} diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/cart/domain/Cart.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/cart/domain/Cart.java index 229962ba..35022929 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/cart/domain/Cart.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/cart/domain/Cart.java @@ -37,7 +37,7 @@ public class Cart extends BaseTimeEntity { @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) @JoinColumn(name = "cart_id") private List cartLineItems = new ArrayList<>(); - + /** ---------------------------- 생성 관련 메서드 ---------------------------------- */ @Builder public Cart(Long userId, List cartLineItems) { CartLineItem cartLineItem = cartLineItems.stream().findFirst().orElseThrow(); @@ -46,13 +46,26 @@ public Cart(Long userId, List cartLineItems) { this.cartLineItems.addAll(cartLineItems); } - public Money getTotalPrice() { - return cartLineItems.stream() - .map(CartLineItem::getTotalCartLinePrice) - .reduce(Money.ZERO, Money::plus); + /** ---------------------------- 커맨드 메서드 ---------------------------------- */ + + /** ---------------------------- 검증 메서드 ---------------------------------- */ + + /** ---------------------------- 조회용 메서드 ---------------------------------- */ + /** 결제가 필요한 오더인지 반환합니다. */ + public Boolean isNeedPayment() { + return this.cartLineItems.stream() + .map(CartLineItem::isNeedPayment) + .reduce(Boolean.FALSE, (Boolean::logicalOr)); } + /** 카트에 담긴 상품의 총 갯수를 가져옵니다. */ public Long getTotalQuantity() { return cartLineItems.stream().map(CartLineItem::getQuantity).reduce(0L, Long::sum); } + /** 카트에 담긴 상품의 총 가격을 가져옵니다 . (상품 + 옵션 ) * 총갯수 = 카트라인의 가격 , 카트라인의 가격의 합집합 */ + public Money getTotalPrice() { + return cartLineItems.stream() + .map(CartLineItem::getTotalCartLinePrice) + .reduce(Money.ZERO, Money::plus); + } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/cart/domain/CartLineItem.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/cart/domain/CartLineItem.java index 65a5cafa..6a67fe78 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/cart/domain/CartLineItem.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/cart/domain/CartLineItem.java @@ -46,6 +46,7 @@ public class CartLineItem extends BaseTimeEntity { @JoinColumn(name = "cart_line_id") private List cartOptionAnswers = new ArrayList<>(); + /** ---------------------------- 생성 관련 메서드 ---------------------------------- */ @Builder public CartLineItem( TicketItem ticketItem, Long quantity, List cartOptionAnswers) { @@ -54,34 +55,42 @@ public CartLineItem( this.cartOptionAnswers.addAll(cartOptionAnswers); } + /** ---------------------------- 커맨드 메서드 ---------------------------------- */ + + /** ---------------------------- 검증 메서드 ---------------------------------- */ + + /** ---------------------------- 조회용 메서드 ---------------------------------- */ + + /** 응답한 옵션들의 총 가격을 불러옵니다. */ public Money getTotalOptionsPrice() { return cartOptionAnswers.stream() .map(CartOptionAnswer::getOptionPrice) .reduce(Money.ZERO, Money::plus); } - + /** 상품의 이름을 가져옵니다. */ public String getTicketName() { return ticketItem.getName(); } - public Money getTicketPrice() { - return ticketItem.getPrice(); - } - + /** 카트라인의 총 가격을 가져옵니다. 상품 + 옵션답변의 가격 */ public Money getTotalCartLinePrice() { Money totalOptionAnswerPrice = getTotalOptionsPrice(); return ticketItem.getPrice().plus(totalOptionAnswerPrice).times(quantity); } - + /** 상품의 타입을 가져옵니다. ( 승인 방식 , 결제 방식 ) */ public TicketType getTicketType() { return ticketItem.getType(); } - + /** 옵션응답의 정보 VO를 가져옵니다. */ public List getOptionAnswerVos() { return cartOptionAnswers.stream().map(CartOptionAnswer::getOptionAnswerVo).toList(); } - + /** 상품의 가격을 가져옵니다. */ public Money getItemPrice() { return ticketItem.getPrice(); } + /** 장바구니의 담긴 상품이 결제가 필요한지. 가져옵니다. */ + public Boolean isNeedPayment() { + return ticketItem.isNeedPayment(); + } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/cart/domain/CartOptionAnswer.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/cart/domain/CartOptionAnswer.java index c38ebad9..4470a924 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/cart/domain/CartOptionAnswer.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/cart/domain/CartOptionAnswer.java @@ -34,13 +34,18 @@ public class CartOptionAnswer extends BaseTimeEntity { private Option option; private String answer; - + /** ---------------------------- 생성 관련 메서드 ---------------------------------- */ @Builder public CartOptionAnswer(Option option, String answer) { this.option = option; this.answer = answer; } + /** ---------------------------- 커맨드 메서드 ---------------------------------- */ + + /** ---------------------------- 검증 메서드 ---------------------------------- */ + + /** ---------------------------- 조회용 메서드 ---------------------------------- */ protected Money getOptionPrice() { return option.getAdditionalPrice(); } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/Order.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/Order.java index 5b482906..9afb3492 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/Order.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/Order.java @@ -2,19 +2,25 @@ import static band.gosrock.common.consts.DuDoongStatic.NO_START_NUMBER; +import band.gosrock.domain.common.aop.domainEvent.Events; +import band.gosrock.domain.common.events.order.DoneOrderEvent; +import band.gosrock.domain.common.events.order.WithDrawOrderEvent; import band.gosrock.domain.common.model.BaseTimeEntity; import band.gosrock.domain.common.vo.Money; import band.gosrock.domain.common.vo.RefundInfoVo; import band.gosrock.domain.domains.cart.domain.Cart; import band.gosrock.domain.domains.coupon.domain.IssuedCoupon; import band.gosrock.domain.domains.order.exception.InvalidOrderException; +import band.gosrock.domain.domains.order.exception.NotApprovalOrderException; import band.gosrock.domain.domains.order.exception.NotOwnerOrderException; +import band.gosrock.domain.domains.order.exception.NotPaymentOrderException; +import band.gosrock.domain.domains.order.exception.NotRefundAvailableDateOrderException; import band.gosrock.domain.domains.order.exception.OrderLineNotFountException; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.UUID; -import javax.persistence.AttributeOverride; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Embedded; @@ -57,24 +63,15 @@ public class Order extends BaseTimeEntity { @Column(nullable = false) private String orderName; - // 결제 방식 ( 토스 승인 이후 저장 ) - @Enumerated(EnumType.STRING) - private PaymentMethod paymentMethod = PaymentMethod.DEFAULT; - // 토스 결제 승인후 결제 긁힌 시간 ( 토스 승인 이후 저장 ) - private LocalDateTime approvedAt; + // 결제 대행사 정보 ( 토스 승인 이후 저장 ) + @Embedded private PgPaymentInfo pgPaymentInfo; - // 결제 공급자 정보 ex 카카오페이 ( 토스 승인 이후 저장 ) - private String paymentProvider; - - // 영수증 주소 ( 토스 승인 이후 저장 ) - private String receiptUrl; - // 승인된 거래키 ( 취소 때 사용 ) - private String paymentKey; - // 세금 ( 토스 승인 이후 저장 ) - @Embedded - @AttributeOverride(name = "amount", column = @Column(name = "vat_amount")) - private Money vat; + // 결제 완료 된시간 승인 결제등. + private LocalDateTime approvedAt; + @Enumerated(EnumType.STRING) + @Column(nullable = false) + private OrderMethod orderMethod; // 결제 정보 @Embedded private PaymentInfo totalPaymentInfo; @@ -103,38 +100,41 @@ public void createOrderNo() { this.orderNo = "R" + Long.sum(NO_START_NUMBER, this.id); } + /** ---------------------------- 생성 관련 메서드 ---------------------------------- */ @Builder public Order( Long userId, String OrderName, List orderLineItems, - OrderStatus orderStatus) { + OrderStatus orderStatus, + OrderMethod orderMethod) { this.userId = userId; this.orderName = OrderName; this.orderLineItems.addAll(orderLineItems); this.orderStatus = orderStatus; + this.orderMethod = orderMethod; } - /** - * 카드, 간편결제등 토스 요청 과정이 필요한 결제를 생성합니다. - * - * @param userId - * @param cart - * @return - */ + /** 카드, 간편결제등 토스 요청 과정이 필요한 결제를 생성합니다. */ public static Order createPaymentOrder(Long userId, Cart cart) { - return orderBaseBuilder(userId, cart).orderStatus(OrderStatus.PENDING_PAYMENT).build(); + return orderBaseBuilder(userId, cart) + .orderStatus(OrderStatus.PENDING_PAYMENT) + .orderMethod(OrderMethod.PAYMENT) + .build(); } - /** - * 승인 결제인 주문을 생성합니다. - * - * @param userId - * @param cart - * @return - */ + /** 승인 결제인 주문을 생성합니다. */ public static Order createApproveOrder(Long userId, Cart cart) { - return orderBaseBuilder(userId, cart).orderStatus(OrderStatus.PENDING_APPROVE).build(); + return orderBaseBuilder(userId, cart) + .orderStatus(OrderStatus.PENDING_APPROVE) + .orderMethod(OrderMethod.APPROVAL) + .build(); + } + + /** 주문을 생성합니다. */ + public static Order createOrder(Long userId, Cart cart) { + if (cart.isNeedPayment()) return createPaymentOrder(userId, cart); + return createApproveOrder(userId, cart); } private static OrderBuilder orderBaseBuilder(Long userId, Cart cart) { @@ -146,22 +146,7 @@ private static OrderBuilder orderBaseBuilder(Long userId, Cart cart) { .orderLineItems(orderLineItems); } - public Money getTotalSupplyPrice() { - return orderLineItems.stream() - .map(OrderLineItem::getTotalOrderLinePrice) - .reduce(Money.ZERO, Money::plus); - } - - public Money getTotalPaymentPrice() { - return getTotalSupplyPrice().minus(getTotalDiscountPrice()); - } - - public Money getTotalDiscountPrice() { - if (issuedCoupon != null) { - return issuedCoupon.getDiscountAmount(getTotalSupplyPrice()); - } - return Money.ZERO; - } + /** ---------------------------- 커맨드 메서드 ---------------------------------- */ /** totalPaymentInfo 를 업데이트 합니다. */ public void calculatePaymentInfo() { @@ -173,43 +158,115 @@ public void calculatePaymentInfo() { .build(); } - /** 오더의 결제를 승인 합니다. */ - public void confirmPaymentOrder(Money requestAmount) { + /** 결제 방식의 주문을 승인 합니다. */ + public void confirmPayment( + Money pgAmount, LocalDateTime approvedAt, PgPaymentInfo pgPaymentInfo) { + // TODO: 재고량 비교 필요? + validCanConfirmPayment(pgAmount); + validPgAndOrderAmountIsEqual(pgAmount); + orderStatus = OrderStatus.CONFIRM; + this.approvedAt = approvedAt; + this.pgPaymentInfo = pgPaymentInfo; + Events.raise(DoneOrderEvent.of(this.uuid, this)); + } - if (!getTotalPaymentPrice().equals(requestAmount)) { - throw InvalidOrderException.EXCEPTION; + /** 승인 방식의 주문을 승인합니다. */ + public void approve() { + if (isNeedPayment()) { + throw NotApprovalOrderException.EXCEPTION; } - orderStatus.validCanOrder(); + orderStatus.validCanApprove(); // TODO: 재고량 비교 필요? - orderStatus = OrderStatus.CONFIRM; + this.approvedAt = LocalDateTime.now(); + orderStatus = OrderStatus.APPROVED; + Events.raise(DoneOrderEvent.of(this.uuid, this)); + } + + /** 관리자가 주문을 취소 시킵니다 */ + public void cancel() { + orderStatus.validCanCancel(); + validCanRefundDate(); + this.orderStatus = OrderStatus.CANCELED; + Events.raise(WithDrawOrderEvent.of(this.uuid, this)); } + /** 사용자가 주문을 환불 시킵니다. */ + public void refund() { + orderStatus.validCanRefund(); + validCanRefundDate(); + this.orderStatus = OrderStatus.REFUND; + Events.raise(WithDrawOrderEvent.of(this.uuid, this)); + } + + /** ---------------------------- 검증 메서드 ---------------------------------- */ + + /** PG 사를 통한 결제 대금이 주문의 가격과 동일한지 검증합니다. */ + public void validPgAndOrderAmountIsEqual(Money pgAmount) { + if (!pgAmount.equals(getTotalPaymentPrice())) { + throw InvalidOrderException.EXCEPTION; + } + } + /** 주문에대한 주인인지 검증합니다. */ public void validOwner(Long currentUserId) { if (!userId.equals(currentUserId)) { throw NotOwnerOrderException.EXCEPTION; } } + /** 결제 방식의 주문을 승인할수있는지 확인합니다. */ + public void validCanConfirmPayment(Money requestAmount) { + if (!getTotalPaymentPrice().equals(requestAmount)) { + throw InvalidOrderException.EXCEPTION; + } + if (!isNeedPayment()) { + throw NotPaymentOrderException.EXCEPTION; + } + orderStatus.validCanPaymentConfirm(); + } + + public void validCanRefundDate() { + if (!canRefundDate()) { + throw NotRefundAvailableDateOrderException.EXCEPTION; + } + } + + /** ---------------------------- 조회용 메서드 ---------------------------------- */ + /** 결제 방식의 paymentKey를 가져옵니다. */ + public String getPaymentKey() { + if (Objects.isNull(this.pgPaymentInfo)) { + throw NotPaymentOrderException.EXCEPTION; + } + return this.pgPaymentInfo.getPaymentKey(); + } /** - * 토스 결제 승인 이후 넘어온 응답값을 바탕으로 vat 등 결제 정보를 업데이트 합니다. + * 쿠폰의 이름을 가져옵니다 * - * @param approvedAt - * @param paymentMethod - * @param vat + * @default 사용하지않음 */ - public void afterPaymentAddInfo( - LocalDateTime approvedAt, - PaymentMethod paymentMethod, - Money vat, - String provider, - String receiptUrl, - String paymentKey) { - this.approvedAt = approvedAt; - this.paymentMethod = paymentMethod; - this.vat = vat; - this.paymentProvider = provider; - this.receiptUrl = receiptUrl; - this.paymentKey = paymentKey; + public String getCouponName() { + if (issuedCoupon != null) { + return issuedCoupon.getCouponName(); + } + return "사용하지 않음"; + } + + /** 총 공급가액을 가져옵니다. */ + public Money getTotalSupplyPrice() { + return orderLineItems.stream() + .map(OrderLineItem::getTotalOrderLinePrice) + .reduce(Money.ZERO, Money::plus); + } + + /** 총 결제금액을 가져옵니다. 공급가액 - 할인가 */ + public Money getTotalPaymentPrice() { + return getTotalSupplyPrice().minus(getTotalDiscountPrice()); + } + /** 총 할인금액을 가져옵니다. */ + public Money getTotalDiscountPrice() { + if (issuedCoupon != null) { + return issuedCoupon.getDiscountAmount(getTotalSupplyPrice()); + } + return Money.ZERO; } /** @@ -226,32 +283,38 @@ public RefundInfoVo getTotalRefundInfo() { return orderLineItem.getRefundInfo(); } - /** - * 쿠폰의 이름을 가져옵니다 - * - * @default 사용하지않음 - * @return - */ - public String getCouponName() { - if (issuedCoupon != null) { - return issuedCoupon.getCouponName(); - } - return "사용하지 않음"; + /** 결제가 필요한 오더인지 반환합니다. */ + public Boolean isNeedPayment() { + return this.orderLineItems.stream() + .map(OrderLineItem::isNeedPayment) + .reduce(Boolean.FALSE, (Boolean::logicalOr)); } - public void validPgAndOrderAmountIsEqual(Money pgAmount) { - if (!pgAmount.equals(getTotalPaymentPrice())) { - throw InvalidOrderException.EXCEPTION; - } + /** 결제 수단 정보를 가져옵니다. */ + public String getMethod() { + if (this.orderMethod.equals(OrderMethod.APPROVAL)) return OrderMethod.APPROVAL.getKr(); + return this.pgPaymentInfo.getPaymentMethod().getKr(); } - public void cancel() { - orderStatus.validCanCancel(); - this.orderStatus = OrderStatus.CANCELED; + /** 결제 공급자 정보를 가져옵니다. */ + public String getProvider() { + if (this.orderMethod.equals(OrderMethod.APPROVAL)) return null; + return this.pgPaymentInfo.getPaymentProvider(); } - public void refund() { - orderStatus.validCanRefund(); - this.orderStatus = OrderStatus.REFUND; + /** 결제 공급자 정보를 가져옵니다. */ + public String getReceiptUrl() { + if (this.orderMethod.equals(OrderMethod.APPROVAL)) return null; + return this.pgPaymentInfo.getReceiptUrl(); + } + + public Boolean isMethodPayment() { + return orderMethod.isPayment(); + } + + public Boolean canRefundDate() { + return this.orderLineItems.stream() + .map(OrderLineItem::canRefund) + .reduce(Boolean.TRUE, (Boolean::logicalAnd)); } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/OrderLineItem.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/OrderLineItem.java index 5583abaf..e88ba7a1 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/OrderLineItem.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/OrderLineItem.java @@ -47,7 +47,7 @@ public class OrderLineItem extends BaseTimeEntity { @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) @JoinColumn(name = "order_line_item_id") private List orderOptionAnswer = new ArrayList<>(); - + /** ---------------------------- 생성 관련 메서드 ---------------------------------- */ @Builder public OrderLineItem( TicketItem ticketItem, Long quantity, List orderOptionAnswer) { @@ -68,25 +68,41 @@ public static OrderLineItem from(CartLineItem cartLineItem) { .build(); } + /** ---------------------------- 커맨드 메서드 ---------------------------------- */ + + /** ---------------------------- 검증 메서드 ---------------------------------- */ + + /** ---------------------------- 조회용 메서드 ---------------------------------- */ + + /** 응답한 옵션들의 총 가격을 불러옵니다. */ protected Money getTotalOptionAnswersPrice() { return orderOptionAnswer.stream() .map(OrderOptionAnswer::getOptionPrice) .reduce(Money.ZERO, Money::plus); } + /** 카트라인의 총 가격을 가져옵니다. 상품 + 옵션답변의 가격 */ public Money getTotalOrderLinePrice() { return getItemPrice().plus(getTotalOptionAnswersPrice()).times(quantity); } - + /** 상품의 가격을 가져옵니다. */ public Money getItemPrice() { return ticketItem.getPrice(); } - + /** 환불 가능 정보를 불러옵니다. */ public RefundInfoVo getRefundInfo() { return ticketItem.getRefundInfoVo(); } - + /** 옵션응답의 정보 VO를 가져옵니다. */ public List getOptionAnswerVos() { return orderOptionAnswer.stream().map(OrderOptionAnswer::getOptionAnswerVo).toList(); } + /** 결제가 필요한 오더라인인지 가져옵니다. */ + public Boolean isNeedPayment() { + return ticketItem.isNeedPayment(); + } + + public Boolean canRefund() { + return this.getRefundInfo().getAvailAble(); + } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/OrderMethod.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/OrderMethod.java new file mode 100644 index 00000000..adac0546 --- /dev/null +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/OrderMethod.java @@ -0,0 +1,21 @@ +package band.gosrock.domain.domains.order.domain; + + +import com.fasterxml.jackson.annotation.JsonValue; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum OrderMethod { + APPROVAL("APPROVAL", "승인 방식"), + PAYMENT("PAYMENT", "결제 방식"); + + private String value; + + @JsonValue private String kr; + + public Boolean isPayment() { + return this.equals(OrderMethod.PAYMENT); + } +} diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/OrderOptionAnswer.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/OrderOptionAnswer.java index d3e1fbbb..6e57d1ce 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/OrderOptionAnswer.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/OrderOptionAnswer.java @@ -36,7 +36,7 @@ public class OrderOptionAnswer extends BaseTimeEntity { private Option option; private String answer; - + /** ---------------------------- 생성 관련 메서드 ---------------------------------- */ @Builder public OrderOptionAnswer(Option option, String answer) { this.option = option; @@ -50,6 +50,11 @@ public static OrderOptionAnswer from(CartOptionAnswer cartOptionAnswer) { .build(); } + /** ---------------------------- 커맨드 메서드 ---------------------------------- */ + + /** ---------------------------- 검증 메서드 ---------------------------------- */ + + /** ---------------------------- 조회용 메서드 ---------------------------------- */ protected Money getOptionPrice() { return option.getAdditionalPrice(); } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/OrderStatus.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/OrderStatus.java index 1ec02ff3..14d57cb0 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/OrderStatus.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/OrderStatus.java @@ -21,6 +21,8 @@ public enum OrderStatus { OUTDATED("OUTDATED", "결제 시간 만료"), // 결제 승인 CONFIRM("CONFIRM", "결제 완료"), + + APPROVED("APPROVED", "승인 완료"), // 사용자가 환불 REFUND("REFUND", "환불 완료"), @@ -32,21 +34,31 @@ public enum OrderStatus { @JsonValue private String kr; + private boolean checkCanWithDraw() { + return this.equals(OrderStatus.CONFIRM) || this.equals(OrderStatus.APPROVED); + } + public void validCanCancel() { - if (!this.equals(OrderStatus.CONFIRM)) { + if (!checkCanWithDraw()) { throw CanNotCancelOrderException.EXCEPTION; } } public void validCanRefund() { - if (!this.equals(OrderStatus.CONFIRM)) { + if (!checkCanWithDraw()) { throw CanNotRefundOrderException.EXCEPTION; } } - public void validCanOrder() { + public void validCanPaymentConfirm() { if (!this.equals(OrderStatus.PENDING_PAYMENT)) { throw NotPendingOrderException.EXCEPTION; } } + + public void validCanApprove() { + if (!this.equals(OrderStatus.PENDING_APPROVE)) { + throw NotPendingOrderException.EXCEPTION; + } + } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/PaymentMethod.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/PaymentMethod.java index a8ae6bbf..b1018e46 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/PaymentMethod.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/PaymentMethod.java @@ -14,8 +14,6 @@ public enum PaymentMethod { EASYPAY("EASYPAY", "간편 결제"), // 카드결제 CARD("CARD", "카드 결제"), - // 승인결제 - APPROVAL("APPROVAL", "승인 결제"), // 결제방식 미지정상태 DEFAULT("DEFAULT", "결제 방식 미지정"); private String value; diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/PgPaymentInfo.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/PgPaymentInfo.java new file mode 100644 index 00000000..b5e08896 --- /dev/null +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/PgPaymentInfo.java @@ -0,0 +1,59 @@ +package band.gosrock.domain.domains.order.domain; + + +import band.gosrock.domain.common.vo.Money; +import band.gosrock.infrastructure.outer.api.tossPayments.dto.response.PaymentsResponse; +import javax.persistence.AttributeOverride; +import javax.persistence.Column; +import javax.persistence.Embeddable; +import javax.persistence.Embedded; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Embeddable +@NoArgsConstructor +@Getter +public class PgPaymentInfo { + @Enumerated(EnumType.STRING) + private PaymentMethod paymentMethod = PaymentMethod.DEFAULT; + + // 결제 공급자 정보 ex 카카오페이 ( 토스 승인 이후 저장 ) + private String paymentProvider; + + // 영수증 주소 ( 토스 승인 이후 저장 ) + private String receiptUrl; + // 승인된 거래키 ( 취소 때 사용 ) + private String paymentKey; + // 세금 ( 토스 승인 이후 저장 ) + @Embedded + @AttributeOverride(name = "amount", column = @Column(name = "vat_amount")) + private Money vat; + + @Builder + public PgPaymentInfo( + PaymentMethod paymentMethod, + String paymentProvider, + String receiptUrl, + String paymentKey, + Money vat) { + this.paymentMethod = paymentMethod; + this.paymentProvider = paymentProvider; + this.receiptUrl = receiptUrl; + this.paymentKey = paymentKey; + this.vat = vat; + } + + // PaymentsResponse infra layer + public static PgPaymentInfo from(PaymentsResponse paymentsResponse) { + return PgPaymentInfo.builder() + .paymentKey(paymentsResponse.getPaymentKey()) + .paymentMethod(PaymentMethod.from(paymentsResponse.getMethod())) + .paymentProvider(paymentsResponse.getProviderName()) + .receiptUrl(paymentsResponse.getReceipt().getUrl()) + .vat(Money.wons(paymentsResponse.getVat())) + .build(); + } +} diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/NotApprovalOrderException.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/NotApprovalOrderException.java new file mode 100644 index 00000000..288a4bc2 --- /dev/null +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/NotApprovalOrderException.java @@ -0,0 +1,14 @@ +package band.gosrock.domain.domains.order.exception; + + +import band.gosrock.common.exception.DuDoongCodeException; +import band.gosrock.common.exception.ErrorCode; + +public class NotApprovalOrderException extends DuDoongCodeException { + + public static final DuDoongCodeException EXCEPTION = new NotApprovalOrderException(); + + private NotApprovalOrderException() { + super(ErrorCode.ORDER_NOT_APPROVAL); + } +} diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/NotPaymentOrderException.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/NotPaymentOrderException.java new file mode 100644 index 00000000..98c2c8c7 --- /dev/null +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/NotPaymentOrderException.java @@ -0,0 +1,14 @@ +package band.gosrock.domain.domains.order.exception; + + +import band.gosrock.common.exception.DuDoongCodeException; +import band.gosrock.common.exception.ErrorCode; + +public class NotPaymentOrderException extends DuDoongCodeException { + + public static final DuDoongCodeException EXCEPTION = new NotPaymentOrderException(); + + private NotPaymentOrderException() { + super(ErrorCode.ORDER_NOT_PAYMENT); + } +} diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/NotRefundAvailableDateOrderException.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/NotRefundAvailableDateOrderException.java new file mode 100644 index 00000000..1ae7dd2f --- /dev/null +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/NotRefundAvailableDateOrderException.java @@ -0,0 +1,14 @@ +package band.gosrock.domain.domains.order.exception; + + +import band.gosrock.common.exception.DuDoongCodeException; +import band.gosrock.common.exception.ErrorCode; + +public class NotRefundAvailableDateOrderException extends DuDoongCodeException { + + public static final DuDoongCodeException EXCEPTION = new NotRefundAvailableDateOrderException(); + + private NotRefundAvailableDateOrderException() { + super(ErrorCode.ORDER_NOT_REFUND_DATE); + } +} diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/service/CartToOrderService.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/service/CartToOrderService.java index 13fef72d..4c19de27 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/service/CartToOrderService.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/service/CartToOrderService.java @@ -21,7 +21,7 @@ public class CartToOrderService { @Transactional public Order creatOrderWithOutCoupon(Long cartId, Long userId) { Cart cart = cartAdaptor.queryCart(cartId, userId); - Order order = Order.createPaymentOrder(userId, cart); + Order order = Order.createOrder(userId, cart); order.calculatePaymentInfo(); return orderAdaptor.save(order); } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/service/OrderApproveService.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/service/OrderApproveService.java new file mode 100644 index 00000000..7b304823 --- /dev/null +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/service/OrderApproveService.java @@ -0,0 +1,25 @@ +package band.gosrock.domain.domains.order.service; + + +import band.gosrock.common.annotation.DomainService; +import band.gosrock.domain.common.aop.redissonLock.RedissonLock; +import band.gosrock.domain.domains.order.adaptor.OrderAdaptor; +import band.gosrock.domain.domains.order.domain.Order; +import lombok.RequiredArgsConstructor; +import org.springframework.transaction.annotation.Transactional; + +@DomainService +@Transactional(readOnly = true) +@RequiredArgsConstructor +public class OrderApproveService { + + private final OrderAdaptor orderAdaptor; + + @RedissonLock(LockName = "주문승인", identifier = "orderUuid") + public String execute(String orderUuid, Long userId) { + Order order = orderAdaptor.findByOrderUuid(orderUuid); + // TODO : 승인 주문 관리자 할당. + order.approve(); + return orderUuid; + } +} diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/service/OrderConfirmService.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/service/OrderConfirmService.java index 2c3013d4..00b6f551 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/service/OrderConfirmService.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/service/OrderConfirmService.java @@ -6,7 +6,7 @@ import band.gosrock.domain.common.vo.Money; import band.gosrock.domain.domains.order.adaptor.OrderAdaptor; import band.gosrock.domain.domains.order.domain.Order; -import band.gosrock.domain.domains.order.domain.PaymentMethod; +import band.gosrock.domain.domains.order.domain.PgPaymentInfo; import band.gosrock.infrastructure.outer.api.tossPayments.client.PaymentsConfirmClient; import band.gosrock.infrastructure.outer.api.tossPayments.dto.request.ConfirmPaymentsRequest; import band.gosrock.infrastructure.outer.api.tossPayments.dto.response.PaymentsResponse; @@ -29,23 +29,19 @@ public class OrderConfirmService { paramClassType = ConfirmPaymentsRequest.class) public String execute(ConfirmPaymentsRequest confirmPaymentsRequest, Long currentUserId) { Order order = orderAdaptor.findByOrderUuid(confirmPaymentsRequest.getOrderId()); - + Money paymentWons = Money.wons(confirmPaymentsRequest.getAmount()); order.validOwner(currentUserId); - order.confirmPaymentOrder(Money.wons(confirmPaymentsRequest.getAmount())); + order.validCanConfirmPayment(paymentWons); // 결제 승인요청 PaymentsResponse paymentsResponse = paymentsConfirmClient.execute(confirmPaymentsRequest); // TODO : 요청 보내고 난뒤에 도메인 로직 내부에서 실패하면 결제 강제 취소 로직 AOP로 개발 예정 try { - // 실제 거래된 금액이 다를때 - order.validPgAndOrderAmountIsEqual(Money.wons(paymentsResponse.getTotalAmount())); + Money pgAmount = Money.wons(paymentsResponse.getTotalAmount()); // 결제 후처리 정보 업데이트 - order.afterPaymentAddInfo( + order.confirmPayment( + pgAmount, paymentsResponse.getApprovedAt().toLocalDateTime(), - PaymentMethod.from(paymentsResponse.getMethod()), - Money.wons(paymentsResponse.getVat()), - paymentsResponse.getProviderName(), - paymentsResponse.getReceipt().getUrl(), - paymentsResponse.getPaymentKey()); + PgPaymentInfo.from(paymentsResponse)); return order.getUuid(); } catch (Exception exception) { // 내부오류시 결제 강제 취소 diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/service/WithdrawOrderService.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/service/WithdrawOrderService.java index 207a2f9a..75ad001b 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/service/WithdrawOrderService.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/service/WithdrawOrderService.java @@ -25,10 +25,11 @@ public String cancelOrder(String orderUuid, Long userId) { // TODO : 관리자 권환으로 치환. order.validOwner(userId); order.cancel(); - PaymentsResponse paymentsResponse = - withdrawPaymentService.execute( - order.getUuid(), order.getPaymentKey(), "이벤트 관리자에 의한 취소"); - + if (order.isMethodPayment()) { + PaymentsResponse paymentsResponse = + withdrawPaymentService.execute( + order.getUuid(), order.getPaymentKey(), "이벤트 관리자에 의한 취소"); + } return orderUuid; } @@ -37,11 +38,11 @@ public String refundOrder(String orderUuid, Long userId) { Order order = orderAdaptor.findByOrderUuid(orderUuid); order.validOwner(userId); order.refund(); - - PaymentsResponse paymentsResponse = - withdrawPaymentService.execute( - order.getUuid(), order.getPaymentKey(), "구매자에의한 환불 요청"); - + if (order.isMethodPayment()) { + PaymentsResponse paymentsResponse = + withdrawPaymentService.execute( + order.getUuid(), order.getPaymentKey(), "구매자에의한 환불 요청"); + } return orderUuid; } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/domain/TicketItem.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/domain/TicketItem.java index a78b7a57..eefb88f4 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/domain/TicketItem.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/domain/TicketItem.java @@ -92,4 +92,8 @@ public TicketItem( public RefundInfoVo getRefundInfoVo() { return event.getRefundInfoVo(); } + + public Boolean isNeedPayment() { + return this.type.isNeedPayment(); + } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/domain/TicketType.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/domain/TicketType.java index 0656880a..2d766337 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/domain/TicketType.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/domain/TicketType.java @@ -12,4 +12,9 @@ public enum TicketType { // 승인 APPROVAL("APPROVAL"); private String value; + + /** 결제가 필요한지 상태를 반환하는 메서드 */ + public Boolean isNeedPayment() { + return this.equals(TicketType.FIRST_COME_FIRST_SERVED); + } } From 4fd655d6188cf36a1d0a83546302f812e80473a4 Mon Sep 17 00:00:00 2001 From: Chan Jin Date: Sun, 15 Jan 2023 20:25:56 +0900 Subject: [PATCH 2/4] =?UTF-8?q?feature=20:=20=EC=8A=A4=EC=9B=A8=EA=B1=B0?= =?UTF-8?q?=20=EC=97=90=EB=9F=AC=EC=BD=94=EB=93=9C=20=EB=8F=99=EC=A0=81=20?= =?UTF-8?q?=EB=AC=B8=EC=84=9C=ED=99=94=20(#127)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor(domain/order) : order exception errorcode 분리 * style : errorcode file name to GlobalErrorCode * feat : errorcode 어노테이션 추가 * feat : explainError errorcode 지원 * feat(api) : 도메인 별 에러코드 예시 추가 * style: errorcode domain-status-num -> domain_status_num 으로 컨벤션 맞추기 * style :spotless apply --- .../gosrock/api/config/ExampleHolder.java | 4 +- .../gosrock/api/config/SwaggerConfig.java | 93 +++++++++++++++---- .../response/GlobalExceptionHandler.java | 14 ++- .../config/security/AccessDeniedFilter.java | 8 +- .../config/security/JwtExceptionFilter.java | 4 +- .../example/controller/ExampleController.java | 61 +++++++++++- .../example/docs/ExampleException2Docs.java | 3 +- .../example/docs/ExampleExceptionDocs.java | 3 +- ...rExample.java => ApiErrorCodeExample.java} | 5 +- .../annotation/ApiErrorExceptionsExample.java | 14 +++ .../band/gosrock/common/dto/ErrorReason.java | 2 +- .../exception/BadFileExtensionException.java | 2 +- .../exception/BadLockIdentifierException.java | 2 +- .../common/exception/BaseErrorCode.java | 2 + .../exception/DuDoongCodeException.java | 7 +- .../gosrock/common/exception/ErrorCode.java | 67 ------------- .../exception/ExpiredTokenException.java | 2 +- .../common/exception/GlobalErrorCode.java | 75 +++++++++++++++ .../exception/InvalidTokenException.java | 2 +- .../NotAvailableRedissonLockException.java | 2 +- .../OtherServerBadRequestException.java | 2 +- .../OtherServerExpiredTokenException.java | 2 +- .../OtherServerForbiddenException.java | 2 +- .../OtherServerUnauthorizedException.java | 2 +- .../RefreshTokenExpiredException.java | 2 +- .../SecurityContextNotFoundException.java | 2 +- .../interfaces/SwaggerExampleExceptions.java | 7 ++ .../cart/exception/CartNotFoundException.java | 4 +- .../exception/EventNotFoundException.java | 4 +- .../exception/HostNotAuthEventException.java | 4 +- .../IssuedTicketNotFoundException.java | 4 +- .../IssuedTicketUserNotMatchedException.java | 4 +- .../exception/CanNotCancelOrderException.java | 3 +- .../exception/CanNotRefundOrderException.java | 3 +- .../exception/InvalidOrderException.java | 3 +- .../exception/NotApprovalOrderException.java | 3 +- .../exception/NotOwnerOrderException.java | 3 +- .../exception/NotPaymentOrderException.java | 3 +- .../exception/NotPendingOrderException.java | 3 +- .../NotRefundAvailableDateOrderException.java | 3 +- .../NotSupportedOrderMethodException.java | 3 +- .../order/exception/OrderErrorCode.java | 52 +++++++++++ .../exception/OrderLineNotFountException.java | 3 +- .../exception/OrderNotFoundException.java | 3 +- .../AlreadyDeletedUserException.java | 3 +- .../exception/AlreadySignUpUserException.java | 3 +- .../exception/ForbiddenUserException.java | 3 +- .../domains/user/exception/UserErrorCode.java | 42 +++++++++ .../user/exception/UserNotFoundException.java | 3 +- .../exception/PaymentsCancelErrorCode.java | 12 ++- .../exception/PaymentsConfirmErrorCode.java | 12 ++- .../exception/PaymentsCreateErrorCode.java | 12 ++- .../PaymentsEnumNotMatchException.java | 4 +- .../exception/PaymentsUnHandleException.java | 4 +- .../exception/TransactionGetErrorCode.java | 12 ++- 55 files changed, 439 insertions(+), 167 deletions(-) rename DuDoong-Common/src/main/java/band/gosrock/common/annotation/{ApiErrorExample.java => ApiErrorCodeExample.java} (66%) create mode 100644 DuDoong-Common/src/main/java/band/gosrock/common/annotation/ApiErrorExceptionsExample.java delete mode 100644 DuDoong-Common/src/main/java/band/gosrock/common/exception/ErrorCode.java create mode 100644 DuDoong-Common/src/main/java/band/gosrock/common/exception/GlobalErrorCode.java create mode 100644 DuDoong-Common/src/main/java/band/gosrock/common/interfaces/SwaggerExampleExceptions.java create mode 100644 DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/OrderErrorCode.java create mode 100644 DuDoong-Domain/src/main/java/band/gosrock/domain/domains/user/exception/UserErrorCode.java diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/config/ExampleHolder.java b/DuDoong-Api/src/main/java/band/gosrock/api/config/ExampleHolder.java index b7d73dc4..5ef61b2f 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/config/ExampleHolder.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/config/ExampleHolder.java @@ -2,11 +2,11 @@ import io.swagger.v3.oas.models.examples.Example; -import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; @Getter -@AllArgsConstructor +@Builder public class ExampleHolder { private Example holder; private String name; diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/config/SwaggerConfig.java b/DuDoong-Api/src/main/java/band/gosrock/api/config/SwaggerConfig.java index 270490fb..c9af42c6 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/config/SwaggerConfig.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/config/SwaggerConfig.java @@ -2,11 +2,13 @@ import static java.util.stream.Collectors.groupingBy; -import band.gosrock.common.annotation.ApiErrorExample; +import band.gosrock.common.annotation.ApiErrorCodeExample; +import band.gosrock.common.annotation.ApiErrorExceptionsExample; import band.gosrock.common.annotation.DisableSwaggerSecurity; import band.gosrock.common.annotation.ExplainError; import band.gosrock.common.dto.ErrorReason; import band.gosrock.common.dto.ErrorResponse; +import band.gosrock.common.exception.BaseErrorCode; import band.gosrock.common.exception.DuDoongCodeException; import com.fasterxml.jackson.databind.ObjectMapper; import io.swagger.v3.core.jackson.ModelResolver; @@ -86,8 +88,11 @@ public OperationCustomizer customize() { return (Operation operation, HandlerMethod handlerMethod) -> { DisableSwaggerSecurity methodAnnotation = handlerMethod.getMethodAnnotation(DisableSwaggerSecurity.class); - ApiErrorExample apiErrorExample = - handlerMethod.getMethodAnnotation(ApiErrorExample.class); + ApiErrorExceptionsExample apiErrorExceptionsExample = + handlerMethod.getMethodAnnotation(ApiErrorExceptionsExample.class); + ApiErrorCodeExample apiErrorCodeExample = + handlerMethod.getMethodAnnotation(ApiErrorCodeExample.class); + List tags = getTags(handlerMethod); // DisableSecurity 어노테이션있을시 스웨거 시큐리티 설정 삭제 if (methodAnnotation != null) { @@ -97,22 +102,62 @@ public OperationCustomizer customize() { if (!tags.isEmpty()) { operation.setTags(Collections.singletonList(tags.get(0))); } - // ApiErrorExample 어노테이션 단 클래스에 적용 - if (apiErrorExample != null) { - generateErrorResponseExample(operation, apiErrorExample.value()); + // ApiErrorExceptionsExample 어노테이션 단 메소드 적용 + if (apiErrorExceptionsExample != null) { + generateExceptionResponseExample(operation, apiErrorExceptionsExample.value()); + } + // ApiErrorCodeExample 어노테이션 단 메소드 적용 + if (apiErrorCodeExample != null) { + generateErrorCodeResponseExample(operation, apiErrorCodeExample.value()); } return operation; }; } + /** + * BaseErrorCode 타입의 이넘값들을 문서화 시킵니다. ExplainError 어노테이션으로 부가설명을 붙일수있습니다. 필드들을 가져와서 예시 에러 객체를 + * 동적으로 생성해서 예시값으로 붙입니다. + */ + private void generateErrorCodeResponseExample( + Operation operation, Class type) { + ApiResponses responses = operation.getResponses(); - /** ExplainError 어노테이션으로 부가설명을 붙일수있습니다. 필드들을 가져와서 예시 에러 객체를 동적으로 생성해서 예시값으로 붙입니다. */ - private void generateErrorResponseExample(Operation operation, Class type) { + BaseErrorCode[] errorCodes = type.getEnumConstants(); + + Map> statusWithExampleHolders = + Arrays.stream(errorCodes) + .map( + baseErrorCode -> { + try { + ErrorReason errorReason = baseErrorCode.getErrorReason(); + return ExampleHolder.builder() + .holder( + getSwaggerExample( + baseErrorCode.getExplainError(), + errorReason)) + .code(errorReason.getStatus()) + .name(errorReason.getCode()) + .build(); + } catch (NoSuchFieldException e) { + throw new RuntimeException(e); + } + }) + .collect(groupingBy(ExampleHolder::getCode)); + + addExamplesToResponses(responses, statusWithExampleHolders); + } + + /** + * SwaggerExampleExceptions 타입의 클래스를 문서화 시킵니다. SwaggerExampleExceptions 타입의 클래스는 필드로 + * DuDoongCodeException 타입을 가지며, DuDoongCodeException 의 errorReason 와,ExplainError 의 설명을 + * 문서화시킵니다. + */ + private void generateExceptionResponseExample(Operation operation, Class type) { ApiResponses responses = operation.getResponses(); // ----------------생성 Object bean = applicationContext.getBean(type); Field[] declaredFields = bean.getClass().getDeclaredFields(); - Map> stringListMap = + Map> statusWithExampleHolders = Arrays.stream(declaredFields) .filter(field -> field.getAnnotation(ExplainError.class) != null) .filter(field -> field.getType() == DuDoongCodeException.class) @@ -124,15 +169,12 @@ private void generateErrorResponseExample(Operation operation, Class type) { ExplainError annotation = field.getAnnotation(ExplainError.class); String value = annotation.value(); - ErrorReason errorReason = - exception.getErrorCode().getErrorReason(); - ErrorResponse errorResponse = - new ErrorResponse(errorReason, "요청시 패스정보입니다."); - Example example = new Example(); - example.description(value); - example.setValue(errorResponse); - return new ExampleHolder( - example, field.getName(), errorReason.getStatus()); + ErrorReason errorReason = exception.getErrorReason(); + return ExampleHolder.builder() + .holder(getSwaggerExample(value, errorReason)) + .code(errorReason.getStatus()) + .name(field.getName()) + .build(); } catch (IllegalAccessException e) { throw new RuntimeException(e); } @@ -140,7 +182,20 @@ private void generateErrorResponseExample(Operation operation, Class type) { .collect(groupingBy(ExampleHolder::getCode)); // -------------------------- 콘텐츠 세팅 코드별로 진행 - stringListMap.forEach( + addExamplesToResponses(responses, statusWithExampleHolders); + } + + private Example getSwaggerExample(String value, ErrorReason errorReason) { + ErrorResponse errorResponse = new ErrorResponse(errorReason, "요청시 패스정보입니다."); + Example example = new Example(); + example.description(value); + example.setValue(errorResponse); + return example; + } + + private void addExamplesToResponses( + ApiResponses responses, Map> statusWithExampleHolders) { + statusWithExampleHolders.forEach( (status, v) -> { Content content = new Content(); MediaType mediaType = new MediaType(); diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/config/response/GlobalExceptionHandler.java b/DuDoong-Api/src/main/java/band/gosrock/api/config/response/GlobalExceptionHandler.java index e4a09273..bce442f9 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/config/response/GlobalExceptionHandler.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/config/response/GlobalExceptionHandler.java @@ -1,10 +1,12 @@ package band.gosrock.api.config.response; +import band.gosrock.common.dto.ErrorReason; import band.gosrock.common.dto.ErrorResponse; +import band.gosrock.common.exception.BaseErrorCode; import band.gosrock.common.exception.DuDoongCodeException; import band.gosrock.common.exception.DuDoongDynamicException; -import band.gosrock.common.exception.ErrorCode; +import band.gosrock.common.exception.GlobalErrorCode; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.util.List; @@ -79,10 +81,12 @@ protected ResponseEntity handleMethodArgumentNotValid( @ExceptionHandler(DuDoongCodeException.class) public ResponseEntity DuDoongCodeExceptionHandler( DuDoongCodeException e, HttpServletRequest request) { - ErrorCode code = e.getErrorCode(); + BaseErrorCode code = e.getErrorCode(); + ErrorReason errorReason = code.getErrorReason(); ErrorResponse errorResponse = - new ErrorResponse(code.getErrorReason(), request.getRequestURL().toString()); - return ResponseEntity.status(HttpStatus.valueOf(code.getStatus())).body(errorResponse); + new ErrorResponse(errorReason, request.getRequestURL().toString()); + return ResponseEntity.status(HttpStatus.valueOf(errorReason.getStatus())) + .body(errorResponse); } @ExceptionHandler(DuDoongDynamicException.class) @@ -107,7 +111,7 @@ protected ResponseEntity handleException(Exception e, HttpServlet .toUriString(); log.error("INTERNAL_SERVER_ERROR", e); - ErrorCode internalServerError = ErrorCode.INTERNAL_SERVER_ERROR; + GlobalErrorCode internalServerError = GlobalErrorCode.INTERNAL_SERVER_ERROR; ErrorResponse errorResponse = new ErrorResponse( internalServerError.getStatus(), diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/config/security/AccessDeniedFilter.java b/DuDoong-Api/src/main/java/band/gosrock/api/config/security/AccessDeniedFilter.java index ce5b074a..b670a9a7 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/config/security/AccessDeniedFilter.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/config/security/AccessDeniedFilter.java @@ -1,9 +1,10 @@ package band.gosrock.api.config.security; +import band.gosrock.common.dto.ErrorReason; import band.gosrock.common.dto.ErrorResponse; +import band.gosrock.common.exception.BaseErrorCode; import band.gosrock.common.exception.DuDoongCodeException; -import band.gosrock.common.exception.ErrorCode; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import javax.servlet.FilterChain; @@ -46,9 +47,10 @@ protected void doFilterInternal( } } - private ErrorResponse getErrorResponse(ErrorCode errorCode, String path) { + private ErrorResponse getErrorResponse(BaseErrorCode errorCode, String path) { + ErrorReason errorReason = errorCode.getErrorReason(); return new ErrorResponse( - errorCode.getStatus(), errorCode.getCode(), errorCode.getReason(), path); + errorReason.getStatus(), errorReason.getCode(), errorReason.getReason(), path); } private void responseToClient(HttpServletResponse response, ErrorResponse errorResponse) diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/config/security/JwtExceptionFilter.java b/DuDoong-Api/src/main/java/band/gosrock/api/config/security/JwtExceptionFilter.java index 097f3ffc..4da31bdc 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/config/security/JwtExceptionFilter.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/config/security/JwtExceptionFilter.java @@ -2,8 +2,8 @@ import band.gosrock.common.dto.ErrorResponse; +import band.gosrock.common.exception.BaseErrorCode; import band.gosrock.common.exception.DuDoongCodeException; -import band.gosrock.common.exception.ErrorCode; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import javax.servlet.FilterChain; @@ -36,7 +36,7 @@ protected void doFilterInternal( } } - private ErrorResponse getErrorResponse(ErrorCode errorCode, String path) { + private ErrorResponse getErrorResponse(BaseErrorCode errorCode, String path) { return new ErrorResponse(errorCode.getErrorReason(), path); } diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/example/controller/ExampleController.java b/DuDoong-Api/src/main/java/band/gosrock/api/example/controller/ExampleController.java index e70a082f..47964300 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/example/controller/ExampleController.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/example/controller/ExampleController.java @@ -5,9 +5,19 @@ import band.gosrock.api.example.docs.ExampleExceptionDocs; import band.gosrock.api.example.dto.ExampleResponse; import band.gosrock.api.example.service.ExampleApiService; -import band.gosrock.common.annotation.ApiErrorExample; +import band.gosrock.common.annotation.ApiErrorCodeExample; +import band.gosrock.common.annotation.ApiErrorExceptionsExample; import band.gosrock.common.annotation.DevelopOnlyApi; +import band.gosrock.common.exception.GlobalErrorCode; +import band.gosrock.domain.domains.order.exception.OrderErrorCode; +import band.gosrock.domain.domains.user.exception.UserErrorCode; +import band.gosrock.infrastructure.outer.api.tossPayments.exception.PaymentsCancelErrorCode; +import band.gosrock.infrastructure.outer.api.tossPayments.exception.PaymentsConfirmErrorCode; +import band.gosrock.infrastructure.outer.api.tossPayments.exception.PaymentsCreateErrorCode; +import band.gosrock.infrastructure.outer.api.tossPayments.exception.TransactionGetErrorCode; +import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @@ -15,23 +25,66 @@ import org.springframework.web.bind.annotation.RestController; @RestController -@RequestMapping("/v1") +@RequestMapping("/v1/examples") @RequiredArgsConstructor @SecurityRequirement(name = "access-token") +@Tag(name = "예시 컨트롤러, 실사용 용도가 아닙니다. 에러코드들의 목록을 가지고 있는 api 도 있습니다.") public class ExampleController { private final ExampleApiService exampleApiService; @GetMapping @DevelopOnlyApi - @ApiErrorExample(ExampleExceptionDocs.class) + @ApiErrorExceptionsExample(ExampleExceptionDocs.class) public ExampleResponse get() { return exampleApiService.getExample(); } @PostMapping - @ApiErrorExample(ExampleException2Docs.class) + @ApiErrorExceptionsExample(ExampleException2Docs.class) public ExampleResponse create() { return exampleApiService.createExample(); } + + @GetMapping("/global") + @DevelopOnlyApi + @Operation(summary = "글로벌 ( 인증 , aop, 서버 내부 오류등) 관련 에러 코드 나열") + @ApiErrorCodeExample(GlobalErrorCode.class) + public void getGlobalErrorCode() {} + + @GetMapping("/user") + @DevelopOnlyApi + @Operation(summary = "유저 도메인 관련 에러 코드 나열") + @ApiErrorCodeExample(UserErrorCode.class) + public void getUserErrorCode() {} + + @GetMapping("/order") + @DevelopOnlyApi + @Operation(summary = "주문 도메인 관련 에러 코드 나열") + @ApiErrorCodeExample(OrderErrorCode.class) + public void getOrderErrorCode() {} + + @GetMapping("/toss/create") + @DevelopOnlyApi + @Operation(summary = "토스 주문 생성 관련 에러 코드 나열") + @ApiErrorCodeExample(PaymentsCreateErrorCode.class) + public void getPaymentsCreateErrorCode() {} + + @GetMapping("/toss/confirm") + @DevelopOnlyApi + @Operation(summary = "토스 주문 승인 관련 에러 코드 나열") + @ApiErrorCodeExample(PaymentsConfirmErrorCode.class) + public void getPaymentsConfirmErrorCode() {} + + @GetMapping("/toss/cancel") + @DevelopOnlyApi + @Operation(summary = "토스 주문 취소 관련 에러 코드 나열") + @ApiErrorCodeExample(PaymentsCancelErrorCode.class) + public void getPaymentsCancelErrorCode() {} + + @GetMapping("/toss/transaction") + @DevelopOnlyApi + @Operation(summary = "토스 거래 조회 관련 에러 코드 나열") + @ApiErrorCodeExample(TransactionGetErrorCode.class) + public void getTransactionGetErrorCode() {} } diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/example/docs/ExampleException2Docs.java b/DuDoong-Api/src/main/java/band/gosrock/api/example/docs/ExampleException2Docs.java index 2d32f319..4e223303 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/example/docs/ExampleException2Docs.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/example/docs/ExampleException2Docs.java @@ -5,11 +5,12 @@ import band.gosrock.common.annotation.ExplainError; import band.gosrock.common.exception.DuDoongCodeException; import band.gosrock.common.exception.InvalidTokenException; +import band.gosrock.common.interfaces.SwaggerExampleExceptions; import band.gosrock.domain.domains.order.exception.InvalidOrderException; import band.gosrock.domain.domains.order.exception.OrderNotFoundException; @ExceptionDoc -public class ExampleException2Docs { +public class ExampleException2Docs implements SwaggerExampleExceptions { @ExplainError("어쩌구 저쩌구") public DuDoongCodeException 유저없을때 = InvalidTokenException.EXCEPTION; diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/example/docs/ExampleExceptionDocs.java b/DuDoong-Api/src/main/java/band/gosrock/api/example/docs/ExampleExceptionDocs.java index 6085fb32..ca06d0ad 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/example/docs/ExampleExceptionDocs.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/example/docs/ExampleExceptionDocs.java @@ -4,12 +4,13 @@ import band.gosrock.common.annotation.ExceptionDoc; import band.gosrock.common.annotation.ExplainError; import band.gosrock.common.exception.DuDoongCodeException; +import band.gosrock.common.interfaces.SwaggerExampleExceptions; import band.gosrock.domain.domains.order.exception.InvalidOrderException; import band.gosrock.domain.domains.order.exception.OrderNotFoundException; import band.gosrock.domain.domains.user.exception.UserNotFoundException; @ExceptionDoc -public class ExampleExceptionDocs { +public class ExampleExceptionDocs implements SwaggerExampleExceptions { @ExplainError("유저검색시에 안나올 때 나오는 에러입니다.") public DuDoongCodeException 유저없을때 = UserNotFoundException.EXCEPTION; diff --git a/DuDoong-Common/src/main/java/band/gosrock/common/annotation/ApiErrorExample.java b/DuDoong-Common/src/main/java/band/gosrock/common/annotation/ApiErrorCodeExample.java similarity index 66% rename from DuDoong-Common/src/main/java/band/gosrock/common/annotation/ApiErrorExample.java rename to DuDoong-Common/src/main/java/band/gosrock/common/annotation/ApiErrorCodeExample.java index 42a821e9..25ad81ca 100644 --- a/DuDoong-Common/src/main/java/band/gosrock/common/annotation/ApiErrorExample.java +++ b/DuDoong-Common/src/main/java/band/gosrock/common/annotation/ApiErrorCodeExample.java @@ -1,6 +1,7 @@ package band.gosrock.common.annotation; +import band.gosrock.common.exception.BaseErrorCode; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -8,6 +9,6 @@ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) -public @interface ApiErrorExample { - Class value(); +public @interface ApiErrorCodeExample { + Class value(); } diff --git a/DuDoong-Common/src/main/java/band/gosrock/common/annotation/ApiErrorExceptionsExample.java b/DuDoong-Common/src/main/java/band/gosrock/common/annotation/ApiErrorExceptionsExample.java new file mode 100644 index 00000000..e6f2a322 --- /dev/null +++ b/DuDoong-Common/src/main/java/band/gosrock/common/annotation/ApiErrorExceptionsExample.java @@ -0,0 +1,14 @@ +package band.gosrock.common.annotation; + + +import band.gosrock.common.interfaces.SwaggerExampleExceptions; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface ApiErrorExceptionsExample { + Class value(); +} diff --git a/DuDoong-Common/src/main/java/band/gosrock/common/dto/ErrorReason.java b/DuDoong-Common/src/main/java/band/gosrock/common/dto/ErrorReason.java index 9d26d3a9..dff969fb 100644 --- a/DuDoong-Common/src/main/java/band/gosrock/common/dto/ErrorReason.java +++ b/DuDoong-Common/src/main/java/band/gosrock/common/dto/ErrorReason.java @@ -7,7 +7,7 @@ @Getter @Builder public class ErrorReason { - private final int status; + private final Integer status; private final String code; private final String reason; } diff --git a/DuDoong-Common/src/main/java/band/gosrock/common/exception/BadFileExtensionException.java b/DuDoong-Common/src/main/java/band/gosrock/common/exception/BadFileExtensionException.java index 5ee0d6f6..fbb51f80 100644 --- a/DuDoong-Common/src/main/java/band/gosrock/common/exception/BadFileExtensionException.java +++ b/DuDoong-Common/src/main/java/band/gosrock/common/exception/BadFileExtensionException.java @@ -5,6 +5,6 @@ public class BadFileExtensionException extends DuDoongCodeException { public static final DuDoongCodeException EXCEPTION = new BadFileExtensionException(); private BadFileExtensionException() { - super(ErrorCode.BAD_FILE_EXTENSION); + super(GlobalErrorCode.BAD_FILE_EXTENSION); } } diff --git a/DuDoong-Common/src/main/java/band/gosrock/common/exception/BadLockIdentifierException.java b/DuDoong-Common/src/main/java/band/gosrock/common/exception/BadLockIdentifierException.java index 03346c96..bcd09361 100644 --- a/DuDoong-Common/src/main/java/band/gosrock/common/exception/BadLockIdentifierException.java +++ b/DuDoong-Common/src/main/java/band/gosrock/common/exception/BadLockIdentifierException.java @@ -5,6 +5,6 @@ public class BadLockIdentifierException extends DuDoongCodeException { public static final DuDoongCodeException EXCEPTION = new BadLockIdentifierException(); private BadLockIdentifierException() { - super(ErrorCode.BAD_LOCK_IDENTIFIER); + super(GlobalErrorCode.BAD_LOCK_IDENTIFIER); } } diff --git a/DuDoong-Common/src/main/java/band/gosrock/common/exception/BaseErrorCode.java b/DuDoong-Common/src/main/java/band/gosrock/common/exception/BaseErrorCode.java index 86b923aa..3fa3fcc0 100644 --- a/DuDoong-Common/src/main/java/band/gosrock/common/exception/BaseErrorCode.java +++ b/DuDoong-Common/src/main/java/band/gosrock/common/exception/BaseErrorCode.java @@ -5,4 +5,6 @@ public interface BaseErrorCode { public ErrorReason getErrorReason(); + + String getExplainError() throws NoSuchFieldException; } diff --git a/DuDoong-Common/src/main/java/band/gosrock/common/exception/DuDoongCodeException.java b/DuDoong-Common/src/main/java/band/gosrock/common/exception/DuDoongCodeException.java index 1daceb16..c953772d 100644 --- a/DuDoong-Common/src/main/java/band/gosrock/common/exception/DuDoongCodeException.java +++ b/DuDoong-Common/src/main/java/band/gosrock/common/exception/DuDoongCodeException.java @@ -1,11 +1,16 @@ package band.gosrock.common.exception; +import band.gosrock.common.dto.ErrorReason; import lombok.AllArgsConstructor; import lombok.Getter; @Getter @AllArgsConstructor public class DuDoongCodeException extends RuntimeException { - private ErrorCode errorCode; + private BaseErrorCode errorCode; + + public ErrorReason getErrorReason() { + return this.errorCode.getErrorReason(); + } } diff --git a/DuDoong-Common/src/main/java/band/gosrock/common/exception/ErrorCode.java b/DuDoong-Common/src/main/java/band/gosrock/common/exception/ErrorCode.java deleted file mode 100644 index dce5bfca..00000000 --- a/DuDoong-Common/src/main/java/band/gosrock/common/exception/ErrorCode.java +++ /dev/null @@ -1,67 +0,0 @@ -package band.gosrock.common.exception; - -import static band.gosrock.common.consts.DuDoongStatic.BAD_REQUEST; -import static band.gosrock.common.consts.DuDoongStatic.FORBIDDEN; -import static band.gosrock.common.consts.DuDoongStatic.INTERNAL_SERVER; -import static band.gosrock.common.consts.DuDoongStatic.NOT_FOUND; -import static band.gosrock.common.consts.DuDoongStatic.UNAUTHORIZED; - -import band.gosrock.common.dto.ErrorReason; -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter -@AllArgsConstructor -public enum ErrorCode implements BaseErrorCode { - EXAMPLE_NOT_FOUND(NOT_FOUND, "EXAMPLE_404_1", "Example Not Found."), - - ARGUMENT_NOT_VALID_ERROR(BAD_REQUEST, "GLOBAL_400_1", "validation error"), - - TOKEN_EXPIRED(UNAUTHORIZED, "AUTH_401_1", "Expired Jwt Token."), - REFRESH_TOKEN_EXPIRED(FORBIDDEN, "AUTH_403_1", "refreshToken expired."), - - INVALID_TOKEN(UNAUTHORIZED, "GLOBAL-401-1", "Invalid Jwt Token."), - - USER_NOT_FOUND(NOT_FOUND, "USER-404-1", "User Not Found."), - - INTERNAL_SERVER_ERROR(INTERNAL_SERVER, "GLOBAL-500-1", "Internal Server Error."), - - OTHER_SERVER_BAD_REQUEST(BAD_REQUEST, "FEIGN-400-1", "Other server bad request"), - OTHER_SERVER_UNAUTHORIZED(BAD_REQUEST, "FEIGN-400-2", "Other server unauthorized"), - OTHER_SERVER_FORBIDDEN(BAD_REQUEST, "FEIGN-400-3", "Other server forbidden"), - OTHER_SERVER_EXPIRED_TOKEN(BAD_REQUEST, "FEIGN-400-4", "Other server expired token"), - NOT_AVAILABLE_REDISSON_LOCK(500, "Redisson-500-1", "can not get redisson lock"), - SECURITY_CONTEXT_NOT_FOUND(500, "GLOBAL-500-2", "security context not found"), - USER_ALREADY_SIGNUP(BAD_REQUEST, "USER-400-1", "User already signup"), - USER_FORBIDDEN(FORBIDDEN, "USER_403_1", "user forbidden"), - USER_ALREADY_DELETED(FORBIDDEN, "USER_403_2", "user already deleted"), - TOSS_PAYMENTS_UNHANDLED(INTERNAL_SERVER, "PAYMENTS_INTERNAL_SERVER", "관리자에게 연락부탁드려요."), - BAD_LOCK_IDENTIFIER(500, "AOP_500_1", "락의 키값이 잘못 세팅 되었습니다"), - BAD_FILE_EXTENSION(BAD_REQUEST, "FILE-400-1", "파일 확장자가 잘못 되었습니다."), - CART_NOT_FOUND(NOT_FOUND, "Cart-404-1", "Cart Not Found."), - ORDER_NOT_FOUND(NOT_FOUND, "Order-404-1", "Order Not Found."), - ORDER_NOT_MINE(BAD_REQUEST, "Order-400-1", "Order Not MINE"), - ORDER_NOT_VALID(BAD_REQUEST, "Order-400-2", "Order Not Valid"), - ORDER_NOT_PENDING(BAD_REQUEST, "Order-400-3", "Order Status Not Pending"), - ORDER_NOT_SUPPORTED_METHOD(BAD_REQUEST, "Order-400-4", "Order Method Not Supported"), - ORDER_LINE_NOT_FOUND(BAD_REQUEST, "Order-404-2", "Order Line Not Fount"), - ISSUED_TICKET_NOT_FOUND(NOT_FOUND, "IssuedTicket-404-1", "IssuedTicket Not Found"), - ISSUED_TICKET_NOT_MATCHED_USER( - FORBIDDEN, "IssuedTicket-403-1", "IssuedTicket User Not Matched"), - TOSS_PAYMENTS_ENUM_NOT_MATCH(INTERNAL_SERVER, "INFRA-500-1", "토스페이먼츠 이넘값 관련 매칭 안된 문제입니다."), - ORDER_CANNOT_CANCEL(BAD_REQUEST, "Order-404-3", "주문을 취소할 수 없는 상태입니다."), - ORDER_CANNOT_REFUND(BAD_REQUEST, "Order-404-4", "주문을 환불할 수 없는 상태입니다."), - EVENT_NOT_FOUND(NOT_FOUND, "Event-404-1", "Event Not Found"), - ORDER_NOT_APPROVAL(BAD_REQUEST, "Order-400-5", "승인 주문이 아닙니다."), - ORDER_NOT_PAYMENT(BAD_REQUEST, "Order-400-6", "결제 주문이 아닙니다."), - HOST_NOT_AUTH_EVENT(FORBIDDEN, "Event-403-1", "Host Not Auth Event"), - ORDER_NOT_REFUND_DATE(BAD_REQUEST, "Order-400-7", "환불을 할 수 있는 기한을 지났습니다."); - private int status; - private String code; - private String reason; - - @Override - public ErrorReason getErrorReason() { - return ErrorReason.builder().reason(reason).code(code).status(status).build(); - } -} diff --git a/DuDoong-Common/src/main/java/band/gosrock/common/exception/ExpiredTokenException.java b/DuDoong-Common/src/main/java/band/gosrock/common/exception/ExpiredTokenException.java index 30a6cd9b..eecadc52 100644 --- a/DuDoong-Common/src/main/java/band/gosrock/common/exception/ExpiredTokenException.java +++ b/DuDoong-Common/src/main/java/band/gosrock/common/exception/ExpiredTokenException.java @@ -4,6 +4,6 @@ public class ExpiredTokenException extends DuDoongCodeException { public static final DuDoongCodeException EXCEPTION = new ExpiredTokenException(); private ExpiredTokenException() { - super(ErrorCode.TOKEN_EXPIRED); + super(GlobalErrorCode.TOKEN_EXPIRED); } } diff --git a/DuDoong-Common/src/main/java/band/gosrock/common/exception/GlobalErrorCode.java b/DuDoong-Common/src/main/java/band/gosrock/common/exception/GlobalErrorCode.java new file mode 100644 index 00000000..957e84a0 --- /dev/null +++ b/DuDoong-Common/src/main/java/band/gosrock/common/exception/GlobalErrorCode.java @@ -0,0 +1,75 @@ +package band.gosrock.common.exception; + +import static band.gosrock.common.consts.DuDoongStatic.BAD_REQUEST; +import static band.gosrock.common.consts.DuDoongStatic.FORBIDDEN; +import static band.gosrock.common.consts.DuDoongStatic.INTERNAL_SERVER; +import static band.gosrock.common.consts.DuDoongStatic.NOT_FOUND; +import static band.gosrock.common.consts.DuDoongStatic.UNAUTHORIZED; + +import band.gosrock.common.annotation.ExplainError; +import band.gosrock.common.dto.ErrorReason; +import java.lang.reflect.Field; +import java.util.Objects; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 글로벌 관련 예외 코드들이 나온 곳입니다. 인증 , global, aop 종류등 도메인 제외한 exception 코드들이 모이는 곳입니다. 도메인 관련 Exception + * code 들은 도메인 내부 exception 패키지에 위치시키면 됩니다. + */ +@Getter +@AllArgsConstructor +public enum GlobalErrorCode implements BaseErrorCode { + @ExplainError("백엔드에서 예시로만든 에러입니다. 개발용!이에유! 신경쓰지마세유") + EXAMPLE_NOT_FOUND(NOT_FOUND, "EXAMPLE_404_1", "예시를 찾을 수 없는 오류입니다."), + + @ExplainError("밸리데이션 (검증 과정 수행속 ) 발생하는 오류입니다.") + ARGUMENT_NOT_VALID_ERROR(BAD_REQUEST, "GLOBAL_400_1", "검증 오류"), + + @ExplainError("accessToken 만료시 발생하는 오류입니다.") + TOKEN_EXPIRED(UNAUTHORIZED, "AUTH_401_1", "인증 시간이 만료되었습니다. 인증토큰을 재 발급 해주세요"), + + @ExplainError("refreshToken 만료시 발생하는 오류입니다.") + REFRESH_TOKEN_EXPIRED(FORBIDDEN, "AUTH_403_1", "인증 시간이 만료되었습니다. 재 로그인 해주세요."), + + @ExplainError("인증 토큰이 잘못됐을 때 발생하는 오류입니다.") + INVALID_TOKEN(UNAUTHORIZED, "GLOBAL_401_1", "잘못된 토큰입니다. 재 로그인 해주세요"), + + @ExplainError("500번대 알수없는 오류입니다. 서버 관리자에게 문의 주세요") + INTERNAL_SERVER_ERROR(INTERNAL_SERVER, "GLOBAL_500_1", "서버 오류. 관리자에게 문의 부탁드립니다."), + + OTHER_SERVER_BAD_REQUEST(BAD_REQUEST, "FEIGN_400_1", "Other server bad request"), + OTHER_SERVER_UNAUTHORIZED(BAD_REQUEST, "FEIGN_400_2", "Other server unauthorized"), + OTHER_SERVER_FORBIDDEN(BAD_REQUEST, "FEIGN_400_3", "Other server forbidden"), + OTHER_SERVER_EXPIRED_TOKEN(BAD_REQUEST, "FEIGN_400_4", "Other server expired token"), + NOT_AVAILABLE_REDISSON_LOCK(500, "Redisson_500_1", "can not get redisson lock"), + SECURITY_CONTEXT_NOT_FOUND(500, "GLOBAL_500_2", "security context not found"), + + TOSS_PAYMENTS_UNHANDLED(INTERNAL_SERVER, "PAYMENTS_INTERNAL_SERVER", "관리자에게 연락부탁드려요."), + BAD_LOCK_IDENTIFIER(500, "AOP_500_1", "락의 키값이 잘못 세팅 되었습니다"), + BAD_FILE_EXTENSION(BAD_REQUEST, "FILE_400_1", "파일 확장자가 잘못 되었습니다."), + CART_NOT_FOUND(NOT_FOUND, "Cart_404_1", "Cart Not Found."), + + ISSUED_TICKET_NOT_FOUND(NOT_FOUND, "IssuedTicket_404_1", "IssuedTicket Not Found"), + ISSUED_TICKET_NOT_MATCHED_USER( + FORBIDDEN, "IssuedTicket_403_1", "IssuedTicket User Not Matched"), + TOSS_PAYMENTS_ENUM_NOT_MATCH(INTERNAL_SERVER, "INFRA_500_1", "토스페이먼츠 이넘값 관련 매칭 안된 문제입니다."), + + EVENT_NOT_FOUND(NOT_FOUND, "Event_404_1", "Event Not Found"), + HOST_NOT_AUTH_EVENT(FORBIDDEN, "Event_403_1", "Host Not Auth Event"); + private Integer status; + private String code; + private String reason; + + @Override + public ErrorReason getErrorReason() { + return ErrorReason.builder().reason(reason).code(code).status(status).build(); + } + + @Override + public String getExplainError() throws NoSuchFieldException { + Field field = this.getClass().getField(this.name()); + ExplainError annotation = field.getAnnotation(ExplainError.class); + return Objects.nonNull(annotation) ? annotation.value() : this.getReason(); + } +} diff --git a/DuDoong-Common/src/main/java/band/gosrock/common/exception/InvalidTokenException.java b/DuDoong-Common/src/main/java/band/gosrock/common/exception/InvalidTokenException.java index 0ba7655d..2072588a 100644 --- a/DuDoong-Common/src/main/java/band/gosrock/common/exception/InvalidTokenException.java +++ b/DuDoong-Common/src/main/java/band/gosrock/common/exception/InvalidTokenException.java @@ -4,6 +4,6 @@ public class InvalidTokenException extends DuDoongCodeException { public static final DuDoongCodeException EXCEPTION = new InvalidTokenException(); private InvalidTokenException() { - super(ErrorCode.INVALID_TOKEN); + super(GlobalErrorCode.INVALID_TOKEN); } } diff --git a/DuDoong-Common/src/main/java/band/gosrock/common/exception/NotAvailableRedissonLockException.java b/DuDoong-Common/src/main/java/band/gosrock/common/exception/NotAvailableRedissonLockException.java index c6cb9fd0..2be73000 100644 --- a/DuDoong-Common/src/main/java/band/gosrock/common/exception/NotAvailableRedissonLockException.java +++ b/DuDoong-Common/src/main/java/band/gosrock/common/exception/NotAvailableRedissonLockException.java @@ -5,6 +5,6 @@ public class NotAvailableRedissonLockException extends DuDoongCodeException { public static final DuDoongCodeException EXCEPTION = new NotAvailableRedissonLockException(); private NotAvailableRedissonLockException() { - super(ErrorCode.NOT_AVAILABLE_REDISSON_LOCK); + super(GlobalErrorCode.NOT_AVAILABLE_REDISSON_LOCK); } } diff --git a/DuDoong-Common/src/main/java/band/gosrock/common/exception/OtherServerBadRequestException.java b/DuDoong-Common/src/main/java/band/gosrock/common/exception/OtherServerBadRequestException.java index d8f24933..f90e06d0 100644 --- a/DuDoong-Common/src/main/java/band/gosrock/common/exception/OtherServerBadRequestException.java +++ b/DuDoong-Common/src/main/java/band/gosrock/common/exception/OtherServerBadRequestException.java @@ -5,6 +5,6 @@ public class OtherServerBadRequestException extends DuDoongCodeException { public static final DuDoongCodeException EXCEPTION = new OtherServerBadRequestException(); private OtherServerBadRequestException() { - super(ErrorCode.OTHER_SERVER_BAD_REQUEST); + super(GlobalErrorCode.OTHER_SERVER_BAD_REQUEST); } } diff --git a/DuDoong-Common/src/main/java/band/gosrock/common/exception/OtherServerExpiredTokenException.java b/DuDoong-Common/src/main/java/band/gosrock/common/exception/OtherServerExpiredTokenException.java index 9fe5bd29..9b7dc18b 100644 --- a/DuDoong-Common/src/main/java/band/gosrock/common/exception/OtherServerExpiredTokenException.java +++ b/DuDoong-Common/src/main/java/band/gosrock/common/exception/OtherServerExpiredTokenException.java @@ -5,6 +5,6 @@ public class OtherServerExpiredTokenException extends DuDoongCodeException { public static final DuDoongCodeException EXCEPTION = new OtherServerExpiredTokenException(); private OtherServerExpiredTokenException() { - super(ErrorCode.OTHER_SERVER_EXPIRED_TOKEN); + super(GlobalErrorCode.OTHER_SERVER_EXPIRED_TOKEN); } } diff --git a/DuDoong-Common/src/main/java/band/gosrock/common/exception/OtherServerForbiddenException.java b/DuDoong-Common/src/main/java/band/gosrock/common/exception/OtherServerForbiddenException.java index da3423a4..dbdd227b 100644 --- a/DuDoong-Common/src/main/java/band/gosrock/common/exception/OtherServerForbiddenException.java +++ b/DuDoong-Common/src/main/java/band/gosrock/common/exception/OtherServerForbiddenException.java @@ -5,6 +5,6 @@ public class OtherServerForbiddenException extends DuDoongCodeException { public static final DuDoongCodeException EXCEPTION = new OtherServerForbiddenException(); private OtherServerForbiddenException() { - super(ErrorCode.OTHER_SERVER_FORBIDDEN); + super(GlobalErrorCode.OTHER_SERVER_FORBIDDEN); } } diff --git a/DuDoong-Common/src/main/java/band/gosrock/common/exception/OtherServerUnauthorizedException.java b/DuDoong-Common/src/main/java/band/gosrock/common/exception/OtherServerUnauthorizedException.java index 8b609083..cda58990 100644 --- a/DuDoong-Common/src/main/java/band/gosrock/common/exception/OtherServerUnauthorizedException.java +++ b/DuDoong-Common/src/main/java/band/gosrock/common/exception/OtherServerUnauthorizedException.java @@ -5,6 +5,6 @@ public class OtherServerUnauthorizedException extends DuDoongCodeException { public static final DuDoongCodeException EXCEPTION = new OtherServerUnauthorizedException(); private OtherServerUnauthorizedException() { - super(ErrorCode.OTHER_SERVER_UNAUTHORIZED); + super(GlobalErrorCode.OTHER_SERVER_UNAUTHORIZED); } } diff --git a/DuDoong-Common/src/main/java/band/gosrock/common/exception/RefreshTokenExpiredException.java b/DuDoong-Common/src/main/java/band/gosrock/common/exception/RefreshTokenExpiredException.java index ed8ea1fc..c9bb6e16 100644 --- a/DuDoong-Common/src/main/java/band/gosrock/common/exception/RefreshTokenExpiredException.java +++ b/DuDoong-Common/src/main/java/band/gosrock/common/exception/RefreshTokenExpiredException.java @@ -4,6 +4,6 @@ public class RefreshTokenExpiredException extends DuDoongCodeException { public static final DuDoongCodeException EXCEPTION = new RefreshTokenExpiredException(); private RefreshTokenExpiredException() { - super(ErrorCode.REFRESH_TOKEN_EXPIRED); + super(GlobalErrorCode.REFRESH_TOKEN_EXPIRED); } } diff --git a/DuDoong-Common/src/main/java/band/gosrock/common/exception/SecurityContextNotFoundException.java b/DuDoong-Common/src/main/java/band/gosrock/common/exception/SecurityContextNotFoundException.java index 775fadca..1fc76ccb 100644 --- a/DuDoong-Common/src/main/java/band/gosrock/common/exception/SecurityContextNotFoundException.java +++ b/DuDoong-Common/src/main/java/band/gosrock/common/exception/SecurityContextNotFoundException.java @@ -4,6 +4,6 @@ public class SecurityContextNotFoundException extends DuDoongCodeException { public static final DuDoongCodeException EXCEPTION = new SecurityContextNotFoundException(); private SecurityContextNotFoundException() { - super(ErrorCode.SECURITY_CONTEXT_NOT_FOUND); + super(GlobalErrorCode.SECURITY_CONTEXT_NOT_FOUND); } } diff --git a/DuDoong-Common/src/main/java/band/gosrock/common/interfaces/SwaggerExampleExceptions.java b/DuDoong-Common/src/main/java/band/gosrock/common/interfaces/SwaggerExampleExceptions.java new file mode 100644 index 00000000..adef536a --- /dev/null +++ b/DuDoong-Common/src/main/java/band/gosrock/common/interfaces/SwaggerExampleExceptions.java @@ -0,0 +1,7 @@ +package band.gosrock.common.interfaces; + + +import band.gosrock.common.annotation.ExceptionDoc; + +@ExceptionDoc +public interface SwaggerExampleExceptions {} diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/cart/exception/CartNotFoundException.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/cart/exception/CartNotFoundException.java index 0d20cd9b..335e5f0b 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/cart/exception/CartNotFoundException.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/cart/exception/CartNotFoundException.java @@ -2,13 +2,13 @@ import band.gosrock.common.exception.DuDoongCodeException; -import band.gosrock.common.exception.ErrorCode; +import band.gosrock.common.exception.GlobalErrorCode; public class CartNotFoundException extends DuDoongCodeException { public static final DuDoongCodeException EXCEPTION = new CartNotFoundException(); private CartNotFoundException() { - super(ErrorCode.CART_NOT_FOUND); + super(GlobalErrorCode.CART_NOT_FOUND); } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/event/exception/EventNotFoundException.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/event/exception/EventNotFoundException.java index c3af4e44..0d9c5935 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/event/exception/EventNotFoundException.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/event/exception/EventNotFoundException.java @@ -2,13 +2,13 @@ import band.gosrock.common.exception.DuDoongCodeException; -import band.gosrock.common.exception.ErrorCode; +import band.gosrock.common.exception.GlobalErrorCode; public class EventNotFoundException extends DuDoongCodeException { public static final DuDoongCodeException EXCEPTION = new EventNotFoundException(); private EventNotFoundException() { - super(ErrorCode.EVENT_NOT_FOUND); + super(GlobalErrorCode.EVENT_NOT_FOUND); } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/event/exception/HostNotAuthEventException.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/event/exception/HostNotAuthEventException.java index 19edd5be..4714df78 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/event/exception/HostNotAuthEventException.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/event/exception/HostNotAuthEventException.java @@ -2,13 +2,13 @@ import band.gosrock.common.exception.DuDoongCodeException; -import band.gosrock.common.exception.ErrorCode; +import band.gosrock.common.exception.GlobalErrorCode; public class HostNotAuthEventException extends DuDoongCodeException { public static final DuDoongCodeException EXCEPTION = new HostNotAuthEventException(); private HostNotAuthEventException() { - super(ErrorCode.HOST_NOT_AUTH_EVENT); + super(GlobalErrorCode.HOST_NOT_AUTH_EVENT); } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/exception/IssuedTicketNotFoundException.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/exception/IssuedTicketNotFoundException.java index 9edfc137..4ea56950 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/exception/IssuedTicketNotFoundException.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/exception/IssuedTicketNotFoundException.java @@ -2,13 +2,13 @@ import band.gosrock.common.exception.DuDoongCodeException; -import band.gosrock.common.exception.ErrorCode; +import band.gosrock.common.exception.GlobalErrorCode; public class IssuedTicketNotFoundException extends DuDoongCodeException { public static final DuDoongCodeException EXCEPTION = new IssuedTicketNotFoundException(); private IssuedTicketNotFoundException() { - super(ErrorCode.ISSUED_TICKET_NOT_FOUND); + super(GlobalErrorCode.ISSUED_TICKET_NOT_FOUND); } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/exception/IssuedTicketUserNotMatchedException.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/exception/IssuedTicketUserNotMatchedException.java index 154aaa2d..a7114089 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/exception/IssuedTicketUserNotMatchedException.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/exception/IssuedTicketUserNotMatchedException.java @@ -2,13 +2,13 @@ import band.gosrock.common.exception.DuDoongCodeException; -import band.gosrock.common.exception.ErrorCode; +import band.gosrock.common.exception.GlobalErrorCode; public class IssuedTicketUserNotMatchedException extends DuDoongCodeException { public static final DuDoongCodeException EXCEPTION = new IssuedTicketUserNotMatchedException(); private IssuedTicketUserNotMatchedException() { - super(ErrorCode.ISSUED_TICKET_NOT_MATCHED_USER); + super(GlobalErrorCode.ISSUED_TICKET_NOT_MATCHED_USER); } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/CanNotCancelOrderException.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/CanNotCancelOrderException.java index ce0f3296..355af811 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/CanNotCancelOrderException.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/CanNotCancelOrderException.java @@ -2,13 +2,12 @@ import band.gosrock.common.exception.DuDoongCodeException; -import band.gosrock.common.exception.ErrorCode; public class CanNotCancelOrderException extends DuDoongCodeException { public static final DuDoongCodeException EXCEPTION = new CanNotCancelOrderException(); private CanNotCancelOrderException() { - super(ErrorCode.ORDER_CANNOT_CANCEL); + super(OrderErrorCode.ORDER_CANNOT_CANCEL); } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/CanNotRefundOrderException.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/CanNotRefundOrderException.java index 47ef5480..b5a5b379 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/CanNotRefundOrderException.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/CanNotRefundOrderException.java @@ -2,13 +2,12 @@ import band.gosrock.common.exception.DuDoongCodeException; -import band.gosrock.common.exception.ErrorCode; public class CanNotRefundOrderException extends DuDoongCodeException { public static final DuDoongCodeException EXCEPTION = new CanNotRefundOrderException(); private CanNotRefundOrderException() { - super(ErrorCode.ORDER_CANNOT_REFUND); + super(OrderErrorCode.ORDER_CANNOT_REFUND); } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/InvalidOrderException.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/InvalidOrderException.java index 5a828ae7..ab3cc05b 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/InvalidOrderException.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/InvalidOrderException.java @@ -2,13 +2,12 @@ import band.gosrock.common.exception.DuDoongCodeException; -import band.gosrock.common.exception.ErrorCode; public class InvalidOrderException extends DuDoongCodeException { public static final DuDoongCodeException EXCEPTION = new InvalidOrderException(); private InvalidOrderException() { - super(ErrorCode.ORDER_NOT_VALID); + super(OrderErrorCode.ORDER_NOT_VALID); } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/NotApprovalOrderException.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/NotApprovalOrderException.java index 288a4bc2..b1f430a0 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/NotApprovalOrderException.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/NotApprovalOrderException.java @@ -2,13 +2,12 @@ import band.gosrock.common.exception.DuDoongCodeException; -import band.gosrock.common.exception.ErrorCode; public class NotApprovalOrderException extends DuDoongCodeException { public static final DuDoongCodeException EXCEPTION = new NotApprovalOrderException(); private NotApprovalOrderException() { - super(ErrorCode.ORDER_NOT_APPROVAL); + super(OrderErrorCode.ORDER_NOT_APPROVAL); } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/NotOwnerOrderException.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/NotOwnerOrderException.java index 628366ea..2836505b 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/NotOwnerOrderException.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/NotOwnerOrderException.java @@ -2,13 +2,12 @@ import band.gosrock.common.exception.DuDoongCodeException; -import band.gosrock.common.exception.ErrorCode; public class NotOwnerOrderException extends DuDoongCodeException { public static final DuDoongCodeException EXCEPTION = new NotOwnerOrderException(); private NotOwnerOrderException() { - super(ErrorCode.ORDER_NOT_MINE); + super(OrderErrorCode.ORDER_NOT_MINE); } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/NotPaymentOrderException.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/NotPaymentOrderException.java index 98c2c8c7..7654d518 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/NotPaymentOrderException.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/NotPaymentOrderException.java @@ -2,13 +2,12 @@ import band.gosrock.common.exception.DuDoongCodeException; -import band.gosrock.common.exception.ErrorCode; public class NotPaymentOrderException extends DuDoongCodeException { public static final DuDoongCodeException EXCEPTION = new NotPaymentOrderException(); private NotPaymentOrderException() { - super(ErrorCode.ORDER_NOT_PAYMENT); + super(OrderErrorCode.ORDER_NOT_PAYMENT); } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/NotPendingOrderException.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/NotPendingOrderException.java index 6112309f..8c7aa50e 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/NotPendingOrderException.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/NotPendingOrderException.java @@ -2,13 +2,12 @@ import band.gosrock.common.exception.DuDoongCodeException; -import band.gosrock.common.exception.ErrorCode; public class NotPendingOrderException extends DuDoongCodeException { public static final DuDoongCodeException EXCEPTION = new NotPendingOrderException(); private NotPendingOrderException() { - super(ErrorCode.ORDER_NOT_PENDING); + super(OrderErrorCode.ORDER_NOT_PENDING); } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/NotRefundAvailableDateOrderException.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/NotRefundAvailableDateOrderException.java index 1ae7dd2f..b6e9c137 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/NotRefundAvailableDateOrderException.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/NotRefundAvailableDateOrderException.java @@ -2,13 +2,12 @@ import band.gosrock.common.exception.DuDoongCodeException; -import band.gosrock.common.exception.ErrorCode; public class NotRefundAvailableDateOrderException extends DuDoongCodeException { public static final DuDoongCodeException EXCEPTION = new NotRefundAvailableDateOrderException(); private NotRefundAvailableDateOrderException() { - super(ErrorCode.ORDER_NOT_REFUND_DATE); + super(OrderErrorCode.ORDER_NOT_REFUND_DATE); } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/NotSupportedOrderMethodException.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/NotSupportedOrderMethodException.java index 79171b48..794cabe2 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/NotSupportedOrderMethodException.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/NotSupportedOrderMethodException.java @@ -2,13 +2,12 @@ import band.gosrock.common.exception.DuDoongCodeException; -import band.gosrock.common.exception.ErrorCode; public class NotSupportedOrderMethodException extends DuDoongCodeException { public static final DuDoongCodeException EXCEPTION = new NotSupportedOrderMethodException(); private NotSupportedOrderMethodException() { - super(ErrorCode.ORDER_NOT_SUPPORTED_METHOD); + super(OrderErrorCode.ORDER_NOT_SUPPORTED_METHOD); } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/OrderErrorCode.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/OrderErrorCode.java new file mode 100644 index 00000000..c35a444a --- /dev/null +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/OrderErrorCode.java @@ -0,0 +1,52 @@ +package band.gosrock.domain.domains.order.exception; + +import static band.gosrock.common.consts.DuDoongStatic.BAD_REQUEST; +import static band.gosrock.common.consts.DuDoongStatic.NOT_FOUND; + +import band.gosrock.common.annotation.ExplainError; +import band.gosrock.common.dto.ErrorReason; +import band.gosrock.common.exception.BaseErrorCode; +import java.lang.reflect.Field; +import java.util.Objects; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum OrderErrorCode implements BaseErrorCode { + @ExplainError("본인의 주문이 아닐 때 발생하는 오류. 본인의 주문만 상태변경이 가능한 api 들이 있습니다.") + ORDER_NOT_MINE(BAD_REQUEST, "Order_400_1", "본인의 주문이 아닙니다."), + @ExplainError("토스 결제 금액과 , 주문금액이 다를 때 등 올바르지 않은 주문 상태를 가질 때 발생하는 오류입니다.") + ORDER_NOT_VALID(BAD_REQUEST, "Order_400_2", "올바르지 않은 주문입니다."), + ORDER_NOT_PENDING(BAD_REQUEST, "Order_400_3", "결제,승인 대기중인 주문이 아닙니다."), + ORDER_NOT_SUPPORTED_METHOD(BAD_REQUEST, "Order_400_4", "지원하지 않는 방식의 주문입니다."), + ORDER_CANNOT_CANCEL(BAD_REQUEST, "Order_400_5", "주문을 취소할 수 없는 상태입니다."), + ORDER_CANNOT_REFUND(BAD_REQUEST, "Order_400_6", "주문을 환불할 수 없는 상태입니다."), + + ORDER_NOT_APPROVAL(BAD_REQUEST, "Order_400_7", "승인 주문이 아닙니다."), + ORDER_NOT_PAYMENT(BAD_REQUEST, "Order_400_8", "결제 주문이 아닙니다."), + + ORDER_NOT_REFUND_DATE(BAD_REQUEST, "Order-400-9", "환불을 할 수 있는 기한을 지났습니다."), + ORDER_NOT_FOUND(NOT_FOUND, "Order_404_1", "주문을 찾을 수 없습니다."), + ORDER_LINE_NOT_FOUND(NOT_FOUND, "Order_404_2", "주문 라인을 찾을 수 없습니다."); + + private Integer status; + private String code; + private String reason; + + @Override + public ErrorReason getErrorReason() { + return band.gosrock.common.dto.ErrorReason.builder() + .reason(reason) + .code(code) + .status(status) + .build(); + } + + @Override + public String getExplainError() throws NoSuchFieldException { + Field field = this.getClass().getField(this.name()); + ExplainError annotation = field.getAnnotation(ExplainError.class); + return Objects.nonNull(annotation) ? annotation.value() : this.getReason(); + } +} diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/OrderLineNotFountException.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/OrderLineNotFountException.java index d0a51fa5..3380551c 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/OrderLineNotFountException.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/OrderLineNotFountException.java @@ -2,13 +2,12 @@ import band.gosrock.common.exception.DuDoongCodeException; -import band.gosrock.common.exception.ErrorCode; public class OrderLineNotFountException extends DuDoongCodeException { public static final DuDoongCodeException EXCEPTION = new OrderLineNotFountException(); private OrderLineNotFountException() { - super(ErrorCode.ORDER_LINE_NOT_FOUND); + super(OrderErrorCode.ORDER_LINE_NOT_FOUND); } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/OrderNotFoundException.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/OrderNotFoundException.java index 4d2e952f..9803e605 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/OrderNotFoundException.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/OrderNotFoundException.java @@ -2,13 +2,12 @@ import band.gosrock.common.exception.DuDoongCodeException; -import band.gosrock.common.exception.ErrorCode; public class OrderNotFoundException extends DuDoongCodeException { public static final DuDoongCodeException EXCEPTION = new OrderNotFoundException(); private OrderNotFoundException() { - super(ErrorCode.ORDER_NOT_FOUND); + super(OrderErrorCode.ORDER_NOT_FOUND); } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/user/exception/AlreadyDeletedUserException.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/user/exception/AlreadyDeletedUserException.java index b325e4fc..8f98f1a9 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/user/exception/AlreadyDeletedUserException.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/user/exception/AlreadyDeletedUserException.java @@ -2,13 +2,12 @@ import band.gosrock.common.exception.DuDoongCodeException; -import band.gosrock.common.exception.ErrorCode; public class AlreadyDeletedUserException extends DuDoongCodeException { public static final DuDoongCodeException EXCEPTION = new AlreadyDeletedUserException(); private AlreadyDeletedUserException() { - super(ErrorCode.USER_ALREADY_DELETED); + super(UserErrorCode.USER_ALREADY_DELETED); } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/user/exception/AlreadySignUpUserException.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/user/exception/AlreadySignUpUserException.java index 27737b20..c81ac986 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/user/exception/AlreadySignUpUserException.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/user/exception/AlreadySignUpUserException.java @@ -2,13 +2,12 @@ import band.gosrock.common.exception.DuDoongCodeException; -import band.gosrock.common.exception.ErrorCode; public class AlreadySignUpUserException extends DuDoongCodeException { public static final DuDoongCodeException EXCEPTION = new AlreadySignUpUserException(); private AlreadySignUpUserException() { - super(ErrorCode.USER_ALREADY_SIGNUP); + super(UserErrorCode.USER_ALREADY_SIGNUP); } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/user/exception/ForbiddenUserException.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/user/exception/ForbiddenUserException.java index 09fec3e5..b158226c 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/user/exception/ForbiddenUserException.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/user/exception/ForbiddenUserException.java @@ -2,13 +2,12 @@ import band.gosrock.common.exception.DuDoongCodeException; -import band.gosrock.common.exception.ErrorCode; public class ForbiddenUserException extends DuDoongCodeException { public static final DuDoongCodeException EXCEPTION = new ForbiddenUserException(); private ForbiddenUserException() { - super(ErrorCode.USER_FORBIDDEN); + super(UserErrorCode.USER_FORBIDDEN); } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/user/exception/UserErrorCode.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/user/exception/UserErrorCode.java new file mode 100644 index 00000000..6d3cc088 --- /dev/null +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/user/exception/UserErrorCode.java @@ -0,0 +1,42 @@ +package band.gosrock.domain.domains.user.exception; + +import static band.gosrock.common.consts.DuDoongStatic.BAD_REQUEST; +import static band.gosrock.common.consts.DuDoongStatic.FORBIDDEN; +import static band.gosrock.common.consts.DuDoongStatic.NOT_FOUND; + +import band.gosrock.common.annotation.ExplainError; +import band.gosrock.common.dto.ErrorReason; +import band.gosrock.common.exception.BaseErrorCode; +import java.lang.reflect.Field; +import java.util.Objects; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum UserErrorCode implements BaseErrorCode { + @ExplainError("회원가입시에 이미 회원가입한 유저일시 발생하는 오류. 회원가입전엔 항상 register valid check 를 해주세요") + USER_ALREADY_SIGNUP(BAD_REQUEST, "USER_400_1", "이미 회원가입한 유저입니다."), + @ExplainError("정지 처리된 유저일 경우 밣생하는 오류") + USER_FORBIDDEN(FORBIDDEN, "USER_403_1", "접근이 제한된 유저입니다."), + @ExplainError("탈퇴한 유저로 접근하려는 경우") + USER_ALREADY_DELETED(FORBIDDEN, "USER_403_2", "이미 지워진 유저입니다."), + @ExplainError("유저 정보를 찾을 수 없는 경우") + USER_NOT_FOUND(NOT_FOUND, "USER_404_1", "유저 정보를 찾을 수 없습니다."); + + private Integer status; + private String code; + private String reason; + + @Override + public ErrorReason getErrorReason() { + return ErrorReason.builder().reason(reason).code(code).status(status).build(); + } + + @Override + public String getExplainError() throws NoSuchFieldException { + Field field = this.getClass().getField(this.name()); + ExplainError annotation = field.getAnnotation(ExplainError.class); + return Objects.nonNull(annotation) ? annotation.value() : this.getReason(); + } +} diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/user/exception/UserNotFoundException.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/user/exception/UserNotFoundException.java index f105060f..be2417d8 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/user/exception/UserNotFoundException.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/user/exception/UserNotFoundException.java @@ -2,13 +2,12 @@ import band.gosrock.common.exception.DuDoongCodeException; -import band.gosrock.common.exception.ErrorCode; public class UserNotFoundException extends DuDoongCodeException { public static final DuDoongCodeException EXCEPTION = new UserNotFoundException(); private UserNotFoundException() { - super(ErrorCode.USER_NOT_FOUND); + super(UserErrorCode.USER_NOT_FOUND); } } diff --git a/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/tossPayments/exception/PaymentsCancelErrorCode.java b/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/tossPayments/exception/PaymentsCancelErrorCode.java index 87241d17..bda9190b 100644 --- a/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/tossPayments/exception/PaymentsCancelErrorCode.java +++ b/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/tossPayments/exception/PaymentsCancelErrorCode.java @@ -3,8 +3,11 @@ import static org.springframework.http.HttpStatus.BAD_REQUEST; import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR; +import band.gosrock.common.annotation.ExplainError; import band.gosrock.common.dto.ErrorReason; import band.gosrock.common.exception.BaseErrorCode; +import java.lang.reflect.Field; +import java.util.Objects; import lombok.AllArgsConstructor; import lombok.Getter; @@ -74,7 +77,7 @@ public enum PaymentsCancelErrorCode implements BaseErrorCode { BAD_REQUEST.value(), "PAYMENTS_GET_FAILED_PAYMENT_INTERNAL_SYSTEM_PROCESSING", "결제가 완료되지 않았어요. 다시 시도해주세요."); - private int status; + private Integer status; private String code; private String reason; @@ -82,4 +85,11 @@ public enum PaymentsCancelErrorCode implements BaseErrorCode { public ErrorReason getErrorReason() { return ErrorReason.builder().status(status).code(code).reason(reason).build(); } + + @Override + public String getExplainError() throws NoSuchFieldException { + Field field = this.getClass().getField(this.name()); + ExplainError annotation = field.getAnnotation(ExplainError.class); + return Objects.nonNull(annotation) ? annotation.value() : this.getReason(); + } } diff --git a/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/tossPayments/exception/PaymentsConfirmErrorCode.java b/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/tossPayments/exception/PaymentsConfirmErrorCode.java index 9ba94a9b..b6efecd9 100644 --- a/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/tossPayments/exception/PaymentsConfirmErrorCode.java +++ b/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/tossPayments/exception/PaymentsConfirmErrorCode.java @@ -2,8 +2,11 @@ import static org.springframework.http.HttpStatus.BAD_REQUEST; +import band.gosrock.common.annotation.ExplainError; import band.gosrock.common.dto.ErrorReason; import band.gosrock.common.exception.BaseErrorCode; +import java.lang.reflect.Field; +import java.util.Objects; import lombok.AllArgsConstructor; import lombok.Getter; @@ -138,7 +141,7 @@ public enum PaymentsConfirmErrorCode implements BaseErrorCode { "PAYMENTS_CONFIRM_RESTRICTED_TRANSFER_ACCOUNT", "계좌는 등록 후 12시간 뒤부터 결제할 수 있습니다. 관련 정책은 해당 은행으로 문의해주세요."); - private int status; + private Integer status; private String code; private String reason; @@ -146,4 +149,11 @@ public enum PaymentsConfirmErrorCode implements BaseErrorCode { public ErrorReason getErrorReason() { return ErrorReason.builder().status(status).code(code).reason(reason).build(); } + + @Override + public String getExplainError() throws NoSuchFieldException { + Field field = this.getClass().getField(this.name()); + ExplainError annotation = field.getAnnotation(ExplainError.class); + return Objects.nonNull(annotation) ? annotation.value() : this.getReason(); + } } diff --git a/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/tossPayments/exception/PaymentsCreateErrorCode.java b/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/tossPayments/exception/PaymentsCreateErrorCode.java index 05eb819b..bd783aa6 100644 --- a/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/tossPayments/exception/PaymentsCreateErrorCode.java +++ b/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/tossPayments/exception/PaymentsCreateErrorCode.java @@ -2,8 +2,11 @@ import static org.springframework.http.HttpStatus.BAD_REQUEST; +import band.gosrock.common.annotation.ExplainError; import band.gosrock.common.dto.ErrorReason; import band.gosrock.common.exception.BaseErrorCode; +import java.lang.reflect.Field; +import java.util.Objects; import lombok.AllArgsConstructor; import lombok.Getter; @@ -22,7 +25,7 @@ public enum PaymentsCreateErrorCode implements BaseErrorCode { "이미 승인 및 취소가 진행된 중복된 주문번호 입니다. 다른 주문번호로 진행해주세요."), INVALID_REQUEST(BAD_REQUEST.value(), "PAYMENTS_CREATE_INVALID_REQUEST", "잘못된 요청입니다."); - private int status; + private Integer status; private String code; private String reason; @@ -30,4 +33,11 @@ public enum PaymentsCreateErrorCode implements BaseErrorCode { public ErrorReason getErrorReason() { return ErrorReason.builder().status(status).code(code).reason(reason).build(); } + + @Override + public String getExplainError() throws NoSuchFieldException { + Field field = this.getClass().getField(this.name()); + ExplainError annotation = field.getAnnotation(ExplainError.class); + return Objects.nonNull(annotation) ? annotation.value() : this.getReason(); + } } diff --git a/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/tossPayments/exception/PaymentsEnumNotMatchException.java b/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/tossPayments/exception/PaymentsEnumNotMatchException.java index 93fa4cac..9cb397d9 100644 --- a/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/tossPayments/exception/PaymentsEnumNotMatchException.java +++ b/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/tossPayments/exception/PaymentsEnumNotMatchException.java @@ -2,12 +2,12 @@ import band.gosrock.common.exception.DuDoongCodeException; -import band.gosrock.common.exception.ErrorCode; +import band.gosrock.common.exception.GlobalErrorCode; public class PaymentsEnumNotMatchException extends DuDoongCodeException { public static final DuDoongCodeException EXCEPTION = new PaymentsEnumNotMatchException(); private PaymentsEnumNotMatchException() { - super(ErrorCode.TOSS_PAYMENTS_ENUM_NOT_MATCH); + super(GlobalErrorCode.TOSS_PAYMENTS_ENUM_NOT_MATCH); } } diff --git a/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/tossPayments/exception/PaymentsUnHandleException.java b/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/tossPayments/exception/PaymentsUnHandleException.java index ec61fac1..2e9389df 100644 --- a/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/tossPayments/exception/PaymentsUnHandleException.java +++ b/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/tossPayments/exception/PaymentsUnHandleException.java @@ -2,12 +2,12 @@ import band.gosrock.common.exception.DuDoongCodeException; -import band.gosrock.common.exception.ErrorCode; +import band.gosrock.common.exception.GlobalErrorCode; public class PaymentsUnHandleException extends DuDoongCodeException { public static final DuDoongCodeException EXCEPTION = new PaymentsUnHandleException(); private PaymentsUnHandleException() { - super(ErrorCode.TOSS_PAYMENTS_UNHANDLED); + super(GlobalErrorCode.TOSS_PAYMENTS_UNHANDLED); } } diff --git a/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/tossPayments/exception/TransactionGetErrorCode.java b/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/tossPayments/exception/TransactionGetErrorCode.java index 6910fd13..c70912c4 100644 --- a/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/tossPayments/exception/TransactionGetErrorCode.java +++ b/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/tossPayments/exception/TransactionGetErrorCode.java @@ -2,8 +2,11 @@ import static org.springframework.http.HttpStatus.BAD_REQUEST; +import band.gosrock.common.annotation.ExplainError; import band.gosrock.common.dto.ErrorReason; import band.gosrock.common.exception.BaseErrorCode; +import java.lang.reflect.Field; +import java.util.Objects; import lombok.AllArgsConstructor; import lombok.Getter; @@ -23,7 +26,7 @@ public enum TransactionGetErrorCode implements BaseErrorCode { "PAYMENTS_GET_FAILED_PAYMENT_INTERNAL_SYSTEM_PROCESSING", "결제가 완료되지 않았어요. 다시 시도해주세요."); - private int status; + private Integer status; private String code; private String reason; @@ -31,4 +34,11 @@ public enum TransactionGetErrorCode implements BaseErrorCode { public ErrorReason getErrorReason() { return ErrorReason.builder().status(status).code(code).reason(reason).build(); } + + @Override + public String getExplainError() throws NoSuchFieldException { + Field field = this.getClass().getField(this.name()); + ExplainError annotation = field.getAnnotation(ExplainError.class); + return Objects.nonNull(annotation) ? annotation.value() : this.getReason(); + } } From 1339aa9a794a695f079ad5e482ef2a756d566d37 Mon Sep 17 00:00:00 2001 From: Chan Jin Date: Sun, 15 Jan 2023 22:43:16 +0900 Subject: [PATCH 3/4] =?UTF-8?q?refactor=20:=20=EC=B9=B4=EC=B9=B4=EC=98=A4?= =?UTF-8?q?=20code=20=EC=9A=94=EC=B2=AD=20=EC=97=90=EB=9F=AC=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=ED=99=94=20(#128)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat : Kakao error code 추가 * refactor(infra) : KakaoKauthConfig * style :spotless * style : kakao 관련 에러코드 kakao prefix 추가 * style : errorcode 컨벤션 * feat : kakao code api 에 예시 에러응답값 추가 --- .../api/auth/controller/AuthController.java | 5 +- .../example/controller/ExampleController.java | 7 +++ .../order/exception/OrderErrorCode.java | 2 +- .../api/oauth/client/KakaoInfoClient.java | 4 +- .../api/oauth/client/KakaoOauthClient.java | 4 +- ...nOauthConfig.java => KakaoInfoConfig.java} | 8 +-- ...ecoder.java => KakaoInfoErrorDecoder.java} | 2 +- .../api/oauth/config/KakaoKauthConfig.java | 23 +++++++ .../api/oauth/config/KauthErrorDecoder.java | 29 +++++++++ .../oauth/dto/KakaoKauthErrorResponse.java | 30 +++++++++ .../oauth/exception/KakaoKauthErrorCode.java | 61 +++++++++++++++++++ 11 files changed, 164 insertions(+), 11 deletions(-) rename DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/oauth/config/{FeignOauthConfig.java => KakaoInfoConfig.java} (73%) rename DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/oauth/config/{KakaoOauthErrorDecoder.java => KakaoInfoErrorDecoder.java} (94%) create mode 100644 DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/oauth/config/KakaoKauthConfig.java create mode 100644 DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/oauth/config/KauthErrorDecoder.java create mode 100644 DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/oauth/dto/KakaoKauthErrorResponse.java create mode 100644 DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/oauth/exception/KakaoKauthErrorCode.java diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/auth/controller/AuthController.java b/DuDoong-Api/src/main/java/band/gosrock/api/auth/controller/AuthController.java index 8772212e..be8ff599 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/auth/controller/AuthController.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/auth/controller/AuthController.java @@ -14,7 +14,9 @@ import band.gosrock.api.auth.service.RegisterUseCase; import band.gosrock.api.auth.service.WithDrawUseCase; import band.gosrock.api.auth.service.helper.CookieGenerateHelper; +import band.gosrock.common.annotation.ApiErrorCodeExample; import band.gosrock.common.annotation.DevelopOnlyApi; +import band.gosrock.infrastructure.outer.api.oauth.exception.KakaoKauthErrorCode; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; @@ -81,9 +83,10 @@ public OauthLoginLinkResponse getKakaoOauthLink( return registerUseCase.getKaKaoOauthLink(referer); } - @Operation(summary = "code 요청받는 핸들러 클라이언트가 몰라도됩니다.") + @Operation(summary = "카카오 code 요청받는 곳입니다. referer,host는 건들이지 말아주세요!안보내셔도됩니다.") @Tag(name = "카카오 oauth") @GetMapping("/oauth/kakao") + @ApiErrorCodeExample(KakaoKauthErrorCode.class) public OauthTokenResponse getCredentialFromKaKao( @RequestParam("code") String code, @RequestHeader(value = "referer", required = false) String referer, diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/example/controller/ExampleController.java b/DuDoong-Api/src/main/java/band/gosrock/api/example/controller/ExampleController.java index 47964300..70ef05a8 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/example/controller/ExampleController.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/example/controller/ExampleController.java @@ -11,6 +11,7 @@ import band.gosrock.common.exception.GlobalErrorCode; import band.gosrock.domain.domains.order.exception.OrderErrorCode; import band.gosrock.domain.domains.user.exception.UserErrorCode; +import band.gosrock.infrastructure.outer.api.oauth.exception.KakaoKauthErrorCode; import band.gosrock.infrastructure.outer.api.tossPayments.exception.PaymentsCancelErrorCode; import band.gosrock.infrastructure.outer.api.tossPayments.exception.PaymentsConfirmErrorCode; import band.gosrock.infrastructure.outer.api.tossPayments.exception.PaymentsCreateErrorCode; @@ -64,6 +65,12 @@ public void getUserErrorCode() {} @ApiErrorCodeExample(OrderErrorCode.class) public void getOrderErrorCode() {} + @GetMapping("/kakao") + @DevelopOnlyApi + @Operation(summary = "카카오 에러 코드 나열") + @ApiErrorCodeExample(KakaoKauthErrorCode.class) + public void getKakaoKauthErrorCode() {} + @GetMapping("/toss/create") @DevelopOnlyApi @Operation(summary = "토스 주문 생성 관련 에러 코드 나열") diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/OrderErrorCode.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/OrderErrorCode.java index c35a444a..38352e91 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/OrderErrorCode.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/exception/OrderErrorCode.java @@ -26,7 +26,7 @@ public enum OrderErrorCode implements BaseErrorCode { ORDER_NOT_APPROVAL(BAD_REQUEST, "Order_400_7", "승인 주문이 아닙니다."), ORDER_NOT_PAYMENT(BAD_REQUEST, "Order_400_8", "결제 주문이 아닙니다."), - ORDER_NOT_REFUND_DATE(BAD_REQUEST, "Order-400-9", "환불을 할 수 있는 기한을 지났습니다."), + ORDER_NOT_REFUND_DATE(BAD_REQUEST, "Order_400_9", "환불을 할 수 있는 기한을 지났습니다."), ORDER_NOT_FOUND(NOT_FOUND, "Order_404_1", "주문을 찾을 수 없습니다."), ORDER_LINE_NOT_FOUND(NOT_FOUND, "Order_404_2", "주문 라인을 찾을 수 없습니다."); diff --git a/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/oauth/client/KakaoInfoClient.java b/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/oauth/client/KakaoInfoClient.java index 6d6b2d31..7edff8f9 100644 --- a/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/oauth/client/KakaoInfoClient.java +++ b/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/oauth/client/KakaoInfoClient.java @@ -1,7 +1,7 @@ package band.gosrock.infrastructure.outer.api.oauth.client; -import band.gosrock.infrastructure.outer.api.oauth.config.FeignOauthConfig; +import band.gosrock.infrastructure.outer.api.oauth.config.KakaoInfoConfig; import band.gosrock.infrastructure.outer.api.oauth.dto.KakaoInformationResponse; import band.gosrock.infrastructure.outer.api.oauth.dto.UnlinkKaKaoTarget; import org.springframework.cloud.openfeign.FeignClient; @@ -13,7 +13,7 @@ @FeignClient( name = "KakaoInfoClient", url = "https://kapi.kakao.com", - configuration = FeignOauthConfig.class) + configuration = KakaoInfoConfig.class) public interface KakaoInfoClient { @GetMapping("/v2/user/me") diff --git a/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/oauth/client/KakaoOauthClient.java b/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/oauth/client/KakaoOauthClient.java index b9d45f07..b8da6fca 100644 --- a/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/oauth/client/KakaoOauthClient.java +++ b/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/oauth/client/KakaoOauthClient.java @@ -1,7 +1,7 @@ package band.gosrock.infrastructure.outer.api.oauth.client; -import band.gosrock.infrastructure.outer.api.oauth.config.FeignOauthConfig; +import band.gosrock.infrastructure.outer.api.oauth.config.KakaoKauthConfig; import band.gosrock.infrastructure.outer.api.oauth.dto.KakaoTokenResponse; import band.gosrock.infrastructure.outer.api.oauth.dto.OIDCPublicKeysResponse; import org.springframework.cache.annotation.Cacheable; @@ -13,7 +13,7 @@ @FeignClient( name = "KakaoAuthClient", url = "https://kauth.kakao.com", - configuration = FeignOauthConfig.class) + configuration = KakaoKauthConfig.class) public interface KakaoOauthClient { @PostMapping( diff --git a/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/oauth/config/FeignOauthConfig.java b/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/oauth/config/KakaoInfoConfig.java similarity index 73% rename from DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/oauth/config/FeignOauthConfig.java rename to DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/oauth/config/KakaoInfoConfig.java index 87ac58df..9a518939 100644 --- a/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/oauth/config/FeignOauthConfig.java +++ b/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/oauth/config/KakaoInfoConfig.java @@ -7,13 +7,13 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Import; -@Import(KakaoOauthErrorDecoder.class) -public class FeignOauthConfig { +@Import(KakaoInfoErrorDecoder.class) +public class KakaoInfoConfig { @Bean @ConditionalOnMissingBean(value = ErrorDecoder.class) - public KakaoOauthErrorDecoder commonFeignErrorDecoder() { - return new KakaoOauthErrorDecoder(); + public KakaoInfoErrorDecoder commonFeignErrorDecoder() { + return new KakaoInfoErrorDecoder(); } @Bean diff --git a/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/oauth/config/KakaoOauthErrorDecoder.java b/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/oauth/config/KakaoInfoErrorDecoder.java similarity index 94% rename from DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/oauth/config/KakaoOauthErrorDecoder.java rename to DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/oauth/config/KakaoInfoErrorDecoder.java index 1587f2c0..d19fbcf4 100644 --- a/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/oauth/config/KakaoOauthErrorDecoder.java +++ b/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/oauth/config/KakaoInfoErrorDecoder.java @@ -9,7 +9,7 @@ import feign.Response; import feign.codec.ErrorDecoder; -public class KakaoOauthErrorDecoder implements ErrorDecoder { +public class KakaoInfoErrorDecoder implements ErrorDecoder { @Override public Exception decode(String methodKey, Response response) { diff --git a/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/oauth/config/KakaoKauthConfig.java b/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/oauth/config/KakaoKauthConfig.java new file mode 100644 index 00000000..779531ac --- /dev/null +++ b/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/oauth/config/KakaoKauthConfig.java @@ -0,0 +1,23 @@ +package band.gosrock.infrastructure.outer.api.oauth.config; + + +import feign.codec.Encoder; +import feign.codec.ErrorDecoder; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Import; + +@Import(KauthErrorDecoder.class) +public class KakaoKauthConfig { + + @Bean + @ConditionalOnMissingBean(value = ErrorDecoder.class) + public KauthErrorDecoder commonFeignErrorDecoder() { + return new KauthErrorDecoder(); + } + + @Bean + Encoder formEncoder() { + return new feign.form.FormEncoder(); + } +} diff --git a/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/oauth/config/KauthErrorDecoder.java b/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/oauth/config/KauthErrorDecoder.java new file mode 100644 index 00000000..ba7cbc93 --- /dev/null +++ b/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/oauth/config/KauthErrorDecoder.java @@ -0,0 +1,29 @@ +package band.gosrock.infrastructure.outer.api.oauth.config; + + +import band.gosrock.common.dto.ErrorReason; +import band.gosrock.common.exception.DuDoongDynamicException; +import band.gosrock.infrastructure.outer.api.oauth.dto.KakaoKauthErrorResponse; +import band.gosrock.infrastructure.outer.api.oauth.exception.KakaoKauthErrorCode; +import feign.Response; +import feign.codec.ErrorDecoder; + +public class KauthErrorDecoder implements ErrorDecoder { + @Override + public Exception decode(String methodKey, Response response) { + KakaoKauthErrorResponse body = KakaoKauthErrorResponse.from(response); + + try { + KakaoKauthErrorCode kakaoKauthErrorCode = + KakaoKauthErrorCode.valueOf(body.getErrorCode()); + ErrorReason errorReason = kakaoKauthErrorCode.getErrorReason(); + throw new DuDoongDynamicException( + errorReason.getStatus(), errorReason.getCode(), errorReason.getReason()); + } catch (IllegalArgumentException e) { + KakaoKauthErrorCode koeInvalidRequest = KakaoKauthErrorCode.KOE_INVALID_REQUEST; + ErrorReason errorReason = koeInvalidRequest.getErrorReason(); + throw new DuDoongDynamicException( + errorReason.getStatus(), errorReason.getCode(), errorReason.getReason()); + } + } +} diff --git a/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/oauth/dto/KakaoKauthErrorResponse.java b/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/oauth/dto/KakaoKauthErrorResponse.java new file mode 100644 index 00000000..32ad09b9 --- /dev/null +++ b/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/oauth/dto/KakaoKauthErrorResponse.java @@ -0,0 +1,30 @@ +package band.gosrock.infrastructure.outer.api.oauth.dto; + + +import band.gosrock.infrastructure.outer.api.tossPayments.exception.PaymentsUnHandleException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.PropertyNamingStrategies.SnakeCaseStrategy; +import com.fasterxml.jackson.databind.annotation.JsonNaming; +import feign.Response; +import java.io.IOException; +import java.io.InputStream; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@JsonNaming(SnakeCaseStrategy.class) +public class KakaoKauthErrorResponse { + private String error; + private String errorCode; + private String errorDescription; + + public static KakaoKauthErrorResponse from(Response response) { + try (InputStream bodyIs = response.body().asInputStream()) { + ObjectMapper mapper = new ObjectMapper(); + return mapper.readValue(bodyIs, KakaoKauthErrorResponse.class); + } catch (IOException e) { + throw PaymentsUnHandleException.EXCEPTION; + } + } +} diff --git a/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/oauth/exception/KakaoKauthErrorCode.java b/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/oauth/exception/KakaoKauthErrorCode.java new file mode 100644 index 00000000..d072d1af --- /dev/null +++ b/DuDoong-Infrastructure/src/main/java/band/gosrock/infrastructure/outer/api/oauth/exception/KakaoKauthErrorCode.java @@ -0,0 +1,61 @@ +package band.gosrock.infrastructure.outer.api.oauth.exception; + +import static band.gosrock.common.consts.DuDoongStatic.BAD_REQUEST; + +import band.gosrock.common.annotation.ExplainError; +import band.gosrock.common.dto.ErrorReason; +import band.gosrock.common.exception.BaseErrorCode; +import java.lang.reflect.Field; +import java.util.Objects; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum KakaoKauthErrorCode implements BaseErrorCode { + KOE101(BAD_REQUEST, "KAKAO_KOE101", "invalid_client", "잘못된 앱 키 타입을 사용하거나 앱 키에 오타가 있을 경우"), + KOE009(BAD_REQUEST, "KAKAO_KOE009", "misconfigured", "등록되지 않은 플랫폼에서 액세스 토큰을 요청 하는 경우"), + KOE010( + BAD_REQUEST, + "KAKAO_KOE101", + "invalid_client", + "클라이언트 시크릿(Client secret) 기능을 사용하는 앱에서 토큰 요청 시 client_secret 값을 전달하지 않거나 정확하지 않은 값을 전달하는 경우"), + KOE303( + BAD_REQUEST, + "KAKAO_KOE303", + "invalid_grant", + "인가 코드 요청 시 사용한 redirect_uri와 액세스 토큰 요청 시 사용한 redirect_uri가 다른 경우"), + KOE319(BAD_REQUEST, "KAKAO_KOE319", "invalid_grant", "토큰 갱신 요청 시 리프레시 토큰을 전달하지 않는 경우"), + KOE320( + BAD_REQUEST, + "KAKAO_KOE320", + "invalid_grant", + "동일한 인가 코드를 두 번 이상 사용하거나, 이미 만료된 인가 코드를 사용한 경우, 혹은 인가 코드를 찾을 수 없는 경우"), + KOE322( + BAD_REQUEST, + "KAKAO_KOE322", + "invalid_grant", + "refresh_token을 찾을 수 없거나 이미 만료된 리프레시 토큰을 사용한 경우"), + KOE_INVALID_REQUEST(BAD_REQUEST, "KAKAO_KOE_INVALID_REQUEST", "invalid_request", "잘못된 요청인 경우"), + KOE400(BAD_REQUEST, "KAKAO_KOE400", "invalid_token", "ID 토큰 값이 전달되지 않았거나 올바른 형식이 아닌 ID 토큰인 경우"), + KOE401(BAD_REQUEST, "KAKAO_KOE401", "invalid_token", "ID 토큰을 발급한 인증 기관(iss)이 카카오 인증 서버"), + KOE402(BAD_REQUEST, "KAKAO_KOE402", "invalid_token", "서명이 올바르지 않아 유효한 ID 토큰이 아닌 경우"), + KOE403(BAD_REQUEST, "KAKAO_KOE403", "invalid_token", "만료된 ID 토큰인 경우"); + + private Integer status; + private String errorCode; + private String error; + private String reason; + + @Override + public ErrorReason getErrorReason() { + return ErrorReason.builder().status(status).code(errorCode).reason(reason).build(); + } + + @Override + public String getExplainError() throws NoSuchFieldException { + Field field = this.getClass().getField(this.name()); + ExplainError annotation = field.getAnnotation(ExplainError.class); + return Objects.nonNull(annotation) ? annotation.value() : this.getReason(); + } +} From 69b037cc69c88f4542bb1ed13fd8aa1e0c92bc90 Mon Sep 17 00:00:00 2001 From: Chan Jin Date: Sun, 15 Jan 2023 22:44:41 +0900 Subject: [PATCH 4/4] =?UTF-8?q?refactor=20:=20=EC=97=90=EB=9F=AC=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=EB=B3=84=EB=A1=9C=20?= =?UTF-8?q?=EB=B6=84=ED=95=A0=20=20(#129)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor : cart errorcode 분리 * refactor : event, issuedTicket 에러코드 분리 * feat : api example 에 cart issuedTicket 예시에러 추가 --- .../example/controller/ExampleController.java | 14 ++++++++ .../common/exception/GlobalErrorCode.java | 10 +----- .../domains/cart/exception/CartErrorCode.java | 34 ++++++++++++++++++ .../cart/exception/CartNotFoundException.java | 3 +- .../event/exception/EventErrorCode.java | 34 ++++++++++++++++++ .../exception/EventNotFoundException.java | 3 +- .../exception/HostNotAuthEventException.java | 3 +- .../exception/IssuedTicketErrorCode.java | 36 +++++++++++++++++++ .../IssuedTicketNotFoundException.java | 3 +- .../IssuedTicketUserNotMatchedException.java | 3 +- 10 files changed, 124 insertions(+), 19 deletions(-) create mode 100644 DuDoong-Domain/src/main/java/band/gosrock/domain/domains/cart/exception/CartErrorCode.java create mode 100644 DuDoong-Domain/src/main/java/band/gosrock/domain/domains/event/exception/EventErrorCode.java create mode 100644 DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/exception/IssuedTicketErrorCode.java diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/example/controller/ExampleController.java b/DuDoong-Api/src/main/java/band/gosrock/api/example/controller/ExampleController.java index 70ef05a8..97e2c18f 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/example/controller/ExampleController.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/example/controller/ExampleController.java @@ -9,6 +9,8 @@ import band.gosrock.common.annotation.ApiErrorExceptionsExample; import band.gosrock.common.annotation.DevelopOnlyApi; import band.gosrock.common.exception.GlobalErrorCode; +import band.gosrock.domain.domains.cart.exception.CartErrorCode; +import band.gosrock.domain.domains.issuedTicket.exception.IssuedTicketErrorCode; import band.gosrock.domain.domains.order.exception.OrderErrorCode; import band.gosrock.domain.domains.user.exception.UserErrorCode; import band.gosrock.infrastructure.outer.api.oauth.exception.KakaoKauthErrorCode; @@ -65,6 +67,18 @@ public void getUserErrorCode() {} @ApiErrorCodeExample(OrderErrorCode.class) public void getOrderErrorCode() {} + @GetMapping("/cart") + @DevelopOnlyApi + @Operation(summary = "주문 도메인 관련 에러 코드 나열") + @ApiErrorCodeExample(CartErrorCode.class) + public void getCartErrorCode() {} + + @GetMapping("/issuedTicket") + @DevelopOnlyApi + @Operation(summary = "주문 도메인 관련 에러 코드 나열") + @ApiErrorCodeExample(IssuedTicketErrorCode.class) + public void getIssuedTicketErrorCode() {} + @GetMapping("/kakao") @DevelopOnlyApi @Operation(summary = "카카오 에러 코드 나열") diff --git a/DuDoong-Common/src/main/java/band/gosrock/common/exception/GlobalErrorCode.java b/DuDoong-Common/src/main/java/band/gosrock/common/exception/GlobalErrorCode.java index 957e84a0..2a67a543 100644 --- a/DuDoong-Common/src/main/java/band/gosrock/common/exception/GlobalErrorCode.java +++ b/DuDoong-Common/src/main/java/band/gosrock/common/exception/GlobalErrorCode.java @@ -48,15 +48,7 @@ public enum GlobalErrorCode implements BaseErrorCode { TOSS_PAYMENTS_UNHANDLED(INTERNAL_SERVER, "PAYMENTS_INTERNAL_SERVER", "관리자에게 연락부탁드려요."), BAD_LOCK_IDENTIFIER(500, "AOP_500_1", "락의 키값이 잘못 세팅 되었습니다"), BAD_FILE_EXTENSION(BAD_REQUEST, "FILE_400_1", "파일 확장자가 잘못 되었습니다."), - CART_NOT_FOUND(NOT_FOUND, "Cart_404_1", "Cart Not Found."), - - ISSUED_TICKET_NOT_FOUND(NOT_FOUND, "IssuedTicket_404_1", "IssuedTicket Not Found"), - ISSUED_TICKET_NOT_MATCHED_USER( - FORBIDDEN, "IssuedTicket_403_1", "IssuedTicket User Not Matched"), - TOSS_PAYMENTS_ENUM_NOT_MATCH(INTERNAL_SERVER, "INFRA_500_1", "토스페이먼츠 이넘값 관련 매칭 안된 문제입니다."), - - EVENT_NOT_FOUND(NOT_FOUND, "Event_404_1", "Event Not Found"), - HOST_NOT_AUTH_EVENT(FORBIDDEN, "Event_403_1", "Host Not Auth Event"); + TOSS_PAYMENTS_ENUM_NOT_MATCH(INTERNAL_SERVER, "INFRA_500_1", "토스페이먼츠 이넘값 관련 매칭 안된 문제입니다."); private Integer status; private String code; private String reason; diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/cart/exception/CartErrorCode.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/cart/exception/CartErrorCode.java new file mode 100644 index 00000000..e0ea472f --- /dev/null +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/cart/exception/CartErrorCode.java @@ -0,0 +1,34 @@ +package band.gosrock.domain.domains.cart.exception; + +import static band.gosrock.common.consts.DuDoongStatic.NOT_FOUND; + +import band.gosrock.common.annotation.ExplainError; +import band.gosrock.common.dto.ErrorReason; +import band.gosrock.common.exception.BaseErrorCode; +import java.lang.reflect.Field; +import java.util.Objects; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum CartErrorCode implements BaseErrorCode { + @ExplainError("id로 카트를 찾을 때 못 찾으면 발생하는 오류") + CART_NOT_FOUND(NOT_FOUND, "Cart_404_1", "장바구니를 찾을 수 없습니다."); + + private Integer status; + private String code; + private String reason; + + @Override + public ErrorReason getErrorReason() { + return ErrorReason.builder().reason(reason).code(code).status(status).build(); + } + + @Override + public String getExplainError() throws NoSuchFieldException { + Field field = this.getClass().getField(this.name()); + ExplainError annotation = field.getAnnotation(ExplainError.class); + return Objects.nonNull(annotation) ? annotation.value() : this.getReason(); + } +} diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/cart/exception/CartNotFoundException.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/cart/exception/CartNotFoundException.java index 335e5f0b..6cd6ccfd 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/cart/exception/CartNotFoundException.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/cart/exception/CartNotFoundException.java @@ -2,13 +2,12 @@ import band.gosrock.common.exception.DuDoongCodeException; -import band.gosrock.common.exception.GlobalErrorCode; public class CartNotFoundException extends DuDoongCodeException { public static final DuDoongCodeException EXCEPTION = new CartNotFoundException(); private CartNotFoundException() { - super(GlobalErrorCode.CART_NOT_FOUND); + super(CartErrorCode.CART_NOT_FOUND); } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/event/exception/EventErrorCode.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/event/exception/EventErrorCode.java new file mode 100644 index 00000000..5f29b24f --- /dev/null +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/event/exception/EventErrorCode.java @@ -0,0 +1,34 @@ +package band.gosrock.domain.domains.event.exception; + +import static band.gosrock.common.consts.DuDoongStatic.BAD_REQUEST; +import static band.gosrock.common.consts.DuDoongStatic.NOT_FOUND; + +import band.gosrock.common.annotation.ExplainError; +import band.gosrock.common.dto.ErrorReason; +import band.gosrock.common.exception.BaseErrorCode; +import java.lang.reflect.Field; +import java.util.Objects; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum EventErrorCode implements BaseErrorCode { + EVENT_NOT_FOUND(NOT_FOUND, "Event_404_1", "이벤트를 찾을 수 없습니다."), + HOST_NOT_AUTH_EVENT(BAD_REQUEST, "Event_400_1", "Host Not Auth Event"); + private Integer status; + private String code; + private String reason; + + @Override + public ErrorReason getErrorReason() { + return ErrorReason.builder().reason(reason).code(code).status(status).build(); + } + + @Override + public String getExplainError() throws NoSuchFieldException { + Field field = this.getClass().getField(this.name()); + ExplainError annotation = field.getAnnotation(ExplainError.class); + return Objects.nonNull(annotation) ? annotation.value() : this.getReason(); + } +} diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/event/exception/EventNotFoundException.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/event/exception/EventNotFoundException.java index 0d9c5935..208d4198 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/event/exception/EventNotFoundException.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/event/exception/EventNotFoundException.java @@ -2,13 +2,12 @@ import band.gosrock.common.exception.DuDoongCodeException; -import band.gosrock.common.exception.GlobalErrorCode; public class EventNotFoundException extends DuDoongCodeException { public static final DuDoongCodeException EXCEPTION = new EventNotFoundException(); private EventNotFoundException() { - super(GlobalErrorCode.EVENT_NOT_FOUND); + super(EventErrorCode.EVENT_NOT_FOUND); } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/event/exception/HostNotAuthEventException.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/event/exception/HostNotAuthEventException.java index 4714df78..d264588d 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/event/exception/HostNotAuthEventException.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/event/exception/HostNotAuthEventException.java @@ -2,13 +2,12 @@ import band.gosrock.common.exception.DuDoongCodeException; -import band.gosrock.common.exception.GlobalErrorCode; public class HostNotAuthEventException extends DuDoongCodeException { public static final DuDoongCodeException EXCEPTION = new HostNotAuthEventException(); private HostNotAuthEventException() { - super(GlobalErrorCode.HOST_NOT_AUTH_EVENT); + super(EventErrorCode.HOST_NOT_AUTH_EVENT); } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/exception/IssuedTicketErrorCode.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/exception/IssuedTicketErrorCode.java new file mode 100644 index 00000000..42b8e774 --- /dev/null +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/exception/IssuedTicketErrorCode.java @@ -0,0 +1,36 @@ +package band.gosrock.domain.domains.issuedTicket.exception; + +import static band.gosrock.common.consts.DuDoongStatic.BAD_REQUEST; +import static band.gosrock.common.consts.DuDoongStatic.NOT_FOUND; + +import band.gosrock.common.annotation.ExplainError; +import band.gosrock.common.dto.ErrorReason; +import band.gosrock.common.exception.BaseErrorCode; +import java.lang.reflect.Field; +import java.util.Objects; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum IssuedTicketErrorCode implements BaseErrorCode { + ISSUED_TICKET_NOT_FOUND(NOT_FOUND, "IssuedTicket_404_1", "IssuedTicket Not Found"), + ISSUED_TICKET_NOT_MATCHED_USER( + BAD_REQUEST, "IssuedTicket_400_1", "IssuedTicket User Not Matched"); + + private Integer status; + private String code; + private String reason; + + @Override + public ErrorReason getErrorReason() { + return ErrorReason.builder().reason(reason).code(code).status(status).build(); + } + + @Override + public String getExplainError() throws NoSuchFieldException { + Field field = this.getClass().getField(this.name()); + ExplainError annotation = field.getAnnotation(ExplainError.class); + return Objects.nonNull(annotation) ? annotation.value() : this.getReason(); + } +} diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/exception/IssuedTicketNotFoundException.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/exception/IssuedTicketNotFoundException.java index 4ea56950..c4485c81 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/exception/IssuedTicketNotFoundException.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/exception/IssuedTicketNotFoundException.java @@ -2,13 +2,12 @@ import band.gosrock.common.exception.DuDoongCodeException; -import band.gosrock.common.exception.GlobalErrorCode; public class IssuedTicketNotFoundException extends DuDoongCodeException { public static final DuDoongCodeException EXCEPTION = new IssuedTicketNotFoundException(); private IssuedTicketNotFoundException() { - super(GlobalErrorCode.ISSUED_TICKET_NOT_FOUND); + super(IssuedTicketErrorCode.ISSUED_TICKET_NOT_FOUND); } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/exception/IssuedTicketUserNotMatchedException.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/exception/IssuedTicketUserNotMatchedException.java index a7114089..ffa6b2e2 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/exception/IssuedTicketUserNotMatchedException.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/exception/IssuedTicketUserNotMatchedException.java @@ -2,13 +2,12 @@ import band.gosrock.common.exception.DuDoongCodeException; -import band.gosrock.common.exception.GlobalErrorCode; public class IssuedTicketUserNotMatchedException extends DuDoongCodeException { public static final DuDoongCodeException EXCEPTION = new IssuedTicketUserNotMatchedException(); private IssuedTicketUserNotMatchedException() { - super(GlobalErrorCode.ISSUED_TICKET_NOT_MATCHED_USER); + super(IssuedTicketErrorCode.ISSUED_TICKET_NOT_MATCHED_USER); } }