diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/cart/docs/CreateCartExceptionDocs.java b/DuDoong-Api/src/main/java/band/gosrock/api/cart/docs/CreateCartExceptionDocs.java index 3bf355d6..38749976 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/cart/docs/CreateCartExceptionDocs.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/cart/docs/CreateCartExceptionDocs.java @@ -5,8 +5,13 @@ import band.gosrock.common.annotation.ExplainError; import band.gosrock.common.exception.DuDoongCodeException; import band.gosrock.common.interfaces.SwaggerExampleExceptions; -import band.gosrock.domain.domains.cart.exception.CartInvalidItemKindPolicyException; import band.gosrock.domain.domains.cart.exception.CartInvalidOptionAnswerException; +import band.gosrock.domain.domains.cart.exception.CartItemNotOneTypeException; +import band.gosrock.domain.domains.cart.exception.CartNotAnswerAllOptionGroupException; +import band.gosrock.domain.domains.event.exception.EventIsNotOpenStatusException; +import band.gosrock.domain.domains.event.exception.EventTicketingTimeIsPassedException; +import band.gosrock.domain.domains.ticket_item.exception.TicketItemQuantityLackException; +import band.gosrock.domain.domains.ticket_item.exception.TicketPurchaseLimitException; @ExceptionDoc public class CreateCartExceptionDocs implements SwaggerExampleExceptions { @@ -14,6 +19,21 @@ public class CreateCartExceptionDocs implements SwaggerExampleExceptions { @ExplainError("아이템에 대한 옵션에 대한 응답을 올바르게 안했을때 ( 한 옵션그룹에 한 응답, 옵션그룹에 응답안했을때)") public DuDoongCodeException 응답_올바르게_안했을_때 = CartInvalidOptionAnswerException.EXCEPTION; - @ExplainError("카트를 담을 때 한 아이템 종류 ( 한 아이디로만 담아주세요 ), 정책 위반입니다.") - public DuDoongCodeException 한_종류_아이템만_장바구니에 = CartInvalidItemKindPolicyException.EXCEPTION; + @ExplainError("모든 질문지에 대답을 안했을 때") + public DuDoongCodeException 응답_다대답_안했을때 = CartNotAnswerAllOptionGroupException.EXCEPTION; + + @ExplainError("이벤트가 열린 상태가 아닐때") + public DuDoongCodeException 이벤트_닫힘 = EventIsNotOpenStatusException.EXCEPTION; + + @ExplainError("이벤트 티켓팅 시간이 지났을때.") + public DuDoongCodeException 티켓팅_시간지남 = EventTicketingTimeIsPassedException.EXCEPTION; + + @ExplainError("티켓 아이템이 한 종류가 아닐 떄") + public DuDoongCodeException 아이템은_한종류여야함 = CartItemNotOneTypeException.EXCEPTION; + + @ExplainError("아이템의 재고가 부족한 상태일 때") + public DuDoongCodeException 티켓팅_재고부족 = TicketItemQuantityLackException.EXCEPTION; + + @ExplainError("티켓당 1인당 구매갯수 제한을 넘었을때") + public DuDoongCodeException 티켓팅_구매갯수제한 = TicketPurchaseLimitException.EXCEPTION; } diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/comment/controller/CommentController.java b/DuDoong-Api/src/main/java/band/gosrock/api/comment/controller/CommentController.java index 86b077de..2680108e 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/comment/controller/CommentController.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/comment/controller/CommentController.java @@ -3,14 +3,20 @@ import band.gosrock.api.comment.model.request.CreateCommentRequest; import band.gosrock.api.comment.model.response.CreateCommentResponse; +import band.gosrock.api.comment.model.response.RetrieveCommentCountResponse; import band.gosrock.api.comment.model.response.RetrieveCommentListResponse; +import band.gosrock.api.comment.model.response.RetrieveRandomCommentResponse; import band.gosrock.api.comment.service.CreateCommentUseCase; +import band.gosrock.api.comment.service.DeleteCommentUseCase; +import band.gosrock.api.comment.service.RetrieveCommentCountUseCase; import band.gosrock.api.comment.service.RetrieveCommentUseCase; +import band.gosrock.api.comment.service.RetrieveRandomCommentUseCase; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; import javax.validation.Valid; import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -30,6 +36,12 @@ public class CommentController { private final RetrieveCommentUseCase retrieveCommentUseCase; + private final DeleteCommentUseCase deleteCommentUseCase; + + private final RetrieveCommentCountUseCase retrieveCommentCountUseCase; + + private final RetrieveRandomCommentUseCase retrieveRandomCommentUseCase; + @Operation(summary = "응원글을 생성합니다.") @PostMapping public CreateCommentResponse postComment( @@ -44,4 +56,22 @@ public RetrieveCommentListResponse getComments( @PathVariable Long eventId, @RequestParam(required = false) Long lastId) { return retrieveCommentUseCase.execute(eventId, lastId); } + + @Operation(summary = "[어드민 기능] 응원글을 삭제합니다.") + @DeleteMapping(value = "/{commentId}") + public void deleteComment(@PathVariable Long eventId, @PathVariable Long commentId) { + deleteCommentUseCase.execute(eventId, commentId); + } + + @Operation(summary = "응원글 개수를 카운팅합니다.") + @GetMapping(value = "/counts") + public RetrieveCommentCountResponse getCommentCounts(@PathVariable Long eventId) { + return retrieveCommentCountUseCase.execute(eventId); + } + + @Operation(summary = "응원글을 랜덤으로 뽑아옵니다.") + @GetMapping(value = "/random") + public RetrieveRandomCommentResponse getRandomComment(@PathVariable Long eventId) { + return retrieveRandomCommentUseCase.execute(eventId); + } } diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/comment/mapper/CommentMapper.java b/DuDoong-Api/src/main/java/band/gosrock/api/comment/mapper/CommentMapper.java index 5eb11092..b36d7204 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/comment/mapper/CommentMapper.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/comment/mapper/CommentMapper.java @@ -3,7 +3,9 @@ import band.gosrock.api.comment.model.request.CreateCommentRequest; import band.gosrock.api.comment.model.response.CreateCommentResponse; +import band.gosrock.api.comment.model.response.RetrieveCommentCountResponse; import band.gosrock.api.comment.model.response.RetrieveCommentListResponse; +import band.gosrock.api.comment.model.response.RetrieveRandomCommentResponse; import band.gosrock.common.annotation.Mapper; import band.gosrock.domain.domains.comment.adaptor.CommentAdaptor; import band.gosrock.domain.domains.comment.domain.Comment; @@ -35,4 +37,17 @@ public RetrieveCommentListResponse toRetrieveCommentListResponse( Slice comments = commentAdaptor.searchComment(commentCondition); return RetrieveCommentListResponse.of(comments, currentUserId); } + + @Transactional(readOnly = true) + public Comment retrieveComment(Long commentId) { + return commentAdaptor.queryComment(commentId); + } + + public RetrieveCommentCountResponse toRetrieveCommentCountResponse(Long commentCount) { + return RetrieveCommentCountResponse.of(commentCount); + } + + public RetrieveRandomCommentResponse toRetrieveRandomCommentResponse(Comment comment) { + return RetrieveRandomCommentResponse.of(comment); + } } diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/comment/model/response/RetrieveCommentCountResponse.java b/DuDoong-Api/src/main/java/band/gosrock/api/comment/model/response/RetrieveCommentCountResponse.java new file mode 100644 index 00000000..865027b6 --- /dev/null +++ b/DuDoong-Api/src/main/java/band/gosrock/api/comment/model/response/RetrieveCommentCountResponse.java @@ -0,0 +1,16 @@ +package band.gosrock.api.comment.model.response; + + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class RetrieveCommentCountResponse { + + private final Long commentCounts; + + public static RetrieveCommentCountResponse of(Long commentCounts) { + return RetrieveCommentCountResponse.builder().commentCounts(commentCounts).build(); + } +} diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/comment/model/response/RetrieveRandomCommentResponse.java b/DuDoong-Api/src/main/java/band/gosrock/api/comment/model/response/RetrieveRandomCommentResponse.java new file mode 100644 index 00000000..f2cd2b19 --- /dev/null +++ b/DuDoong-Api/src/main/java/band/gosrock/api/comment/model/response/RetrieveRandomCommentResponse.java @@ -0,0 +1,20 @@ +package band.gosrock.api.comment.model.response; + + +import band.gosrock.domain.common.vo.CommentInfoVo; +import band.gosrock.domain.domains.comment.domain.Comment; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class RetrieveRandomCommentResponse { + + private final CommentInfoVo commentInfo; + + public static RetrieveRandomCommentResponse of(Comment comment) { + return RetrieveRandomCommentResponse.builder() + .commentInfo(comment.toCommentInfoVo()) + .build(); + } +} diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/comment/service/DeleteCommentUseCase.java b/DuDoong-Api/src/main/java/band/gosrock/api/comment/service/DeleteCommentUseCase.java new file mode 100644 index 00000000..30ff95c0 --- /dev/null +++ b/DuDoong-Api/src/main/java/band/gosrock/api/comment/service/DeleteCommentUseCase.java @@ -0,0 +1,33 @@ +package band.gosrock.api.comment.service; + + +import band.gosrock.api.comment.mapper.CommentMapper; +import band.gosrock.api.common.UserUtils; +import band.gosrock.common.annotation.UseCase; +import band.gosrock.domain.domains.comment.domain.Comment; +import band.gosrock.domain.domains.comment.service.CommentDomainService; +import band.gosrock.domain.domains.event.service.EventService; +import lombok.RequiredArgsConstructor; +import org.springframework.transaction.annotation.Transactional; + +@UseCase +@RequiredArgsConstructor +public class DeleteCommentUseCase { + + private final UserUtils userUtils; + + private final CommentMapper commentMapper; + + private final EventService eventService; + + private final CommentDomainService commentDomainService; + + @Transactional + public void execute(Long eventId, Long commentId) { + Long currentUserId = userUtils.getCurrentUserId(); + // 권한 검사 + eventService.checkEventHost(currentUserId, eventId); + Comment comment = commentMapper.retrieveComment(commentId); + commentDomainService.deleteComment(comment, eventId); + } +} diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/comment/service/RetrieveCommentCountUseCase.java b/DuDoong-Api/src/main/java/band/gosrock/api/comment/service/RetrieveCommentCountUseCase.java new file mode 100644 index 00000000..ace5b3be --- /dev/null +++ b/DuDoong-Api/src/main/java/band/gosrock/api/comment/service/RetrieveCommentCountUseCase.java @@ -0,0 +1,29 @@ +package band.gosrock.api.comment.service; + + +import band.gosrock.api.comment.mapper.CommentMapper; +import band.gosrock.api.comment.model.response.RetrieveCommentCountResponse; +import band.gosrock.common.annotation.UseCase; +import band.gosrock.domain.domains.comment.adaptor.CommentAdaptor; +import band.gosrock.domain.domains.event.adaptor.EventAdaptor; +import band.gosrock.domain.domains.event.domain.Event; +import lombok.RequiredArgsConstructor; +import org.springframework.transaction.annotation.Transactional; + +@UseCase +@RequiredArgsConstructor +public class RetrieveCommentCountUseCase { + + private final CommentAdaptor commentAdaptor; + + private final CommentMapper commentMapper; + + private final EventAdaptor eventAdaptor; + + @Transactional(readOnly = true) + public RetrieveCommentCountResponse execute(Long eventId) { + Event event = eventAdaptor.findById(eventId); + Long commentCount = commentAdaptor.queryCommentCount(event.getId()); + return commentMapper.toRetrieveCommentCountResponse(commentCount); + } +} diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/comment/service/RetrieveRandomCommentUseCase.java b/DuDoong-Api/src/main/java/band/gosrock/api/comment/service/RetrieveRandomCommentUseCase.java new file mode 100644 index 00000000..511c2399 --- /dev/null +++ b/DuDoong-Api/src/main/java/band/gosrock/api/comment/service/RetrieveRandomCommentUseCase.java @@ -0,0 +1,30 @@ +package band.gosrock.api.comment.service; + + +import band.gosrock.api.comment.mapper.CommentMapper; +import band.gosrock.api.comment.model.response.RetrieveRandomCommentResponse; +import band.gosrock.common.annotation.UseCase; +import band.gosrock.domain.domains.comment.adaptor.CommentAdaptor; +import band.gosrock.domain.domains.comment.domain.Comment; +import band.gosrock.domain.domains.event.adaptor.EventAdaptor; +import band.gosrock.domain.domains.event.domain.Event; +import lombok.RequiredArgsConstructor; +import org.springframework.transaction.annotation.Transactional; + +@UseCase +@RequiredArgsConstructor +public class RetrieveRandomCommentUseCase { + + private final CommentAdaptor commentAdaptor; + + private final CommentMapper commentMapper; + + private final EventAdaptor eventAdaptor; + + @Transactional(readOnly = true) + public RetrieveRandomCommentResponse execute(Long eventId) { + Event event = eventAdaptor.findById(eventId); + Comment comment = commentAdaptor.queryRandomComment(event.getId()); + return commentMapper.toRetrieveRandomCommentResponse(comment); + } +} diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/coupon/controller/CouponController.java b/DuDoong-Api/src/main/java/band/gosrock/api/coupon/controller/CouponController.java index 1ad5ce9a..f8d857fc 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/coupon/controller/CouponController.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/coupon/controller/CouponController.java @@ -6,7 +6,6 @@ import band.gosrock.api.coupon.service.CreateCouponUseCase; import band.gosrock.api.coupon.service.CreateUserCouponUseCase; import band.gosrock.api.coupon.service.ReadIssuedCouponUseCase; -import band.gosrock.api.coupon.service.ReadMyPageIssuedCouponUseCase; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; @@ -22,9 +21,8 @@ public class CouponController { private final CreateCouponUseCase createCouponUseCase; - private final ReadIssuedCouponUseCase readIssuedCouponUseCase; private final CreateUserCouponUseCase createUserCouponUseCase; - private final ReadMyPageIssuedCouponUseCase readMyPageIssuedCouponUseCase; + private final ReadIssuedCouponUseCase readIssuedCouponUseCase; @Operation(summary = "쿠폰 캠페인 생성 API") @PostMapping("/campaigns") @@ -33,13 +31,6 @@ public CreateCouponCampaignResponse createCouponCampaign( return createCouponUseCase.execute(createCouponCampaignRequest); } - @Deprecated - @Operation(summary = "주문시 쿠폰 조회 API(삭제 예정)") - @GetMapping("/issuedCoupons/orders") - public ReadIssuedCouponOrderResponse getAllIssuedCouponsUsedInOrders() { - return readIssuedCouponUseCase.execute(); - } - @Operation(summary = "유저 쿠폰 발급 API") @PostMapping("/campaigns/{coupon_code}") public CreateUserCouponResponse createUserCoupon( @@ -50,7 +41,7 @@ public CreateUserCouponResponse createUserCoupon( @Operation(summary = "내 쿠폰 조회 API") @GetMapping("") public ReadIssuedCouponResponse getAllMyIssuedCoupons( - @RequestParam(required = false, defaultValue = "false") Boolean expired) { - return readMyPageIssuedCouponUseCase.execute(expired); + @RequestParam(required = false, defaultValue = "true") Boolean expired) { + return readIssuedCouponUseCase.execute(expired); } } diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/coupon/dto/reqeust/CreateCouponCampaignRequest.java b/DuDoong-Api/src/main/java/band/gosrock/api/coupon/dto/reqeust/CreateCouponCampaignRequest.java index 42d9ab3c..2624e9d5 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/coupon/dto/reqeust/CreateCouponCampaignRequest.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/coupon/dto/reqeust/CreateCouponCampaignRequest.java @@ -2,7 +2,6 @@ import band.gosrock.common.annotation.DateFormat; -import band.gosrock.domain.common.vo.DateTimePeriod; import band.gosrock.domain.domains.coupon.domain.*; import io.swagger.v3.oas.annotations.media.Schema; import java.time.LocalDateTime; @@ -55,25 +54,4 @@ public class CreateCouponCampaignRequest { @NotBlank(message = "couponCode를 입력해주세요.") private String couponCode; - - public CouponCampaign toOnceEntity() { - CouponStockInfo couponStockInfo = - CouponStockInfo.builder() - .issuedAmount(issuedAmount) - .remainingAmount(issuedAmount) - .build(); - DateTimePeriod dateTimePeriod = - DateTimePeriod.builder().startAt(startAt).endAt(endAt).build(); - - return CouponCampaign.builder() - .hostId(hostId) - .discountType(discountType) - .applyTarget(applyTarget) - .validTerm(validTerm) - .dateTimePeriod(dateTimePeriod) - .couponStockInfo(couponStockInfo) - .discountAmount(discountAmount) - .couponCode(couponCode) - .build(); - } } diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/coupon/dto/response/CreateCouponCampaignResponse.java b/DuDoong-Api/src/main/java/band/gosrock/api/coupon/dto/response/CreateCouponCampaignResponse.java index 44778e26..d67c8a02 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/coupon/dto/response/CreateCouponCampaignResponse.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/coupon/dto/response/CreateCouponCampaignResponse.java @@ -1,7 +1,6 @@ package band.gosrock.api.coupon.dto.response; -import band.gosrock.domain.domains.coupon.domain.CouponCampaign; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; @@ -10,18 +9,4 @@ public record CreateCouponCampaignResponse( @Schema(description = "쿠폰 캠페인 ID") Long couponCampaignId, @Schema(description = "쿠폰 코드") String couponCode, @Schema(description = "생성한 쿠폰 총 매수") Long issuedAmount, - @Schema(description = "쿠폰 생성한 호스트 ID") Long hostId) { - - /* - 나중에 디자인 나오고 더 필요한 리스폰스 값 있으면 추가할 예정입니다. - */ - - public static CreateCouponCampaignResponse of(CouponCampaign couponCampaign, Long hostId) { - return CreateCouponCampaignResponse.builder() - .couponCampaignId(couponCampaign.getId()) - .couponCode(couponCampaign.getCouponCode()) - .issuedAmount(couponCampaign.getCouponStockInfo().getIssuedAmount()) - .hostId(hostId) - .build(); - } -} + @Schema(description = "쿠폰 생성한 호스트 ID") Long hostId) {} diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/coupon/dto/response/CreateUserCouponResponse.java b/DuDoong-Api/src/main/java/band/gosrock/api/coupon/dto/response/CreateUserCouponResponse.java index 4eb8fd71..72e1bd78 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/coupon/dto/response/CreateUserCouponResponse.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/coupon/dto/response/CreateUserCouponResponse.java @@ -21,7 +21,6 @@ public class CreateUserCouponResponse { @Schema(description = "쿠폰 코드") private final String couponCode; - // TODO : DateFormat 어노테이션 적용 @Schema(type = "string", pattern = "yyyy-MM-dd HH:mm", description = "쿠폰 유효 기간") @DateFormat private final LocalDateTime validTerm; diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/coupon/mapper/CouponCampaignMapper.java b/DuDoong-Api/src/main/java/band/gosrock/api/coupon/mapper/CouponCampaignMapper.java new file mode 100644 index 00000000..37c99cd4 --- /dev/null +++ b/DuDoong-Api/src/main/java/band/gosrock/api/coupon/mapper/CouponCampaignMapper.java @@ -0,0 +1,58 @@ +package band.gosrock.api.coupon.mapper; + + +import band.gosrock.api.coupon.dto.reqeust.CreateCouponCampaignRequest; +import band.gosrock.api.coupon.dto.response.CreateCouponCampaignResponse; +import band.gosrock.common.annotation.Mapper; +import band.gosrock.domain.common.vo.DateTimePeriod; +import band.gosrock.domain.domains.coupon.domain.CouponCampaign; +import band.gosrock.domain.domains.coupon.domain.CouponStockInfo; +import java.time.LocalDateTime; +import lombok.RequiredArgsConstructor; + +@Mapper +@RequiredArgsConstructor +public class CouponCampaignMapper { + + public static CreateCouponCampaignResponse toCreateCouponCampaignResponse( + CouponCampaign couponCampaign, Long hostId) { + return CreateCouponCampaignResponse.builder() + .couponCampaignId(couponCampaign.getId()) + .couponCode(couponCampaign.getCouponCode()) + .issuedAmount(couponCampaign.getCouponStockInfo().getIssuedAmount()) + .hostId(hostId) + .build(); + } + + public static CouponStockInfo toCouponStockInfo(Long IssuedAmount) { + return CouponStockInfo.builder() + .issuedAmount(IssuedAmount) + .remainingAmount(IssuedAmount) + .build(); + } + + public static DateTimePeriod toDateTimePeriod(LocalDateTime startAt, LocalDateTime endAt) { + return DateTimePeriod.builder().startAt(startAt).endAt(endAt).build(); + } + + public CouponCampaign toEntity(CreateCouponCampaignRequest createCouponCampaignRequest) { + + CouponStockInfo couponStockInfo = + toCouponStockInfo(createCouponCampaignRequest.getIssuedAmount()); + DateTimePeriod dateTimePeriod = + toDateTimePeriod( + createCouponCampaignRequest.getStartAt(), + createCouponCampaignRequest.getEndAt()); + + return CouponCampaign.builder() + .hostId(createCouponCampaignRequest.getHostId()) + .discountType(createCouponCampaignRequest.getDiscountType()) + .applyTarget(createCouponCampaignRequest.getApplyTarget()) + .validTerm(createCouponCampaignRequest.getValidTerm()) + .dateTimePeriod(dateTimePeriod) + .couponStockInfo(couponStockInfo) + .discountAmount(createCouponCampaignRequest.getDiscountAmount()) + .couponCode(createCouponCampaignRequest.getCouponCode()) + .build(); + } +} diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/coupon/mapper/IssuedCouponMapper.java b/DuDoong-Api/src/main/java/band/gosrock/api/coupon/mapper/IssuedCouponMapper.java index 1a4e4107..9c37f64f 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/coupon/mapper/IssuedCouponMapper.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/coupon/mapper/IssuedCouponMapper.java @@ -28,7 +28,7 @@ public CreateUserCouponResponse toCreateUserCouponResponse( .issuedCouponId(issuedCoupon.getId()) .couponCampaignId(couponCampaign.getId()) .couponCode(couponCampaign.getCouponCode()) - .validTerm(issuedCoupon.getCreatedAt().plusDays(couponCampaign.getValidTerm())) + .validTerm(issuedCoupon.calculateValidTerm()) .discountType(couponCampaign.getDiscountType()) .discountAmount(couponCampaign.getDiscountAmount()) .build(); diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/coupon/service/CreateCouponUseCase.java b/DuDoong-Api/src/main/java/band/gosrock/api/coupon/service/CreateCouponUseCase.java index a72b921c..bc393422 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/coupon/service/CreateCouponUseCase.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/coupon/service/CreateCouponUseCase.java @@ -4,6 +4,7 @@ import band.gosrock.api.common.UserUtils; import band.gosrock.api.coupon.dto.reqeust.CreateCouponCampaignRequest; import band.gosrock.api.coupon.dto.response.CreateCouponCampaignResponse; +import band.gosrock.api.coupon.mapper.CouponCampaignMapper; import band.gosrock.common.annotation.UseCase; import band.gosrock.domain.domains.coupon.domain.CouponCampaign; import band.gosrock.domain.domains.coupon.service.CreateCouponCampaignDomainService; @@ -19,6 +20,7 @@ public class CreateCouponUseCase { private final UserUtils userUtils; private final CreateCouponCampaignDomainService createCouponCampaignDomainService; private final HostService hostService; + private final CouponCampaignMapper couponCampaignMapper; @Transactional public CreateCouponCampaignResponse execute( @@ -33,7 +35,8 @@ public CreateCouponCampaignResponse execute( // 쿠폰 생성 CouponCampaign couponCampaign = createCouponCampaignDomainService.createCouponCampaign( - createCouponCampaignRequest.toOnceEntity()); - return CreateCouponCampaignResponse.of(couponCampaign, couponCampaign.getHostId()); + couponCampaignMapper.toEntity(createCouponCampaignRequest)); + return CouponCampaignMapper.toCreateCouponCampaignResponse( + couponCampaign, couponCampaign.getHostId()); } } diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/coupon/service/ReadIssuedCouponUseCase.java b/DuDoong-Api/src/main/java/band/gosrock/api/coupon/service/ReadIssuedCouponUseCase.java index 5ea0db47..0bb49aad 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/coupon/service/ReadIssuedCouponUseCase.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/coupon/service/ReadIssuedCouponUseCase.java @@ -2,12 +2,13 @@ import band.gosrock.api.common.UserUtils; -import band.gosrock.api.coupon.dto.response.ReadIssuedCouponOrderResponse; +import band.gosrock.api.coupon.dto.response.ReadIssuedCouponResponse; +import band.gosrock.api.coupon.mapper.IssuedCouponMapper; import band.gosrock.common.annotation.UseCase; import band.gosrock.domain.domains.coupon.adaptor.IssuedCouponAdaptor; import band.gosrock.domain.domains.coupon.domain.IssuedCoupon; import band.gosrock.domain.domains.user.domain.User; -import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.transaction.annotation.Transactional; @@ -15,35 +16,45 @@ @UseCase @RequiredArgsConstructor public class ReadIssuedCouponUseCase { - private final UserUtils userUtils; private final IssuedCouponAdaptor issuedCouponAdaptor; + private final IssuedCouponMapper issuedCouponMapper; - /** - * 주문시 쿠폰 조회 API - * - * @return ReadIssuedCouponResponse - */ @Transactional(readOnly = true) - public ReadIssuedCouponOrderResponse execute() { + public ReadIssuedCouponResponse execute(boolean expired) { // 존재하는 유저인지 검증 User user = userUtils.getCurrentUser(); List issuedCoupons = issuedCouponAdaptor.findAllByUserId(user.getId()); + // 사용 가능 쿠폰 조회 (사용 이전, 유효 기간 이전) + List validTermAvailableIssuedCoupons = + filterAvailableCouponList(issuedCoupons); + + // 만료된 쿠폰 조회(사용 완료, 유효 기간 만료) + if (expired) { + List expiredValidTermIssuedCoupons = + filterExpiredCouponList(issuedCoupons); + return issuedCouponMapper.toReadIssuedCouponMyPageResponse( + validTermAvailableIssuedCoupons, expiredValidTermIssuedCoupons); + } + + return issuedCouponMapper.toReadIssuedCouponMyPageResponse( + validTermAvailableIssuedCoupons, new ArrayList<>()); + } + + public List filterAvailableCouponList(List issuedCoupons) { + return issuedCoupons.stream() + .filter( + issuedCoupon -> + issuedCoupon.isAvailableTerm() && !issuedCoupon.getUsageStatus()) + .toList(); + } - List validTermIssuedCoupons = - issuedCoupons.stream() - .filter( - issuedCoupon -> - !LocalDateTime.now() - .isAfter( - issuedCoupon - .getCreatedAt() - .plusDays( - issuedCoupon - .getCouponCampaign() - .getValidTerm()))) - .toList(); - return ReadIssuedCouponOrderResponse.of(validTermIssuedCoupons); + public List filterExpiredCouponList(List issuedCoupons) { + return issuedCoupons.stream() + .filter( + issuedCoupon -> + !issuedCoupon.isAvailableTerm() || issuedCoupon.getUsageStatus()) + .toList(); } } diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/coupon/service/ReadMyPageIssuedCouponUseCase.java b/DuDoong-Api/src/main/java/band/gosrock/api/coupon/service/ReadMyPageIssuedCouponUseCase.java index 4485cca9..8b137891 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/coupon/service/ReadMyPageIssuedCouponUseCase.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/coupon/service/ReadMyPageIssuedCouponUseCase.java @@ -1,55 +1 @@ -package band.gosrock.api.coupon.service; - -import band.gosrock.api.common.UserUtils; -import band.gosrock.api.coupon.dto.response.ReadIssuedCouponResponse; -import band.gosrock.api.coupon.mapper.IssuedCouponMapper; -import band.gosrock.common.annotation.UseCase; -import band.gosrock.domain.domains.coupon.adaptor.IssuedCouponAdaptor; -import band.gosrock.domain.domains.coupon.domain.IssuedCoupon; -import band.gosrock.domain.domains.user.domain.User; -import java.util.ArrayList; -import java.util.List; -import lombok.RequiredArgsConstructor; -import org.springframework.transaction.annotation.Transactional; - -@UseCase -@RequiredArgsConstructor -public class ReadMyPageIssuedCouponUseCase { - private final UserUtils userUtils; - private final IssuedCouponAdaptor issuedCouponAdaptor; - - private final IssuedCouponMapper issuedCouponMapper; - - @Transactional(readOnly = true) - public ReadIssuedCouponResponse execute(boolean expired) { - // 존재하는 유저인지 검증 - User user = userUtils.getCurrentUser(); - - List issuedCoupons = issuedCouponAdaptor.findAllByUserId(user.getId()); - // 사용 가능 쿠폰 조회 (사용 이전, 유효 기간 이전) - List validTermAvailableIssuedCoupons = - issuedCoupons.stream() - .filter( - issuedCoupon -> - issuedCoupon.isAvailableTerm() - && !issuedCoupon.isUsageStatus()) - .toList(); - - // 만료된 쿠폰 조회(사용 완료, 유효 기간 만료) - if (expired) { - List expiredValidTermIssuedCoupons = - issuedCoupons.stream() - .filter( - issuedCoupon -> - !issuedCoupon.isAvailableTerm() - || issuedCoupon.isUsageStatus()) - .toList(); - return issuedCouponMapper.toReadIssuedCouponMyPageResponse( - validTermAvailableIssuedCoupons, expiredValidTermIssuedCoupons); - } - - return issuedCouponMapper.toReadIssuedCouponMyPageResponse( - validTermAvailableIssuedCoupons, new ArrayList<>()); - } -} diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/order/controller/OrderController.java b/DuDoong-Api/src/main/java/band/gosrock/api/order/controller/OrderController.java index 11d08329..280550de 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/order/controller/OrderController.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/order/controller/OrderController.java @@ -1,9 +1,17 @@ package band.gosrock.api.order.controller; +import band.gosrock.api.common.page.PageResponse; +import band.gosrock.api.order.docs.ApproveOrderExceptionDocs; +import band.gosrock.api.order.docs.CancelOrderExceptionDocs; +import band.gosrock.api.order.docs.ConfirmOrderExceptionDocs; +import band.gosrock.api.order.docs.CreateOrderExceptionDocs; +import band.gosrock.api.order.docs.FreeOrderExceptionDocs; +import band.gosrock.api.order.docs.RefundOrderExceptionDocs; import band.gosrock.api.order.model.dto.request.ConfirmOrderRequest; import band.gosrock.api.order.model.dto.request.CreateOrderRequest; import band.gosrock.api.order.model.dto.response.CreateOrderResponse; +import band.gosrock.api.order.model.dto.response.OrderBriefElement; import band.gosrock.api.order.model.dto.response.OrderResponse; import band.gosrock.api.order.service.ApproveOrderUseCase; import band.gosrock.api.order.service.CancelOrderUseCase; @@ -13,6 +21,7 @@ import band.gosrock.api.order.service.FreeOrderUseCase; import band.gosrock.api.order.service.ReadOrderUseCase; import band.gosrock.api.order.service.RefundOrderUseCase; +import band.gosrock.common.annotation.ApiErrorExceptionsExample; import band.gosrock.common.annotation.DevelopOnlyApi; import band.gosrock.infrastructure.outer.api.tossPayments.dto.response.PaymentsResponse; import io.swagger.v3.oas.annotations.Operation; @@ -20,11 +29,15 @@ import io.swagger.v3.oas.annotations.tags.Tag; import javax.validation.Valid; import lombok.RequiredArgsConstructor; +import org.springdoc.api.annotations.ParameterObject; +import org.springframework.data.domain.Pageable; +import org.springframework.data.web.PageableDefault; 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.RequestParam; import org.springframework.web.bind.annotation.RestController; @SecurityRequirement(name = "access-token") @@ -52,8 +65,8 @@ public PaymentsResponse createTossOrderUseCase(@PathVariable("order_uuid") Strin return createTossOrderUseCase.execute(orderUuid); } - // TODO : 승인 결제 방식 도입하면서 좀더 이쁘게 만들 예정 @Operation(summary = "주문을 생성합니다. 장바구니 아이디를 주문서로 변환하는 작업을 합니다.") + @ApiErrorExceptionsExample(CreateOrderExceptionDocs.class) @PostMapping("/") public CreateOrderResponse createOrder( @RequestBody @Valid CreateOrderRequest createOrderRequest) { @@ -61,6 +74,7 @@ public CreateOrderResponse createOrder( } @Operation(summary = "결제 확인하기 . successUrl 로 돌아온 웹페이지에서 query 로 받은 응답값을 서버로 보냅니당.") + @ApiErrorExceptionsExample(ConfirmOrderExceptionDocs.class) @PostMapping("/{order_uuid}/confirm") public OrderResponse confirmOrder( @PathVariable("order_uuid") String orderUuid, @@ -69,32 +83,50 @@ public OrderResponse confirmOrder( } @Operation(summary = "주문 승인하기 . 호스트 관리자가 티켓 주문을 승인합니다. ( 어드민 이벤트쪽으로 이동예정 )") + @ApiErrorExceptionsExample(ApproveOrderExceptionDocs.class) @PostMapping("/{order_uuid}/approve") public OrderResponse confirmOrder(@PathVariable("order_uuid") String orderUuid) { return approveOrderUseCase.execute(orderUuid); } @Operation(summary = "주문을 무료로 결제합니다. 선착순 방식 결제 0원일 때 지원") + @ApiErrorExceptionsExample(FreeOrderExceptionDocs.class) @PostMapping("/{order_uuid}/free") public OrderResponse freeOrder(@PathVariable("order_uuid") String orderUuid) { return freeOrderUseCase.execute(orderUuid); } @Operation(summary = "결제 취소요청. 호스트 관리자가 결제를 취소 시킵니다.! (호스트 관리자용(관리자쪽에서 사용))") + @ApiErrorExceptionsExample(CancelOrderExceptionDocs.class) @PostMapping("/{order_uuid}/cancel") public OrderResponse cancelOrder(@PathVariable("order_uuid") String orderUuid) { return cancelOrderUseCase.execute(orderUuid); } @Operation(summary = "결제 환불요청. 본인이 구매한 오더를 환불 시킵니다.! (본인 용)") + @ApiErrorExceptionsExample(RefundOrderExceptionDocs.class) @PostMapping("/{order_uuid}/refund") public OrderResponse refundOrder(@PathVariable("order_uuid") String orderUuid) { return refundOrderUseCase.execute(orderUuid); } - @Operation(summary = "결제 조회. 결제 조회 권한은 주문 본인, 호스트 관리자.") + @Operation(summary = "결제 조회. 결제 조회 권한은 주문 본인") @GetMapping("/{order_uuid}") - public OrderResponse readOrder(@PathVariable("order_uuid") String orderUuid) { - return readOrderUseCase.execute(orderUuid); + public OrderResponse getOrderDetail(@PathVariable("order_uuid") String orderUuid) { + return readOrderUseCase.getOrderDetail(orderUuid); + } + + @Operation(summary = "최근 예매내역 조회") + @GetMapping("/recent") + public OrderBriefElement getRecentOrder() { + return readOrderUseCase.getRecentOrder(); + } + + @Operation(summary = "마이페이지 내 예매목록 조회") + @GetMapping + public PageResponse getMyOrders( + @ParameterObject @RequestParam Boolean showing, + @ParameterObject @PageableDefault(size = 10) Pageable pageable) { + return readOrderUseCase.getMyOrders(showing, pageable); } } diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/order/docs/ApproveOrderExceptionDocs.java b/DuDoong-Api/src/main/java/band/gosrock/api/order/docs/ApproveOrderExceptionDocs.java new file mode 100644 index 00000000..76a36cc6 --- /dev/null +++ b/DuDoong-Api/src/main/java/band/gosrock/api/order/docs/ApproveOrderExceptionDocs.java @@ -0,0 +1,43 @@ +package band.gosrock.api.order.docs; + + +import band.gosrock.common.annotation.ExceptionDoc; +import band.gosrock.common.annotation.ExplainError; +import band.gosrock.common.exception.DuDoongCodeException; +import band.gosrock.common.interfaces.SwaggerExampleExceptions; +import band.gosrock.domain.domains.event.exception.EventIsNotOpenStatusException; +import band.gosrock.domain.domains.event.exception.EventTicketingTimeIsPassedException; +import band.gosrock.domain.domains.order.exception.NotApprovalOrderException; +import band.gosrock.domain.domains.order.exception.NotPendingOrderException; +import band.gosrock.domain.domains.order.exception.OrdeItemNotOneTypeException; +import band.gosrock.domain.domains.order.exception.OrderItemOptionChangedException; +import band.gosrock.domain.domains.ticket_item.exception.TicketItemQuantityLackException; +import band.gosrock.domain.domains.ticket_item.exception.TicketPurchaseLimitException; + +@ExceptionDoc +public class ApproveOrderExceptionDocs implements SwaggerExampleExceptions { + + @ExplainError("주문 방식이 승인 방식인지 검증합니다.") + public DuDoongCodeException 주문방식_승인방식_검증 = NotApprovalOrderException.EXCEPTION; + + @ExplainError("주문상태가 대기중인 상태가 아닐 때") + public DuDoongCodeException 주문상태_검증 = NotPendingOrderException.EXCEPTION; + + @ExplainError("이벤트가 열린 상태가 아닐때") + public DuDoongCodeException 이벤트_닫힘 = EventIsNotOpenStatusException.EXCEPTION; + + @ExplainError("이벤트 티켓팅 시간이 지났을때.") + public DuDoongCodeException 티켓팅_시간지남 = EventTicketingTimeIsPassedException.EXCEPTION; + + @ExplainError("티켓 아이템이 한 종류가 아닐 떄") + public DuDoongCodeException 아이템은_한종류여야함 = OrdeItemNotOneTypeException.EXCEPTION; + + @ExplainError("아이템의 재고가 부족한 상태일 때") + public DuDoongCodeException 티켓팅_재고부족 = TicketItemQuantityLackException.EXCEPTION; + + @ExplainError("티켓당 1인당 구매갯수 제한을 넘었을때") + public DuDoongCodeException 티켓팅_구매갯수제한 = TicketPurchaseLimitException.EXCEPTION; + + @ExplainError("주문 과정속에서 아이템의 옵션이 변화했을때 오류") + public DuDoongCodeException 아이템_옵션_변화 = OrderItemOptionChangedException.EXCEPTION; +} diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/order/docs/CancelOrderExceptionDocs.java b/DuDoong-Api/src/main/java/band/gosrock/api/order/docs/CancelOrderExceptionDocs.java new file mode 100644 index 00000000..53f0a5db --- /dev/null +++ b/DuDoong-Api/src/main/java/band/gosrock/api/order/docs/CancelOrderExceptionDocs.java @@ -0,0 +1,27 @@ +package band.gosrock.api.order.docs; + + +import band.gosrock.common.annotation.ExceptionDoc; +import band.gosrock.common.annotation.ExplainError; +import band.gosrock.common.exception.DuDoongCodeException; +import band.gosrock.common.interfaces.SwaggerExampleExceptions; +import band.gosrock.domain.domains.event.exception.EventIsNotOpenStatusException; +import band.gosrock.domain.domains.event.exception.EventTicketingTimeIsPassedException; +import band.gosrock.domain.domains.order.exception.CanNotCancelOrderException; +import band.gosrock.domain.domains.order.exception.NotRefundAvailableDateOrderException; + +@ExceptionDoc +public class CancelOrderExceptionDocs implements SwaggerExampleExceptions { + + @ExplainError("주문이 환불 가능한 시점인지 확인합니다.") + public DuDoongCodeException 주문_환불가능_시점확인 = NotRefundAvailableDateOrderException.EXCEPTION; + + @ExplainError("주문상태가 취소가 가능한 상태여야 합니다.") + public DuDoongCodeException 주문상태_취소가능_검증 = CanNotCancelOrderException.EXCEPTION; + + @ExplainError("이벤트가 열린 상태가 아닐때") + public DuDoongCodeException 이벤트_닫힘 = EventIsNotOpenStatusException.EXCEPTION; + + @ExplainError("이벤트 티켓팅 시간이 지났을때.") + public DuDoongCodeException 티켓팅_시간지남 = EventTicketingTimeIsPassedException.EXCEPTION; +} diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/order/docs/ConfirmOrderExceptionDocs.java b/DuDoong-Api/src/main/java/band/gosrock/api/order/docs/ConfirmOrderExceptionDocs.java new file mode 100644 index 00000000..e7d018bd --- /dev/null +++ b/DuDoong-Api/src/main/java/band/gosrock/api/order/docs/ConfirmOrderExceptionDocs.java @@ -0,0 +1,43 @@ +package band.gosrock.api.order.docs; + + +import band.gosrock.common.annotation.ExceptionDoc; +import band.gosrock.common.annotation.ExplainError; +import band.gosrock.common.exception.DuDoongCodeException; +import band.gosrock.common.interfaces.SwaggerExampleExceptions; +import band.gosrock.domain.domains.event.exception.EventIsNotOpenStatusException; +import band.gosrock.domain.domains.event.exception.EventTicketingTimeIsPassedException; +import band.gosrock.domain.domains.order.exception.NotPaymentOrderException; +import band.gosrock.domain.domains.order.exception.NotPendingOrderException; +import band.gosrock.domain.domains.order.exception.OrdeItemNotOneTypeException; +import band.gosrock.domain.domains.order.exception.OrderItemOptionChangedException; +import band.gosrock.domain.domains.ticket_item.exception.TicketItemQuantityLackException; +import band.gosrock.domain.domains.ticket_item.exception.TicketPurchaseLimitException; + +@ExceptionDoc +public class ConfirmOrderExceptionDocs implements SwaggerExampleExceptions { + + @ExplainError("주문 방식이 결제 방식인지 검증합니다.") + public DuDoongCodeException 주문방식_결제방식_검증 = NotPaymentOrderException.EXCEPTION; + + @ExplainError("주문상태가 대기중인 상태가 아닐 때") + public DuDoongCodeException 주문상태_검증 = NotPendingOrderException.EXCEPTION; + + @ExplainError("이벤트가 열린 상태가 아닐때") + public DuDoongCodeException 이벤트_닫힘 = EventIsNotOpenStatusException.EXCEPTION; + + @ExplainError("이벤트 티켓팅 시간이 지났을때.") + public DuDoongCodeException 티켓팅_시간지남 = EventTicketingTimeIsPassedException.EXCEPTION; + + @ExplainError("티켓 아이템이 한 종류가 아닐 떄") + public DuDoongCodeException 아이템은_한종류여야함 = OrdeItemNotOneTypeException.EXCEPTION; + + @ExplainError("아이템의 재고가 부족한 상태일 때") + public DuDoongCodeException 티켓팅_재고부족 = TicketItemQuantityLackException.EXCEPTION; + + @ExplainError("티켓당 1인당 구매갯수 제한을 넘었을때") + public DuDoongCodeException 티켓팅_구매갯수제한 = TicketPurchaseLimitException.EXCEPTION; + + @ExplainError("주문 과정속에서 아이템의 옵션이 변화했을때 오류") + public DuDoongCodeException 아이템_옵션_변화 = OrderItemOptionChangedException.EXCEPTION; +} diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/order/docs/CreateOrderExceptionDocs.java b/DuDoong-Api/src/main/java/band/gosrock/api/order/docs/CreateOrderExceptionDocs.java new file mode 100644 index 00000000..9e7ed481 --- /dev/null +++ b/DuDoong-Api/src/main/java/band/gosrock/api/order/docs/CreateOrderExceptionDocs.java @@ -0,0 +1,39 @@ +package band.gosrock.api.order.docs; + + +import band.gosrock.common.annotation.ExceptionDoc; +import band.gosrock.common.annotation.ExplainError; +import band.gosrock.common.exception.DuDoongCodeException; +import band.gosrock.common.interfaces.SwaggerExampleExceptions; +import band.gosrock.domain.domains.event.exception.EventIsNotOpenStatusException; +import band.gosrock.domain.domains.event.exception.EventTicketingTimeIsPassedException; +import band.gosrock.domain.domains.order.exception.InvalidOrderException; +import band.gosrock.domain.domains.order.exception.OrdeItemNotOneTypeException; +import band.gosrock.domain.domains.order.exception.OrderItemOptionChangedException; +import band.gosrock.domain.domains.ticket_item.exception.TicketItemQuantityLackException; +import band.gosrock.domain.domains.ticket_item.exception.TicketPurchaseLimitException; + +@ExceptionDoc +public class CreateOrderExceptionDocs implements SwaggerExampleExceptions { + + @ExplainError("선착순 주문이라 결제가 필요한 주문인데 승인으로 요청하거나 쿠폰이 적용된 주문인데 결제금액이 없는경우 등 잘못된 주문 요청") + public DuDoongCodeException 잘못된주문생성요청 = InvalidOrderException.EXCEPTION; + + @ExplainError("이벤트가 열린 상태가 아닐때") + public DuDoongCodeException 이벤트_닫힘 = EventIsNotOpenStatusException.EXCEPTION; + + @ExplainError("이벤트 티켓팅 시간이 지났을때.") + public DuDoongCodeException 티켓팅_시간지남 = EventTicketingTimeIsPassedException.EXCEPTION; + + @ExplainError("티켓 아이템이 한 종류가 아닐 떄") + public DuDoongCodeException 아이템은_한종류여야함 = OrdeItemNotOneTypeException.EXCEPTION; + + @ExplainError("아이템의 재고가 부족한 상태일 때") + public DuDoongCodeException 티켓팅_재고부족 = TicketItemQuantityLackException.EXCEPTION; + + @ExplainError("티켓당 1인당 구매갯수 제한을 넘었을때") + public DuDoongCodeException 티켓팅_구매갯수제한 = TicketPurchaseLimitException.EXCEPTION; + + @ExplainError("주문 과정속에서 아이템의 옵션이 변화했을때 오류") + public DuDoongCodeException 아이템_옵션_변화 = OrderItemOptionChangedException.EXCEPTION; +} diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/order/docs/FreeOrderExceptionDocs.java b/DuDoong-Api/src/main/java/band/gosrock/api/order/docs/FreeOrderExceptionDocs.java new file mode 100644 index 00000000..b5ad0dd2 --- /dev/null +++ b/DuDoong-Api/src/main/java/band/gosrock/api/order/docs/FreeOrderExceptionDocs.java @@ -0,0 +1,47 @@ +package band.gosrock.api.order.docs; + + +import band.gosrock.common.annotation.ExceptionDoc; +import band.gosrock.common.annotation.ExplainError; +import band.gosrock.common.exception.DuDoongCodeException; +import band.gosrock.common.interfaces.SwaggerExampleExceptions; +import band.gosrock.domain.domains.event.exception.EventIsNotOpenStatusException; +import band.gosrock.domain.domains.event.exception.EventTicketingTimeIsPassedException; +import band.gosrock.domain.domains.order.exception.NotFreeOrderException; +import band.gosrock.domain.domains.order.exception.NotPaymentOrderException; +import band.gosrock.domain.domains.order.exception.NotPendingOrderException; +import band.gosrock.domain.domains.order.exception.OrdeItemNotOneTypeException; +import band.gosrock.domain.domains.order.exception.OrderItemOptionChangedException; +import band.gosrock.domain.domains.ticket_item.exception.TicketItemQuantityLackException; +import band.gosrock.domain.domains.ticket_item.exception.TicketPurchaseLimitException; + +@ExceptionDoc +public class FreeOrderExceptionDocs implements SwaggerExampleExceptions { + + @ExplainError("주문 금액이 0원인지 검증합니다.") + public DuDoongCodeException 주문_0원_검증 = NotFreeOrderException.EXCEPTION; + + @ExplainError("주문 방식이 결제 방식인지 검증합니다.") + public DuDoongCodeException 주문방식_결제방식_검증 = NotPaymentOrderException.EXCEPTION; + + @ExplainError("주문상태가 대기중인 상태가 아닐 때") + public DuDoongCodeException 주문상태_검증 = NotPendingOrderException.EXCEPTION; + + @ExplainError("이벤트가 열린 상태가 아닐때") + public DuDoongCodeException 이벤트_닫힘 = EventIsNotOpenStatusException.EXCEPTION; + + @ExplainError("이벤트 티켓팅 시간이 지났을때.") + public DuDoongCodeException 티켓팅_시간지남 = EventTicketingTimeIsPassedException.EXCEPTION; + + @ExplainError("티켓 아이템이 한 종류가 아닐 떄") + public DuDoongCodeException 아이템은_한종류여야함 = OrdeItemNotOneTypeException.EXCEPTION; + + @ExplainError("아이템의 재고가 부족한 상태일 때") + public DuDoongCodeException 티켓팅_재고부족 = TicketItemQuantityLackException.EXCEPTION; + + @ExplainError("티켓당 1인당 구매갯수 제한을 넘었을때") + public DuDoongCodeException 티켓팅_구매갯수제한 = TicketPurchaseLimitException.EXCEPTION; + + @ExplainError("주문 과정속에서 아이템의 옵션이 변화했을때 오류") + public DuDoongCodeException 아이템_옵션_변화 = OrderItemOptionChangedException.EXCEPTION; +} diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/order/docs/RefundOrderExceptionDocs.java b/DuDoong-Api/src/main/java/band/gosrock/api/order/docs/RefundOrderExceptionDocs.java new file mode 100644 index 00000000..1130d6e7 --- /dev/null +++ b/DuDoong-Api/src/main/java/band/gosrock/api/order/docs/RefundOrderExceptionDocs.java @@ -0,0 +1,27 @@ +package band.gosrock.api.order.docs; + + +import band.gosrock.common.annotation.ExceptionDoc; +import band.gosrock.common.annotation.ExplainError; +import band.gosrock.common.exception.DuDoongCodeException; +import band.gosrock.common.interfaces.SwaggerExampleExceptions; +import band.gosrock.domain.domains.event.exception.EventIsNotOpenStatusException; +import band.gosrock.domain.domains.event.exception.EventTicketingTimeIsPassedException; +import band.gosrock.domain.domains.order.exception.CanNotRefundOrderException; +import band.gosrock.domain.domains.order.exception.NotRefundAvailableDateOrderException; + +@ExceptionDoc +public class RefundOrderExceptionDocs implements SwaggerExampleExceptions { + + @ExplainError("주문이 환불 가능한 시점인지 확인합니다.") + public DuDoongCodeException 주문_환불가능_시점확인 = NotRefundAvailableDateOrderException.EXCEPTION; + + @ExplainError("주문상태가 취소가 가능한 상태여야 합니다.") + public DuDoongCodeException 주문상태_취소가능_검증 = CanNotRefundOrderException.EXCEPTION; + + @ExplainError("이벤트가 열린 상태가 아닐때") + public DuDoongCodeException 이벤트_닫힘 = EventIsNotOpenStatusException.EXCEPTION; + + @ExplainError("이벤트 티켓팅 시간이 지났을때.") + public DuDoongCodeException 티켓팅_시간지남 = EventTicketingTimeIsPassedException.EXCEPTION; +} diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/order/model/dto/response/OrderBriefElement.java b/DuDoong-Api/src/main/java/band/gosrock/api/order/model/dto/response/OrderBriefElement.java new file mode 100644 index 00000000..dbe3737a --- /dev/null +++ b/DuDoong-Api/src/main/java/band/gosrock/api/order/model/dto/response/OrderBriefElement.java @@ -0,0 +1,54 @@ +package band.gosrock.api.order.model.dto.response; + + +import band.gosrock.domain.common.vo.EventProfileVo; +import band.gosrock.domain.common.vo.RefundInfoVo; +import band.gosrock.domain.domains.event.domain.Event; +import band.gosrock.domain.domains.issuedTicket.domain.IssuedTickets; +import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicketsStage; +import band.gosrock.domain.domains.order.domain.Order; +import band.gosrock.domain.domains.order.domain.OrderStatus; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class OrderBriefElement { + @Schema(description = "예매 취소 정보") + private final RefundInfoVo refundInfo; + + @Schema(description = "이벤트 프로필 정보") + private final EventProfileVo eventProfile; + + @Schema(description = "주문 고유 uuid") + private final String orderUuid; + + @Schema(description = "주문 번호 R------- 형식") + private final String orderNo; + + @Schema(description = "주문에 딸린 티켓들의 상태") + private final IssuedTicketsStage stage; + + @Schema(description = "주문의 상태") + private final OrderStatus orderStatus; + + @Schema(description = "아이템 이름") + private final String itemName; + + @Schema(description = "아이템 총 갯수") + private final int totalQuantity; + + public static OrderBriefElement of(Order order, Event event, IssuedTickets issuedTickets) { + return OrderBriefElement.builder() + .refundInfo(event.getRefundInfoVo()) + .stage(issuedTickets.getIssuedTicketsStage()) + .orderUuid(order.getUuid()) + .orderNo(order.getOrderNo()) + .orderStatus(order.getOrderStatus()) + .eventProfile(event.toEventProfileVo()) + .itemName(issuedTickets.getItemName()) + .totalQuantity(issuedTickets.getTotalQuantity()) + .build(); + } +} diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/order/model/dto/response/OrderResponse.java b/DuDoong-Api/src/main/java/band/gosrock/api/order/model/dto/response/OrderResponse.java index 4002f9fe..7d186a92 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/order/model/dto/response/OrderResponse.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/order/model/dto/response/OrderResponse.java @@ -1,7 +1,9 @@ package band.gosrock.api.order.model.dto.response; +import band.gosrock.domain.common.vo.EventProfileVo; import band.gosrock.domain.common.vo.RefundInfoVo; +import band.gosrock.domain.domains.event.domain.Event; import band.gosrock.domain.domains.order.domain.Order; import band.gosrock.domain.domains.order.domain.OrderMethod; import io.swagger.v3.oas.annotations.media.Schema; @@ -24,6 +26,9 @@ public class OrderResponse { @Schema(description = "예매 취소 정보") private final RefundInfoVo refundInfo; + @Schema(description = "이벤트 프로필 정보") + private final EventProfileVo eventProfile; + @Schema(description = "주문 고유 uuid") private final String orderUuid; @@ -34,14 +39,15 @@ public class OrderResponse { private final OrderMethod orderMethod; public static OrderResponse of( - Order order, RefundInfoVo refundInfo, List tickets) { + Order order, Event event, List tickets) { return OrderResponse.builder() - .refundInfo(refundInfo) + .refundInfo(event.getRefundInfoVo()) .orderMethod(order.getOrderMethod()) .paymentInfo(OrderPaymentResponse.from(order)) .tickets(tickets) .orderUuid(order.getUuid()) .orderNo(order.getOrderNo()) + .eventProfile(event.toEventProfileVo()) .build(); } } diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/order/model/mapper/OrderMapper.java b/DuDoong-Api/src/main/java/band/gosrock/api/order/model/mapper/OrderMapper.java index fb9cc7f2..75b1f0cd 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/order/model/mapper/OrderMapper.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/order/model/mapper/OrderMapper.java @@ -3,6 +3,7 @@ import band.gosrock.api.common.UserUtils; import band.gosrock.api.order.model.dto.response.CreateOrderResponse; +import band.gosrock.api.order.model.dto.response.OrderBriefElement; import band.gosrock.api.order.model.dto.response.OrderLineTicketResponse; import band.gosrock.api.order.model.dto.response.OrderResponse; import band.gosrock.common.annotation.Mapper; @@ -10,7 +11,7 @@ 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.IssuedTickets; import band.gosrock.domain.domains.order.adaptor.OrderAdaptor; import band.gosrock.domain.domains.order.domain.Order; import band.gosrock.domain.domains.order.domain.OrderLineItem; @@ -23,6 +24,7 @@ import java.util.List; import lombok.RequiredArgsConstructor; import org.jetbrains.annotations.NotNull; +import org.springframework.data.domain.Page; import org.springframework.transaction.annotation.Transactional; @Mapper @@ -39,11 +41,23 @@ public class OrderMapper { public OrderResponse toOrderResponse(String orderUuid) { Order order = orderAdaptor.findByOrderUuid(orderUuid); - Event event = eventAdaptor.findById(order.getItemGroupId()); + Event event = getEvent(order); List orderLineTicketResponses = getOrderLineTicketResponses(order); - return OrderResponse.of(order, event.getRefundInfoVo(), orderLineTicketResponses); + return OrderResponse.of(order, event, orderLineTicketResponses); + } + + @Transactional(readOnly = true) + public OrderResponse toOrderResponse(Order order) { + Event event = getEvent(order); + List orderLineTicketResponses = getOrderLineTicketResponses(order); + + return OrderResponse.of(order, event, orderLineTicketResponses); + } + + private Event getEvent(Order order) { + return eventAdaptor.findById(order.getItemGroupId()); } @Transactional(readOnly = true) @@ -73,17 +87,11 @@ private String getUserName() { return user.getProfile().getName(); } - private List getOptionIds(OrderLineItem orderLineItem) { - return orderLineItem.getOrderOptionAnswer().stream() - .map(OrderOptionAnswer::getOptionId) - .toList(); - } - private List getOptionAnswerVos(OrderLineItem orderLineItem) { - List optionIds = getOptionIds(orderLineItem); - List