From 03799b6c1ba5e27686053ed2e26f8f84adc44b6c Mon Sep 17 00:00:00 2001 From: Minjoon Kim <59060780+sanbonai06@users.noreply.github.com> Date: Mon, 16 Jan 2023 16:15:03 +0900 Subject: [PATCH 1/2] =?UTF-8?q?refactor:=20QueryDsl=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=20=EB=B0=8F=20=EC=A7=80=EC=97=B0=20=EB=A1=9C=EB=94=A9=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81=20(#1?= =?UTF-8?q?32)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat : QueryDsl 세팅 * fix : plugins 추가 * refactor(api) : QueryDsl 추가 및 발급 티켓 페이지네이션 리팩토링 * chore(api) : 주석 수정 * refactor(api) : 명명규칙 및 반환값 수정 * refactor(api) : 발급 티켓 옵션 답변 지연 로딩 관련 수정 * fix : order 생성 메서드 * feat : QueryDslConfig component 추가 * style : spotless * fix : gradle.plugins.queryds 사용 안하는 방식으로 변경 * refactor(api) : PR 리뷰 반영 Co-authored-by: 이찬진 --- .gitignore | 4 +- .../dto/response/RetrieveIssuedTicketDTO.java | 10 ++- .../RetrieveIssuedTicketDetailResponse.java | 15 ++-- .../RetrieveIssuedTicketListResponse.java | 25 ++++-- .../mapper/IssuedTicketMapper.java | 31 +++++++ .../service/ReadIssuedTicketUseCase.java | 14 +-- .../service/ReadIssuedTicketsUseCase.java | 26 ++---- DuDoong-Domain/build.gradle | 21 ++++- .../gosrock/domain/common/vo/EventInfoVo.java | 16 ++-- .../gosrock/domain/config/QueryDslConfig.java | 19 ++++ .../domain/domains/event/domain/Event.java | 5 ++ .../adaptor/IssuedTicketAdaptor.java | 35 ++++---- .../issuedTicket/domain/IssuedTicket.java | 8 +- .../dto/condtion/IssuedTicketCondition.java | 16 ++++ .../dto/response/IssuedTicketDTO.java | 8 +- .../IssuedTicketCustomRepository.java | 15 ++++ .../IssuedTicketCustomRepositoryImpl.java | 88 +++++++++++++++++++ .../repository/IssuedTicketRepository.java | 13 +-- .../service/IssuedTicketDomainService.java | 45 ---------- .../domain/domains/order/domain/Order.java | 25 +++--- .../domain/domains/user/domain/User.java | 4 +- 21 files changed, 286 insertions(+), 157 deletions(-) create mode 100644 DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/mapper/IssuedTicketMapper.java create mode 100644 DuDoong-Domain/src/main/java/band/gosrock/domain/config/QueryDslConfig.java create mode 100644 DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/dto/condtion/IssuedTicketCondition.java create mode 100644 DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/repository/IssuedTicketCustomRepository.java create mode 100644 DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/repository/IssuedTicketCustomRepositoryImpl.java diff --git a/.gitignore b/.gitignore index d4d3334e..22e1cee2 100644 --- a/.gitignore +++ b/.gitignore @@ -36,4 +36,6 @@ out/ ### VS Code ### .vscode/ .env -.env.* \ No newline at end of file +.env.* + +DuDoong-Domain/src/main/generated/**/*.java \ No newline at end of file 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 0f0e6e39..f6edff3f 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 @@ -5,17 +5,21 @@ import band.gosrock.domain.common.vo.UserInfoVo; import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicket; import band.gosrock.domain.domains.user.domain.User; +import lombok.Builder; import lombok.Getter; @Getter +@Builder public class RetrieveIssuedTicketDTO { private final IssuedTicketInfoVo issuedTicketInfo; private final UserInfoVo userInfo; - public RetrieveIssuedTicketDTO(IssuedTicket issuedTicket, User user) { - this.issuedTicketInfo = issuedTicket.toIssuedTicketInfoVo(issuedTicket); - this.userInfo = user.toUserInfoVo(user); + public static RetrieveIssuedTicketDTO of(IssuedTicket issuedTicket, User user) { + return RetrieveIssuedTicketDTO.builder() + .issuedTicketInfo(issuedTicket.toIssuedTicketInfoVo()) + .userInfo(user.toUserInfoVo()) + .build(); } } 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 2a9f5f17..e915cdef 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,13 +3,14 @@ import band.gosrock.domain.common.vo.EventInfoVo; import band.gosrock.domain.common.vo.IssuedTicketInfoVo; -import band.gosrock.domain.domains.issuedTicket.dto.response.IssuedTicketDTO; -import band.gosrock.domain.domains.user.domain.User; +import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicket; +import lombok.Builder; import lombok.Getter; import lombok.RequiredArgsConstructor; @Getter @RequiredArgsConstructor +@Builder public class RetrieveIssuedTicketDetailResponse { /* @@ -27,9 +28,11 @@ public class RetrieveIssuedTicketDetailResponse { */ private final String userName; - public RetrieveIssuedTicketDetailResponse(IssuedTicketDTO issuedTicket, User user) { - this.issuedTicketInfo = issuedTicket.getIssuedTicketInfo(); - this.eventInfo = issuedTicket.getEventInfo(); - this.userName = user.getProfile().getName(); + public static RetrieveIssuedTicketDetailResponse of(IssuedTicket issuedTicket) { + return RetrieveIssuedTicketDetailResponse.builder() + .issuedTicketInfo(issuedTicket.toIssuedTicketInfoVo()) + .eventInfo(issuedTicket.getEvent().toEventInfoVo()) + .userName(issuedTicket.getUser().getProfile().getName()) + .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 d18df636..e2cb8cfc 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 @@ -1,22 +1,33 @@ package band.gosrock.api.issuedTicket.dto.response; +import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicket; import java.util.List; +import lombok.Builder; import lombok.Getter; +import org.springframework.data.domain.Page; @Getter +@Builder public class RetrieveIssuedTicketListResponse { - private final Long page; + private final int page; - private final Long totalPage; + private final int totalPage; private final List issuedTickets; - public RetrieveIssuedTicketListResponse( - Long page, Long totalPage, List issuedTickets) { - this.page = page; - this.totalPage = totalPage; - this.issuedTickets = issuedTickets; + public static RetrieveIssuedTicketListResponse of(Page issuedTickets) { + return RetrieveIssuedTicketListResponse.builder() + .page(issuedTickets.getPageable().getPageNumber()) + .totalPage(issuedTickets.getTotalPages()) + .issuedTickets( + issuedTickets.stream() + .map( + issuedTicket -> + RetrieveIssuedTicketDTO.of( + issuedTicket, issuedTicket.getUser())) + .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 new file mode 100644 index 00000000..478da676 --- /dev/null +++ b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/mapper/IssuedTicketMapper.java @@ -0,0 +1,31 @@ +package band.gosrock.api.issuedTicket.mapper; + + +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.issuedTicket.adaptor.IssuedTicketAdaptor; +import band.gosrock.domain.domains.issuedTicket.dto.condtion.IssuedTicketCondition; +import lombok.RequiredArgsConstructor; +import org.springframework.transaction.annotation.Transactional; + +@Mapper +@RequiredArgsConstructor +public class IssuedTicketMapper { + + private final IssuedTicketAdaptor issuedTicketAdaptor; + + @Transactional(readOnly = true) + public RetrieveIssuedTicketListResponse toIssuedTicketPageResponse( + Long page, IssuedTicketCondition condition) { + return RetrieveIssuedTicketListResponse.of( + issuedTicketAdaptor.searchIssuedTicket(page, condition)); + } + + @Transactional(readOnly = true) + public RetrieveIssuedTicketDetailResponse toIssuedTicketDetailResponse( + Long currentUserId, Long issuedTicketId) { + return RetrieveIssuedTicketDetailResponse.of( + issuedTicketAdaptor.find(currentUserId, issuedTicketId)); + } +} diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/service/ReadIssuedTicketUseCase.java b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/service/ReadIssuedTicketUseCase.java index df8de961..58b757a9 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/service/ReadIssuedTicketUseCase.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/service/ReadIssuedTicketUseCase.java @@ -3,11 +3,9 @@ import band.gosrock.api.config.security.SecurityUtils; import band.gosrock.api.issuedTicket.dto.response.RetrieveIssuedTicketDetailResponse; +import band.gosrock.api.issuedTicket.mapper.IssuedTicketMapper; import band.gosrock.common.annotation.UseCase; -import band.gosrock.domain.domains.issuedTicket.dto.response.IssuedTicketDTO; import band.gosrock.domain.domains.issuedTicket.service.IssuedTicketDomainService; -import band.gosrock.domain.domains.user.domain.User; -import band.gosrock.domain.domains.user.service.UserDomainService; import lombok.RequiredArgsConstructor; @UseCase @@ -15,7 +13,7 @@ public class ReadIssuedTicketUseCase { private final IssuedTicketDomainService issuedTicketDomainService; - private final UserDomainService userDomainService; + private final IssuedTicketMapper issuedTicketMapper; /** * 발급 티켓 상세 정보 API @@ -25,12 +23,6 @@ public class ReadIssuedTicketUseCase { */ public RetrieveIssuedTicketDetailResponse execute(Long issuedTicketId) { Long currentUserId = SecurityUtils.getCurrentUserId(); - /* - Todo: 지연 로딩 트랜잭션 이슈 때문에 일단은 DTO로 감싸서 올림. But, 이게 최선일까? 고민해보자. - */ - IssuedTicketDTO issuedTicket = - issuedTicketDomainService.retrieveIssuedTicket(currentUserId, issuedTicketId); - User user = userDomainService.retrieveUser(currentUserId); - return new RetrieveIssuedTicketDetailResponse(issuedTicket, user); + return issuedTicketMapper.toIssuedTicketDetailResponse(currentUserId, issuedTicketId); } } diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/service/ReadIssuedTicketsUseCase.java b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/service/ReadIssuedTicketsUseCase.java index 7e629928..55f482fd 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/service/ReadIssuedTicketsUseCase.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/issuedTicket/service/ReadIssuedTicketsUseCase.java @@ -2,46 +2,32 @@ import band.gosrock.api.config.security.SecurityUtils; -import band.gosrock.api.issuedTicket.dto.response.RetrieveIssuedTicketDTO; import band.gosrock.api.issuedTicket.dto.response.RetrieveIssuedTicketListResponse; +import band.gosrock.api.issuedTicket.mapper.IssuedTicketMapper; import band.gosrock.common.annotation.UseCase; import band.gosrock.domain.domains.event.service.EventService; -import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicket; +import band.gosrock.domain.domains.issuedTicket.dto.condtion.IssuedTicketCondition; import band.gosrock.domain.domains.issuedTicket.service.IssuedTicketDomainService; -import band.gosrock.domain.domains.user.service.UserDomainService; import lombok.RequiredArgsConstructor; -import org.springframework.data.domain.Page; -import org.springframework.transaction.annotation.Transactional; @UseCase @RequiredArgsConstructor public class ReadIssuedTicketsUseCase { private final IssuedTicketDomainService issuedTicketDomainService; - private final UserDomainService userDomainService; + private final IssuedTicketMapper issuedTicketMapper; private final EventService eventService; /** * 발급된 티켓 리스트 가져오기 API 일단 유즈케이스에 트랜잭션 걸어서 처리 IssuedTicket에 걸린 event와 user를 연관관계 매핑 없이 조회하려할 때 - * 로직이 너무 복잡해짐 => 일단 연관관계 매핑 걸어두고 나중에 QueryDsl 설정 들어오면 바꿔야 할 듯 + * 로직이 너무 복잡해짐 => 일단 연관관계 매핑 걸어두고 나중에 QueryDsl 설정 들어오면 바꿔야 할 듯 => QueryDsl 추가 완료 */ - @Transactional(readOnly = true) public RetrieveIssuedTicketListResponse execute( Long page, Long eventId, String userName, String phoneNumber) { Long currentUserId = SecurityUtils.getCurrentUserId(); // 조회 유저 권한 인증 eventService.checkEventHost(currentUserId, eventId); - Page issuedTickets = - issuedTicketDomainService.retrieveIssuedTickets( - page, eventId, userName, phoneNumber); - return new RetrieveIssuedTicketListResponse( - page, - (long) issuedTickets.getTotalPages(), - issuedTickets.stream() - .map( - issuedTicket -> - new RetrieveIssuedTicketDTO( - issuedTicket, issuedTicket.getUser())) - .toList()); + return issuedTicketMapper.toIssuedTicketPageResponse( + page, new IssuedTicketCondition(eventId, userName, phoneNumber)); } } diff --git a/DuDoong-Domain/build.gradle b/DuDoong-Domain/build.gradle index 033736a6..db8a8648 100644 --- a/DuDoong-Domain/build.gradle +++ b/DuDoong-Domain/build.gradle @@ -7,4 +7,23 @@ dependencies { runtimeOnly 'com.h2database:h2' implementation project(':DuDoong-Common') implementation project(':DuDoong-Infrastructure') -} \ No newline at end of file + //queryDsl 설정 부분 + api ("com.querydsl:querydsl-core") // querydsl + api ("com.querydsl:querydsl-jpa") // querydsl + annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa" // querydsl JPAAnnotationProcessor 사용 지정 + annotationProcessor("jakarta.persistence:jakarta.persistence-api") + annotationProcessor("jakarta.annotation:jakarta.annotation-api") +} +//https://jojoldu.tistory.com/372 +def generated='src/main/generated' +sourceSets { + main.java.srcDirs += [ generated ] +} + +tasks.withType(JavaCompile) { + options.annotationProcessorGeneratedSourcesDirectory = file(generated) +} + +clean.doLast { + file(generated).deleteDir() +} diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/common/vo/EventInfoVo.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/common/vo/EventInfoVo.java index cfde2b22..fde90917 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/common/vo/EventInfoVo.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/common/vo/EventInfoVo.java @@ -5,12 +5,14 @@ import band.gosrock.domain.domains.event.domain.EventStatus; import com.fasterxml.jackson.annotation.JsonFormat; import java.time.LocalDateTime; +import lombok.Builder; import lombok.Getter; /* 이벤트 정보 VO (공용) */ @Getter +@Builder public class EventInfoVo { /* @@ -41,11 +43,13 @@ public class EventInfoVo { */ private final EventStatus eventStatus; - public EventInfoVo(Event event) { - this.eventName = event.getName(); - this.posterImage = event.getPosterImage(); - this.startAt = event.getStartAt(); - this.eventStatus = event.getStatus(); - this.placeName = event.getPlaceName(); + public static EventInfoVo from(Event event) { + return EventInfoVo.builder() + .eventName(event.getName()) + .posterImage(event.getPosterImage()) + .startAt(event.getStartAt()) + .placeName(event.getPlaceName()) + .eventStatus(event.getStatus()) + .build(); } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/config/QueryDslConfig.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/config/QueryDslConfig.java new file mode 100644 index 00000000..1b5bf20e --- /dev/null +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/config/QueryDslConfig.java @@ -0,0 +1,19 @@ +package band.gosrock.domain.config; + + +import com.querydsl.jpa.impl.JPAQueryFactory; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class QueryDslConfig { + + @PersistenceContext private EntityManager entityManager; + + @Bean + public JPAQueryFactory jpaQueryFactory() { + return new JPAQueryFactory(entityManager); + } +} diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/event/domain/Event.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/event/domain/Event.java index 2f677011..6c5e9846 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/event/domain/Event.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/event/domain/Event.java @@ -2,6 +2,7 @@ import band.gosrock.domain.common.model.BaseTimeEntity; +import band.gosrock.domain.common.vo.EventInfoVo; import band.gosrock.domain.common.vo.RefundInfoVo; import java.time.LocalDateTime; import javax.persistence.*; @@ -97,4 +98,8 @@ public Event( public RefundInfoVo getRefundInfoVo() { return RefundInfoVo.from(startAt); } + + public EventInfoVo toEventInfoVo() { + return EventInfoVo.from(this); + } } 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 79d9a7b2..0faa2116 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 @@ -3,12 +3,16 @@ import band.gosrock.common.annotation.Adaptor; import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicket; +import band.gosrock.domain.domains.issuedTicket.dto.condtion.IssuedTicketCondition; import band.gosrock.domain.domains.issuedTicket.exception.IssuedTicketNotFoundException; +import band.gosrock.domain.domains.issuedTicket.exception.IssuedTicketUserNotMatchedException; import band.gosrock.domain.domains.issuedTicket.repository.IssuedTicketRepository; import java.util.List; +import java.util.Objects; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; @Adaptor @RequiredArgsConstructor @@ -28,25 +32,20 @@ public List findAllByOrderLineId(Long orderLineId) { return issuedTicketRepository.findAllByOrderLineId(orderLineId); } - public IssuedTicket find(Long issuedTicket) { - return issuedTicketRepository - .findById(issuedTicket) - .orElseThrow(() -> IssuedTicketNotFoundException.EXCEPTION); + public IssuedTicket find(Long currentUserId, Long issuedTicketId) { + IssuedTicket issuedTicket = + issuedTicketRepository + .find(issuedTicketId) + .orElseThrow(() -> IssuedTicketNotFoundException.EXCEPTION); + if (!Objects.equals(issuedTicket.getUser().getId(), currentUserId)) { + throw IssuedTicketUserNotMatchedException.EXCEPTION; + } + return issuedTicket; } - public Page findAllByEvent(PageRequest pageRequest, Long eventId) { - return issuedTicketRepository.findAllByEvent_IdOrderByIdDesc(eventId, pageRequest); - } - - public Page findAllByEventAndUserName( - PageRequest pageRequest, Long eventId, String userName) { - return issuedTicketRepository.findAllByEvent_IdAndUser_Profile_NameContaining( - eventId, userName, pageRequest); - } - - public Page findAllByEventAndUserPhoneNumber( - PageRequest pageRequest, Long eventId, String phoneNumber) { - return issuedTicketRepository.findAllByEvent_IdAndUser_Profile_PhoneNumberContaining( - eventId, phoneNumber, pageRequest); + public Page searchIssuedTicket(Long page, IssuedTicketCondition condition) { + PageRequest pageRequest = + PageRequest.of(Math.toIntExact(page), 10, Sort.by("id").descending()); + return issuedTicketRepository.searchToPage(condition, pageRequest); } } 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 ae755789..62447751 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 @@ -143,10 +143,6 @@ public void createIssuedTicketNo() { } public Money sumOptionPrice() { - // issuedTicketOptionAnswers.forEach(issuedTicketOptionAnswer -> { - // this.optionPrice = this.optionPrice.plus(issuedTicketOptionAnswer.getOption() - // .getAdditionalPrice()); - // }); return issuedTicketOptionAnswers.stream() .map( issuedTicketOptionAnswer -> @@ -154,8 +150,8 @@ public Money sumOptionPrice() { .reduce(Money.ZERO, Money::plus); } - public IssuedTicketInfoVo toIssuedTicketInfoVo(IssuedTicket issuedTicket) { - return IssuedTicketInfoVo.from(issuedTicket); + public IssuedTicketInfoVo toIssuedTicketInfoVo() { + return IssuedTicketInfoVo.from(this); } public static CreateIssuedTicketResponse orderLineItemToIssuedTickets( diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/dto/condtion/IssuedTicketCondition.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/dto/condtion/IssuedTicketCondition.java new file mode 100644 index 00000000..a1373f4c --- /dev/null +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/dto/condtion/IssuedTicketCondition.java @@ -0,0 +1,16 @@ +package band.gosrock.domain.domains.issuedTicket.dto.condtion; + + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class IssuedTicketCondition { + + private Long eventId; + + private String userName; + + private String phoneNumber; +} diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/dto/response/IssuedTicketDTO.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/dto/response/IssuedTicketDTO.java index c56b6c45..7f920920 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/dto/response/IssuedTicketDTO.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/dto/response/IssuedTicketDTO.java @@ -3,18 +3,14 @@ import band.gosrock.domain.common.vo.EventInfoVo; import band.gosrock.domain.common.vo.IssuedTicketInfoVo; -import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicket; +import lombok.Builder; import lombok.Getter; @Getter +@Builder public class IssuedTicketDTO { private final IssuedTicketInfoVo issuedTicketInfo; private final EventInfoVo eventInfo; - - public IssuedTicketDTO(IssuedTicket issuedTicket) { - this.issuedTicketInfo = issuedTicket.toIssuedTicketInfoVo(issuedTicket); - this.eventInfo = new EventInfoVo(issuedTicket.getEvent()); - } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/repository/IssuedTicketCustomRepository.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/repository/IssuedTicketCustomRepository.java new file mode 100644 index 00000000..c6936700 --- /dev/null +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/repository/IssuedTicketCustomRepository.java @@ -0,0 +1,15 @@ +package band.gosrock.domain.domains.issuedTicket.repository; + + +import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicket; +import band.gosrock.domain.domains.issuedTicket.dto.condtion.IssuedTicketCondition; +import java.util.Optional; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +public interface IssuedTicketCustomRepository { + + Page searchToPage(IssuedTicketCondition condition, Pageable pageable); + + Optional find(Long issuedTicketId); +} 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 new file mode 100644 index 00000000..dc04bb58 --- /dev/null +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/repository/IssuedTicketCustomRepositoryImpl.java @@ -0,0 +1,88 @@ +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.dto.condtion.IssuedTicketCondition; +import com.querydsl.core.types.dsl.BooleanExpression; +import com.querydsl.jpa.impl.JPAQuery; +import com.querydsl.jpa.impl.JPAQueryFactory; +import java.util.List; +import java.util.Optional; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.support.PageableExecutionUtils; + +@RequiredArgsConstructor +public class IssuedTicketCustomRepositoryImpl implements IssuedTicketCustomRepository { + + private final JPAQueryFactory queryFactory; + + @Override + public Page searchToPage(IssuedTicketCondition condition, Pageable pageable) { + List issuedTickets = + queryFactory + .selectFrom(issuedTicket) + .leftJoin(issuedTicket.event, event) + .fetchJoin() + .leftJoin(issuedTicket.user, user) + .fetchJoin() + .leftJoin(issuedTicket.ticketItem, ticketItem) + .fetchJoin() + .where( + eventIdEq(condition.getEventId()), + userNameContains(condition.getUserName()), + phoneNumberContains(condition.getPhoneNumber())) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) + .fetch(); + + JPAQuery countQuery = + queryFactory + .select(issuedTicket.count()) + .from(issuedTicket) + .where( + eventIdEq(condition.getEventId()), + userNameContains(condition.getUserName()), + phoneNumberContains(condition.getPhoneNumber())); + + return PageableExecutionUtils.getPage(issuedTickets, pageable, countQuery::fetchOne); + } + + @Override + 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(issuedTicket.id.eq(issuedTicketId)) + .fetchOne(); + return Optional.ofNullable(findIssuedTicket); + } + + private BooleanExpression eventIdEq(Long eventId) { + return eventId == null ? null : issuedTicket.event.id.eq(eventId); + } + + private BooleanExpression userNameContains(String userName) { + return userName == null ? null : issuedTicket.user.profile.name.contains(userName); + } + + private BooleanExpression phoneNumberContains(String phoneNumber) { + return phoneNumber == null + ? null + : issuedTicket.user.profile.phoneNumber.contains(phoneNumber); + } +} diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/repository/IssuedTicketRepository.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/repository/IssuedTicketRepository.java index 09dda080..897b93cb 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/repository/IssuedTicketRepository.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/repository/IssuedTicketRepository.java @@ -3,20 +3,9 @@ import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicket; import java.util.List; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.repository.PagingAndSortingRepository; public interface IssuedTicketRepository - extends JpaRepository, PagingAndSortingRepository { + extends JpaRepository, IssuedTicketCustomRepository { List findAllByOrderLineId(Long orderLineId); - - Page findAllByEvent_IdOrderByIdDesc(Long eventId, Pageable pageable); - - Page findAllByEvent_IdAndUser_Profile_NameContaining( - Long eventId, String userName, Pageable pageable); - - Page findAllByEvent_IdAndUser_Profile_PhoneNumberContaining( - Long eventId, String phoneNumber, Pageable pageable); } 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 1efc1f4f..556507cf 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 @@ -7,15 +7,9 @@ import band.gosrock.domain.domains.issuedTicket.domain.IssuedTicket; import band.gosrock.domain.domains.issuedTicket.dto.request.CreateIssuedTicketDTO; import band.gosrock.domain.domains.issuedTicket.dto.response.CreateIssuedTicketResponse; -import band.gosrock.domain.domains.issuedTicket.dto.response.IssuedTicketDTO; -import band.gosrock.domain.domains.issuedTicket.exception.IssuedTicketUserNotMatchedException; import band.gosrock.domain.domains.issuedTicket.repository.IssuedTicketRepository; import java.util.List; -import java.util.Objects; import lombok.RequiredArgsConstructor; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Sort; import org.springframework.transaction.annotation.Transactional; @DomainService @@ -72,43 +66,4 @@ public void createIssuedTicket(List createIssuedTicketDTO responseDTO.getIssuedTicketOptionAnswers()); }); } - - /** - * 발급 티켓 정보 가져오기 비즈니스 로직 - * - * @param currentUserId 현재 접근 유저 id - * @param issuedTicketId 검색하고자 하는 발급 티켓 id - * @return IssuedTicketDTO (transaction 상태에서만 지연 로딩 프록시 객체를 갖고올 수 있으므로 DTO로 묶어서 반환) - */ - @Transactional(readOnly = true) - public IssuedTicketDTO retrieveIssuedTicket(Long currentUserId, Long issuedTicketId) { - IssuedTicket issuedTicket = issuedTicketAdaptor.find(issuedTicketId); - if (!Objects.equals(issuedTicket.getUser().getId(), currentUserId)) { - throw IssuedTicketUserNotMatchedException.EXCEPTION; - } - return new IssuedTicketDTO(issuedTicket); - } - - /** - * 발급 티켓 리스트 가져오기 비즈니스 로직 - * - * @param page 페이지 번호 - * @param eventId 이벤트 id - * @param userName 검색할 유저 이름 - * @return Page - */ - @Transactional(readOnly = true) - public Page retrieveIssuedTickets( - Long page, Long eventId, String userName, String phoneNumber) { - PageRequest pageRequest = - PageRequest.of(Math.toIntExact(page - 1), 10, Sort.by("id").descending()); - if (userName == null && phoneNumber == null) { - return issuedTicketAdaptor.findAllByEvent(pageRequest, eventId); - } else if (userName != null) { - return issuedTicketAdaptor.findAllByEventAndUserName(pageRequest, eventId, userName); - } else { - return issuedTicketAdaptor.findAllByEventAndUserPhoneNumber( - pageRequest, eventId, phoneNumber); - } - } } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/Order.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/Order.java index 9afb3492..e0ca52bb 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/Order.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/Order.java @@ -117,7 +117,12 @@ public Order( /** 카드, 간편결제등 토스 요청 과정이 필요한 결제를 생성합니다. */ public static Order createPaymentOrder(Long userId, Cart cart) { - return orderBaseBuilder(userId, cart) + List orderLineItems = + cart.getCartLineItems().stream().map(OrderLineItem::from).toList(); + return Order.builder() + .userId(userId) + .OrderName(cart.getCartName()) + .orderLineItems(orderLineItems) .orderStatus(OrderStatus.PENDING_PAYMENT) .orderMethod(OrderMethod.PAYMENT) .build(); @@ -125,27 +130,21 @@ public static Order createPaymentOrder(Long userId, Cart cart) { /** 승인 결제인 주문을 생성합니다. */ public static Order createApproveOrder(Long userId, Cart cart) { - return orderBaseBuilder(userId, cart) + List orderLineItems = + cart.getCartLineItems().stream().map(OrderLineItem::from).toList(); + return Order.builder() + .userId(userId) + .OrderName(cart.getCartName()) + .orderLineItems(orderLineItems) .orderStatus(OrderStatus.PENDING_APPROVE) .orderMethod(OrderMethod.APPROVAL) .build(); } - /** 주문을 생성합니다. */ public static Order createOrder(Long userId, Cart cart) { if (cart.isNeedPayment()) return createPaymentOrder(userId, cart); return createApproveOrder(userId, cart); } - - private static OrderBuilder orderBaseBuilder(Long userId, Cart cart) { - List orderLineItems = - cart.getCartLineItems().stream().map(OrderLineItem::from).toList(); - return Order.builder() - .userId(userId) - .OrderName(cart.getCartName()) - .orderLineItems(orderLineItems); - } - /** ---------------------------- 커맨드 메서드 ---------------------------------- */ /** totalPaymentInfo 를 업데이트 합니다. */ diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/user/domain/User.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/user/domain/User.java index cfe46184..8129c19b 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/user/domain/User.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/user/domain/User.java @@ -74,7 +74,7 @@ public void login() { } } - public UserInfoVo toUserInfoVo(User user) { - return UserInfoVo.from(user); + public UserInfoVo toUserInfoVo() { + return UserInfoVo.from(this); } } From 0b382e87b92cdb5c1d53e9d9bf47cfca0cb39881 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=8B=E1=85=B5=E1=84=8E=E1=85=A1=E1=86=AB=E1=84=8C?= =?UTF-8?q?=E1=85=B5=E1=86=AB?= Date: Mon, 16 Jan 2023 16:31:42 +0900 Subject: [PATCH 2/2] =?UTF-8?q?fix=20:=20token=20refresh=20=EB=95=8C?= =?UTF-8?q?=EB=8F=84=20=EC=BF=A0=ED=82=A4=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../band/gosrock/api/auth/controller/AuthController.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/DuDoong-Api/src/main/java/band/gosrock/api/auth/controller/AuthController.java b/DuDoong-Api/src/main/java/band/gosrock/api/auth/controller/AuthController.java index be8ff599..62e8ff2f 100644 --- a/DuDoong-Api/src/main/java/band/gosrock/api/auth/controller/AuthController.java +++ b/DuDoong-Api/src/main/java/band/gosrock/api/auth/controller/AuthController.java @@ -161,8 +161,11 @@ public OauthUserInfoResponse kakaoOauthUserInfo( @Operation(summary = "refreshToken 용입니다.") @PostMapping("/token/refresh") - public TokenAndUserResponse tokenRefresh(@RequestParam("token") String code) { - return refreshUseCase.execute(code); + public ResponseEntity tokenRefresh(@RequestParam("token") String code) { + TokenAndUserResponse tokenAndUserResponse = refreshUseCase.execute(code); + return ResponseEntity.ok() + .headers(cookieGenerateHelper.getTokenCookies(tokenAndUserResponse)) + .body(tokenAndUserResponse); } @Operation(summary = "회원탈퇴를 합니다.")