From a4974a53101fc6725d9e67165bd76a8dfa3cfeb3 Mon Sep 17 00:00:00 2001 From: kim-wonjin Date: Sun, 29 Jan 2023 01:23:01 +0900 Subject: [PATCH 1/5] =?UTF-8?q?refactor(itemOptionGroup)=20:=20=ED=8B=B0?= =?UTF-8?q?=EC=BC=93=EC=83=81=ED=92=88=20=EB=82=B4=20=EC=98=B5=EC=85=98?= =?UTF-8?q?=EA=B7=B8=EB=A3=B9=20=EA=B4=80=EB=A6=AC=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ticket_item/domain/TicketItem.java | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/domain/TicketItem.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/domain/TicketItem.java index 94d883ee..838948d8 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/domain/TicketItem.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/domain/TicketItem.java @@ -5,12 +5,15 @@ import band.gosrock.domain.common.vo.Money; import band.gosrock.domain.common.vo.RefundInfoVo; import band.gosrock.domain.domains.event.domain.Event; +import band.gosrock.domain.domains.host.domain.HostUser; import band.gosrock.domain.domains.ticket_item.exception.TicketItemQuantityException; import band.gosrock.domain.domains.ticket_item.exception.TicketItemQuantityLackException; import band.gosrock.domain.domains.ticket_item.exception.TicketItemQuantityLargeException; import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import javax.persistence.*; import lombok.AccessLevel; import lombok.Builder; @@ -62,8 +65,8 @@ public class TicketItem extends BaseTimeEntity { @JoinColumn(name = "event_id", nullable = false) private Event event; - @OneToMany(mappedBy = "item") - private List itemOptionGroups = new ArrayList<>(); + @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) + private final Set itemOptionGroups = new HashSet<>(); @Builder public TicketItem( @@ -77,8 +80,7 @@ public TicketItem( Boolean isSellable, LocalDateTime saleStartAt, LocalDateTime saleEndAt, - Event event, - List itemOptionGroups) { + Event event) { this.type = type; this.name = name; this.description = description; @@ -90,7 +92,14 @@ public TicketItem( this.saleStartAt = saleStartAt; this.saleEndAt = saleEndAt; this.event = event; - this.itemOptionGroups = itemOptionGroups; + } + + public void addItemOptionGroup(ItemOptionGroup itemOptionGroup) { + this.itemOptionGroups.add(itemOptionGroup); + } + + public Boolean hasItemOptionGroup(Long optionGroupId) { + return this.itemOptionGroups.stream().anyMatch(itemOptionGroup -> itemOptionGroup.getOptionGroup().getId().equals(optionGroupId)); } public RefundInfoVo getRefundInfoVo() { From 65d9953dae2944c97ba4cce43eced182a8738519 Mon Sep 17 00:00:00 2001 From: kim-wonjin Date: Sun, 29 Jan 2023 01:26:31 +0900 Subject: [PATCH 2/5] =?UTF-8?q?refactor(itemOptionGroup)=20:=20=EC=9A=94?= =?UTF-8?q?=EC=B2=ADDTO=20=EB=82=B4=20id=EA=B2=80=EC=A6=9D=20=EC=96=B4?= =?UTF-8?q?=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ticketItem/dto/request/ApplyTicketOptionRequest.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/dto/request/ApplyTicketOptionRequest.java b/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/dto/request/ApplyTicketOptionRequest.java index d526aa7a..b039da00 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/dto/request/ApplyTicketOptionRequest.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/dto/request/ApplyTicketOptionRequest.java @@ -3,6 +3,8 @@ import io.swagger.v3.oas.annotations.media.Schema; import javax.validation.constraints.NotNull; +import javax.validation.constraints.Positive; + import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -10,11 +12,11 @@ @RequiredArgsConstructor public class ApplyTicketOptionRequest { - @NotNull @Schema(nullable = false, example = "1") + @Positive(message = "올바른 티켓상품 고유 아이디를 입력해주세요") private Long ticketItemId; - @NotNull @Schema(nullable = false, example = "1") + @Positive(message = "올바른 옵션그룹 고유 아이디를 입력해주세요") private Long optionGroupId; } From 2ffd0aff225c7516486b7a64d2db3ba1d8220ec2 Mon Sep 17 00:00:00 2001 From: kim-wonjin Date: Sun, 29 Jan 2023 05:12:23 +0900 Subject: [PATCH 3/5] =?UTF-8?q?refactor(itemOptionGroup)=20:=20=EC=98=B5?= =?UTF-8?q?=EC=85=98=EC=A0=81=EC=9A=A9=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0=20=EB=A6=AC=ED=8E=99=ED=86=A0=EB=A7=81=20=EB=B0=8F=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/request/ApplyTicketOptionRequest.java | 2 - .../dto/request/CreateTicketItemRequest.java | 2 +- .../response/ApplyTicketOptionResponse.java | 16 +++---- .../ticketItem/mapper/TicketOptionMapper.java | 6 --- .../service/ApplyTicketOptionUseCase.java | 29 ++++-------- .../adaptor/ItemOptionGroupAdaptor.java | 23 ---------- .../ticket_item/domain/OptionGroup.java | 9 +++- .../ticket_item/domain/TicketItem.java | 24 ++++++---- .../ForbiddenOptionChangeException.java | 13 ++++++ .../exception/TicketItemErrorCode.java | 7 +-- .../repository/ItemOptionGroupRepository.java | 10 ----- .../service/ItemOptionGroupService.java | 45 ++++++++++--------- 12 files changed, 82 insertions(+), 104 deletions(-) delete mode 100644 DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/adaptor/ItemOptionGroupAdaptor.java create mode 100644 DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/exception/ForbiddenOptionChangeException.java delete mode 100644 DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/repository/ItemOptionGroupRepository.java diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/dto/request/ApplyTicketOptionRequest.java b/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/dto/request/ApplyTicketOptionRequest.java index b039da00..ae6ceba9 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/dto/request/ApplyTicketOptionRequest.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/dto/request/ApplyTicketOptionRequest.java @@ -2,9 +2,7 @@ import io.swagger.v3.oas.annotations.media.Schema; -import javax.validation.constraints.NotNull; import javax.validation.constraints.Positive; - import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/dto/request/CreateTicketItemRequest.java b/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/dto/request/CreateTicketItemRequest.java index b39b82fb..0ea60a29 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/dto/request/CreateTicketItemRequest.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/dto/request/CreateTicketItemRequest.java @@ -20,7 +20,7 @@ public class CreateTicketItemRequest { private Long eventId; @NotNull - @Schema(nullable = false, defaultValue = "FIRST_COME_FIRST_SERVED") + @Schema(nullable = false, defaultValue = "선착순") private TicketType type; @NotNull diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/dto/response/ApplyTicketOptionResponse.java b/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/dto/response/ApplyTicketOptionResponse.java index 0e588f76..093d0ecb 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/dto/response/ApplyTicketOptionResponse.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/dto/response/ApplyTicketOptionResponse.java @@ -1,28 +1,26 @@ package band.gosrock.api.ticketItem.dto.response; -import band.gosrock.domain.domains.ticket_item.domain.ItemOptionGroup; +import band.gosrock.domain.domains.ticket_item.domain.TicketItem; import io.swagger.v3.oas.annotations.media.Schema; +import java.util.List; import lombok.Builder; import lombok.Getter; @Getter @Builder public class ApplyTicketOptionResponse { - @Schema(description = "상품-옵션그룹 id") - private final Long itemOptionGroupId; @Schema(description = "티켓상품 id") private final Long ticketItemId; - @Schema(description = "옵션그룹 id") - private final Long optionGroupId; + @Schema(description = "옵션그룹 id 리스트") + private final List optionGroupIds; - public static ApplyTicketOptionResponse from(ItemOptionGroup itemOptionGroup) { + public static ApplyTicketOptionResponse from(TicketItem ticketItem) { return ApplyTicketOptionResponse.builder() - .itemOptionGroupId(itemOptionGroup.getId()) - .ticketItemId(itemOptionGroup.getItem().getId()) - .optionGroupId(itemOptionGroup.getOptionGroup().getId()) + .ticketItemId(ticketItem.getId()) + .optionGroupIds(ticketItem.getOptionGroupIds()) .build(); } } diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/mapper/TicketOptionMapper.java b/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/mapper/TicketOptionMapper.java index bd7e6948..c5782b7f 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/mapper/TicketOptionMapper.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/mapper/TicketOptionMapper.java @@ -4,9 +4,7 @@ import band.gosrock.api.ticketItem.dto.request.CreateTicketOptionRequest; import band.gosrock.common.annotation.Mapper; import band.gosrock.domain.domains.event.domain.Event; -import band.gosrock.domain.domains.ticket_item.domain.ItemOptionGroup; import band.gosrock.domain.domains.ticket_item.domain.OptionGroup; -import band.gosrock.domain.domains.ticket_item.domain.TicketItem; import java.util.ArrayList; import lombok.RequiredArgsConstructor; @@ -25,8 +23,4 @@ public OptionGroup toOptionGroup( .options(new ArrayList<>()) .build(); } - - public ItemOptionGroup toItemOptionGroup(TicketItem ticketItem, OptionGroup optionGroup) { - return ItemOptionGroup.builder().item(ticketItem).optionGroup(optionGroup).build(); - } } diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/service/ApplyTicketOptionUseCase.java b/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/service/ApplyTicketOptionUseCase.java index efef5ebd..5e5f1f39 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/service/ApplyTicketOptionUseCase.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/ticketItem/service/ApplyTicketOptionUseCase.java @@ -4,16 +4,12 @@ import band.gosrock.api.common.UserUtils; import band.gosrock.api.ticketItem.dto.request.ApplyTicketOptionRequest; import band.gosrock.api.ticketItem.dto.response.ApplyTicketOptionResponse; -import band.gosrock.api.ticketItem.mapper.TicketOptionMapper; import band.gosrock.common.annotation.UseCase; 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.ticket_item.adaptor.OptionAdaptor; -import band.gosrock.domain.domains.ticket_item.adaptor.TicketItemAdaptor; -import band.gosrock.domain.domains.ticket_item.domain.ItemOptionGroup; -import band.gosrock.domain.domains.ticket_item.domain.OptionGroup; +import band.gosrock.domain.domains.host.service.HostService; import band.gosrock.domain.domains.ticket_item.domain.TicketItem; import band.gosrock.domain.domains.ticket_item.service.ItemOptionGroupService; import band.gosrock.domain.domains.user.domain.User; @@ -26,10 +22,8 @@ public class ApplyTicketOptionUseCase { private final UserUtils userUtils; private final EventAdaptor eventAdaptor; private final HostAdaptor hostAdaptor; - private final TicketItemAdaptor ticketItemAdaptor; - private final OptionAdaptor optionAdaptor; private final ItemOptionGroupService itemOptionGroupService; - private final TicketOptionMapper ticketOptionMapper; + private final HostService hostService; public ApplyTicketOptionResponse execute( ApplyTicketOptionRequest applyTicketOptionRequest, Long eventId) { @@ -37,20 +31,13 @@ public ApplyTicketOptionResponse execute( Event event = eventAdaptor.findById(eventId); Host host = hostAdaptor.findById(event.getHostId()); // 권한 체크 ( 해당 이벤트의 호스트인지 ) - host.hasHostUserId(user.getId()); + hostService.validateHostUser(host, user.getId()); - TicketItem ticketItem = - ticketItemAdaptor.queryTicketItem(applyTicketOptionRequest.getTicketItemId()); - OptionGroup optionGroup = - optionAdaptor.queryOptionGroup(applyTicketOptionRequest.getOptionGroupId()); - // 티켓상품과 옵션이 해당 이벤트 소속인지 확인 - itemOptionGroupService.checkEventId(eventId, ticketItem, optionGroup); - // 이미 적용된 옵션인지 확인 - itemOptionGroupService.checkApply(ticketItem, optionGroup); + Long ticketItemId = applyTicketOptionRequest.getTicketItemId(); + Long optionGroupId = applyTicketOptionRequest.getOptionGroupId(); - ItemOptionGroup itemOptionGroup = - itemOptionGroupService.createItemOptionGroup( - ticketOptionMapper.toItemOptionGroup(ticketItem, optionGroup)); - return ApplyTicketOptionResponse.from(itemOptionGroup); + TicketItem ticketItem = + itemOptionGroupService.createItemOptionGroup(ticketItemId, optionGroupId, eventId); + return ApplyTicketOptionResponse.from(ticketItem); } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/adaptor/ItemOptionGroupAdaptor.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/adaptor/ItemOptionGroupAdaptor.java deleted file mode 100644 index 3d0c010f..00000000 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/adaptor/ItemOptionGroupAdaptor.java +++ /dev/null @@ -1,23 +0,0 @@ -package band.gosrock.domain.domains.ticket_item.adaptor; - - -import band.gosrock.common.annotation.Adaptor; -import band.gosrock.domain.domains.ticket_item.domain.ItemOptionGroup; -import band.gosrock.domain.domains.ticket_item.repository.ItemOptionGroupRepository; -import lombok.RequiredArgsConstructor; - -@Adaptor -@RequiredArgsConstructor -public class ItemOptionGroupAdaptor { - - private final ItemOptionGroupRepository itemOptionGroupRepository; - - public Boolean existsQueryItemOptionGroup(Long ticketItemId, Long optionGroupId) { - return itemOptionGroupRepository.existsByItemIdAndOptionGroupId( - ticketItemId, optionGroupId); - } - - public ItemOptionGroup save(ItemOptionGroup itemOptionGroup) { - return itemOptionGroupRepository.save(itemOptionGroup); - } -} diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/domain/OptionGroup.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/domain/OptionGroup.java index 2a08781d..bc622832 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/domain/OptionGroup.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/domain/OptionGroup.java @@ -5,6 +5,7 @@ import band.gosrock.domain.common.vo.Money; import band.gosrock.domain.domains.event.domain.Event; +import band.gosrock.domain.domains.ticket_item.exception.InvalidOptionGroupException; import java.util.ArrayList; import java.util.List; import javax.persistence.*; @@ -41,7 +42,7 @@ public class OptionGroup { private Boolean isEssential; @OneToMany(cascade = CascadeType.ALL, mappedBy = "optionGroup") - private List