From fa8bab4821732a2330c17bd1487e310e9599d9a5 Mon Sep 17 00:00:00 2001 From: kim-wonjin Date: Sat, 18 Feb 2023 22:44:52 +0900 Subject: [PATCH 1/3] =?UTF-8?q?refactor(ticketItem)=20:=20=EB=91=90?= =?UTF-8?q?=EB=91=A5=ED=8B=B0=EC=BC=93=20=EA=B3=84=EC=A2=8C=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/request/CreateTicketItemRequest.java | 12 +++++++-- .../dto/response/TicketItemResponse.java | 5 ++++ .../ticketItem/mapper/TicketItemMapper.java | 2 ++ .../domain/common/vo/AccountInfoVo.java | 25 +++++++++++++++++++ .../ticket_item/domain/TicketItem.java | 23 ++++++++++++++--- .../exception/EmptyAccountInfoException.java | 13 ++++++++++ .../EmptyAccountNumberException.java | 13 ---------- .../exception/TicketItemErrorCode.java | 2 +- 8 files changed, 76 insertions(+), 19 deletions(-) create mode 100644 DuDoong-Domain/src/main/java/band/gosrock/domain/common/vo/AccountInfoVo.java create mode 100644 DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/exception/EmptyAccountInfoException.java delete mode 100644 DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/exception/EmptyAccountNumberException.java diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/dto/request/CreateTicketItemRequest.java b/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/dto/request/CreateTicketItemRequest.java index ce78efa7..fb1092f1 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/dto/request/CreateTicketItemRequest.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/dto/request/CreateTicketItemRequest.java @@ -28,9 +28,17 @@ public class CreateTicketItemRequest { private String description; @Nullable - @Schema(nullable = true, example = "신한은행 110-123-1234567") + @Schema(nullable = true, example = "신한은행") + private String bankName; + + @Nullable + @Schema(nullable = true, example = "110-123-1234567") private String accountNumber; + @Nullable + @Schema(nullable = true, example = "김원진") + private String accountHolder; + @NotNull @Schema(defaultValue = "0", nullable = false, example = "4000") private Long price; @@ -39,7 +47,7 @@ public class CreateTicketItemRequest { @Schema(nullable = false, example = "100") private Long supplyCount; - @Schema(nullable = false, defaultValue = "선착순") + @Schema(nullable = false, defaultValue = "승인") @Enum(message = "선착순, 승인만 허용됩니다") private TicketType approveType; diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/dto/response/TicketItemResponse.java b/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/dto/response/TicketItemResponse.java index a959195e..8c28c028 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/dto/response/TicketItemResponse.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/dto/response/TicketItemResponse.java @@ -1,6 +1,7 @@ package band.gosrock.api.ticketItem.dto.response; +import band.gosrock.domain.common.vo.AccountInfoVo; import band.gosrock.domain.common.vo.Money; import band.gosrock.domain.domains.ticket_item.domain.TicketItem; import band.gosrock.domain.domains.ticket_item.domain.TicketPayType; @@ -42,6 +43,9 @@ public class TicketItemResponse { @Schema(description = "재고공개 여부") private final Boolean isQuantityPublic; + @Schema(description = "계좌 정보") + private final AccountInfoVo accountInfo; + public static TicketItemResponse from(TicketItem ticketItem, Boolean isAdmin) { return TicketItemResponse.builder() @@ -58,6 +62,7 @@ public static TicketItemResponse from(TicketItem ticketItem, Boolean isAdmin) { ? ticketItem.getQuantity() : null) .isQuantityPublic(ticketItem.getIsQuantityPublic()) + .accountInfo(ticketItem.toAccountInfoVo()) .build(); } } diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/mapper/TicketItemMapper.java b/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/mapper/TicketItemMapper.java index 29ea0b98..e8cf2370 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/mapper/TicketItemMapper.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/mapper/TicketItemMapper.java @@ -33,7 +33,9 @@ public TicketItem toTicketItem(CreateTicketItemRequest createTicketItemRequest, .supplyCount(createTicketItemRequest.getSupplyCount()) .purchaseLimit(createTicketItemRequest.getPurchaseLimit()) .type(createTicketItemRequest.getApproveType()) + .bankName(createTicketItemRequest.getBankName()) .accountNumber(createTicketItemRequest.getAccountNumber()) + .accountHolder(createTicketItemRequest.getAccountHolder()) .isQuantityPublic(createTicketItemRequest.getIsQuantityPublic()) .isSellable(true) .event(event) diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/common/vo/AccountInfoVo.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/common/vo/AccountInfoVo.java new file mode 100644 index 00000000..0d8ae005 --- /dev/null +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/common/vo/AccountInfoVo.java @@ -0,0 +1,25 @@ +package band.gosrock.domain.common.vo; + + +import band.gosrock.domain.domains.ticket_item.domain.TicketItem; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class AccountInfoVo { + + private final String bankName; + + private final String accountNumber; + + private final String accountHolder; + + public static AccountInfoVo from(TicketItem ticketItem) { + return AccountInfoVo.builder() + .bankName(ticketItem.getBankName()) + .accountNumber(ticketItem.getAccountNumber()) + .accountHolder(ticketItem.getAccountHolder()) + .build(); + } +} 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 400e1268..6bc1800e 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 @@ -2,6 +2,7 @@ import band.gosrock.domain.common.model.BaseTimeEntity; +import band.gosrock.domain.common.vo.AccountInfoVo; import band.gosrock.domain.common.vo.Money; import band.gosrock.domain.common.vo.RefundInfoVo; import band.gosrock.domain.domains.event.domain.Event; @@ -53,9 +54,15 @@ public class TicketItem extends BaseTimeEntity { @Enumerated(EnumType.STRING) private TicketType type; + // 은행명 + private String bankName; + // 계좌번호 private String accountNumber; + // 예금주 + private String accountHolder; + // 재고 공개 여부 private Boolean isQuantityPublic; @@ -90,7 +97,9 @@ public TicketItem( Long supplyCount, Long purchaseLimit, TicketType type, + String bankName, String accountNumber, + String accountHolder, Boolean isQuantityPublic, Boolean isSellable, LocalDateTime saleStartAt, @@ -104,7 +113,9 @@ public TicketItem( this.supplyCount = supplyCount; this.purchaseLimit = purchaseLimit; this.type = type; + this.bankName = bankName; this.accountNumber = accountNumber; + this.accountHolder = accountHolder; this.isQuantityPublic = isQuantityPublic; this.isSellable = isSellable; this.saleStartAt = saleStartAt; @@ -149,13 +160,15 @@ public void validateEventId(Long eventId) { } public void validateTicketPayType(Boolean isPartner) { - // 두둥티켓은 무조건 승인 + 계좌번호 필요 + // 두둥티켓은 무조건 승인 + 계좌정보 필요 if (this.payType.equals(TicketPayType.DUDOONG_TICKET)) { if (!this.type.equals(TicketType.APPROVAL)) { throw InvalidTicketTypeException.EXCEPTION; } - if (StringUtils.isEmpty(this.accountNumber)) { - throw EmptyAccountNumberException.EXCEPTION; + if (StringUtils.isEmpty(this.accountNumber) + || StringUtils.isEmpty(this.accountHolder) + || StringUtils.isEmpty(this.bankName)) { + throw EmptyAccountInfoException.EXCEPTION; } } // 유료티켓은 무조건 선착순 + 제휴 확인 + 1000원 이상 @@ -178,6 +191,10 @@ else if (this.payType.equals(TicketPayType.PRICE_TICKET)) { } } + public AccountInfoVo toAccountInfoVo() { + return AccountInfoVo.from(this); + } + public RefundInfoVo getRefundInfoVo() { return event.toRefundInfoVo(); } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/exception/EmptyAccountInfoException.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/exception/EmptyAccountInfoException.java new file mode 100644 index 00000000..c11589d2 --- /dev/null +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/exception/EmptyAccountInfoException.java @@ -0,0 +1,13 @@ +package band.gosrock.domain.domains.ticket_item.exception; + + +import band.gosrock.common.exception.DuDoongCodeException; + +public class EmptyAccountInfoException extends DuDoongCodeException { + + public static final DuDoongCodeException EXCEPTION = new EmptyAccountInfoException(); + + private EmptyAccountInfoException() { + super(TicketItemErrorCode.EMPTY_ACCOUT_INFO); + } +} diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/exception/EmptyAccountNumberException.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/exception/EmptyAccountNumberException.java deleted file mode 100644 index d46df006..00000000 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/exception/EmptyAccountNumberException.java +++ /dev/null @@ -1,13 +0,0 @@ -package band.gosrock.domain.domains.ticket_item.exception; - - -import band.gosrock.common.exception.DuDoongCodeException; - -public class EmptyAccountNumberException extends DuDoongCodeException { - - public static final DuDoongCodeException EXCEPTION = new EmptyAccountNumberException(); - - private EmptyAccountNumberException() { - super(TicketItemErrorCode.EMPTY_ACCOUT_NUMBER); - } -} diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/exception/TicketItemErrorCode.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/exception/TicketItemErrorCode.java index 03c43e66..ef657b42 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/exception/TicketItemErrorCode.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/exception/TicketItemErrorCode.java @@ -45,7 +45,7 @@ public enum TicketItemErrorCode implements BaseErrorCode { @ExplainError("이미 적용되어 옵션그룹 삭제가 불가능할 경우 발생하는 오류입니다.") FORBIDDEN_OPTION_GROUP_DELETE(BAD_REQUEST, "Option_Group_400_2", "옵션그룹 삭제가 불가능한 상태입니다."), @ExplainError("두둥티켓 타입에 계좌번호가 입력되지 않았을 경우 발생하는 오류입니다.") - EMPTY_ACCOUT_NUMBER(BAD_REQUEST, "Ticket_Item_400_8", "계좌번호가 필요합니다."), + EMPTY_ACCOUT_INFO(BAD_REQUEST, "Ticket_Item_400_8", "계좌정보가 필요합니다."), @ExplainError("티켓 지불방식과 승인방식이 불가능한 조합일때 발생하는 오류입니다.") INVALID_TICKET_TYPE(BAD_REQUEST, "Ticket_Item_400_9", "잘못된 티켓 승인타입입니다."), @ExplainError("제휴되지 않은 호스트가 유료티켓 생성을 요청했을때 발생하는 오류입니다.") From 75c49b4d0c1eecbafdfe9d1ec3efd183b092491e Mon Sep 17 00:00:00 2001 From: kim-wonjin Date: Sun, 19 Feb 2023 20:25:06 +0900 Subject: [PATCH 2/3] refactor(ticketItem) : accountInfoVo embedded --- .../cart/model/dto/response/CartResponse.java | 5 ++-- .../dto/response/CreateOrderResponse.java | 5 ++-- .../dto/response/TicketItemResponse.java | 2 +- .../domain/common/vo/AccountInfoVo.java | 29 +++++++++++-------- .../ticket_item/domain/TicketItem.java | 23 ++++----------- 5 files changed, 29 insertions(+), 35 deletions(-) diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/cart/model/dto/response/CartResponse.java b/DuDoong-Api/src/main/java/band/gosrock/api/cart/model/dto/response/CartResponse.java index 1298844d..739313b8 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/cart/model/dto/response/CartResponse.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/cart/model/dto/response/CartResponse.java @@ -1,6 +1,7 @@ package band.gosrock.api.cart.model.dto.response; +import band.gosrock.domain.common.vo.AccountInfoVo; import band.gosrock.domain.common.vo.Money; import band.gosrock.domain.domains.cart.domain.Cart; import band.gosrock.domain.domains.ticket_item.domain.TicketItem; @@ -41,7 +42,7 @@ public class CartResponse { private final TicketPayType ticketPayType; @Schema(description = "계좌정보", nullable = true) - private final String accountNumber; + private final AccountInfoVo accountInfo; public static CartResponse of( List cartItemResponses, Cart cart, TicketItem item) { @@ -54,7 +55,7 @@ public static CartResponse of( .totalQuantity(cart.getTotalQuantity()) .approveType(item.getType()) .ticketPayType(item.getPayType()) - .accountNumber(item.getAccountNumber()) + .accountInfo(item.getAccountInfo()) .build(); } } diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/order/model/dto/response/CreateOrderResponse.java b/DuDoong-Api/src/main/java/band/gosrock/api/order/model/dto/response/CreateOrderResponse.java index fcbb1707..c74667a8 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/order/model/dto/response/CreateOrderResponse.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/order/model/dto/response/CreateOrderResponse.java @@ -1,6 +1,7 @@ package band.gosrock.api.order.model.dto.response; +import band.gosrock.domain.common.vo.AccountInfoVo; import band.gosrock.domain.common.vo.Money; import band.gosrock.domain.domains.order.domain.Order; import band.gosrock.domain.domains.order.domain.OrderMethod; @@ -43,7 +44,7 @@ public class CreateOrderResponse { private final TicketPayType ticketPayType; @Schema(description = "계좌정보", nullable = true) - private final String accountNumber; + private final AccountInfoVo accountInfo; public static CreateOrderResponse from(Order order, TicketItem item, Profile profile) { return CreateOrderResponse.builder() @@ -56,7 +57,7 @@ public static CreateOrderResponse from(Order order, TicketItem item, Profile pro .isNeedPayment(order.isNeedPaid()) .approveType(item.getType()) .ticketPayType(item.getPayType()) - .accountNumber(item.getAccountNumber()) + .accountInfo(item.getAccountInfo()) .build(); } } diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/dto/response/TicketItemResponse.java b/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/dto/response/TicketItemResponse.java index 8c28c028..c58e2d42 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/dto/response/TicketItemResponse.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/dto/response/TicketItemResponse.java @@ -62,7 +62,7 @@ public static TicketItemResponse from(TicketItem ticketItem, Boolean isAdmin) { ? ticketItem.getQuantity() : null) .isQuantityPublic(ticketItem.getIsQuantityPublic()) - .accountInfo(ticketItem.toAccountInfoVo()) + .accountInfo(ticketItem.getAccountInfo()) .build(); } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/common/vo/AccountInfoVo.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/common/vo/AccountInfoVo.java index 0d8ae005..003ce458 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/common/vo/AccountInfoVo.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/common/vo/AccountInfoVo.java @@ -1,25 +1,30 @@ package band.gosrock.domain.common.vo; -import band.gosrock.domain.domains.ticket_item.domain.TicketItem; -import lombok.Builder; +import javax.persistence.Embeddable; +import lombok.AccessLevel; import lombok.Getter; +import lombok.NoArgsConstructor; @Getter -@Builder +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Embeddable public class AccountInfoVo { - private final String bankName; + private String bankName; - private final String accountNumber; + private String accountNumber; - private final String accountHolder; + private String accountHolder; - public static AccountInfoVo from(TicketItem ticketItem) { - return AccountInfoVo.builder() - .bankName(ticketItem.getBankName()) - .accountNumber(ticketItem.getAccountNumber()) - .accountHolder(ticketItem.getAccountHolder()) - .build(); + public AccountInfoVo(String bankName, String accountNumber, String accountHolder) { + this.bankName = bankName; + this.accountNumber = accountNumber; + this.accountHolder = accountHolder; + } + + public static AccountInfoVo valueOf( + String bankName, String accountNumber, String accountHolder) { + return new AccountInfoVo(bankName, accountNumber, accountHolder); } } 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 6bc1800e..2c1d4d6f 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 @@ -54,14 +54,7 @@ public class TicketItem extends BaseTimeEntity { @Enumerated(EnumType.STRING) private TicketType type; - // 은행명 - private String bankName; - - // 계좌번호 - private String accountNumber; - - // 예금주 - private String accountHolder; + @Embedded private AccountInfoVo accountInfo; // 재고 공개 여부 private Boolean isQuantityPublic; @@ -113,9 +106,7 @@ public TicketItem( this.supplyCount = supplyCount; this.purchaseLimit = purchaseLimit; this.type = type; - this.bankName = bankName; - this.accountNumber = accountNumber; - this.accountHolder = accountHolder; + this.accountInfo = AccountInfoVo.valueOf(bankName, accountNumber, accountHolder); this.isQuantityPublic = isQuantityPublic; this.isSellable = isSellable; this.saleStartAt = saleStartAt; @@ -165,9 +156,9 @@ public void validateTicketPayType(Boolean isPartner) { if (!this.type.equals(TicketType.APPROVAL)) { throw InvalidTicketTypeException.EXCEPTION; } - if (StringUtils.isEmpty(this.accountNumber) - || StringUtils.isEmpty(this.accountHolder) - || StringUtils.isEmpty(this.bankName)) { + if (StringUtils.isEmpty(this.accountInfo.getBankName()) + || StringUtils.isEmpty(this.accountInfo.getAccountNumber()) + || StringUtils.isEmpty(this.accountInfo.getAccountHolder())) { throw EmptyAccountInfoException.EXCEPTION; } } @@ -191,10 +182,6 @@ else if (this.payType.equals(TicketPayType.PRICE_TICKET)) { } } - public AccountInfoVo toAccountInfoVo() { - return AccountInfoVo.from(this); - } - public RefundInfoVo getRefundInfoVo() { return event.toRefundInfoVo(); } From 6328be625a77d1d47afa6ee30f3d0e25b0bd4f83 Mon Sep 17 00:00:00 2001 From: kim-wonjin Date: Sun, 19 Feb 2023 21:10:08 +0900 Subject: [PATCH 3/3] refactor(ticketItem) : price @positive --- .../api/ticketItem/dto/request/CreateTicketItemRequest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/dto/request/CreateTicketItemRequest.java b/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/dto/request/CreateTicketItemRequest.java index fb1092f1..652f7a64 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/dto/request/CreateTicketItemRequest.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/dto/request/CreateTicketItemRequest.java @@ -7,6 +7,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; +import javax.validation.constraints.Positive; import lombok.Getter; import lombok.RequiredArgsConstructor; import org.springframework.lang.Nullable; @@ -39,7 +40,7 @@ public class CreateTicketItemRequest { @Schema(nullable = true, example = "김원진") private String accountHolder; - @NotNull + @Positive @Schema(defaultValue = "0", nullable = false, example = "4000") private Long price;