From 77d9894224d6f4d4f16d4880fd0443ebcf37d7eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AF=BC=EC=A4=80?= Date: Mon, 30 Jan 2023 18:54:52 +0900 Subject: [PATCH 01/12] =?UTF-8?q?refactor:=20=EB=B0=9C=EA=B8=89=20?= =?UTF-8?q?=ED=8B=B0=EC=BC=93=20Entity=20=EA=B0=9D=EC=B2=B4=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../issuedTicket/domain/IssuedTicket.java | 14 ++++++++ .../domain/IssuedTicketItemInfoVo.java | 32 +++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketItemInfoVo.java diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicket.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicket.java index 54d68516..3caea42d 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicket.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicket.java @@ -3,8 +3,10 @@ import static band.gosrock.common.consts.DuDoongStatic.NO_START_NUMBER; import band.gosrock.domain.common.model.BaseTimeEntity; +import band.gosrock.domain.common.vo.EventInfoVo; import band.gosrock.domain.common.vo.IssuedTicketInfoVo; import band.gosrock.domain.common.vo.Money; +import band.gosrock.domain.common.vo.UserInfoVo; import band.gosrock.domain.domains.event.domain.Event; import band.gosrock.domain.domains.issuedTicket.exception.CanNotCancelEntranceException; import band.gosrock.domain.domains.issuedTicket.exception.CanNotCancelException; @@ -17,6 +19,7 @@ import java.util.UUID; import javax.persistence.CascadeType; import javax.persistence.Column; +import javax.persistence.Embedded; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; @@ -52,6 +55,12 @@ public class IssuedTicket extends BaseTimeEntity { @JoinColumn(name = "event_id") private Event event; + private Long eventId; + + private Long userId; + + @Embedded private IssuedTicketItemInfoVo itemInfo; + /* 발급 티켓 주문 id (단방향) */ @@ -104,6 +113,8 @@ public void addOptionAnswers(List answers) { @Enumerated(EnumType.STRING) private IssuedTicketStatus issuedTicketStatus = IssuedTicketStatus.ENTRANCE_INCOMPLETE; + + /* 빌더를 통해 객체 생성 시 List는 큰 의미를 두지 않지만 new ArrayList<>()로 한 번 초기화 시켜주면 NPE를 방지 할 수 있음 @@ -118,6 +129,9 @@ public IssuedTicket( Money price, List issuedTicketOptionAnswers) { this.event = event; + this.eventId = event.getId(); + this.userId = user.getId(); + this.itemInfo = IssuedTicketItemInfoVo.from(ticketItem); this.user = user; this.orderUuid = orderUuid; this.orderLineId = orderLineId; diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketItemInfoVo.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketItemInfoVo.java new file mode 100644 index 00000000..d5edd1a7 --- /dev/null +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketItemInfoVo.java @@ -0,0 +1,32 @@ +package band.gosrock.domain.domains.issuedTicket.domain; + +import band.gosrock.domain.common.vo.Money; +import band.gosrock.domain.domains.ticket_item.domain.TicketItem; +import band.gosrock.domain.domains.ticket_item.domain.TicketType; +import javax.persistence.Embeddable; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Embeddable +@Builder +public class IssuedTicketItemInfoVo { + + private final Long ticketItemId; + + private final TicketType ticketType; + + private final String ticketName; + + private final Money price; + + private final Long quantity; + + private final Long supplyCount; + + public static IssuedTicketItemInfoVo from(TicketItem item) { + return IssuedTicketItemInfoVo.builder().ticketItemId(item.getId()) + .ticketType(item.getType()).ticketName(item.getName()).price(item.getPrice()) + .quantity(item.getQuantity()).supplyCount(item.getSupplyCount()).build(); + } +} From 7794fe87bfc63c1e0560f2131ef2b4d1746b4731 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AF=BC=EC=A4=80?= Date: Mon, 30 Jan 2023 20:30:47 +0900 Subject: [PATCH 02/12] =?UTF-8?q?refactor:=20=EC=9D=98=EC=A1=B4=EA=B4=80?= =?UTF-8?q?=EA=B3=84=20=EC=A0=9C=EA=B1=B0=20=EC=9E=91=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AdminIssuedTicketController.java | 8 ++--- .../controller/IssuedTicketController.java | 4 +-- .../dto/response/RetrieveIssuedTicketDTO.java | 5 ++- .../RetrieveIssuedTicketDetailResponse.java | 7 ++-- .../RetrieveIssuedTicketListResponse.java | 4 +-- .../mapper/IssuedTicketMapper.java | 9 +++++- .../service/CreateIssuedTicketUseCase.java | 7 +--- .../service/EntranceIssuedTicketUseCase.java | 4 +-- .../domain/common/vo/IssuedTicketInfoVo.java | 12 ++++--- .../adaptor/IssuedTicketAdaptor.java | 4 +-- .../issuedTicket/domain/IssuedTicket.java | 31 +++--------------- .../domain/IssuedTicketItemInfoVo.java | 6 ++-- .../domain/IssuedTicketUserInfoVo.java | 27 ++++++++++++++++ .../exception/IssuedTicketErrorCode.java | 3 +- .../IssuedTicketNotMatchedEventException.java | 13 ++++++++ .../IssuedTicketCustomRepositoryImpl.java | 30 ++++++++--------- .../service/IssuedTicketDomainService.java | 29 ++++++++++------- .../validator/IssuedTicketValidator.java | 32 +++++++++++++++++++ 18 files changed, 147 insertions(+), 88 deletions(-) create mode 100644 DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketUserInfoVo.java create mode 100644 DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/exception/IssuedTicketNotMatchedEventException.java create mode 100644 DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/validator/IssuedTicketValidator.java diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/controller/AdminIssuedTicketController.java b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/controller/AdminIssuedTicketController.java index 2e2192ed..a122b5d5 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/controller/AdminIssuedTicketController.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/controller/AdminIssuedTicketController.java @@ -19,7 +19,7 @@ @SecurityRequirement(name = "access-token") @Tag(name = "발급 티켓 관련 어드민 컨트롤러") @RestController -@RequestMapping("/v1/admin/issuedTickets") +@RequestMapping("/v1/event/{eventId}/issuedTickets") @RequiredArgsConstructor public class AdminIssuedTicketController { @@ -30,8 +30,8 @@ public class AdminIssuedTicketController { @Operation(summary = "[어드민 기능] 발급 티켓 리스트 가져오기 API 입니다.") @GetMapping public RetrieveIssuedTicketListResponse getIssuedTickets( + @PathVariable Long eventId, @RequestParam Long page, - @RequestParam Long eventId, @RequestParam(required = false) String userName, @RequestParam(required = false) String phoneNumber) { return readIssuedTicketsUseCase.execute(page, eventId, userName, phoneNumber); @@ -39,7 +39,7 @@ public RetrieveIssuedTicketListResponse getIssuedTickets( @Operation(summary = "[어드민 기능] 발급 티켓 입장 처리 API 입니다.") @PatchMapping(value = "/{issuedTicketId}") - public IssuedTicketInfoVo patchIssuedTicketStatus(@PathVariable Long issuedTicketId) { - return entranceIssuedTicketUseCase.execute(issuedTicketId); + public IssuedTicketInfoVo patchIssuedTicketStatus(@PathVariable Long eventId, @PathVariable Long issuedTicketId) { + return entranceIssuedTicketUseCase.execute(eventId, issuedTicketId); } } diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/controller/IssuedTicketController.java b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/controller/IssuedTicketController.java index 14aacdb8..5cd9edb8 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/controller/IssuedTicketController.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/controller/IssuedTicketController.java @@ -36,8 +36,8 @@ public RetrieveIssuedTicketDetailResponse getIssuedTicket(@PathVariable Long iss @Operation(summary = "개발용 발급 티켓 생성 API 입니다.") @DevelopOnlyApi @PostMapping(value = "/develop") - public RetrieveIssuedTicketDetailResponse postIssuedTicket( + public void postIssuedTicket( @RequestBody CreateIssuedTicketForDevDTO body) { - return createIssuedTicketUseCase.executeForDev(body); + createIssuedTicketUseCase.executeForDev(body); } } diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/dto/response/RetrieveIssuedTicketDTO.java b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/dto/response/RetrieveIssuedTicketDTO.java index 6d026ad6..41e9370d 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/dto/response/RetrieveIssuedTicketDTO.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/dto/response/RetrieveIssuedTicketDTO.java @@ -17,14 +17,13 @@ public class RetrieveIssuedTicketDTO { private final IssuedTicketInfoVo issuedTicketInfo; - private final UserInfoVo userInfo; +// private final UserInfoVo userInfo; private final List issuedTicketOptionAnswers; - public static RetrieveIssuedTicketDTO of(IssuedTicket issuedTicket, User user) { + public static RetrieveIssuedTicketDTO of(IssuedTicket issuedTicket) { return RetrieveIssuedTicketDTO.builder() .issuedTicketInfo(issuedTicket.toIssuedTicketInfoVo()) - .userInfo(user.toUserInfoVo()) .issuedTicketOptionAnswers( issuedTicket.getIssuedTicketOptionAnswers().stream() .map(IssuedTicketOptionAnswer::toIssuedTicketOptionAnswerVo) diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/dto/response/RetrieveIssuedTicketDetailResponse.java b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/dto/response/RetrieveIssuedTicketDetailResponse.java index e915cdef..6bb12930 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/dto/response/RetrieveIssuedTicketDetailResponse.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/dto/response/RetrieveIssuedTicketDetailResponse.java @@ -3,6 +3,7 @@ import band.gosrock.domain.common.vo.EventInfoVo; import band.gosrock.domain.common.vo.IssuedTicketInfoVo; +import band.gosrock.domain.domains.event.domain.Event; import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicket; import lombok.Builder; import lombok.Getter; @@ -28,11 +29,11 @@ public class RetrieveIssuedTicketDetailResponse { */ private final String userName; - public static RetrieveIssuedTicketDetailResponse of(IssuedTicket issuedTicket) { + public static RetrieveIssuedTicketDetailResponse of(IssuedTicket issuedTicket, Event event) { return RetrieveIssuedTicketDetailResponse.builder() .issuedTicketInfo(issuedTicket.toIssuedTicketInfoVo()) - .eventInfo(issuedTicket.getEvent().toEventInfoVo()) - .userName(issuedTicket.getUser().getProfile().getName()) + .eventInfo(event.toEventInfoVo()) + .userName(issuedTicket.getUserInfo().getUserName()) .build(); } } diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/dto/response/RetrieveIssuedTicketListResponse.java b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/dto/response/RetrieveIssuedTicketListResponse.java index e2cb8cfc..7f11c371 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/dto/response/RetrieveIssuedTicketListResponse.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/dto/response/RetrieveIssuedTicketListResponse.java @@ -24,9 +24,7 @@ public static RetrieveIssuedTicketListResponse of(Page issuedTicke .issuedTickets( issuedTickets.stream() .map( - issuedTicket -> - RetrieveIssuedTicketDTO.of( - issuedTicket, issuedTicket.getUser())) + RetrieveIssuedTicketDTO::of) .toList()) .build(); } diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/mapper/IssuedTicketMapper.java b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/mapper/IssuedTicketMapper.java index ae2c843e..03606219 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/mapper/IssuedTicketMapper.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/mapper/IssuedTicketMapper.java @@ -4,7 +4,10 @@ import band.gosrock.api.issuedTicket.dto.response.RetrieveIssuedTicketDetailResponse; import band.gosrock.api.issuedTicket.dto.response.RetrieveIssuedTicketListResponse; import band.gosrock.common.annotation.Mapper; +import band.gosrock.domain.domains.event.adaptor.EventAdaptor; +import band.gosrock.domain.domains.event.domain.Event; import band.gosrock.domain.domains.issuedTicket.adaptor.IssuedTicketAdaptor; +import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicket; import band.gosrock.domain.domains.issuedTicket.dto.condition.IssuedTicketCondition; import lombok.RequiredArgsConstructor; import org.springframework.transaction.annotation.Transactional; @@ -15,6 +18,8 @@ public class IssuedTicketMapper { private final IssuedTicketAdaptor issuedTicketAdaptor; + private final EventAdaptor eventAdaptor; + @Transactional(readOnly = true) public RetrieveIssuedTicketListResponse toIssuedTicketPageResponse( Long page, IssuedTicketCondition condition) { @@ -25,7 +30,9 @@ public RetrieveIssuedTicketListResponse toIssuedTicketPageResponse( @Transactional(readOnly = true) public RetrieveIssuedTicketDetailResponse toIssuedTicketDetailResponse( Long currentUserId, Long issuedTicketId) { + IssuedTicket issuedTicket = issuedTicketAdaptor.findForUser(currentUserId, issuedTicketId); + Event event = eventAdaptor.findById(issuedTicket.getEventId()); return RetrieveIssuedTicketDetailResponse.of( - issuedTicketAdaptor.findForUser(currentUserId, issuedTicketId)); + issuedTicket, event); } } diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/service/CreateIssuedTicketUseCase.java b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/service/CreateIssuedTicketUseCase.java index ebfa8357..330ba336 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/service/CreateIssuedTicketUseCase.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/service/CreateIssuedTicketUseCase.java @@ -33,7 +33,7 @@ public class CreateIssuedTicketUseCase { private final OptionAdaptor optionAdaptor; @Transactional - public RetrieveIssuedTicketDetailResponse executeForDev(CreateIssuedTicketForDevDTO body) { + public void executeForDev(CreateIssuedTicketForDevDTO body) { Long currentUserId = SecurityUtils.getCurrentUserId(); User user = getUser(currentUserId); Event event = getEvent(body.getEventId()); @@ -58,11 +58,6 @@ public RetrieveIssuedTicketDetailResponse executeForDev(CreateIssuedTicketForDev ticketItem, Money.wons(body.getAmount()), issuedTicketOptionAnswers)); - - return new RetrieveIssuedTicketDetailResponse( - issuedTicket.toIssuedTicketInfoVo(), - issuedTicket.getEvent().toEventInfoVo(), - issuedTicket.getUser().getProfile().getName()); } private Event getEvent(Long eventId) { diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/service/EntranceIssuedTicketUseCase.java b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/service/EntranceIssuedTicketUseCase.java index cc682e7b..9b19a375 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/service/EntranceIssuedTicketUseCase.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/service/EntranceIssuedTicketUseCase.java @@ -18,9 +18,9 @@ public class EntranceIssuedTicketUseCase { private final UserUtils userUtils; - public IssuedTicketInfoVo execute(Long issuedTicketId) { + public IssuedTicketInfoVo execute(Long eventId, Long issuedTicketId) { Long currentUserId = userUtils.getCurrentUserId(); - return issuedTicketDomainService.processingEntranceIssuedTicket( + return issuedTicketDomainService.processingEntranceIssuedTicket(eventId, currentUserId, issuedTicketId); } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/common/vo/IssuedTicketInfoVo.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/common/vo/IssuedTicketInfoVo.java index fa81d97b..95819f73 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/common/vo/IssuedTicketInfoVo.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/common/vo/IssuedTicketInfoVo.java @@ -1,8 +1,10 @@ package band.gosrock.domain.common.vo; +import band.gosrock.common.annotation.DateFormat; import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicket; import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicketStatus; +import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicketUserInfoVo; import com.fasterxml.jackson.annotation.JsonFormat; import java.time.LocalDateTime; import lombok.Builder; @@ -40,10 +42,7 @@ public class IssuedTicketInfoVo { /* 티켓 발급 시간 */ - @JsonFormat( - shape = JsonFormat.Shape.STRING, - pattern = "yyyy-MM-dd HH:mm:ss", - timezone = "Asia/Seoul") + @DateFormat private final LocalDateTime createdAt; /* @@ -56,16 +55,19 @@ public class IssuedTicketInfoVo { */ private final Money optionPrice; + private final IssuedTicketUserInfoVo userInfo; + public static IssuedTicketInfoVo from(IssuedTicket issuedTicket) { return IssuedTicketInfoVo.builder() .issuedTicketId(issuedTicket.getId()) .issuedTicketNo(issuedTicket.getIssuedTicketNo()) .uuid(issuedTicket.getUuid()) - .ticketName(issuedTicket.getTicketItem().getName()) + .ticketName(issuedTicket.getItemInfo().getTicketName()) .ticketPrice(issuedTicket.getPrice()) .createdAt(issuedTicket.getCreatedAt()) .issuedTicketStatus(issuedTicket.getIssuedTicketStatus()) .optionPrice(issuedTicket.sumOptionPrice()) + .userInfo(issuedTicket.getUserInfo()) .build(); } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/adaptor/IssuedTicketAdaptor.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/adaptor/IssuedTicketAdaptor.java index 73825761..bfecdd35 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/adaptor/IssuedTicketAdaptor.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/adaptor/IssuedTicketAdaptor.java @@ -37,13 +37,13 @@ public IssuedTicket findForUser(Long currentUserId, Long issuedTicketId) { issuedTicketRepository .find(issuedTicketId) .orElseThrow(() -> IssuedTicketNotFoundException.EXCEPTION); - if (!Objects.equals(issuedTicket.getUser().getId(), currentUserId)) { + if (!Objects.equals(issuedTicket.getUserInfo().getUserId(), currentUserId)) { throw IssuedTicketUserNotMatchedException.EXCEPTION; } return issuedTicket; } - public IssuedTicket find(Long issuedTicketId) { + public IssuedTicket queryIssuedTicket(Long issuedTicketId) { return issuedTicketRepository .find(issuedTicketId) .orElseThrow(() -> IssuedTicketNotFoundException.EXCEPTION); diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicket.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicket.java index 3caea42d..d78b14f4 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicket.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicket.java @@ -12,6 +12,7 @@ import band.gosrock.domain.domains.issuedTicket.exception.CanNotCancelException; import band.gosrock.domain.domains.issuedTicket.exception.CanNotEntranceException; import band.gosrock.domain.domains.issuedTicket.exception.IssuedTicketAlreadyEntranceException; +import band.gosrock.domain.domains.order.domain.Order; import band.gosrock.domain.domains.ticket_item.domain.TicketItem; import band.gosrock.domain.domains.user.domain.User; import java.util.ArrayList; @@ -48,16 +49,9 @@ public class IssuedTicket extends BaseTimeEntity { private String issuedTicketNo; - /* - 발급 티켓의 이벤트 (양방향) - */ - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "event_id") - private Event event; - private Long eventId; - private Long userId; + @Embedded private IssuedTicketUserInfoVo userInfo; @Embedded private IssuedTicketItemInfoVo itemInfo; @@ -71,20 +65,6 @@ public class IssuedTicket extends BaseTimeEntity { */ private Long orderLineId; - /* - 티켓 발급 유저 id - */ - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "userId") - private User user; - - /* - 발급 티켓의 item (양방향) - */ - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "ticket_item_id") - private TicketItem ticketItem; - /* 발급 티켓의 옵션들 (단방향) */ @@ -105,7 +85,7 @@ public void addOptionAnswers(List answers) { /* 발급 티켓 가격 */ - private Money price; + @Embedded private Money price; /* 발급 티켓 상태 @@ -128,14 +108,11 @@ public IssuedTicket( TicketItem ticketItem, Money price, List issuedTicketOptionAnswers) { - this.event = event; this.eventId = event.getId(); - this.userId = user.getId(); + this.userInfo = IssuedTicketUserInfoVo.from(user); this.itemInfo = IssuedTicketItemInfoVo.from(ticketItem); - this.user = user; this.orderUuid = orderUuid; this.orderLineId = orderLineId; - this.ticketItem = ticketItem; this.price = price; this.issuedTicketOptionAnswers.addAll(issuedTicketOptionAnswers); } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketItemInfoVo.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketItemInfoVo.java index d5edd1a7..64d708e1 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketItemInfoVo.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketItemInfoVo.java @@ -6,10 +6,12 @@ import javax.persistence.Embeddable; import lombok.Builder; import lombok.Getter; +import lombok.RequiredArgsConstructor; @Getter @Embeddable @Builder +@RequiredArgsConstructor public class IssuedTicketItemInfoVo { private final Long ticketItemId; @@ -18,15 +20,13 @@ public class IssuedTicketItemInfoVo { private final String ticketName; - private final Money price; - private final Long quantity; private final Long supplyCount; public static IssuedTicketItemInfoVo from(TicketItem item) { return IssuedTicketItemInfoVo.builder().ticketItemId(item.getId()) - .ticketType(item.getType()).ticketName(item.getName()).price(item.getPrice()) + .ticketType(item.getType()).ticketName(item.getName()) .quantity(item.getQuantity()).supplyCount(item.getSupplyCount()).build(); } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketUserInfoVo.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketUserInfoVo.java new file mode 100644 index 00000000..62b9d515 --- /dev/null +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketUserInfoVo.java @@ -0,0 +1,27 @@ +package band.gosrock.domain.domains.issuedTicket.domain; + +import band.gosrock.domain.domains.user.domain.User; +import javax.persistence.Embeddable; +import lombok.Builder; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +//Todo: default constructor 고치기 +@Getter +@Embeddable +@Builder +@RequiredArgsConstructor +public class IssuedTicketUserInfoVo { + + private final Long userId; + + private final String userName; + + private final String phoneNumber; + + public static IssuedTicketUserInfoVo from(User user) { + return IssuedTicketUserInfoVo.builder().userId(user.getId()) + .userName(user.getProfile().getName()).phoneNumber(user.getProfile().getPhoneNumber()) + .build(); + } +} 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 index 9925ec1c..90688d32 100644 --- 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 @@ -20,7 +20,8 @@ public enum IssuedTicketErrorCode implements BaseErrorCode { CAN_NOT_CANCEL(BAD_REQUEST, "IssuedTicket_400_2", "티켓을 취소 할 수 있는 상태가 아닙니다."), CAN_NOT_CANCEL_ENTRANCE(BAD_REQUEST, "IssuedTicket_400_3", "티켓이 입장 취소 할 수 있는 상태가 아닙니다."), CAN_NOT_ENTRANCE(BAD_REQUEST, "IssuedTicket_400_4", "티켓이 입장 할 수 있는 상태가 아닙니다."), - ISSUED_TICKET_ALREADY_ENTRANCE(BAD_REQUEST, "IssuedTicket_400_5", "이미 입장 처리된 티켓입니다."); + ISSUED_TICKET_ALREADY_ENTRANCE(BAD_REQUEST, "IssuedTicket_400_5", "이미 입장 처리된 티켓입니다."), + ISSUED_TICKET_NOT_MATCHED_EVENT(BAD_REQUEST, "IssuedTicket_400_6", "이 티켓은 해당 이벤트에서 발급된 티켓이 아닙니다."); private Integer status; private String code; diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/exception/IssuedTicketNotMatchedEventException.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/exception/IssuedTicketNotMatchedEventException.java new file mode 100644 index 00000000..6851537f --- /dev/null +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/exception/IssuedTicketNotMatchedEventException.java @@ -0,0 +1,13 @@ +package band.gosrock.domain.domains.issuedTicket.exception; + +import band.gosrock.common.exception.DuDoongCodeException; + +public class IssuedTicketNotMatchedEventException extends DuDoongCodeException { + + public static final DuDoongCodeException EXCEPTION = new IssuedTicketNotMatchedEventException(); + + private IssuedTicketNotMatchedEventException() { + super(IssuedTicketErrorCode.ISSUED_TICKET_NOT_MATCHED_EVENT); + } + +} diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/repository/IssuedTicketCustomRepositoryImpl.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/repository/IssuedTicketCustomRepositoryImpl.java index 4743d31e..7ed1fdc1 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/repository/IssuedTicketCustomRepositoryImpl.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/repository/IssuedTicketCustomRepositoryImpl.java @@ -29,12 +29,12 @@ public Page searchToPage(IssuedTicketCondition condition, Pageable List issuedTickets = queryFactory .selectFrom(issuedTicket) - .leftJoin(issuedTicket.event, event) - .fetchJoin() - .leftJoin(issuedTicket.user, user) - .fetchJoin() - .leftJoin(issuedTicket.ticketItem, ticketItem) - .fetchJoin() +// .leftJoin(issuedTicket.eventId, event) +// .fetchJoin() +// .leftJoin(issuedTicket.user, user) +// .fetchJoin() +// .leftJoin(issuedTicket.ticketItem, ticketItem) +// .fetchJoin() .where( eventIdEq(condition.getEventId()), userNameContains(condition.getUserName()), @@ -65,12 +65,12 @@ public Optional find(Long issuedTicketId) { IssuedTicket findIssuedTicket = queryFactory .selectFrom(issuedTicket) - .leftJoin(issuedTicket.event, event) - .fetchJoin() - .leftJoin(issuedTicket.user, user) - .fetchJoin() - .leftJoin(issuedTicket.ticketItem, ticketItem) - .fetchJoin() +// .leftJoin(issuedTicket.event, event) +// .fetchJoin() +// .leftJoin(issuedTicket.user, user) +// .fetchJoin() +// .leftJoin(issuedTicket.ticketItem, ticketItem) +// .fetchJoin() .leftJoin(issuedTicket.issuedTicketOptionAnswers, issuedTicketOptionAnswer) .fetchJoin() .where( @@ -87,16 +87,16 @@ public Optional find(Long issuedTicketId) { } private BooleanExpression eventIdEq(Long eventId) { - return eventId == null ? null : issuedTicket.event.id.eq(eventId); + return eventId == null ? null : issuedTicket.eventId.eq(eventId); } private BooleanExpression userNameContains(String userName) { - return userName == null ? null : issuedTicket.user.profile.name.contains(userName); + return userName == null ? null : issuedTicket.userInfo.userName.contains(userName); } private BooleanExpression phoneNumberContains(String phoneNumber) { return phoneNumber == null ? null - : issuedTicket.user.profile.phoneNumber.contains(phoneNumber); + : issuedTicket.userInfo.phoneNumber.contains(phoneNumber); } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/service/IssuedTicketDomainService.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/service/IssuedTicketDomainService.java index c408b3b1..005bc8d7 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/service/IssuedTicketDomainService.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/service/IssuedTicketDomainService.java @@ -4,9 +4,12 @@ import band.gosrock.common.annotation.DomainService; import band.gosrock.domain.common.aop.redissonLock.RedissonLock; import band.gosrock.domain.common.vo.IssuedTicketInfoVo; +import band.gosrock.domain.domains.event.adaptor.EventAdaptor; +import band.gosrock.domain.domains.event.domain.Event; import band.gosrock.domain.domains.event.exception.HostNotAuthEventException; import band.gosrock.domain.domains.issuedTicket.adaptor.IssuedTicketAdaptor; import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicket; +import band.gosrock.domain.domains.issuedTicket.validator.IssuedTicketValidator; import band.gosrock.domain.domains.ticket_item.adaptor.TicketItemAdaptor; import band.gosrock.domain.domains.ticket_item.domain.TicketItem; import java.util.List; @@ -20,26 +23,30 @@ public class IssuedTicketDomainService { private final IssuedTicketAdaptor issuedTicketAdaptor; private final TicketItemAdaptor ticketItemAdaptor; + private final EventAdaptor eventAdaptor; + + private final IssuedTicketValidator issuedTicketValidator; private final OrderToIssuedTicketService orderToIssuedTicketService; @RedissonLock(LockName = "티켓재고관리", identifier = "itemId") - @Transactional public void withDrawIssuedTicket(Long itemId, List issuedTickets) { - issuedTickets.forEach( - issuedTicket -> { - issuedTicket.getTicketItem().increaseQuantity(1L); - issuedTicketAdaptor.cancel(issuedTicket); - }); + // itemId로 티켓 아이템 찾아서 (해당 락에선 ticketItem이 하나로 정해지기 때문에) + TicketItem ticketItem = ticketItemAdaptor.queryTicketItem(itemId); + issuedTickets.forEach(issuedTicket -> { + // 재고 복구하고 + ticketItem.increaseQuantity(1L); + // 발급된 티켓 취소 + issuedTicket.cancel(); + }); } @Transactional - public IssuedTicketInfoVo processingEntranceIssuedTicket( + public IssuedTicketInfoVo processingEntranceIssuedTicket(Long eventId, Long currentUserId, Long issuedTicketId) { - IssuedTicket issuedTicket = issuedTicketAdaptor.find(issuedTicketId); - if (!Objects.equals(issuedTicket.getEvent().getHostId(), currentUserId)) { - throw HostNotAuthEventException.EXCEPTION; - } + IssuedTicket issuedTicket = issuedTicketAdaptor.queryIssuedTicket(issuedTicketId); + issuedTicketValidator.validIssuedTicketEventIdEqualEvent(issuedTicket, eventId); + issuedTicketValidator.validCanProcessingEntranceIssuedTicket(issuedTicket, currentUserId); issuedTicket.entrance(); return issuedTicket.toIssuedTicketInfoVo(); } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/validator/IssuedTicketValidator.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/validator/IssuedTicketValidator.java new file mode 100644 index 00000000..0bd2caff --- /dev/null +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/validator/IssuedTicketValidator.java @@ -0,0 +1,32 @@ +package band.gosrock.domain.domains.issuedTicket.validator; + +import band.gosrock.common.annotation.Validator; +import band.gosrock.domain.domains.event.adaptor.EventAdaptor; +import band.gosrock.domain.domains.event.domain.Event; +import band.gosrock.domain.domains.host.adaptor.HostAdaptor; +import band.gosrock.domain.domains.host.domain.Host; +import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicket; +import band.gosrock.domain.domains.issuedTicket.exception.IssuedTicketNotMatchedEventException; +import java.util.Objects; +import lombok.RequiredArgsConstructor; + +@Validator +@RequiredArgsConstructor +public class IssuedTicketValidator { + + private final EventAdaptor eventAdaptor; + private final HostAdaptor hostAdaptor; + + public void validCanProcessingEntranceIssuedTicket(IssuedTicket issuedTicket, + Long currentUserId) { + Event event = eventAdaptor.findById(issuedTicket.getEventId()); + Host host = hostAdaptor.findById(event.getHostId()); + host.validateHostUser(currentUserId); + } + + public void validIssuedTicketEventIdEqualEvent(IssuedTicket issuedTicket, Long eventId) { + if (!Objects.equals(issuedTicket.getEventId(), eventId)) { + throw IssuedTicketNotMatchedEventException.EXCEPTION; + } + } +} From dd1fb30b57e2deb783c91dab96ef9c55cca95e91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AF=BC=EC=A4=80?= Date: Tue, 31 Jan 2023 16:01:37 +0900 Subject: [PATCH 03/12] =?UTF-8?q?fix:=20default=20constructor=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/IssuedTicketItemInfoVo.java | 24 +++++++++++++------ .../domain/IssuedTicketUserInfoVo.java | 18 ++++++++++---- 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketItemInfoVo.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketItemInfoVo.java index 64d708e1..10429db3 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketItemInfoVo.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketItemInfoVo.java @@ -6,23 +6,33 @@ import javax.persistence.Embeddable; import lombok.Builder; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.RequiredArgsConstructor; @Getter @Embeddable -@Builder -@RequiredArgsConstructor +@NoArgsConstructor public class IssuedTicketItemInfoVo { - private final Long ticketItemId; + private Long ticketItemId; - private final TicketType ticketType; + private TicketType ticketType; - private final String ticketName; + private String ticketName; - private final Long quantity; + private Long quantity; - private final Long supplyCount; + private Long supplyCount; + + @Builder + public IssuedTicketItemInfoVo(Long ticketItemId, TicketType ticketType, String ticketName, + Long quantity, Long supplyCount) { + this.ticketItemId = ticketItemId; + this.ticketType = ticketType; + this.ticketName = ticketName; + this.quantity = quantity; + this.supplyCount = supplyCount; + } public static IssuedTicketItemInfoVo from(TicketItem item) { return IssuedTicketItemInfoVo.builder().ticketItemId(item.getId()) diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketUserInfoVo.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketUserInfoVo.java index 62b9d515..b1cb73f4 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketUserInfoVo.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketUserInfoVo.java @@ -4,20 +4,28 @@ import javax.persistence.Embeddable; import lombok.Builder; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.RequiredArgsConstructor; //Todo: default constructor 고치기 @Getter @Embeddable -@Builder -@RequiredArgsConstructor +@NoArgsConstructor public class IssuedTicketUserInfoVo { - private final Long userId; + private Long userId; - private final String userName; + private String userName; + + private String phoneNumber; + + @Builder + public IssuedTicketUserInfoVo(Long userId, String userName, String phoneNumber) { + this.userId = userId; + this.userName = userName; + this.phoneNumber = phoneNumber; + } - private final String phoneNumber; public static IssuedTicketUserInfoVo from(User user) { return IssuedTicketUserInfoVo.builder().userId(user.getId()) From fdd55344e968ed93a89758967f68cbe42f13f97f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AF=BC=EC=A4=80?= Date: Tue, 31 Jan 2023 16:07:48 +0900 Subject: [PATCH 04/12] =?UTF-8?q?refactor:=20DTO=20=EB=B0=8F=20QueryDsl=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RetrieveIssuedTicketDetailResponse.java | 6 ------ .../IssuedTicketCustomRepositoryImpl.java | 18 +----------------- 2 files changed, 1 insertion(+), 23 deletions(-) diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/dto/response/RetrieveIssuedTicketDetailResponse.java b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/dto/response/RetrieveIssuedTicketDetailResponse.java index 6bb12930..ee36d236 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/dto/response/RetrieveIssuedTicketDetailResponse.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/dto/response/RetrieveIssuedTicketDetailResponse.java @@ -24,16 +24,10 @@ public class RetrieveIssuedTicketDetailResponse { */ private final EventInfoVo eventInfo; - /* - 발급 유저 이름 - */ - private final String userName; - public static RetrieveIssuedTicketDetailResponse of(IssuedTicket issuedTicket, Event event) { return RetrieveIssuedTicketDetailResponse.builder() .issuedTicketInfo(issuedTicket.toIssuedTicketInfoVo()) .eventInfo(event.toEventInfoVo()) - .userName(issuedTicket.getUserInfo().getUserName()) .build(); } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/repository/IssuedTicketCustomRepositoryImpl.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/repository/IssuedTicketCustomRepositoryImpl.java index 7ed1fdc1..8946c05c 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/repository/IssuedTicketCustomRepositoryImpl.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/repository/IssuedTicketCustomRepositoryImpl.java @@ -29,20 +29,10 @@ public Page searchToPage(IssuedTicketCondition condition, Pageable List issuedTickets = queryFactory .selectFrom(issuedTicket) -// .leftJoin(issuedTicket.eventId, event) -// .fetchJoin() -// .leftJoin(issuedTicket.user, user) -// .fetchJoin() -// .leftJoin(issuedTicket.ticketItem, ticketItem) -// .fetchJoin() .where( eventIdEq(condition.getEventId()), userNameContains(condition.getUserName()), - phoneNumberContains(condition.getPhoneNumber()), - issuedTicket - .issuedTicketStatus - .eq(IssuedTicketStatus.CANCELED) - .not()) + phoneNumberContains(condition.getPhoneNumber())) .orderBy(issuedTicket.id.desc()) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) @@ -65,12 +55,6 @@ public Optional find(Long issuedTicketId) { IssuedTicket findIssuedTicket = queryFactory .selectFrom(issuedTicket) -// .leftJoin(issuedTicket.event, event) -// .fetchJoin() -// .leftJoin(issuedTicket.user, user) -// .fetchJoin() -// .leftJoin(issuedTicket.ticketItem, ticketItem) -// .fetchJoin() .leftJoin(issuedTicket.issuedTicketOptionAnswers, issuedTicketOptionAnswer) .fetchJoin() .where( From 77b37f78a468e51c55a54ee9e427ea60a0599810 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AF=BC=EC=A4=80?= Date: Tue, 31 Jan 2023 16:50:14 +0900 Subject: [PATCH 05/12] =?UTF-8?q?feat(api)=20:=20=EA=B4=80=EB=A6=AC?= =?UTF-8?q?=EC=9E=90=20=EA=B6=8C=ED=95=9C=20=ED=8B=B0=EC=BC=93=20=EC=B7=A8?= =?UTF-8?q?=EC=86=8C=20API=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AdminIssuedTicketController.java | 13 ++++++- .../controller/IssuedTicketController.java | 3 +- .../dto/response/RetrieveIssuedTicketDTO.java | 4 +-- .../RetrieveIssuedTicketDetailResponse.java | 2 +- .../RetrieveIssuedTicketListResponse.java | 6 +--- .../mapper/IssuedTicketMapper.java | 8 +++-- .../AdminDeleteIssuedTicketUseCase.java | 34 ++++++++++++++++++ .../service/CreateIssuedTicketUseCase.java | 1 - .../service/EntranceIssuedTicketUseCase.java | 4 +-- .../domain/common/vo/IssuedTicketInfoVo.java | 13 ++++--- .../issuedTicket/domain/IssuedTicket.java | 20 ++++++++--- .../domain/IssuedTicketCancelInfoVo.java | 36 +++++++++++++++++++ .../domain/IssuedTicketCancelReason.java | 17 +++++++++ .../domain/IssuedTicketItemInfoVo.java | 20 ++++------- .../domain/IssuedTicketUserInfoVo.java | 13 +++---- .../exception/IssuedTicketErrorCode.java | 3 +- .../IssuedTicketNotMatchedEventException.java | 2 +- .../IssuedTicketCustomRepositoryImpl.java | 7 +--- .../service/IssuedTicketDomainService.java | 32 ++++++++++------- .../handlers/WithDrawOrderEventHandler.java | 4 +-- .../validator/IssuedTicketValidator.java | 4 +-- 21 files changed, 176 insertions(+), 70 deletions(-) create mode 100644 DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/service/AdminDeleteIssuedTicketUseCase.java create mode 100644 DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketCancelInfoVo.java create mode 100644 DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketCancelReason.java diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/controller/AdminIssuedTicketController.java b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/controller/AdminIssuedTicketController.java index a122b5d5..73fed7f8 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/controller/AdminIssuedTicketController.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/controller/AdminIssuedTicketController.java @@ -2,6 +2,7 @@ import band.gosrock.api.issuedTicket.dto.response.RetrieveIssuedTicketListResponse; +import band.gosrock.api.issuedTicket.service.AdminDeleteIssuedTicketUseCase; import band.gosrock.api.issuedTicket.service.EntranceIssuedTicketUseCase; import band.gosrock.api.issuedTicket.service.ReadIssuedTicketsUseCase; import band.gosrock.domain.common.vo.IssuedTicketInfoVo; @@ -9,6 +10,7 @@ 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.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -27,6 +29,8 @@ public class AdminIssuedTicketController { private final EntranceIssuedTicketUseCase entranceIssuedTicketUseCase; + private final AdminDeleteIssuedTicketUseCase adminDeleteIssuedTicketUseCase; + @Operation(summary = "[어드민 기능] 발급 티켓 리스트 가져오기 API 입니다.") @GetMapping public RetrieveIssuedTicketListResponse getIssuedTickets( @@ -39,7 +43,14 @@ public RetrieveIssuedTicketListResponse getIssuedTickets( @Operation(summary = "[어드민 기능] 발급 티켓 입장 처리 API 입니다.") @PatchMapping(value = "/{issuedTicketId}") - public IssuedTicketInfoVo patchIssuedTicketStatus(@PathVariable Long eventId, @PathVariable Long issuedTicketId) { + public IssuedTicketInfoVo patchIssuedTicketStatus( + @PathVariable Long eventId, @PathVariable Long issuedTicketId) { return entranceIssuedTicketUseCase.execute(eventId, issuedTicketId); } + + @Operation(summary = "[어드민 기능] 관리자에 의한 발급 티켓 철회 API 입니다.") + @DeleteMapping(value = "/{issuedTicketId}") + public void deleteIssuedTicket(@PathVariable Long eventId, @PathVariable Long issuedTicketId) { + adminDeleteIssuedTicketUseCase.execute(eventId, issuedTicketId); + } } diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/controller/IssuedTicketController.java b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/controller/IssuedTicketController.java index 5cd9edb8..1b9d3d42 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/controller/IssuedTicketController.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/controller/IssuedTicketController.java @@ -36,8 +36,7 @@ public RetrieveIssuedTicketDetailResponse getIssuedTicket(@PathVariable Long iss @Operation(summary = "개발용 발급 티켓 생성 API 입니다.") @DevelopOnlyApi @PostMapping(value = "/develop") - public void postIssuedTicket( - @RequestBody CreateIssuedTicketForDevDTO body) { + public void postIssuedTicket(@RequestBody CreateIssuedTicketForDevDTO body) { createIssuedTicketUseCase.executeForDev(body); } } diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/dto/response/RetrieveIssuedTicketDTO.java b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/dto/response/RetrieveIssuedTicketDTO.java index 41e9370d..f399a59b 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/dto/response/RetrieveIssuedTicketDTO.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/dto/response/RetrieveIssuedTicketDTO.java @@ -3,10 +3,8 @@ import band.gosrock.domain.common.vo.IssuedTicketInfoVo; import band.gosrock.domain.common.vo.IssuedTicketOptionAnswerVo; -import band.gosrock.domain.common.vo.UserInfoVo; import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicket; import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicketOptionAnswer; -import band.gosrock.domain.domains.user.domain.User; import java.util.List; import lombok.Builder; import lombok.Getter; @@ -17,7 +15,7 @@ public class RetrieveIssuedTicketDTO { private final IssuedTicketInfoVo issuedTicketInfo; -// private final UserInfoVo userInfo; + // private final UserInfoVo userInfo; private final List issuedTicketOptionAnswers; diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/dto/response/RetrieveIssuedTicketDetailResponse.java b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/dto/response/RetrieveIssuedTicketDetailResponse.java index ee36d236..551b8b4e 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/dto/response/RetrieveIssuedTicketDetailResponse.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/dto/response/RetrieveIssuedTicketDetailResponse.java @@ -27,7 +27,7 @@ public class RetrieveIssuedTicketDetailResponse { public static RetrieveIssuedTicketDetailResponse of(IssuedTicket issuedTicket, Event event) { return RetrieveIssuedTicketDetailResponse.builder() .issuedTicketInfo(issuedTicket.toIssuedTicketInfoVo()) - .eventInfo(event.toEventInfoVo()) + .eventInfo(event.toEventInfoVo()) .build(); } } diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/dto/response/RetrieveIssuedTicketListResponse.java b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/dto/response/RetrieveIssuedTicketListResponse.java index 7f11c371..98e9ab22 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/dto/response/RetrieveIssuedTicketListResponse.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/dto/response/RetrieveIssuedTicketListResponse.java @@ -21,11 +21,7 @@ public static RetrieveIssuedTicketListResponse of(Page issuedTicke return RetrieveIssuedTicketListResponse.builder() .page(issuedTickets.getPageable().getPageNumber()) .totalPage(issuedTickets.getTotalPages()) - .issuedTickets( - issuedTickets.stream() - .map( - RetrieveIssuedTicketDTO::of) - .toList()) + .issuedTickets(issuedTickets.stream().map(RetrieveIssuedTicketDTO::of).toList()) .build(); } } diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/mapper/IssuedTicketMapper.java b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/mapper/IssuedTicketMapper.java index 03606219..e0854408 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/mapper/IssuedTicketMapper.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/mapper/IssuedTicketMapper.java @@ -32,7 +32,11 @@ public RetrieveIssuedTicketDetailResponse toIssuedTicketDetailResponse( Long currentUserId, Long issuedTicketId) { IssuedTicket issuedTicket = issuedTicketAdaptor.findForUser(currentUserId, issuedTicketId); Event event = eventAdaptor.findById(issuedTicket.getEventId()); - return RetrieveIssuedTicketDetailResponse.of( - issuedTicket, event); + return RetrieveIssuedTicketDetailResponse.of(issuedTicket, event); + } + + @Transactional(readOnly = true) + public IssuedTicket getIssuedTicket(Long issuedTicketId) { + return issuedTicketAdaptor.queryIssuedTicket(issuedTicketId); } } diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/service/AdminDeleteIssuedTicketUseCase.java b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/service/AdminDeleteIssuedTicketUseCase.java new file mode 100644 index 00000000..59b5d779 --- /dev/null +++ b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/service/AdminDeleteIssuedTicketUseCase.java @@ -0,0 +1,34 @@ +package band.gosrock.api.issuedTicket.service; + + +import band.gosrock.api.common.UserUtils; +import band.gosrock.api.issuedTicket.mapper.IssuedTicketMapper; +import band.gosrock.common.annotation.UseCase; +import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicket; +import band.gosrock.domain.domains.issuedTicket.service.IssuedTicketDomainService; +import band.gosrock.domain.domains.issuedTicket.validator.IssuedTicketValidator; +import lombok.RequiredArgsConstructor; +import org.springframework.transaction.annotation.Transactional; + +@UseCase +@RequiredArgsConstructor +public class AdminDeleteIssuedTicketUseCase { + + private final IssuedTicketDomainService issuedTicketDomainService; + + private final UserUtils userUtils; + + private final IssuedTicketMapper issuedTicketMapper; + + private final IssuedTicketValidator issuedTicketValidator; + + @Transactional + public void execute(Long eventId, Long issuedTicketId) { + Long currentUserId = userUtils.getCurrentUserId(); + IssuedTicket issuedTicket = issuedTicketMapper.getIssuedTicket(issuedTicketId); + issuedTicketValidator.validIssuedTicketEventIdEqualEvent(issuedTicket, eventId); + issuedTicketValidator.validCanModifyIssuedTicketUser(issuedTicket, currentUserId); + issuedTicketDomainService.adminCancelIssuedTicket( + issuedTicket, issuedTicket.getItemInfo().getTicketItemId()); + } +} diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/service/CreateIssuedTicketUseCase.java b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/service/CreateIssuedTicketUseCase.java index 330ba336..a84f4922 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/service/CreateIssuedTicketUseCase.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/service/CreateIssuedTicketUseCase.java @@ -2,7 +2,6 @@ import band.gosrock.api.config.security.SecurityUtils; -import band.gosrock.api.issuedTicket.dto.response.RetrieveIssuedTicketDetailResponse; import band.gosrock.common.annotation.UseCase; import band.gosrock.domain.common.vo.Money; import band.gosrock.domain.domains.event.adaptor.EventAdaptor; diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/service/EntranceIssuedTicketUseCase.java b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/service/EntranceIssuedTicketUseCase.java index 9b19a375..b7bcd882 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/service/EntranceIssuedTicketUseCase.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/service/EntranceIssuedTicketUseCase.java @@ -20,7 +20,7 @@ public class EntranceIssuedTicketUseCase { public IssuedTicketInfoVo execute(Long eventId, Long issuedTicketId) { Long currentUserId = userUtils.getCurrentUserId(); - return issuedTicketDomainService.processingEntranceIssuedTicket(eventId, - currentUserId, issuedTicketId); + return issuedTicketDomainService.processingEntranceIssuedTicket( + eventId, currentUserId, issuedTicketId); } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/common/vo/IssuedTicketInfoVo.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/common/vo/IssuedTicketInfoVo.java index 95819f73..202aad07 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/common/vo/IssuedTicketInfoVo.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/common/vo/IssuedTicketInfoVo.java @@ -3,9 +3,9 @@ import band.gosrock.common.annotation.DateFormat; import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicket; +import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicketCancelInfoVo; import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicketStatus; import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicketUserInfoVo; -import com.fasterxml.jackson.annotation.JsonFormat; import java.time.LocalDateTime; import lombok.Builder; import lombok.Getter; @@ -42,8 +42,7 @@ public class IssuedTicketInfoVo { /* 티켓 발급 시간 */ - @DateFormat - private final LocalDateTime createdAt; + @DateFormat private final LocalDateTime createdAt; /* 발급 티켓 상태 @@ -57,6 +56,11 @@ public class IssuedTicketInfoVo { private final IssuedTicketUserInfoVo userInfo; + /* + 발급 티켓 철회 시간 + */ + private final IssuedTicketCancelInfoVo cancelInfo; + public static IssuedTicketInfoVo from(IssuedTicket issuedTicket) { return IssuedTicketInfoVo.builder() .issuedTicketId(issuedTicket.getId()) @@ -67,7 +71,8 @@ public static IssuedTicketInfoVo from(IssuedTicket issuedTicket) { .createdAt(issuedTicket.getCreatedAt()) .issuedTicketStatus(issuedTicket.getIssuedTicketStatus()) .optionPrice(issuedTicket.sumOptionPrice()) - .userInfo(issuedTicket.getUserInfo()) + .userInfo(issuedTicket.getUserInfo()) + .cancelInfo(issuedTicket.getCancelInfo()) .build(); } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicket.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicket.java index d78b14f4..b55d0162 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicket.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicket.java @@ -3,18 +3,16 @@ import static band.gosrock.common.consts.DuDoongStatic.NO_START_NUMBER; import band.gosrock.domain.common.model.BaseTimeEntity; -import band.gosrock.domain.common.vo.EventInfoVo; import band.gosrock.domain.common.vo.IssuedTicketInfoVo; import band.gosrock.domain.common.vo.Money; -import band.gosrock.domain.common.vo.UserInfoVo; import band.gosrock.domain.domains.event.domain.Event; import band.gosrock.domain.domains.issuedTicket.exception.CanNotCancelEntranceException; import band.gosrock.domain.domains.issuedTicket.exception.CanNotCancelException; import band.gosrock.domain.domains.issuedTicket.exception.CanNotEntranceException; import band.gosrock.domain.domains.issuedTicket.exception.IssuedTicketAlreadyEntranceException; -import band.gosrock.domain.domains.order.domain.Order; import band.gosrock.domain.domains.ticket_item.domain.TicketItem; import band.gosrock.domain.domains.user.domain.User; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.UUID; @@ -29,7 +27,6 @@ import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.PostPersist; import javax.persistence.PrePersist; @@ -93,7 +90,7 @@ public void addOptionAnswers(List answers) { @Enumerated(EnumType.STRING) private IssuedTicketStatus issuedTicketStatus = IssuedTicketStatus.ENTRANCE_INCOMPLETE; - + @Embedded private IssuedTicketCancelInfoVo cancelInfo; /* 빌더를 통해 객체 생성 시 List는 큰 의미를 두지 않지만 @@ -115,6 +112,7 @@ public IssuedTicket( this.orderLineId = orderLineId; this.price = price; this.issuedTicketOptionAnswers.addAll(issuedTicketOptionAnswers); + this.cancelInfo = null; } /** ---------------------------- 생성 관련 메서드 ---------------------------------- */ @@ -188,6 +186,18 @@ public void cancel() { throw CanNotCancelException.EXCEPTION; } this.issuedTicketStatus = IssuedTicketStatus.CANCELED; + this.cancelInfo = + IssuedTicketCancelInfoVo.of(LocalDateTime.now(), IssuedTicketCancelReason.REFUND); + } + + public void adminCancel() { + if (this.issuedTicketStatus != IssuedTicketStatus.ENTRANCE_INCOMPLETE) { + throw CanNotCancelException.EXCEPTION; + } + this.issuedTicketStatus = IssuedTicketStatus.CANCELED; + this.cancelInfo = + IssuedTicketCancelInfoVo.of( + LocalDateTime.now(), IssuedTicketCancelReason.ADMIN_CANCEL); } /* diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketCancelInfoVo.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketCancelInfoVo.java new file mode 100644 index 00000000..e5638d92 --- /dev/null +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketCancelInfoVo.java @@ -0,0 +1,36 @@ +package band.gosrock.domain.domains.issuedTicket.domain; + + +import java.time.LocalDateTime; +import javax.persistence.Embeddable; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Embeddable +@NoArgsConstructor +public class IssuedTicketCancelInfoVo { + + private LocalDateTime canceledAt; + + @Enumerated(EnumType.STRING) + private IssuedTicketCancelReason cancelReason; + + @Builder + public IssuedTicketCancelInfoVo( + LocalDateTime canceledAt, IssuedTicketCancelReason cancelReason) { + this.canceledAt = canceledAt; + this.cancelReason = cancelReason; + } + + public static IssuedTicketCancelInfoVo of( + LocalDateTime canceledAt, IssuedTicketCancelReason cancelReason) { + return IssuedTicketCancelInfoVo.builder() + .canceledAt(canceledAt) + .cancelReason(cancelReason) + .build(); + } +} diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketCancelReason.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketCancelReason.java new file mode 100644 index 00000000..0da8e6c6 --- /dev/null +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketCancelReason.java @@ -0,0 +1,17 @@ +package band.gosrock.domain.domains.issuedTicket.domain; + + +import com.fasterxml.jackson.annotation.JsonValue; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum IssuedTicketCancelReason { + REFUND("REFUND", "사용자에 의한 환불"), + ADMIN_CANCEL("ADMIN_CANCEL", "관리자에 의한 취소"); + + private final String value; + + @JsonValue private final String kr; +} diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketItemInfoVo.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketItemInfoVo.java index 10429db3..f27a75cc 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketItemInfoVo.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketItemInfoVo.java @@ -1,13 +1,12 @@ package band.gosrock.domain.domains.issuedTicket.domain; -import band.gosrock.domain.common.vo.Money; + import band.gosrock.domain.domains.ticket_item.domain.TicketItem; import band.gosrock.domain.domains.ticket_item.domain.TicketType; import javax.persistence.Embeddable; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.RequiredArgsConstructor; @Getter @Embeddable @@ -20,23 +19,18 @@ public class IssuedTicketItemInfoVo { private String ticketName; - private Long quantity; - - private Long supplyCount; - @Builder - public IssuedTicketItemInfoVo(Long ticketItemId, TicketType ticketType, String ticketName, - Long quantity, Long supplyCount) { + public IssuedTicketItemInfoVo(Long ticketItemId, TicketType ticketType, String ticketName) { this.ticketItemId = ticketItemId; this.ticketType = ticketType; this.ticketName = ticketName; - this.quantity = quantity; - this.supplyCount = supplyCount; } public static IssuedTicketItemInfoVo from(TicketItem item) { - return IssuedTicketItemInfoVo.builder().ticketItemId(item.getId()) - .ticketType(item.getType()).ticketName(item.getName()) - .quantity(item.getQuantity()).supplyCount(item.getSupplyCount()).build(); + return IssuedTicketItemInfoVo.builder() + .ticketItemId(item.getId()) + .ticketType(item.getType()) + .ticketName(item.getName()) + .build(); } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketUserInfoVo.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketUserInfoVo.java index b1cb73f4..e5c06d87 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketUserInfoVo.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketUserInfoVo.java @@ -1,13 +1,13 @@ package band.gosrock.domain.domains.issuedTicket.domain; + import band.gosrock.domain.domains.user.domain.User; import javax.persistence.Embeddable; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.RequiredArgsConstructor; -//Todo: default constructor 고치기 +// Todo: default constructor 고치기 @Getter @Embeddable @NoArgsConstructor @@ -26,10 +26,11 @@ public IssuedTicketUserInfoVo(Long userId, String userName, String phoneNumber) this.phoneNumber = phoneNumber; } - public static IssuedTicketUserInfoVo from(User user) { - return IssuedTicketUserInfoVo.builder().userId(user.getId()) - .userName(user.getProfile().getName()).phoneNumber(user.getProfile().getPhoneNumber()) - .build(); + return IssuedTicketUserInfoVo.builder() + .userId(user.getId()) + .userName(user.getProfile().getName()) + .phoneNumber(user.getProfile().getPhoneNumber()) + .build(); } } 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 index 90688d32..b0f83844 100644 --- 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 @@ -21,7 +21,8 @@ public enum IssuedTicketErrorCode implements BaseErrorCode { CAN_NOT_CANCEL_ENTRANCE(BAD_REQUEST, "IssuedTicket_400_3", "티켓이 입장 취소 할 수 있는 상태가 아닙니다."), CAN_NOT_ENTRANCE(BAD_REQUEST, "IssuedTicket_400_4", "티켓이 입장 할 수 있는 상태가 아닙니다."), ISSUED_TICKET_ALREADY_ENTRANCE(BAD_REQUEST, "IssuedTicket_400_5", "이미 입장 처리된 티켓입니다."), - ISSUED_TICKET_NOT_MATCHED_EVENT(BAD_REQUEST, "IssuedTicket_400_6", "이 티켓은 해당 이벤트에서 발급된 티켓이 아닙니다."); + ISSUED_TICKET_NOT_MATCHED_EVENT( + BAD_REQUEST, "IssuedTicket_400_6", "이 티켓은 해당 이벤트에서 발급된 티켓이 아닙니다."); private Integer status; private String code; diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/exception/IssuedTicketNotMatchedEventException.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/exception/IssuedTicketNotMatchedEventException.java index 6851537f..971d4076 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/exception/IssuedTicketNotMatchedEventException.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/exception/IssuedTicketNotMatchedEventException.java @@ -1,5 +1,6 @@ package band.gosrock.domain.domains.issuedTicket.exception; + import band.gosrock.common.exception.DuDoongCodeException; public class IssuedTicketNotMatchedEventException extends DuDoongCodeException { @@ -9,5 +10,4 @@ public class IssuedTicketNotMatchedEventException extends DuDoongCodeException { private IssuedTicketNotMatchedEventException() { super(IssuedTicketErrorCode.ISSUED_TICKET_NOT_MATCHED_EVENT); } - } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/repository/IssuedTicketCustomRepositoryImpl.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/repository/IssuedTicketCustomRepositoryImpl.java index 8946c05c..a6de7e54 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/repository/IssuedTicketCustomRepositoryImpl.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/repository/IssuedTicketCustomRepositoryImpl.java @@ -1,10 +1,7 @@ package band.gosrock.domain.domains.issuedTicket.repository; -import static band.gosrock.domain.domains.event.domain.QEvent.event; import static band.gosrock.domain.domains.issuedTicket.domain.QIssuedTicket.issuedTicket; import static band.gosrock.domain.domains.issuedTicket.domain.QIssuedTicketOptionAnswer.issuedTicketOptionAnswer; -import static band.gosrock.domain.domains.ticket_item.domain.QTicketItem.ticketItem; -import static band.gosrock.domain.domains.user.domain.QUser.user; import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicket; import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicketStatus; @@ -79,8 +76,6 @@ private BooleanExpression userNameContains(String userName) { } private BooleanExpression phoneNumberContains(String phoneNumber) { - return phoneNumber == null - ? null - : issuedTicket.userInfo.phoneNumber.contains(phoneNumber); + return phoneNumber == null ? null : issuedTicket.userInfo.phoneNumber.contains(phoneNumber); } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/service/IssuedTicketDomainService.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/service/IssuedTicketDomainService.java index 005bc8d7..3dc41acf 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/service/IssuedTicketDomainService.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/service/IssuedTicketDomainService.java @@ -5,15 +5,12 @@ import band.gosrock.domain.common.aop.redissonLock.RedissonLock; import band.gosrock.domain.common.vo.IssuedTicketInfoVo; import band.gosrock.domain.domains.event.adaptor.EventAdaptor; -import band.gosrock.domain.domains.event.domain.Event; -import band.gosrock.domain.domains.event.exception.HostNotAuthEventException; import band.gosrock.domain.domains.issuedTicket.adaptor.IssuedTicketAdaptor; import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicket; import band.gosrock.domain.domains.issuedTicket.validator.IssuedTicketValidator; import band.gosrock.domain.domains.ticket_item.adaptor.TicketItemAdaptor; import band.gosrock.domain.domains.ticket_item.domain.TicketItem; import java.util.List; -import java.util.Objects; import lombok.RequiredArgsConstructor; import org.springframework.transaction.annotation.Transactional; @@ -30,23 +27,24 @@ public class IssuedTicketDomainService { private final OrderToIssuedTicketService orderToIssuedTicketService; @RedissonLock(LockName = "티켓재고관리", identifier = "itemId") - public void withDrawIssuedTicket(Long itemId, List issuedTickets) { + public void withdrawIssuedTicket(Long itemId, List issuedTickets) { // itemId로 티켓 아이템 찾아서 (해당 락에선 ticketItem이 하나로 정해지기 때문에) TicketItem ticketItem = ticketItemAdaptor.queryTicketItem(itemId); - issuedTickets.forEach(issuedTicket -> { - // 재고 복구하고 - ticketItem.increaseQuantity(1L); - // 발급된 티켓 취소 - issuedTicket.cancel(); - }); + issuedTickets.forEach( + issuedTicket -> { + // 재고 복구하고 + ticketItem.increaseQuantity(1L); + // 발급된 티켓 취소 + issuedTicket.cancel(); + }); } @Transactional - public IssuedTicketInfoVo processingEntranceIssuedTicket(Long eventId, - Long currentUserId, Long issuedTicketId) { + public IssuedTicketInfoVo processingEntranceIssuedTicket( + Long eventId, Long currentUserId, Long issuedTicketId) { IssuedTicket issuedTicket = issuedTicketAdaptor.queryIssuedTicket(issuedTicketId); issuedTicketValidator.validIssuedTicketEventIdEqualEvent(issuedTicket, eventId); - issuedTicketValidator.validCanProcessingEntranceIssuedTicket(issuedTicket, currentUserId); + issuedTicketValidator.validCanModifyIssuedTicketUser(issuedTicket, currentUserId); issuedTicket.entrance(); return issuedTicket.toIssuedTicketInfoVo(); } @@ -59,4 +57,12 @@ public void createIssuedTicket(Long itemId, String orderUuid, Long userId) { issuedTicketAdaptor.saveAll(issuedTickets); ticketItem.reduceQuantity((long) issuedTickets.size()); } + + @RedissonLock(LockName = "티켓관리", identifier = "itemId") + public void adminCancelIssuedTicket(IssuedTicket issuedTicket, Long itemId) { + System.out.println("itemId = " + itemId); + TicketItem ticketItem = ticketItemAdaptor.queryTicketItem(itemId); + ticketItem.increaseQuantity(1L); + issuedTicket.adminCancel(); + } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/service/handlers/WithDrawOrderEventHandler.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/service/handlers/WithDrawOrderEventHandler.java index 09b75337..df6e21c5 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/service/handlers/WithDrawOrderEventHandler.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/service/handlers/WithDrawOrderEventHandler.java @@ -24,11 +24,11 @@ public class WithDrawOrderEventHandler { @TransactionalEventListener( classes = WithDrawOrderEvent.class, phase = TransactionPhase.BEFORE_COMMIT) - public void handleWithDrawOrderEvent(WithDrawOrderEvent withDrawOrderEvent) { + public void handleWithdrawOrderEvent(WithDrawOrderEvent withDrawOrderEvent) { log.info(withDrawOrderEvent.getOrderUuid() + "주문 상태 철회 , 티켓 철회 필요"); List issuedTickets = issuedTicketAdaptor.findAllByOrderUuid(withDrawOrderEvent.getOrderUuid()); - issuedTicketDomainService.withDrawIssuedTicket( + issuedTicketDomainService.withdrawIssuedTicket( withDrawOrderEvent.getItemId(), issuedTickets); } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/validator/IssuedTicketValidator.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/validator/IssuedTicketValidator.java index 0bd2caff..5b06a878 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/validator/IssuedTicketValidator.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/validator/IssuedTicketValidator.java @@ -1,5 +1,6 @@ package band.gosrock.domain.domains.issuedTicket.validator; + import band.gosrock.common.annotation.Validator; import band.gosrock.domain.domains.event.adaptor.EventAdaptor; import band.gosrock.domain.domains.event.domain.Event; @@ -17,8 +18,7 @@ public class IssuedTicketValidator { private final EventAdaptor eventAdaptor; private final HostAdaptor hostAdaptor; - public void validCanProcessingEntranceIssuedTicket(IssuedTicket issuedTicket, - Long currentUserId) { + public void validCanModifyIssuedTicketUser(IssuedTicket issuedTicket, Long currentUserId) { Event event = eventAdaptor.findById(issuedTicket.getEventId()); Host host = hostAdaptor.findById(event.getHostId()); host.validateHostUser(currentUserId); From 6afa80618eb535ad5a9604f6c254a25349bd9c6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AF=BC=EC=A4=80?= Date: Tue, 31 Jan 2023 18:04:44 +0900 Subject: [PATCH 06/12] =?UTF-8?q?fix:=20=EB=A0=88=EB=94=94=EC=8A=A4=20?= =?UTF-8?q?=EB=9D=BD=20=EC=9D=B4=EB=A6=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/IssuedTicketCustomRepositoryImpl.java | 11 +---------- .../service/IssuedTicketDomainService.java | 4 ++-- .../ticket_item/service/ItemOptionGroupService.java | 2 +- 3 files changed, 4 insertions(+), 13 deletions(-) diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/repository/IssuedTicketCustomRepositoryImpl.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/repository/IssuedTicketCustomRepositoryImpl.java index a6de7e54..a7201bc5 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/repository/IssuedTicketCustomRepositoryImpl.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/repository/IssuedTicketCustomRepositoryImpl.java @@ -4,7 +4,6 @@ import static band.gosrock.domain.domains.issuedTicket.domain.QIssuedTicketOptionAnswer.issuedTicketOptionAnswer; import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicket; -import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicketStatus; import band.gosrock.domain.domains.issuedTicket.dto.condition.IssuedTicketCondition; import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.jpa.impl.JPAQuery; @@ -54,15 +53,7 @@ public Optional find(Long issuedTicketId) { .selectFrom(issuedTicket) .leftJoin(issuedTicket.issuedTicketOptionAnswers, issuedTicketOptionAnswer) .fetchJoin() - .where( - issuedTicket - .id - .eq(issuedTicketId) - .and( - issuedTicket - .issuedTicketStatus - .eq(IssuedTicketStatus.CANCELED) - .not())) + .where(issuedTicket.id.eq(issuedTicketId)) .fetchOne(); return Optional.ofNullable(findIssuedTicket); } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/service/IssuedTicketDomainService.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/service/IssuedTicketDomainService.java index 3dc41acf..3eba3f78 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/service/IssuedTicketDomainService.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/service/IssuedTicketDomainService.java @@ -26,7 +26,7 @@ public class IssuedTicketDomainService { private final OrderToIssuedTicketService orderToIssuedTicketService; - @RedissonLock(LockName = "티켓재고관리", identifier = "itemId") + @RedissonLock(LockName = "티켓관리", identifier = "itemId") public void withdrawIssuedTicket(Long itemId, List issuedTickets) { // itemId로 티켓 아이템 찾아서 (해당 락에선 ticketItem이 하나로 정해지기 때문에) TicketItem ticketItem = ticketItemAdaptor.queryTicketItem(itemId); @@ -49,7 +49,7 @@ public IssuedTicketInfoVo processingEntranceIssuedTicket( return issuedTicket.toIssuedTicketInfoVo(); } - @RedissonLock(LockName = "티켓재고관리", identifier = "itemId") + @RedissonLock(LockName = "티켓관리", identifier = "itemId") public void createIssuedTicket(Long itemId, String orderUuid, Long userId) { TicketItem ticketItem = ticketItemAdaptor.queryTicketItem(itemId); List issuedTickets = diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/service/ItemOptionGroupService.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/service/ItemOptionGroupService.java index f1c42a1f..d2a12030 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/service/ItemOptionGroupService.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/service/ItemOptionGroupService.java @@ -20,7 +20,7 @@ public class ItemOptionGroupService { private final OptionAdaptor optionAdaptor; private final TicketItemRepository ticketItemRepository; - @RedissonLock(LockName = "티켓재고관리", identifier = "ticketItemId") + @RedissonLock(LockName = "티켓관리", identifier = "ticketItemId") @Transactional public TicketItem addItemOptionGroup(Long ticketItemId, Long optionGroupId, Long eventId) { From b0c1ad75411131ae81870a4f232c72f8b17b3af2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AF=BC=EC=A4=80?= Date: Tue, 31 Jan 2023 18:08:59 +0900 Subject: [PATCH 07/12] =?UTF-8?q?style:=20spotless=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domains/issuedTicket/service/IssuedTicketDomainService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/service/IssuedTicketDomainService.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/service/IssuedTicketDomainService.java index 3eba3f78..ae4cdbad 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/service/IssuedTicketDomainService.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/service/IssuedTicketDomainService.java @@ -60,7 +60,6 @@ public void createIssuedTicket(Long itemId, String orderUuid, Long userId) { @RedissonLock(LockName = "티켓관리", identifier = "itemId") public void adminCancelIssuedTicket(IssuedTicket issuedTicket, Long itemId) { - System.out.println("itemId = " + itemId); TicketItem ticketItem = ticketItemAdaptor.queryTicketItem(itemId); ticketItem.increaseQuantity(1L); issuedTicket.adminCancel(); From 7a852fb2dc378d7ecad6bf8e8f3471bd692854e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AF=BC=EC=A4=80?= Date: Tue, 31 Jan 2023 18:33:26 +0900 Subject: [PATCH 08/12] =?UTF-8?q?fix:=20=EA=B0=9C=EB=B0=9C=EC=9A=A9=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=ED=8B=B0=EC=BC=93=20API=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/IssuedTicketController.java | 13 ---- .../service/CreateIssuedTicketUseCase.java | 73 ------------------- .../issuedTicket/domain/IssuedTicket.java | 24 ------ 3 files changed, 110 deletions(-) delete mode 100644 DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/service/CreateIssuedTicketUseCase.java diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/controller/IssuedTicketController.java b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/controller/IssuedTicketController.java index 1b9d3d42..a45dd328 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/controller/IssuedTicketController.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/controller/IssuedTicketController.java @@ -2,18 +2,13 @@ import band.gosrock.api.issuedTicket.dto.response.RetrieveIssuedTicketDetailResponse; -import band.gosrock.api.issuedTicket.service.CreateIssuedTicketUseCase; import band.gosrock.api.issuedTicket.service.ReadIssuedTicketUseCase; -import band.gosrock.common.annotation.DevelopOnlyApi; -import band.gosrock.domain.domains.issuedTicket.dto.request.CreateIssuedTicketForDevDTO; 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.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -24,7 +19,6 @@ @RequiredArgsConstructor public class IssuedTicketController { - private final CreateIssuedTicketUseCase createIssuedTicketUseCase; private final ReadIssuedTicketUseCase readIssuedTicketUseCase; @Operation(summary = "발급 티켓 가져오기 API 입니다.") @@ -32,11 +26,4 @@ public class IssuedTicketController { public RetrieveIssuedTicketDetailResponse getIssuedTicket(@PathVariable Long issuedTicketId) { return readIssuedTicketUseCase.execute(issuedTicketId); } - - @Operation(summary = "개발용 발급 티켓 생성 API 입니다.") - @DevelopOnlyApi - @PostMapping(value = "/develop") - public void postIssuedTicket(@RequestBody CreateIssuedTicketForDevDTO body) { - createIssuedTicketUseCase.executeForDev(body); - } } diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/service/CreateIssuedTicketUseCase.java b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/service/CreateIssuedTicketUseCase.java deleted file mode 100644 index a84f4922..00000000 --- a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/service/CreateIssuedTicketUseCase.java +++ /dev/null @@ -1,73 +0,0 @@ -package band.gosrock.api.issuedTicket.service; - - -import band.gosrock.api.config.security.SecurityUtils; -import band.gosrock.common.annotation.UseCase; -import band.gosrock.domain.common.vo.Money; -import band.gosrock.domain.domains.event.adaptor.EventAdaptor; -import band.gosrock.domain.domains.event.domain.Event; -import band.gosrock.domain.domains.issuedTicket.adaptor.IssuedTicketAdaptor; -import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicket; -import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicketOptionAnswer; -import band.gosrock.domain.domains.issuedTicket.dto.request.CreateIssuedTicketForDevDTO; -import band.gosrock.domain.domains.issuedTicket.service.IssuedTicketDomainService; -import band.gosrock.domain.domains.ticket_item.adaptor.OptionAdaptor; -import band.gosrock.domain.domains.ticket_item.adaptor.TicketItemAdaptor; -import band.gosrock.domain.domains.ticket_item.domain.TicketItem; -import band.gosrock.domain.domains.user.adaptor.UserAdaptor; -import band.gosrock.domain.domains.user.domain.User; -import java.util.List; -import lombok.RequiredArgsConstructor; -import org.springframework.transaction.annotation.Transactional; - -@UseCase -@RequiredArgsConstructor -public class CreateIssuedTicketUseCase { - - private final IssuedTicketDomainService issuedTicketDomainService; - private final IssuedTicketAdaptor issuedTicketAdaptor; - private final UserAdaptor userAdaptor; - private final EventAdaptor eventAdaptor; - private final TicketItemAdaptor ticketItemAdaptor; - private final OptionAdaptor optionAdaptor; - - @Transactional - public void executeForDev(CreateIssuedTicketForDevDTO body) { - Long currentUserId = SecurityUtils.getCurrentUserId(); - User user = getUser(currentUserId); - Event event = getEvent(body.getEventId()); - TicketItem ticketItem = getTicketItem(body.getTicketItemId()); - - List issuedTicketOptionAnswers = - body.getOptionAnswers().stream() - .map( - option -> - IssuedTicketOptionAnswer.builder() - .option(optionAdaptor.queryOption(option)) - .answer("test") - .build()) - .toList(); - - IssuedTicket issuedTicket = - issuedTicketAdaptor.save( - IssuedTicket.createForDev( - event, - user, - body.getOrderLineId(), - ticketItem, - Money.wons(body.getAmount()), - issuedTicketOptionAnswers)); - } - - private Event getEvent(Long eventId) { - return eventAdaptor.findById(eventId); - } - - private User getUser(Long userId) { - return userAdaptor.queryUser(userId); - } - - private TicketItem getTicketItem(Long ticketItemId) { - return ticketItemAdaptor.queryTicketItem(ticketItemId); - } -} diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicket.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicket.java index b55d0162..33efee8c 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicket.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicket.java @@ -117,30 +117,6 @@ public IssuedTicket( /** ---------------------------- 생성 관련 메서드 ---------------------------------- */ - /* - 개발 및 테스트 용도로 사용되는 티켓 발급 정적 메서드 - */ - public static IssuedTicket createForDev( - Event event, - User user, - Long orderLineId, - TicketItem ticketItem, - Money price, - List issuedTicketOptionAnswers) { - IssuedTicket createIssuedTicket = - IssuedTicket.builder() - .event(event) - .user(user) - .orderUuid("test") - .orderLineId(orderLineId) - .ticketItem(ticketItem) - .price(price) - .issuedTicketOptionAnswers(new ArrayList<>()) - .build(); - createIssuedTicket.getIssuedTicketOptionAnswers().addAll(issuedTicketOptionAnswers); - return createIssuedTicket; - } - /* issuedTicket 생성하면서 UUID 생성 */ From f25a01463d37d3414396b7367cade61a4ffba532 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AF=BC=EC=A4=80?= Date: Tue, 31 Jan 2023 18:50:12 +0900 Subject: [PATCH 09/12] =?UTF-8?q?chore:=20=EC=A3=BC=EC=84=9D=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domains/issuedTicket/domain/IssuedTicketUserInfoVo.java | 1 - 1 file changed, 1 deletion(-) diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketUserInfoVo.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketUserInfoVo.java index e5c06d87..d288edb8 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketUserInfoVo.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketUserInfoVo.java @@ -7,7 +7,6 @@ import lombok.Getter; import lombok.NoArgsConstructor; -// Todo: default constructor 고치기 @Getter @Embeddable @NoArgsConstructor From a363530a8ad5a63ca50a6497fc4dd6013caab1f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AF=BC=EC=A4=80?= Date: Tue, 31 Jan 2023 18:56:40 +0900 Subject: [PATCH 10/12] =?UTF-8?q?fix:=20getTicketItem=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/domains/issuedTicket/domain/IssuedTickets.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTickets.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTickets.java index 4ff78eeb..eb33be8b 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTickets.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTickets.java @@ -23,7 +23,7 @@ public List getNos() { public String getItemName() { IssuedTicket issuedTicket = issuedTickets.stream().findFirst().orElseThrow(); - return issuedTicket.getTicketItem().getName(); + return issuedTicket.getItemInfo().getTicketName(); } public int getTotalQuantity() { From 232f9fb16c9b08148a0efe8e6c184d37ed765db1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AF=BC=EC=A4=80?= Date: Tue, 31 Jan 2023 19:14:07 +0900 Subject: [PATCH 11/12] =?UTF-8?q?fix:=20=EA=B4=80=EB=A6=AC=EC=9E=90=20?= =?UTF-8?q?=EA=B6=8C=ED=95=9C=20=ED=8B=B0=EC=BC=93=20=EC=B2=A0=ED=9A=8C=20?= =?UTF-8?q?API=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AdminIssuedTicketController.java | 10 ------ .../AdminDeleteIssuedTicketUseCase.java | 34 ------------------- .../issuedTicket/domain/IssuedTicket.java | 10 ------ .../domain/IssuedTicketCancelReason.java | 3 +- .../service/IssuedTicketDomainService.java | 7 ---- 5 files changed, 1 insertion(+), 63 deletions(-) delete mode 100644 DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/service/AdminDeleteIssuedTicketUseCase.java diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/controller/AdminIssuedTicketController.java b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/controller/AdminIssuedTicketController.java index 73fed7f8..9f9e91df 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/controller/AdminIssuedTicketController.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/controller/AdminIssuedTicketController.java @@ -2,7 +2,6 @@ import band.gosrock.api.issuedTicket.dto.response.RetrieveIssuedTicketListResponse; -import band.gosrock.api.issuedTicket.service.AdminDeleteIssuedTicketUseCase; import band.gosrock.api.issuedTicket.service.EntranceIssuedTicketUseCase; import band.gosrock.api.issuedTicket.service.ReadIssuedTicketsUseCase; import band.gosrock.domain.common.vo.IssuedTicketInfoVo; @@ -10,7 +9,6 @@ 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.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -29,8 +27,6 @@ public class AdminIssuedTicketController { private final EntranceIssuedTicketUseCase entranceIssuedTicketUseCase; - private final AdminDeleteIssuedTicketUseCase adminDeleteIssuedTicketUseCase; - @Operation(summary = "[어드민 기능] 발급 티켓 리스트 가져오기 API 입니다.") @GetMapping public RetrieveIssuedTicketListResponse getIssuedTickets( @@ -47,10 +43,4 @@ public IssuedTicketInfoVo patchIssuedTicketStatus( @PathVariable Long eventId, @PathVariable Long issuedTicketId) { return entranceIssuedTicketUseCase.execute(eventId, issuedTicketId); } - - @Operation(summary = "[어드민 기능] 관리자에 의한 발급 티켓 철회 API 입니다.") - @DeleteMapping(value = "/{issuedTicketId}") - public void deleteIssuedTicket(@PathVariable Long eventId, @PathVariable Long issuedTicketId) { - adminDeleteIssuedTicketUseCase.execute(eventId, issuedTicketId); - } } diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/service/AdminDeleteIssuedTicketUseCase.java b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/service/AdminDeleteIssuedTicketUseCase.java deleted file mode 100644 index 59b5d779..00000000 --- a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/service/AdminDeleteIssuedTicketUseCase.java +++ /dev/null @@ -1,34 +0,0 @@ -package band.gosrock.api.issuedTicket.service; - - -import band.gosrock.api.common.UserUtils; -import band.gosrock.api.issuedTicket.mapper.IssuedTicketMapper; -import band.gosrock.common.annotation.UseCase; -import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicket; -import band.gosrock.domain.domains.issuedTicket.service.IssuedTicketDomainService; -import band.gosrock.domain.domains.issuedTicket.validator.IssuedTicketValidator; -import lombok.RequiredArgsConstructor; -import org.springframework.transaction.annotation.Transactional; - -@UseCase -@RequiredArgsConstructor -public class AdminDeleteIssuedTicketUseCase { - - private final IssuedTicketDomainService issuedTicketDomainService; - - private final UserUtils userUtils; - - private final IssuedTicketMapper issuedTicketMapper; - - private final IssuedTicketValidator issuedTicketValidator; - - @Transactional - public void execute(Long eventId, Long issuedTicketId) { - Long currentUserId = userUtils.getCurrentUserId(); - IssuedTicket issuedTicket = issuedTicketMapper.getIssuedTicket(issuedTicketId); - issuedTicketValidator.validIssuedTicketEventIdEqualEvent(issuedTicket, eventId); - issuedTicketValidator.validCanModifyIssuedTicketUser(issuedTicket, currentUserId); - issuedTicketDomainService.adminCancelIssuedTicket( - issuedTicket, issuedTicket.getItemInfo().getTicketItemId()); - } -} diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicket.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicket.java index 33efee8c..6b85de0b 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicket.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicket.java @@ -166,16 +166,6 @@ public void cancel() { IssuedTicketCancelInfoVo.of(LocalDateTime.now(), IssuedTicketCancelReason.REFUND); } - public void adminCancel() { - if (this.issuedTicketStatus != IssuedTicketStatus.ENTRANCE_INCOMPLETE) { - throw CanNotCancelException.EXCEPTION; - } - this.issuedTicketStatus = IssuedTicketStatus.CANCELED; - this.cancelInfo = - IssuedTicketCancelInfoVo.of( - LocalDateTime.now(), IssuedTicketCancelReason.ADMIN_CANCEL); - } - /* 발급 티켓으로 입장 시 상태 변환 메서드 티켓이 입장 미완료 상태가 아니면 입장 할 수 없음 diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketCancelReason.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketCancelReason.java index 0da8e6c6..0ccc9f4e 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketCancelReason.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketCancelReason.java @@ -8,8 +8,7 @@ @Getter @AllArgsConstructor public enum IssuedTicketCancelReason { - REFUND("REFUND", "사용자에 의한 환불"), - ADMIN_CANCEL("ADMIN_CANCEL", "관리자에 의한 취소"); + REFUND("REFUND", "사용자에 의한 환불"); private final String value; diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/service/IssuedTicketDomainService.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/service/IssuedTicketDomainService.java index ae4cdbad..672d1cf1 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/service/IssuedTicketDomainService.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/service/IssuedTicketDomainService.java @@ -57,11 +57,4 @@ public void createIssuedTicket(Long itemId, String orderUuid, Long userId) { issuedTicketAdaptor.saveAll(issuedTickets); ticketItem.reduceQuantity((long) issuedTickets.size()); } - - @RedissonLock(LockName = "티켓관리", identifier = "itemId") - public void adminCancelIssuedTicket(IssuedTicket issuedTicket, Long itemId) { - TicketItem ticketItem = ticketItemAdaptor.queryTicketItem(itemId); - ticketItem.increaseQuantity(1L); - issuedTicket.adminCancel(); - } } From 26d689e2f952a8f897a32ed1f94d2610067cda33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AF=BC=EC=A4=80?= Date: Tue, 31 Jan 2023 19:26:57 +0900 Subject: [PATCH 12/12] =?UTF-8?q?fix:=20=EC=B7=A8=EC=86=8C=EB=90=9C=20?= =?UTF-8?q?=ED=8B=B0=EC=BC=93=EC=9D=80=20=EA=B0=80=EC=A0=B8=EC=98=A4?= =?UTF-8?q?=EC=A7=80=20=EB=AA=BB=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=BF=BC?= =?UTF-8?q?=EB=A6=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/common/vo/IssuedTicketInfoVo.java | 7 ---- .../issuedTicket/domain/IssuedTicket.java | 6 ---- .../domain/IssuedTicketCancelInfoVo.java | 36 ------------------- .../exception/IssuedTicketErrorCode.java | 2 +- .../IssuedTicketCustomRepositoryImpl.java | 13 +++++-- 5 files changed, 11 insertions(+), 53 deletions(-) delete mode 100644 DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketCancelInfoVo.java diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/common/vo/IssuedTicketInfoVo.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/common/vo/IssuedTicketInfoVo.java index 202aad07..0e7e05cb 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/common/vo/IssuedTicketInfoVo.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/common/vo/IssuedTicketInfoVo.java @@ -3,7 +3,6 @@ import band.gosrock.common.annotation.DateFormat; import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicket; -import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicketCancelInfoVo; import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicketStatus; import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicketUserInfoVo; import java.time.LocalDateTime; @@ -56,11 +55,6 @@ public class IssuedTicketInfoVo { private final IssuedTicketUserInfoVo userInfo; - /* - 발급 티켓 철회 시간 - */ - private final IssuedTicketCancelInfoVo cancelInfo; - public static IssuedTicketInfoVo from(IssuedTicket issuedTicket) { return IssuedTicketInfoVo.builder() .issuedTicketId(issuedTicket.getId()) @@ -72,7 +66,6 @@ public static IssuedTicketInfoVo from(IssuedTicket issuedTicket) { .issuedTicketStatus(issuedTicket.getIssuedTicketStatus()) .optionPrice(issuedTicket.sumOptionPrice()) .userInfo(issuedTicket.getUserInfo()) - .cancelInfo(issuedTicket.getCancelInfo()) .build(); } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicket.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicket.java index 6b85de0b..353c2dac 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicket.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicket.java @@ -12,7 +12,6 @@ import band.gosrock.domain.domains.issuedTicket.exception.IssuedTicketAlreadyEntranceException; import band.gosrock.domain.domains.ticket_item.domain.TicketItem; import band.gosrock.domain.domains.user.domain.User; -import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.UUID; @@ -90,8 +89,6 @@ public void addOptionAnswers(List answers) { @Enumerated(EnumType.STRING) private IssuedTicketStatus issuedTicketStatus = IssuedTicketStatus.ENTRANCE_INCOMPLETE; - @Embedded private IssuedTicketCancelInfoVo cancelInfo; - /* 빌더를 통해 객체 생성 시 List는 큰 의미를 두지 않지만 new ArrayList<>()로 한 번 초기화 시켜주면 NPE를 방지 할 수 있음 @@ -112,7 +109,6 @@ public IssuedTicket( this.orderLineId = orderLineId; this.price = price; this.issuedTicketOptionAnswers.addAll(issuedTicketOptionAnswers); - this.cancelInfo = null; } /** ---------------------------- 생성 관련 메서드 ---------------------------------- */ @@ -162,8 +158,6 @@ public void cancel() { throw CanNotCancelException.EXCEPTION; } this.issuedTicketStatus = IssuedTicketStatus.CANCELED; - this.cancelInfo = - IssuedTicketCancelInfoVo.of(LocalDateTime.now(), IssuedTicketCancelReason.REFUND); } /* diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketCancelInfoVo.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketCancelInfoVo.java deleted file mode 100644 index e5638d92..00000000 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/domain/IssuedTicketCancelInfoVo.java +++ /dev/null @@ -1,36 +0,0 @@ -package band.gosrock.domain.domains.issuedTicket.domain; - - -import java.time.LocalDateTime; -import javax.persistence.Embeddable; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@Embeddable -@NoArgsConstructor -public class IssuedTicketCancelInfoVo { - - private LocalDateTime canceledAt; - - @Enumerated(EnumType.STRING) - private IssuedTicketCancelReason cancelReason; - - @Builder - public IssuedTicketCancelInfoVo( - LocalDateTime canceledAt, IssuedTicketCancelReason cancelReason) { - this.canceledAt = canceledAt; - this.cancelReason = cancelReason; - } - - public static IssuedTicketCancelInfoVo of( - LocalDateTime canceledAt, IssuedTicketCancelReason cancelReason) { - return IssuedTicketCancelInfoVo.builder() - .canceledAt(canceledAt) - .cancelReason(cancelReason) - .build(); - } -} 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 index b0f83844..a699c87f 100644 --- 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 @@ -14,7 +14,7 @@ @Getter @AllArgsConstructor public enum IssuedTicketErrorCode implements BaseErrorCode { - ISSUED_TICKET_NOT_FOUND(NOT_FOUND, "IssuedTicket_404_1", "IssuedTicket Not Found"), + ISSUED_TICKET_NOT_FOUND(NOT_FOUND, "IssuedTicket_404_1", "티켓을 찾을 수 없습니다."), ISSUED_TICKET_NOT_MATCHED_USER( BAD_REQUEST, "IssuedTicket_400_1", "IssuedTicket User Not Matched"), CAN_NOT_CANCEL(BAD_REQUEST, "IssuedTicket_400_2", "티켓을 취소 할 수 있는 상태가 아닙니다."), diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/repository/IssuedTicketCustomRepositoryImpl.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/repository/IssuedTicketCustomRepositoryImpl.java index a7201bc5..7c7028fa 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/repository/IssuedTicketCustomRepositoryImpl.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/repository/IssuedTicketCustomRepositoryImpl.java @@ -4,6 +4,7 @@ import static band.gosrock.domain.domains.issuedTicket.domain.QIssuedTicketOptionAnswer.issuedTicketOptionAnswer; import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicket; +import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicketStatus; import band.gosrock.domain.domains.issuedTicket.dto.condition.IssuedTicketCondition; import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.jpa.impl.JPAQuery; @@ -28,7 +29,8 @@ public Page searchToPage(IssuedTicketCondition condition, Pageable .where( eventIdEq(condition.getEventId()), userNameContains(condition.getUserName()), - phoneNumberContains(condition.getPhoneNumber())) + phoneNumberContains(condition.getPhoneNumber()), + issuedTicketStatusNotCanceled()) .orderBy(issuedTicket.id.desc()) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) @@ -41,7 +43,8 @@ public Page searchToPage(IssuedTicketCondition condition, Pageable .where( eventIdEq(condition.getEventId()), userNameContains(condition.getUserName()), - phoneNumberContains(condition.getPhoneNumber())); + phoneNumberContains(condition.getPhoneNumber()), + issuedTicketStatusNotCanceled()); return PageableExecutionUtils.getPage(issuedTickets, pageable, countQuery::fetchOne); } @@ -53,7 +56,7 @@ public Optional find(Long issuedTicketId) { .selectFrom(issuedTicket) .leftJoin(issuedTicket.issuedTicketOptionAnswers, issuedTicketOptionAnswer) .fetchJoin() - .where(issuedTicket.id.eq(issuedTicketId)) + .where(issuedTicket.id.eq(issuedTicketId), issuedTicketStatusNotCanceled()) .fetchOne(); return Optional.ofNullable(findIssuedTicket); } @@ -69,4 +72,8 @@ private BooleanExpression userNameContains(String userName) { private BooleanExpression phoneNumberContains(String phoneNumber) { return phoneNumber == null ? null : issuedTicket.userInfo.phoneNumber.contains(phoneNumber); } + + private BooleanExpression issuedTicketStatusNotCanceled() { + return issuedTicket.issuedTicketStatus.eq(IssuedTicketStatus.CANCELED).not(); + } }