diff --git a/src/main/java/com/backend/allreva/rent/command/application/RentCommandService.java b/src/main/java/com/backend/allreva/rent/command/application/RentCommandService.java index ad58cf94..38ef47c4 100644 --- a/src/main/java/com/backend/allreva/rent/command/application/RentCommandService.java +++ b/src/main/java/com/backend/allreva/rent/command/application/RentCommandService.java @@ -52,5 +52,14 @@ public void closeRent( rent.close(); } + public void deleteRent( + final RentIdRequest rentIdRequest, + final Long memberId + ) { + Rent rent = rentRepository.findById(rentIdRequest.rentId()) + .orElseThrow(RentNotFoundException::new); + rent.validateMine(memberId); + rentRepository.delete(rent); + } } diff --git a/src/main/java/com/backend/allreva/rent/command/application/request/RentIdRequest.java b/src/main/java/com/backend/allreva/rent/command/application/request/RentIdRequest.java index e838d9dc..a7598542 100644 --- a/src/main/java/com/backend/allreva/rent/command/application/request/RentIdRequest.java +++ b/src/main/java/com/backend/allreva/rent/command/application/request/RentIdRequest.java @@ -1,4 +1,10 @@ package com.backend.allreva.rent.command.application.request; -public record RentIdRequest(Long rentId) { +import jakarta.validation.constraints.NotNull; + +public record RentIdRequest( + @NotNull + Long rentId +) { + } diff --git a/src/main/java/com/backend/allreva/rent/command/application/request/RentRegisterRequest.java b/src/main/java/com/backend/allreva/rent/command/application/request/RentRegisterRequest.java index 2b65aa9a..ec9241a1 100644 --- a/src/main/java/com/backend/allreva/rent/command/application/request/RentRegisterRequest.java +++ b/src/main/java/com/backend/allreva/rent/command/application/request/RentRegisterRequest.java @@ -10,32 +10,58 @@ import com.backend.allreva.rent.command.domain.value.DetailInfo; import com.backend.allreva.rent.command.domain.value.OperationInfo; import com.backend.allreva.rent.command.domain.value.Price; -import com.backend.allreva.rent_join.command.domain.value.RefundType; import com.backend.allreva.rent.command.domain.value.Region; +import com.backend.allreva.rent_join.command.domain.value.RefundType; +import com.fasterxml.jackson.annotation.JsonProperty; +import jakarta.validation.constraints.FutureOrPresent; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.PositiveOrZero; import java.time.LocalDate; import java.util.List; public record RentRegisterRequest( + @NotNull Long concertId, - String imageUrl, + @NotBlank String title, + String imageUrl, + @NotNull String artistName, + @NotNull Region region, // enum 파싱 + @NotNull String depositAccount, + @NotNull String boardingArea, + @NotNull String upTime, + @NotNull String downTime, + @NotEmpty(message = "날짜는 하루 이상 선택되어야 합니다.") + @JsonProperty("boardingDates") List rentBoardingDateRequests, + @NotNull BusSize busSize, // enum + @NotNull BusType busType, // enum + @Min(value = 1, message = "탑승 인원 수는 1명 이상이어야 합니다.") int maxPassenger, + @PositiveOrZero int roundPrice, + @PositiveOrZero int upTimePrice, + @PositiveOrZero int downTimePrice, + @Min(value = 1, message = "모집 인원 수는 1명 이상이어야 합니다.") int recruitmentCount, + @FutureOrPresent(message = "마감 기한은 과거일 수 없습니다.") LocalDate endDate, String chatUrl, - RefundType refundType, //enum + @NotNull + RefundType refundType, // enum String information ) { diff --git a/src/main/java/com/backend/allreva/rent/command/application/request/RentUpdateRequest.java b/src/main/java/com/backend/allreva/rent/command/application/request/RentUpdateRequest.java index f53fccdd..d78956b2 100644 --- a/src/main/java/com/backend/allreva/rent/command/application/request/RentUpdateRequest.java +++ b/src/main/java/com/backend/allreva/rent/command/application/request/RentUpdateRequest.java @@ -1,39 +1,53 @@ package com.backend.allreva.rent.command.application.request; -import com.backend.allreva.rent.command.domain.RentBoardingDate; import com.backend.allreva.rent.command.domain.value.BusSize; import com.backend.allreva.rent.command.domain.value.BusType; -import com.backend.allreva.rent_join.command.domain.value.RefundType; import com.backend.allreva.rent.command.domain.value.Region; +import com.backend.allreva.rent_join.command.domain.value.RefundType; +import com.fasterxml.jackson.annotation.JsonProperty; +import jakarta.validation.constraints.FutureOrPresent; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.PositiveOrZero; import java.time.LocalDate; import java.util.List; public record RentUpdateRequest( + @NotNull Long rentId, String imageUrl, + @NotNull Region region, // enum 파싱 + @NotNull String boardingArea, + @NotNull String upTime, + @NotNull String downTime, + @NotEmpty(message = "날짜는 하루 이상 선택되어야 합니다.") + @JsonProperty("boardingDates") List rentBoardingDateRequests, + @NotNull BusSize busSize, // enum + @NotNull BusType busType, // enum + @Min(value = 1, message = "탑승 인원 수는 1명 이상이어야 합니다.") int maxPassenger, + @PositiveOrZero int roundPrice, + @PositiveOrZero int upTimePrice, + @PositiveOrZero int downTimePrice, + @Min(value = 1, message = "모집 인원 수는 1명 이상이어야 합니다.") int recruitmentCount, + @FutureOrPresent(message = "마감 기한은 과거일 수 없습니다.") LocalDate endDate, String chatUrl, + @NotNull RefundType refundType, //enum String information ) { - public List toRentBoardingDates() { - return rentBoardingDateRequests.stream() - .map(request -> RentBoardingDate.builder() - .date(request) - .build()) - .toList(); - } } diff --git a/src/main/java/com/backend/allreva/rent/command/domain/RentRepository.java b/src/main/java/com/backend/allreva/rent/command/domain/RentRepository.java index ad04460b..68d98931 100644 --- a/src/main/java/com/backend/allreva/rent/command/domain/RentRepository.java +++ b/src/main/java/com/backend/allreva/rent/command/domain/RentRepository.java @@ -1,9 +1,13 @@ package com.backend.allreva.rent.command.domain; import com.backend.allreva.rent.command.domain.value.Region; -import com.backend.allreva.rent.query.application.response.*; +import com.backend.allreva.rent.query.application.response.DepositAccountResponse; +import com.backend.allreva.rent.query.application.response.RentAdminSummaryResponse; +import com.backend.allreva.rent.query.application.response.RentDetailResponse; +import com.backend.allreva.rent.query.application.response.RentJoinCountResponse; +import com.backend.allreva.rent.query.application.response.RentJoinDetailResponse; +import com.backend.allreva.rent.query.application.response.RentSummaryResponse; import com.backend.allreva.survey.query.application.response.SortType; - import java.time.LocalDate; import java.util.List; import java.util.Optional; @@ -26,9 +30,10 @@ public interface RentRepository { Optional findRentDetailById(Long rentId); Optional findDepositAccountById(Long rentId); - List findRentAdminSummariesByMemberId(Long memberId); - Optional findRentAdminDetail(Long memberId, LocalDate boardingDate, Long rentId); - List findRentAdminJoinDetails(Long memberId, Long rentId, LocalDate boardingDate); + List findRentAdminSummaries(Long memberId); + Optional findRentAdminSummary(Long memberId, LocalDate boardingDate, Long rentId); + Optional findRentJoinCount(Long memberId, LocalDate boardingDate, Long rentId); + List findRentJoinDetails(Long memberId, Long rentId, LocalDate boardingDate); List findRentMainSummaries(); } diff --git a/src/main/java/com/backend/allreva/rent/infra/rdb/RentDslRepositoryImpl.java b/src/main/java/com/backend/allreva/rent/infra/rdb/RentDslRepositoryImpl.java index 8bf96905..163c18cd 100644 --- a/src/main/java/com/backend/allreva/rent/infra/rdb/RentDslRepositoryImpl.java +++ b/src/main/java/com/backend/allreva/rent/infra/rdb/RentDslRepositoryImpl.java @@ -1,29 +1,35 @@ package com.backend.allreva.rent.infra.rdb; +import static com.backend.allreva.concert.command.domain.QConcert.concert; +import static com.backend.allreva.hall.command.domain.QConcertHall.concertHall; +import static com.backend.allreva.rent.command.domain.QRent.rent; +import static com.backend.allreva.rent.command.domain.QRentBoardingDate.rentBoardingDate; +import static com.backend.allreva.rent_join.command.domain.QRentJoin.rentJoin; +import static com.querydsl.core.types.Projections.list; + import com.backend.allreva.common.util.DateHolder; import com.backend.allreva.rent.command.domain.value.Region; -import com.backend.allreva.rent.query.application.response.*; +import com.backend.allreva.rent.query.application.response.DepositAccountResponse; +import com.backend.allreva.rent.query.application.response.RentAdminSummaryResponse; +import com.backend.allreva.rent.query.application.response.RentDetailResponse; +import com.backend.allreva.rent.query.application.response.RentDetailResponse.RentBoardingDateResponse; +import com.backend.allreva.rent.query.application.response.RentJoinCountResponse; +import com.backend.allreva.rent.query.application.response.RentJoinDetailResponse; +import com.backend.allreva.rent.query.application.response.RentSummaryResponse; import com.backend.allreva.rent_join.command.domain.value.BoardingType; import com.backend.allreva.rent_join.command.domain.value.RefundType; import com.backend.allreva.survey.query.application.response.SortType; -import com.querydsl.core.types.*; +import com.querydsl.core.types.ConstructorExpression; +import com.querydsl.core.types.OrderSpecifier; +import com.querydsl.core.types.Projections; import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.core.types.dsl.NumberExpression; -import com.querydsl.jpa.JPAExpressions; import com.querydsl.jpa.impl.JPAQueryFactory; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; - import java.time.LocalDate; import java.util.List; import java.util.Optional; - -import static com.backend.allreva.concert.command.domain.QConcert.concert; -import static com.backend.allreva.hall.command.domain.QConcertHall.concertHall; -import static com.backend.allreva.rent.command.domain.QRent.rent; -import static com.backend.allreva.rent.command.domain.QRentBoardingDate.rentBoardingDate; -import static com.backend.allreva.rent_join.command.domain.QRentJoin.rentJoin; -import static com.querydsl.core.types.Projections.list; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; @Repository @RequiredArgsConstructor @@ -32,19 +38,6 @@ public class RentDslRepositoryImpl { private final JPAQueryFactory queryFactory; private final DateHolder dateHolder; - /** - * [SubQuery] 차 대절 현재 참여자 수 - */ - private Expression getParticipationCount() { - // 해당 쿼리를 rentBoardingDate 별로 나눠서 count를 구하고 싶어 - return ExpressionUtils.as(JPAExpressions - .select(rentJoin.passengerNum.sum()) - .from(rentJoin) - .where(rentJoin.rentId.eq(rent.id) - .and(rentJoin.boardingDate.eq(rentBoardingDate.date))) - .groupBy(rentJoin.rentId, rentJoin.boardingDate), "participationCount"); - } - /** * 차 대절 메인 페이지 조회 */ @@ -65,7 +58,7 @@ public List findRentSummaries( )) .from(rent) .where( - rent.additionalInfo.endDate.goe(dateHolder.getDate()), + rent.additionalInfo.endDate.goe(dateHolder.getDate()), // TODO: 마감 기한 스케쥴러 구현 시 조건 1개 빼도 될듯 rent.isClosed.eq(false), getRegionCondition(region), getPagingCondition(sortType, lastId, lastEndDate) @@ -112,16 +105,13 @@ private BooleanExpression getPagingCondition( switch (sortType) { case CLOSING -> { return (rent.additionalInfo.endDate.gt(lastEndDate)) - .or(rent.additionalInfo.endDate.eq(lastEndDate).and(rent.id.gt(lastId))); + .or(rent.additionalInfo.endDate.eq(lastEndDate).and(rent.id.gt(lastId))); } case OLDEST -> { return rent.id.gt(lastId); } - case LATEST -> { - return rent.id.lt(lastId); - } default -> { - return null; + return rent.id.lt(lastId); } } } @@ -131,24 +121,19 @@ private OrderSpecifier[] orderSpecifiers(final SortType sortType) { case CLOSING -> { return new OrderSpecifier[]{ rent.additionalInfo.endDate.asc(), - rent.detailInfo.title.asc() + rent.id.asc() }; } case OLDEST -> { return new OrderSpecifier[]{ - rent.createdAt.asc(), - rent.detailInfo.title.asc() + rent.id.asc() }; } - case LATEST -> { + default -> { return new OrderSpecifier[]{ - rent.createdAt.desc(), - rent.detailInfo.title.asc() + rent.id.desc() }; } - default -> { - return new OrderSpecifier[0]; - } } } @@ -163,6 +148,8 @@ public Optional findRentDetailById(final Long rentId) { .leftJoin(concert).on(rent.concertId.eq(concert.id)) .leftJoin(concertHall).on(concert.code.hallCode.eq(concertHall.id)) .join(rentBoardingDate).on(rent.id.eq(rentBoardingDate.rent.id)) + .leftJoin(rentJoin).on(rentBoardingDate.date.eq(rentJoin.boardingDate)) + .groupBy(rentBoardingDate.date) .fetchFirst(); return Optional.ofNullable(rentDetailResponse); } @@ -178,8 +165,12 @@ public ConstructorExpression rentDetailProjections() { concertHall.name, // 하행 지역 rent.operationInfo.upTime, rent.operationInfo.downTime, - list(rentBoardingDate.date), - list(getParticipationCount()), + list( + Projections.constructor( + RentBoardingDateResponse.class, + rentBoardingDate.date, + rentJoin.passengerNum.sum() + )), rent.operationInfo.bus.busSize, rent.operationInfo.bus.busType, rent.operationInfo.bus.maxPassenger, @@ -190,7 +181,8 @@ public ConstructorExpression rentDetailProjections() { rent.additionalInfo.endDate, rent.additionalInfo.chatUrl, rent.additionalInfo.refundType, - rent.additionalInfo.information + rent.additionalInfo.information, + rent.isClosed ); } @@ -208,70 +200,105 @@ public Optional findDepositAccountById(final Long rentId } /** - * [Register] 등록한 차 대절 리스트 조회 + * [Register] 등록한 차 대절 관리 리스트 조회 + * @param memberId 등록자 ID + * @return 차 대절 관리 리스트 조회 결과 */ - public List findRentAdminSummariesByMemberId(final Long memberId) { + public List findRentAdminSummaries(final Long memberId) { return queryFactory.select(Projections.constructor(RentAdminSummaryResponse.class, rent.id, rent.detailInfo.title, rentBoardingDate.date, rent.operationInfo.boardingArea, - rent.operationInfo.bus.busSize, - rent.operationInfo.bus.busType, - rent.operationInfo.bus.maxPassenger, - rent.additionalInfo.endDate, rent.createdAt, + rent.additionalInfo.endDate, rent.additionalInfo.recruitmentCount, - getParticipationCount(), - rent.isClosed + rentJoin.passengerNum.sum().intValue(), + rent.isClosed, + rent.operationInfo.bus.busSize, + rent.operationInfo.bus.busType, + rent.operationInfo.bus.maxPassenger )) .from(rent) .join(rentBoardingDate).on(rent.id.eq(rentBoardingDate.rent.id)) + .join(rentJoin).on(rentBoardingDate.date.eq(rentJoin.boardingDate)) + .where(rent.memberId.eq(memberId)) + .groupBy(rent.id, rentBoardingDate.date) + .fetch(); + } + + /** + * [Register] 자신이 등록한 차 대절 관리 상세 조회 + * @param memberId 등록자 ID + * @param boardingDate 차 대절 날짜 + * @param rentId 차 대절 ID + * @return 차 대절 관리 상세 조회 결과 + */ + public Optional findRentAdminSummary( + final Long rentId, + final LocalDate boardingDate, + final Long memberId + ) { + RentAdminSummaryResponse rentAdminSummaryResponse = queryFactory.select( + Projections.constructor(RentAdminSummaryResponse.class, + rent.id, + rent.detailInfo.title, + rentBoardingDate.date, + rent.operationInfo.boardingArea, + rent.createdAt, + rent.additionalInfo.endDate, + rent.additionalInfo.recruitmentCount, + rentJoin.passengerNum.sum().intValue(), + rent.isClosed, + rent.operationInfo.bus.busSize, + rent.operationInfo.bus.busType, + rent.operationInfo.bus.maxPassenger + )) + .from(rent) + .join(rentBoardingDate).on(rent.id.eq(rentBoardingDate.rent.id)) + .join(rentJoin).on(rentBoardingDate.date.eq(rentJoin.boardingDate)) .where( - rent.memberId.eq(memberId), - rent.isClosed.eq(false), - rentBoardingDate.date.goe(dateHolder.getDate()) // 마감 날짜 안지난것만 + rentJoin.rentId.eq(rentId), + rentJoin.boardingDate.eq(boardingDate), + rent.memberId.eq(memberId) ) - .fetch(); + .groupBy(rent.id, rentBoardingDate.date) + .fetchFirst(); + return Optional.ofNullable(rentAdminSummaryResponse); } /** - * [Register] 내가 등록한 차 대절 상세 조회 - *

- * 이용 구분, 입금 처리에 대한 count를 반환합니다. + * [Register] 자신이 등록한 차 대절 신청 인원 상세 조회 + * @param memberId 등록자 ID + * @param boardingDate 차 대절 날짜 + * @param rentId 차 대절 ID + * @return 차 대절 신청 인원 상세 조회 결과 */ - public Optional findRentAdminDetail( + public Optional findRentJoinCount( final Long memberId, final LocalDate boardingDate, final Long rentId ) { - RentAdminDetailResponse rentAdminDetailResponse = queryFactory - .select(Projections.constructor(RentAdminDetailResponse.class, - rent.id, - rent.additionalInfo.recruitmentCount, - ExpressionUtils.as(JPAExpressions - .select(rentJoin.passengerNum.sum()) - .from(rentJoin) - .where(rentJoin.rentId.eq(rent.id) - .and(rentJoin.boardingDate.eq(boardingDate))) - .groupBy(rentJoin.rentId, rentJoin.boardingDate), "participationCount"), - getRentBoardingCount(BoardingType.UP, "RentUpCount"), - getRentBoardingCount(BoardingType.DOWN, "RentDownCount"), - getRentBoardingCount(BoardingType.ROUND, "RentRoundCount"), - getRefundCount(RefundType.REFUND, "refundCount"), - getRefundCount(RefundType.ADDITIONAL_DEPOSIT, "additionalDepositCount"))) - .from(rent) - .leftJoin(rentJoin).on(rentJoin.rentId.eq(rent.id)) + RentJoinCountResponse rentJoinCountResponse = queryFactory.select( + Projections.constructor(RentJoinCountResponse.class, + getRentBoardingCount(BoardingType.UP, "RentUpCount"), + getRentBoardingCount(BoardingType.DOWN, "RentDownCount"), + getRentBoardingCount(BoardingType.ROUND, "RentRoundCount"), + getRefundCount(RefundType.REFUND, "refundCount"), + getRefundCount(RefundType.ADDITIONAL_DEPOSIT, "additionalDepositCount"))) + .from(rentJoin) + .join(rent).on(rentJoin.rentId.eq(rent.id)) .where( - rent.memberId.eq(memberId), + rentJoin.rentId.eq(rentId), rentJoin.boardingDate.eq(boardingDate), - rent.id.eq(rentId), - rent.isClosed.eq(false)) + rent.memberId.eq(memberId) + ) .groupBy(rentJoin.boardingType, rentJoin.refundType) .fetchFirst(); - return Optional.ofNullable(rentAdminDetailResponse); + return Optional.ofNullable(rentJoinCountResponse); } + // BoardingType에 따른 case when절 private NumberExpression getRentBoardingCount(final BoardingType boardingType, final String alias) { return rentJoin.boardingType .when(boardingType) @@ -280,6 +307,7 @@ private NumberExpression getRentBoardingCount(final BoardingType boardi .as(alias); } + // RefundType에 따른 case when절 private NumberExpression getRefundCount(final RefundType refundType, final String alias) { return rentJoin.refundType .when(refundType) @@ -293,15 +321,20 @@ private NumberExpression getRefundCount(final RefundType refundType, fi } /** - * [Register] 차 대절 참가자 리스트 조회 + * [Register] 자신이 등록한 차 대절 참가자 리스트 조회 + * @param memberId 등록자 ID + * @param rentId 차 대절 ID + * @param boardingDate 차 대절 날짜 + * @return 자신이 등록한 차 대절 참가자 리스트 조회 결과 */ - public List findRentAdminJoinDetails( + public List findRentJoinDetails( final Long memberId, final Long rentId, final LocalDate boardingDate ) { - return queryFactory.select(Projections.constructor(RentAdminJoinDetailResponse.class, + return queryFactory.select(Projections.constructor(RentJoinDetailResponse.class, rentJoin.id, + rentJoin.createdAt, rentJoin.depositor.depositorName, rentJoin.depositor.phone, rentJoin.passengerNum, @@ -310,14 +343,13 @@ public List findRentAdminJoinDetails( rentJoin.refundType, rentJoin.refundAccount )) - .from(rent) - .join(rentJoin).on(rentJoin.rentId.eq(rent.id)) + .from(rentJoin) + .join(rent).on(rentJoin.rentId.eq(rent.id)) .where( - rent.memberId.eq(memberId), - rent.id.eq(rentId), - rentJoin.boardingDate.eq(boardingDate) + rentJoin.rentId.eq(rentId), + rentJoin.boardingDate.eq(boardingDate), + rent.memberId.eq(memberId) ) .fetch(); } - } diff --git a/src/main/java/com/backend/allreva/rent/infra/rdb/RentRepositoryImpl.java b/src/main/java/com/backend/allreva/rent/infra/rdb/RentRepositoryImpl.java index e4c58af1..e211dcff 100644 --- a/src/main/java/com/backend/allreva/rent/infra/rdb/RentRepositoryImpl.java +++ b/src/main/java/com/backend/allreva/rent/infra/rdb/RentRepositoryImpl.java @@ -4,14 +4,18 @@ import com.backend.allreva.rent.command.domain.RentBoardingDate; import com.backend.allreva.rent.command.domain.RentRepository; import com.backend.allreva.rent.command.domain.value.Region; -import com.backend.allreva.rent.query.application.response.*; +import com.backend.allreva.rent.query.application.response.DepositAccountResponse; +import com.backend.allreva.rent.query.application.response.RentAdminSummaryResponse; +import com.backend.allreva.rent.query.application.response.RentDetailResponse; +import com.backend.allreva.rent.query.application.response.RentJoinCountResponse; +import com.backend.allreva.rent.query.application.response.RentJoinDetailResponse; +import com.backend.allreva.rent.query.application.response.RentSummaryResponse; import com.backend.allreva.survey.query.application.response.SortType; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; - import java.time.LocalDate; import java.util.List; import java.util.Optional; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; @Repository @RequiredArgsConstructor @@ -20,6 +24,7 @@ public class RentRepositoryImpl implements RentRepository { private final RentJpaRepository rentJpaRepository; private final RentDslRepositoryImpl rentDslRepository; private final RentBoardingDateJpaRepository rentBoardingDateJpaRepository; + @Override public Optional findById(final Long id) { return rentJpaRepository.findById(id); @@ -63,8 +68,7 @@ public List findRentSummaries( final Long lastId, final int pageSize ) { - return rentDslRepository - .findRentSummaries(region, sortType, lastEndDate, lastId, pageSize); + return rentDslRepository.findRentSummaries(region, sortType, lastEndDate, lastId, pageSize); } @Override @@ -80,35 +84,41 @@ public Optional findDepositAccountById( } @Override - public List findRentAdminSummariesByMemberId( + public List findRentAdminSummaries( final Long memberId ) { - return rentDslRepository.findRentAdminSummariesByMemberId(memberId); + return rentDslRepository.findRentAdminSummaries(memberId); + } + + @Override + public Optional findRentAdminSummary( + final Long memberId, + final LocalDate boardingDate, + final Long rentId + ) { + return rentDslRepository.findRentAdminSummary(memberId, boardingDate, rentId); } @Override - public Optional findRentAdminDetail( + public Optional findRentJoinCount( final Long memberId, final LocalDate boardingDate, final Long rentId ) { - return rentDslRepository - .findRentAdminDetail(memberId, boardingDate, rentId); + return rentDslRepository.findRentJoinCount(memberId, boardingDate, rentId); } @Override - public List findRentAdminJoinDetails( + public List findRentJoinDetails( final Long memberId, final Long rentId, final LocalDate boardingDate ) { - return rentDslRepository - .findRentAdminJoinDetails(memberId, rentId, boardingDate); + return rentDslRepository.findRentJoinDetails(memberId, rentId, boardingDate); } @Override public List findRentMainSummaries() { return rentDslRepository.findRentMainSummaries(); } - } diff --git a/src/main/java/com/backend/allreva/rent/query/application/RentQueryRepository.java b/src/main/java/com/backend/allreva/rent/query/application/RentQueryRepository.java deleted file mode 100644 index 5c41b20a..00000000 --- a/src/main/java/com/backend/allreva/rent/query/application/RentQueryRepository.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.backend.allreva.rent.query.application; - -import com.backend.allreva.rent.command.domain.value.Region; -import com.backend.allreva.rent.query.application.response.*; -import com.backend.allreva.survey.query.application.response.SortType; - -import java.time.LocalDate; -import java.util.List; -import java.util.Optional; - -public interface RentQueryRepository { - List findRentSummaries(Region region, SortType sortType, LocalDate lastEndDate, Long lastId, int pageSize); - Optional findRentDetailById(Long rentId); - Optional findDepositAccountById(Long rentId); - - List findRentAdminSummariesByMemberId(Long memberId); - Optional findRentAdminDetail(Long memberId, LocalDate boardingDate, Long rentId); - List findRentAdminJoinDetails(Long memberId, Long rentId, LocalDate boardingDate); - - List findRentMainSummaries(); -} diff --git a/src/main/java/com/backend/allreva/rent/query/application/RentQueryService.java b/src/main/java/com/backend/allreva/rent/query/application/RentQueryService.java index 876bcf43..4133d1ff 100644 --- a/src/main/java/com/backend/allreva/rent/query/application/RentQueryService.java +++ b/src/main/java/com/backend/allreva/rent/query/application/RentQueryService.java @@ -3,13 +3,16 @@ import com.backend.allreva.rent.command.domain.RentRepository; import com.backend.allreva.rent.command.domain.value.Region; import com.backend.allreva.rent.exception.RentNotFoundException; -import com.backend.allreva.rent.query.application.response.*; +import com.backend.allreva.rent.query.application.response.DepositAccountResponse; +import com.backend.allreva.rent.query.application.response.RentAdminDetailResponse; +import com.backend.allreva.rent.query.application.response.RentAdminSummaryResponse; +import com.backend.allreva.rent.query.application.response.RentDetailResponse; +import com.backend.allreva.rent.query.application.response.RentSummaryResponse; import com.backend.allreva.survey.query.application.response.SortType; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - import java.time.LocalDate; import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; @Service @RequiredArgsConstructor @@ -42,7 +45,7 @@ public DepositAccountResponse getDepositAccountById(final Long id) { } public List getRentAdminSummariesByMemberId(final Long memberId) { - return rentRepository.findRentAdminSummariesByMemberId(memberId); + return rentRepository.findRentAdminSummaries(memberId); } public RentAdminDetailResponse getRentAdminDetail( @@ -50,13 +53,12 @@ public RentAdminDetailResponse getRentAdminDetail( final LocalDate boardingDate, final Long rentId ) { - RentAdminDetailResponse rentAdminDetailResponse = rentRepository.findRentAdminDetail(memberId, - boardingDate, rentId) - .orElseThrow(RentNotFoundException::new); - List rentAdminJoinDetails = rentRepository.findRentAdminJoinDetails(memberId, - rentId, boardingDate); - rentAdminDetailResponse.setRentJoinDetailResponses(rentAdminJoinDetails); - return rentAdminDetailResponse; + return new RentAdminDetailResponse( + rentRepository.findRentAdminSummary(memberId, boardingDate, rentId) + .orElseThrow(RentNotFoundException::new), + rentRepository.findRentJoinCount(memberId, boardingDate, rentId) + .orElseThrow(RentNotFoundException::new), + rentRepository.findRentJoinDetails(memberId, rentId, boardingDate) + ); } - } diff --git a/src/main/java/com/backend/allreva/rent/query/application/response/RentAdminDetailResponse.java b/src/main/java/com/backend/allreva/rent/query/application/response/RentAdminDetailResponse.java index 3e03338c..cb5a9f6a 100644 --- a/src/main/java/com/backend/allreva/rent/query/application/response/RentAdminDetailResponse.java +++ b/src/main/java/com/backend/allreva/rent/query/application/response/RentAdminDetailResponse.java @@ -1,40 +1,16 @@ package com.backend.allreva.rent.query.application.response; +import com.fasterxml.jackson.annotation.JsonUnwrapped; import java.util.List; import lombok.Getter; -import lombok.Setter; +import lombok.RequiredArgsConstructor; @Getter +@RequiredArgsConstructor public class RentAdminDetailResponse { - private final Long rentId; - private final int maxRecruitmentCount; - private final int currentRecruitmentCount; - private final int rentUpCount; - private final int rentDownCount; - private final int rentRoundCount; - private final int additionalDepositCount; - private final int refundCount; - @Setter - private List rentJoinDetailResponses; - - // for queryDsl - public RentAdminDetailResponse( - final Long rentId, - final int maxRecruitmentCount, - final int currentRecruitmentCount, - final int rentUpCount, - final int rentDownCount, - final int rentRoundCount, - final int additionalDepositCount, - final int refundCount - ) { - this.rentId = rentId; - this.maxRecruitmentCount = maxRecruitmentCount; - this.currentRecruitmentCount = currentRecruitmentCount; - this.rentUpCount = rentUpCount; - this.rentDownCount = rentDownCount; - this.rentRoundCount = rentRoundCount; - this.additionalDepositCount = additionalDepositCount; - this.refundCount = refundCount; - } + @JsonUnwrapped + private final RentAdminSummaryResponse rentAdminSummaryResponse; + @JsonUnwrapped + private final RentJoinCountResponse rentJoinCountResponse; + private final List rentJoinDetailResponses; } \ No newline at end of file diff --git a/src/main/java/com/backend/allreva/rent/query/application/response/RentAdminJoinDetailResponse.java b/src/main/java/com/backend/allreva/rent/query/application/response/RentAdminJoinDetailResponse.java deleted file mode 100644 index 6e9b66d4..00000000 --- a/src/main/java/com/backend/allreva/rent/query/application/response/RentAdminJoinDetailResponse.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.backend.allreva.rent.query.application.response; - -import com.backend.allreva.rent_join.command.domain.value.BoardingType; -import com.backend.allreva.rent_join.command.domain.value.RefundType; - -public record RentAdminJoinDetailResponse( - Long rentJoinId, - String depositorName, - String phone, - int passengerNum, - BoardingType boardingType, - String depositorTime, - RefundType refundType, - String rentAccount -) { - -} diff --git a/src/main/java/com/backend/allreva/rent/query/application/response/RentAdminSummaryResponse.java b/src/main/java/com/backend/allreva/rent/query/application/response/RentAdminSummaryResponse.java index b9291515..4c880fc0 100644 --- a/src/main/java/com/backend/allreva/rent/query/application/response/RentAdminSummaryResponse.java +++ b/src/main/java/com/backend/allreva/rent/query/application/response/RentAdminSummaryResponse.java @@ -7,17 +7,17 @@ public record RentAdminSummaryResponse( Long rentId, - String title, - LocalDate boardingDate, - String boardingArea, - BusSize busSize, - BusType busType, - int maxPassenger, - LocalDate endDate, - LocalDateTime createdAt, - int maxRecruitmentCount, - int currentRecruitmentCount, - boolean isClosed + String title, // 차량 대절 제목 + LocalDate boardingDate, // 차량 대절 날짜 + String boardingArea, // TODO: boardingArea or Region? + LocalDateTime rentStartDate, // 차량 대절 모집 시작 시간 + LocalDate rentEndDate, // 차량 대절 모집 종료 시간 + int recruitmentCount, // 차량 대절 모집 인원 + int participationCount, // 차량 대절 현재 참여 인원 + boolean isClosed, // 모집중 상태 + BusSize busSize, // 버스 + BusType busType, // 버스 + int maxPassenger // 버스 ) { } diff --git a/src/main/java/com/backend/allreva/rent/query/application/response/RentDetailResponse.java b/src/main/java/com/backend/allreva/rent/query/application/response/RentDetailResponse.java index dbf02bed..4b761821 100644 --- a/src/main/java/com/backend/allreva/rent/query/application/response/RentDetailResponse.java +++ b/src/main/java/com/backend/allreva/rent/query/application/response/RentDetailResponse.java @@ -8,28 +8,34 @@ import java.util.List; public record RentDetailResponse( - String concertName, // x -> 대신 concert랑 조인해서 concert name - String imageUrl, - String title, - String artistName, - Region region, + String concertName, // 콘서트 이름 + String imageUrl, // 콘서트 이미지 + String title, // 차량 대절 이름 + String artistName, // 아티스트 이름 + Region region, // 차량 대절 지역 String boardingArea, // 상행 지역 String dropOffArea, // 하행 지역 -> concerthall code 조인 - String upTime, - String downTime, - List rentBoardingDates, - List currentRecruitmentCounts, - BusSize busSize, - BusType busType, - int maxPassenger, - int roundPrice, - int upTimePrice, - int downTimePrice, - int recruitmentCount, - LocalDate endDate, - String chatUrl, // 지금은 필요없을듯 일단은 넣어놓자. - RefundType refundType, - String information + String upTime, // 상행 시간 + String downTime, // 하행 시간 + List boardingDates, + BusSize busSize, // 차량 정보 - 사이즈 + BusType busType, // 차량 정보 - 버스 타입 + int maxPassenger, // 차량 정보 - 최대 탑승 인원 + int roundPrice, // 왕복 가격 + int upTimePrice, // 상행 가격 + int downTimePrice, // 하행 가격 + int recruitmentCount, // 모집 인원 + LocalDate endDate, // 마감일 + String chatUrl, // 채팅 url - 지금은 필요없을듯 일단은 넣어놓자. + RefundType refundType, // + String information, // 기타 안내 사항 + boolean isClosed // 마감 여부 ) { + public record RentBoardingDateResponse( + LocalDate date, + int participationCount + ) { + + } } diff --git a/src/main/java/com/backend/allreva/rent/query/application/response/RentJoinCountResponse.java b/src/main/java/com/backend/allreva/rent/query/application/response/RentJoinCountResponse.java new file mode 100644 index 00000000..0b8c6eba --- /dev/null +++ b/src/main/java/com/backend/allreva/rent/query/application/response/RentJoinCountResponse.java @@ -0,0 +1,11 @@ +package com.backend.allreva.rent.query.application.response; + +public record RentJoinCountResponse( + int rentUpCount, // 이용 구분 - 상행 참여 인원 + int rentDownCount, // 이용 구분 - 하행 참여 인원 + int rentRoundCount, // 이용 구분 - 왕복 참여 인원 + int additionalDepositCount, // 입금 처리 - 추가 입금 인원 + int refundCount // 입금 처리 - 환불 인원 +) { + +} diff --git a/src/main/java/com/backend/allreva/rent/query/application/response/RentJoinDetailResponse.java b/src/main/java/com/backend/allreva/rent/query/application/response/RentJoinDetailResponse.java new file mode 100644 index 00000000..04ba76dc --- /dev/null +++ b/src/main/java/com/backend/allreva/rent/query/application/response/RentJoinDetailResponse.java @@ -0,0 +1,19 @@ +package com.backend.allreva.rent.query.application.response; + +import com.backend.allreva.rent_join.command.domain.value.BoardingType; +import com.backend.allreva.rent_join.command.domain.value.RefundType; +import java.time.LocalDateTime; + +public record RentJoinDetailResponse( + Long rentJoinId, // 차량 대절 참여 ID + LocalDateTime applyDate, // 신청 날짜 + String depositorName, // 입금자명 + String phone, // 연락처 + int passengerNum, // 탑승 인원 + BoardingType boardingType, // 이용 편도 + String depositorTime, // 입금 시각 + RefundType refundType, // 환불 정책 + String rentAccount // 환불 계좌 +) { + +} diff --git a/src/main/java/com/backend/allreva/rent/ui/RentController.java b/src/main/java/com/backend/allreva/rent/ui/RentController.java index 35a022dd..8605e93f 100644 --- a/src/main/java/com/backend/allreva/rent/ui/RentController.java +++ b/src/main/java/com/backend/allreva/rent/ui/RentController.java @@ -7,12 +7,27 @@ import com.backend.allreva.rent.command.application.request.RentIdRequest; import com.backend.allreva.rent.command.application.request.RentRegisterRequest; import com.backend.allreva.rent.command.application.request.RentUpdateRequest; +import com.backend.allreva.rent.command.domain.value.Region; +import com.backend.allreva.rent.query.application.RentQueryService; +import com.backend.allreva.rent.query.application.response.DepositAccountResponse; +import com.backend.allreva.rent.query.application.response.RentAdminDetailResponse; +import com.backend.allreva.rent.query.application.response.RentAdminSummaryResponse; +import com.backend.allreva.rent.query.application.response.RentDetailResponse; +import com.backend.allreva.rent.query.application.response.RentSummaryResponse; +import com.backend.allreva.survey.query.application.response.SortType; +import jakarta.validation.constraints.Min; +import java.time.LocalDate; +import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; 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; @Validated @@ -22,6 +37,7 @@ public class RentController implements RentControllerSwagger { private final RentCommandService rentCommandService; + private final RentQueryService rentQueryService; @PostMapping public Response createRent( @@ -51,4 +67,58 @@ public Response closeRent( return Response.onSuccess(); } + @DeleteMapping + public Response deleteRent( + @RequestBody final RentIdRequest rentIdRequest, + @AuthMember final Member member + ) { + rentCommandService.deleteRent(rentIdRequest, member.getId()); + return Response.onSuccess(); + } + + @GetMapping("/main") + public Response> getRentMainSummaries(){ + return Response.onSuccess(rentQueryService.getRentMainSummaries()); + } + + @GetMapping("/list") + public Response> getRentSummaries( + @RequestParam(name = "region", required = false) final Region region, + @RequestParam(name = "sort", defaultValue = "LATEST") final SortType sortType, + @RequestParam(name = "lastId", required = false) final Long lastId, + @RequestParam(name = "lastEndDate", required = false) final LocalDate lastEndDate, + @RequestParam(name = "pageSize", defaultValue = "10") @Min(10) final int pageSize + ) { + return Response.onSuccess(rentQueryService.getRentSummaries(region, sortType, lastEndDate, lastId, pageSize)); + } + + @GetMapping("/{id}") + public Response getRentDetailById( + @PathVariable final Long id + ) { + return Response.onSuccess(rentQueryService.getRentDetailById(id)); + } + + @GetMapping("/{id}/deposit-account") + public Response getDepositAccountById( + @PathVariable final Long id + ) { + return Response.onSuccess(rentQueryService.getDepositAccountById(id)); + } + + @GetMapping("/register/list") + public Response> getRentAdminSummaries( + @AuthMember Member member + ) { + return Response.onSuccess(rentQueryService.getRentAdminSummariesByMemberId(member.getId())); + } + + @GetMapping("/{id}/register") + public Response getRentAdminDetail( + @PathVariable("id") final Long rentId, + @RequestParam final LocalDate boardingDate, + @AuthMember Member member + ) { + return Response.onSuccess(rentQueryService.getRentAdminDetail(member.getId(), boardingDate, rentId)); + } } diff --git a/src/main/java/com/backend/allreva/rent/ui/RentControllerSwagger.java b/src/main/java/com/backend/allreva/rent/ui/RentControllerSwagger.java index 063fda07..a411a532 100644 --- a/src/main/java/com/backend/allreva/rent/ui/RentControllerSwagger.java +++ b/src/main/java/com/backend/allreva/rent/ui/RentControllerSwagger.java @@ -6,11 +6,21 @@ import com.backend.allreva.rent.command.application.request.RentIdRequest; import com.backend.allreva.rent.command.application.request.RentRegisterRequest; import com.backend.allreva.rent.command.application.request.RentUpdateRequest; +import com.backend.allreva.rent.command.domain.value.Region; +import com.backend.allreva.rent.query.application.response.DepositAccountResponse; +import com.backend.allreva.rent.query.application.response.RentAdminDetailResponse; +import com.backend.allreva.rent.query.application.response.RentAdminSummaryResponse; +import com.backend.allreva.rent.query.application.response.RentDetailResponse; +import com.backend.allreva.rent.query.application.response.RentSummaryResponse; +import com.backend.allreva.survey.query.application.response.SortType; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.constraints.Min; +import java.time.LocalDate; +import java.util.List; import org.springframework.web.bind.annotation.RequestBody; -@Tag(name = "차량 대절 폼 API", description = "차량 대절 폼 API") +@Tag(name = "차량 대절 폼 API") public interface RentControllerSwagger { @Operation(summary = "차량 대절 생성 API", description = "차량 대절 폼을 생성합니다.") @@ -30,4 +40,72 @@ Response closeRent( @RequestBody RentIdRequest rentIdRequest, @AuthMember Member member ); + + @Operation(summary = "차량 대절 삭제 API", description = "차량 대절 폼을 삭제합니다.") + Response deleteRent( + @RequestBody final RentIdRequest rentIdRequest, + @AuthMember final Member member + ); + + @Operation( + summary = "첫 화면 rent API 입니다.", + description = "첫 화면 rent API 입니다. 현재 날짜에서 가장 가까운 콘서트 순으로 5개 정렬" + ) + Response> getRentMainSummaries(); + + @Operation( + summary = "차량 대절 폼 리스트 조회 API", + description = """ + 차량 대절 폼의 요약된 정보를 리스트로 조회합니다. + """) + Response> getRentSummaries( + Region region, + SortType sortType, + Long lastId, + LocalDate lastEndDate, + @Min(10) int pageSize + ); + + @Operation( + summary = "차량 대절 폼 상세 조회 API", + description = """ + 차량 대절 폼을 상세 조회합니다. + boardingDate 는 2024.11.30(토) 와 같은 형태로 반환됩니다. + endDate는 2024-11-30 과 같은 형태로 반환됩니다. + """) + Response getRentDetailById( + Long id + ); + + @Operation( + summary = "입금 계좌 조회 API", + description = """ + 입금 계좌를 조회합니다. + 현재 사용자가 USER 권한보다 아래면 입금 계좌를 조회할 수 없습니다. + """) + Response getDepositAccountById( + Long id + ); + + @Operation( + summary = "내가 등록한 차 대절 리스트 조회 API", + description = """ + 사용자가 등록한 차량 대절 폼의 요약된 정보를 리스트로 조회합니다. + """) + Response> getRentAdminSummaries( + Member member + ); + + @Operation( + summary = "내가 등록한 차 대절 상세 조회 API", + description = """ + 사용자가 등록한 특정 차량 대절 폼의 상세 정보를 조회합니다. + + 조회하고자 하는 차량 대절 rentId는 path variable로, 특정 가용 날짜인 boardingDate는 query parameter로 전달합니다. + """) + Response getRentAdminDetail( + Long rentId, + LocalDate boardingDate, + Member member + ); } diff --git a/src/main/java/com/backend/allreva/rent/ui/RentSearchController.java b/src/main/java/com/backend/allreva/rent/ui/RentSearchController.java index d38c2a36..aac9393c 100644 --- a/src/main/java/com/backend/allreva/rent/ui/RentSearchController.java +++ b/src/main/java/com/backend/allreva/rent/ui/RentSearchController.java @@ -4,30 +4,24 @@ import com.backend.allreva.rent.query.application.RentSearchService; import com.backend.allreva.rent.query.application.response.RentSearchListResponse; import com.backend.allreva.rent.query.application.response.RentThumbnail; -import io.swagger.v3.oas.annotations.Operation; import jakarta.validation.constraints.NotEmpty; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; +import java.util.stream.Stream; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; -import java.util.stream.Stream; - @RestController @RequestMapping("/api/v1/search/rents") @RequiredArgsConstructor -public class RentSearchController { +public class RentSearchController implements RentSearchControllerSwagger { private final RentSearchService rentSearchService; @GetMapping("/") - @Operation( - summary = "차대절 검색시 상위 2개 썸네일 API", - description = "차대절 검색어에 따라 관련도 상위 2개의 썸네일에 필요한 정보를 출력\n" - ) public Response> searchRentThumbnail(@RequestParam final String query) { return Response.onSuccess( rentSearchService.searchRentThumbnails(query) @@ -35,10 +29,6 @@ public Response> searchRentThumbnail(@RequestParam final Str } @GetMapping("/list") - @Operation( - summary = "차대절 검색 더보기 API", - description = "검색어에 따라 관련도 순으로 무한 스크롤 searchAfter1, searchAfter2에 이전 SearchAfter에 있는 값들을 순서대로 넣어주어야 합니다." - ) public Response searchRentList( @RequestParam @NotEmpty(message = "검색어를 입력해야 합니다.") diff --git a/src/main/java/com/backend/allreva/rent/ui/RentSearchControllerSwagger.java b/src/main/java/com/backend/allreva/rent/ui/RentSearchControllerSwagger.java new file mode 100644 index 00000000..12ea5e34 --- /dev/null +++ b/src/main/java/com/backend/allreva/rent/ui/RentSearchControllerSwagger.java @@ -0,0 +1,29 @@ +package com.backend.allreva.rent.ui; + +import com.backend.allreva.common.dto.Response; +import com.backend.allreva.rent.query.application.response.RentSearchListResponse; +import com.backend.allreva.rent.query.application.response.RentThumbnail; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import java.util.List; + +@Tag(name = "차량 대절 검색 API") +public interface RentSearchControllerSwagger { + + @Operation( + summary = "차대절 검색시 상위 2개 썸네일 API", + description = "차대절 검색어에 따라 관련도 상위 2개의 썸네일에 필요한 정보를 출력\n" + ) + Response> searchRentThumbnail(String query); + + @Operation( + summary = "차대절 검색 더보기 API", + description = "검색어에 따라 관련도 순으로 무한 스크롤 searchAfter1, searchAfter2에 이전 SearchAfter에 있는 값들을 순서대로 넣어주어야 합니다." + ) + Response searchRentList( + String query, + int pageSize, + String searchAfter1, + String searchAfter2 + ); +} diff --git a/src/main/java/com/backend/allreva/rent/ui/RentViewController.java b/src/main/java/com/backend/allreva/rent/ui/RentViewController.java deleted file mode 100644 index b7e40b23..00000000 --- a/src/main/java/com/backend/allreva/rent/ui/RentViewController.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.backend.allreva.rent.ui; - -import com.backend.allreva.auth.security.AuthMember; -import com.backend.allreva.common.dto.Response; -import com.backend.allreva.member.command.domain.Member; -import com.backend.allreva.rent.command.domain.value.Region; -import com.backend.allreva.rent.query.application.RentQueryService; -import com.backend.allreva.rent.query.application.response.*; -import com.backend.allreva.survey.query.application.response.SortType; -import io.swagger.v3.oas.annotations.Operation; -import jakarta.validation.constraints.Min; -import lombok.RequiredArgsConstructor; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.time.LocalDate; -import java.util.List; - -@Validated -@RestController -@RequiredArgsConstructor -@RequestMapping("/api/v1/rents") -public class RentViewController implements RentViewControllerSwagger { - - private final RentQueryService rentQueryService; - - @GetMapping("/list") - public Response> getRentSummaries( - @RequestParam(name = "region", required = false) final Region region, - @RequestParam(name = "sort", defaultValue = "LATEST") final SortType sortType, - @RequestParam(name = "lastId", required = false) final Long lastId, - @RequestParam(name = "lastEndDate", required = false) final LocalDate lastEndDate, - @RequestParam(name = "pageSize", defaultValue = "10") @Min(10) final int pageSize - ) { - return Response.onSuccess(rentQueryService.getRentSummaries(region, sortType, lastEndDate, lastId, pageSize)); - } - - @GetMapping("/main") - @Operation( - summary = "첫 화면 rent API 입니다.", - description = "첫 화면 rent API 입니다. 현재 날짜에서 가장 가까운 콘서트 순으로 5개 정렬" - ) - public Response> getRentMainSummaries(){ - return Response.onSuccess(rentQueryService.getRentMainSummaries()); - } - - @GetMapping("/{id}") - public Response getRentDetailById( - @PathVariable final Long id - ) { - return Response.onSuccess(rentQueryService.getRentDetailById(id)); - } - - @GetMapping("/{id}/deposit-account") - public Response getDepositAccountById( - @PathVariable final Long id - ) { - return Response.onSuccess(rentQueryService.getDepositAccountById(id)); - } - - @GetMapping("/register/list") - public Response> getRentAdminSummaries( - @AuthMember Member member - ) { - return Response.onSuccess(rentQueryService.getRentAdminSummariesByMemberId(member.getId())); - } - - @GetMapping("/{id}/register") - public Response getRentAdminDetail( - @PathVariable("id") final Long rentId, - @AuthMember Member member - ) { - return Response.onSuccess(rentQueryService.getRentAdminDetail(member.getId(), LocalDate.now(), rentId)); - } -} diff --git a/src/main/java/com/backend/allreva/rent/ui/RentViewControllerSwagger.java b/src/main/java/com/backend/allreva/rent/ui/RentViewControllerSwagger.java deleted file mode 100644 index 8d5a0901..00000000 --- a/src/main/java/com/backend/allreva/rent/ui/RentViewControllerSwagger.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.backend.allreva.rent.ui; - -import com.backend.allreva.common.dto.Response; -import com.backend.allreva.member.command.domain.Member; -import com.backend.allreva.rent.command.domain.value.Region; -import com.backend.allreva.rent.query.application.response.*; -import com.backend.allreva.survey.query.application.response.SortType; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.validation.constraints.Min; - -import java.time.LocalDate; -import java.util.List; - -@Tag(name = "차량 대절 폼 조회 API", description = "차량 대절 폼 조회 API") -public interface RentViewControllerSwagger { - - @Operation( - summary = "차량 대절 폼 리스트 조회 API", - description = """ - 차량 대절 폼의 요약된 정보를 리스트로 조회합니다. - """) - Response> getRentSummaries( - Region region, - SortType sortType, - Long lastId, - LocalDate lastEndDate, - @Min(10) int pageSize - ); - - @Operation( - summary = "차량 대절 폼 상세 조회 API", - description = """ - 차량 대절 폼을 상세 조회합니다. - boardingDate 는 2024.11.30(토) 와 같은 형태로 반환됩니다. - endDate는 2024-11-30 과 같은 형태로 반환됩니다. - """) - Response getRentDetailById( - Long id - ); - - @Operation( - summary = "입금 계좌 조회 API", - description = """ - 입금 계좌를 조회합니다. - 현재 사용자가 USER 권한보다 아래면 입금 계좌를 조회할 수 없습니다. - """) - Response getDepositAccountById( - Long id - ); - - @Operation( - summary = "내가 등록한 차 대절 리스트 조회 API", - description = """ - 사용자가 등록한 차량 대절 폼의 요약된 정보를 리스트로 조회합니다. - """) - Response> getRentAdminSummaries( - Member member - ); - - @Operation( - summary = "내가 등록한 차 대절 상세 조회 API", - description = """ - 사용자가 등록한 특정 차량 대절 폼의 상세 정보를 조회합니다. - """) - Response getRentAdminDetail( - Long rentId, - Member member - ); - -} diff --git a/src/main/java/com/backend/allreva/rent_join/command/application/request/RentJoinApplyRequest.java b/src/main/java/com/backend/allreva/rent_join/command/application/request/RentJoinApplyRequest.java index f6f6dd7b..3036f159 100644 --- a/src/main/java/com/backend/allreva/rent_join/command/application/request/RentJoinApplyRequest.java +++ b/src/main/java/com/backend/allreva/rent_join/command/application/request/RentJoinApplyRequest.java @@ -4,18 +4,30 @@ import com.backend.allreva.rent_join.command.domain.value.BoardingType; import com.backend.allreva.rent_join.command.domain.value.Depositor; import com.backend.allreva.rent_join.command.domain.value.RefundType; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotNull; import java.time.LocalDate; public record RentJoinApplyRequest( + @NotNull Long rentId, + @NotNull + LocalDate boardingDate, + @NotNull + BoardingType boardingType, + @NotNull + @Min(value = 1, message = "탑승 인원 수는 1명 이상이어야 합니다.") + int passengerNum, + @NotNull String depositorName, + @NotNull String depositorTime, + @NotNull String phone, - int passengerNum, - BoardingType boardingType, + @NotNull RefundType refundType, - String refundAccount, - LocalDate boardingDate + @NotNull + String refundAccount ) { public RentJoin toEntity(final Long memberId) { diff --git a/src/main/java/com/backend/allreva/rent_join/command/application/request/RentJoinIdRequest.java b/src/main/java/com/backend/allreva/rent_join/command/application/request/RentJoinIdRequest.java index e4026501..855b7716 100644 --- a/src/main/java/com/backend/allreva/rent_join/command/application/request/RentJoinIdRequest.java +++ b/src/main/java/com/backend/allreva/rent_join/command/application/request/RentJoinIdRequest.java @@ -1,6 +1,9 @@ package com.backend.allreva.rent_join.command.application.request; +import jakarta.validation.constraints.NotNull; + public record RentJoinIdRequest( + @NotNull Long rentJoinId ) { diff --git a/src/main/java/com/backend/allreva/rent_join/command/application/request/RentJoinUpdateRequest.java b/src/main/java/com/backend/allreva/rent_join/command/application/request/RentJoinUpdateRequest.java index fa1557d4..59bb7e78 100644 --- a/src/main/java/com/backend/allreva/rent_join/command/application/request/RentJoinUpdateRequest.java +++ b/src/main/java/com/backend/allreva/rent_join/command/application/request/RentJoinUpdateRequest.java @@ -2,18 +2,30 @@ import com.backend.allreva.rent_join.command.domain.value.BoardingType; import com.backend.allreva.rent_join.command.domain.value.RefundType; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotNull; import java.time.LocalDate; public record RentJoinUpdateRequest( + @NotNull Long rentJoinId, + @NotNull + LocalDate boardingDate, + @NotNull + BoardingType boardingType, + @NotNull + @Min(value = 1, message = "탑승 인원 수는 1명 이상이어야 합니다.") + int passengerNum, + @NotNull String depositorName, + @NotNull String depositorTime, + @NotNull String phone, - int passengerNum, - BoardingType boardingType, + @NotNull RefundType refundType, - String refundAccount, - LocalDate boardingDate + @NotNull + String refundAccount ) { } diff --git a/src/main/java/com/backend/allreva/rent_join/command/domain/RentJoinRepository.java b/src/main/java/com/backend/allreva/rent_join/command/domain/RentJoinRepository.java index 99cea77c..e96e5157 100644 --- a/src/main/java/com/backend/allreva/rent_join/command/domain/RentJoinRepository.java +++ b/src/main/java/com/backend/allreva/rent_join/command/domain/RentJoinRepository.java @@ -1,6 +1,6 @@ package com.backend.allreva.rent_join.command.domain; -import com.backend.allreva.rent_join.query.response.RentJoinSummaryResponse; +import com.backend.allreva.rent_join.query.response.RentJoinResponse; import java.util.List; import java.util.Optional; @@ -14,5 +14,5 @@ public interface RentJoinRepository { void delete(RentJoin rentJoin); - List findRentJoinSummariesByMemberId(Long memberId); + List findRentJoin(Long memberId); } diff --git a/src/main/java/com/backend/allreva/rent_join/infra/RentJoinDslRepository.java b/src/main/java/com/backend/allreva/rent_join/infra/RentJoinDslRepository.java index a1124225..53157421 100644 --- a/src/main/java/com/backend/allreva/rent_join/infra/RentJoinDslRepository.java +++ b/src/main/java/com/backend/allreva/rent_join/infra/RentJoinDslRepository.java @@ -1,20 +1,21 @@ package com.backend.allreva.rent_join.infra; -import com.backend.allreva.rent_join.query.response.RentJoinSummaryResponse; -import com.querydsl.core.types.Expression; +import static com.backend.allreva.rent.command.domain.QRent.rent; +import static com.backend.allreva.rent.command.domain.QRentBoardingDate.rentBoardingDate; +import static com.backend.allreva.rent_join.command.domain.QRentJoin.rentJoin; + +import com.backend.allreva.rent.command.domain.QRent; +import com.backend.allreva.rent.command.domain.QRentBoardingDate; +import com.backend.allreva.rent_join.command.domain.QRentJoin; +import com.backend.allreva.rent_join.query.response.RentJoinResponse; import com.querydsl.core.types.ExpressionUtils; import com.querydsl.core.types.Projections; import com.querydsl.jpa.JPAExpressions; import com.querydsl.jpa.impl.JPAQueryFactory; +import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; -import java.util.List; - -import static com.backend.allreva.rent.command.domain.QRent.rent; -import static com.backend.allreva.rent.command.domain.QRentBoardingDate.rentBoardingDate; -import static com.backend.allreva.rent_join.command.domain.QRentJoin.rentJoin; - @RequiredArgsConstructor @Repository public class RentJoinDslRepository { @@ -24,42 +25,41 @@ public class RentJoinDslRepository { /** * [Participate] 자신이 참여한 차 대절 조회 */ - public List findRentJoinSummariesByMemberId(final Long memberId) { - return queryFactory.select(Projections.constructor(RentJoinSummaryResponse.class, + public List findRentJoin(final Long memberId) { + QRent rentSub = new QRent("rentSub"); + QRentBoardingDate rentBoardingDateSub = new QRentBoardingDate("rentBoardingDateSub"); + QRentJoin rentJoinSub = new QRentJoin("rentJoinSub"); + + return queryFactory.select(Projections.constructor(RentJoinResponse.class, + rent.id, rent.detailInfo.title, + rentBoardingDate.date, rent.operationInfo.boardingArea, + rent.createdAt, rent.additionalInfo.endDate, rent.additionalInfo.recruitmentCount, - getParticipationCount(), // 현재 참여자 수 - rentBoardingDate.date, + ExpressionUtils.as( + JPAExpressions.select(rentJoinSub.passengerNum.sum()) + .from(rentSub) + .join(rentBoardingDateSub).on(rentSub.id.eq(rentBoardingDateSub.rent.id)) + .join(rentJoinSub).on(rentBoardingDateSub.date.eq(rentJoinSub.boardingDate)) + .where(rentSub.id.eq(rent.id)), + "passengerNum" + ), rent.isClosed, - rent.createdAt, rentJoin.id, - rentJoin.depositor.depositorName, - rentJoin.depositor.phone, + rentJoin.createdAt, rentJoin.passengerNum, rentJoin.boardingType, + rentJoin.depositor.depositorName, rentJoin.depositor.depositorTime, rentJoin.refundType )) - .from(rentJoin) - .join(rent).on(rentJoin.rentId.eq(rent.id)) - .join(rentBoardingDate).on(rent.id.eq(rentBoardingDate.rent.id) - .and(rentJoin.boardingDate.eq(rentBoardingDate.date))) + .from(rent) + .join(rentBoardingDate).on(rent.id.eq(rentBoardingDate.rent.id)) + .join(rentJoin).on(rentBoardingDate.date.eq(rentJoin.boardingDate)) .where(rentJoin.memberId.eq(memberId)) + .groupBy(rent.id, rentBoardingDate.date, rentJoin.id) .fetch(); } - - /** - * [SubQuery] 차 대절 현재 참여자 수 - */ - private Expression getParticipationCount() { - // 해당 쿼리를 rentBoardingDate 별로 나눠서 count를 구하고 싶어 - return ExpressionUtils.as(JPAExpressions - .select(rentJoin.passengerNum.sum()) - .from(rentJoin) - .where(rentJoin.rentId.eq(rent.id) - .and(rentJoin.boardingDate.eq(rentBoardingDate.date))) - .groupBy(rentJoin.rentId, rentJoin.boardingDate), "participationCount"); - } } diff --git a/src/main/java/com/backend/allreva/rent_join/infra/RentJoinRepositoryImpl.java b/src/main/java/com/backend/allreva/rent_join/infra/RentJoinRepositoryImpl.java index 987ba55c..abf79912 100644 --- a/src/main/java/com/backend/allreva/rent_join/infra/RentJoinRepositoryImpl.java +++ b/src/main/java/com/backend/allreva/rent_join/infra/RentJoinRepositoryImpl.java @@ -1,8 +1,8 @@ package com.backend.allreva.rent_join.infra; -import com.backend.allreva.rent_join.query.response.RentJoinSummaryResponse; import com.backend.allreva.rent_join.command.domain.RentJoin; import com.backend.allreva.rent_join.command.domain.RentJoinRepository; +import com.backend.allreva.rent_join.query.response.RentJoinResponse; import java.util.List; import java.util.Optional; import lombok.RequiredArgsConstructor; @@ -35,10 +35,8 @@ public void delete(final RentJoin rentJoin) { rentJoinJpaRepository.delete(rentJoin); } - // rentJoinRepository.findRentJoinSummariesByMemberId(memberId); - @Override - public List findRentJoinSummariesByMemberId(Long memberId) { - return rentJoinDslRepository.findRentJoinSummariesByMemberId(memberId); + public List findRentJoin(final Long memberId) { + return rentJoinDslRepository.findRentJoin(memberId); } } diff --git a/src/main/java/com/backend/allreva/rent_join/query/RentJoinQueryService.java b/src/main/java/com/backend/allreva/rent_join/query/RentJoinQueryService.java index dd7e5a8b..77e03f34 100644 --- a/src/main/java/com/backend/allreva/rent_join/query/RentJoinQueryService.java +++ b/src/main/java/com/backend/allreva/rent_join/query/RentJoinQueryService.java @@ -1,7 +1,7 @@ package com.backend.allreva.rent_join.query; -import com.backend.allreva.rent_join.query.response.RentJoinSummaryResponse; import com.backend.allreva.rent_join.command.domain.RentJoinRepository; +import com.backend.allreva.rent_join.query.response.RentJoinResponse; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -12,7 +12,7 @@ public class RentJoinQueryService { private final RentJoinRepository rentJoinRepository; - public List getRentJoinSummariesByMemberId(final Long memberId) { - return rentJoinRepository.findRentJoinSummariesByMemberId(memberId); + public List getRentJoin(final Long memberId) { + return rentJoinRepository.findRentJoin(memberId); } } diff --git a/src/main/java/com/backend/allreva/rent_join/query/response/RentJoinResponse.java b/src/main/java/com/backend/allreva/rent_join/query/response/RentJoinResponse.java new file mode 100644 index 00000000..7279bffb --- /dev/null +++ b/src/main/java/com/backend/allreva/rent_join/query/response/RentJoinResponse.java @@ -0,0 +1,30 @@ +package com.backend.allreva.rent_join.query.response; + +import com.backend.allreva.rent_join.command.domain.value.BoardingType; +import com.backend.allreva.rent_join.command.domain.value.RefundType; +import java.time.LocalDate; +import java.time.LocalDateTime; + +/** + * 자신이 참여한 차량 대절 마이페이지 + */ +public record RentJoinResponse( + Long rentId, // 차량 대절 ID + String title, // 차량 대절 제목 + LocalDate rentBoardingDate, // 공연일(차 대절 가용 날짜) + String boardingArea, // TODO: boardingArea or Region? + LocalDateTime rentStartDate, // 차량 대절 모집 시작 시간 + LocalDate rentEndDate, // 차량 대절 모집 종료 시간 + int recruitmentCount, // 최대 모집 인원 + int participateCount, // 현재 모집 인원 + boolean isClosed, // 모집중 상태 + Long rentJoinId, // 차량 대절 참여 ID + LocalDateTime applyDate, // 신청 날짜 + int passengerNum, // 탑승 인원 + BoardingType boardingType, // 이용 편도 + String depositorName, // 입금자명 + String depositorTime, // 입금 시각 + RefundType refundType // 환불 정책 +) { + +} diff --git a/src/main/java/com/backend/allreva/rent_join/query/response/RentJoinSummaryResponse.java b/src/main/java/com/backend/allreva/rent_join/query/response/RentJoinSummaryResponse.java deleted file mode 100644 index 9ddcfe68..00000000 --- a/src/main/java/com/backend/allreva/rent_join/query/response/RentJoinSummaryResponse.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.backend.allreva.rent_join.query.response; - -import com.backend.allreva.rent_join.command.domain.value.BoardingType; -import com.backend.allreva.rent_join.command.domain.value.RefundType; -import java.time.LocalDate; -import java.time.LocalDateTime; - -/** - * 자신이 참여한 차량 대절 마이페이지 - */ -public record RentJoinSummaryResponse( - String title, - String boardingArea, - LocalDate endDate, - int maxRecruitmentCount, // 최대 모집 인원 - int participateCount, // 현재 모집 인원 - LocalDate rentBoardingDate, // 공연일(차 대절 가용 날짜) - boolean isClosed, - LocalDateTime createdAt, - Long rentJoinId, - String depositorName, - String phone, - int passengerNum, - BoardingType boardingType, - String depositorTime, - RefundType refundType -) { - -} diff --git a/src/main/java/com/backend/allreva/rent_join/ui/RentJoinController.java b/src/main/java/com/backend/allreva/rent_join/ui/RentJoinController.java index 034b1009..beefcb9d 100644 --- a/src/main/java/com/backend/allreva/rent_join/ui/RentJoinController.java +++ b/src/main/java/com/backend/allreva/rent_join/ui/RentJoinController.java @@ -8,7 +8,7 @@ import com.backend.allreva.rent_join.command.application.request.RentJoinIdRequest; import com.backend.allreva.rent_join.command.application.request.RentJoinUpdateRequest; import com.backend.allreva.rent_join.query.RentJoinQueryService; -import com.backend.allreva.rent_join.query.response.RentJoinSummaryResponse; +import com.backend.allreva.rent_join.query.response.RentJoinResponse; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; @@ -22,7 +22,6 @@ public class RentJoinController implements RentJoinControllerSwagger{ private final RentJoinCommandService rentJoinCommandService; private final RentJoinQueryService rentJoinQueryService; - @PostMapping("/apply") public Response applyRent( @RequestBody final RentJoinApplyRequest rentJoinApplyRequest, @@ -51,9 +50,9 @@ public Response deleteRentJoin( } @GetMapping("/join/list") - public Response> getRentJoinSummaries( + public Response> getRentJoin( @AuthMember Member member ) { - return Response.onSuccess(rentJoinQueryService.getRentJoinSummariesByMemberId(member.getId())); + return Response.onSuccess(rentJoinQueryService.getRentJoin(member.getId())); } } diff --git a/src/main/java/com/backend/allreva/rent_join/ui/RentJoinControllerSwagger.java b/src/main/java/com/backend/allreva/rent_join/ui/RentJoinControllerSwagger.java index 93ade937..ba5d12a9 100644 --- a/src/main/java/com/backend/allreva/rent_join/ui/RentJoinControllerSwagger.java +++ b/src/main/java/com/backend/allreva/rent_join/ui/RentJoinControllerSwagger.java @@ -6,7 +6,7 @@ import com.backend.allreva.rent_join.command.application.request.RentJoinApplyRequest; import com.backend.allreva.rent_join.command.application.request.RentJoinIdRequest; import com.backend.allreva.rent_join.command.application.request.RentJoinUpdateRequest; -import com.backend.allreva.rent_join.query.response.RentJoinSummaryResponse; +import com.backend.allreva.rent_join.query.response.RentJoinResponse; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.web.bind.annotation.RequestBody; @@ -35,11 +35,11 @@ Response deleteRentJoin( ); @Operation( - summary = "내가 참여한 차 대절 리스트 조회 API", + summary = "자신이 참가한 차 대절 리스트 조회 API", description = """ 사용자가 참여한 차량 대절 폼의 요약된 정보를 리스트로 조회합니다. """) - Response> getRentJoinSummaries( + Response> getRentJoin( Member member ); } diff --git a/src/test/java/com/backend/allreva/rent/fixture/RentJoinApplyRequestFixture.java b/src/test/java/com/backend/allreva/rent/fixture/RentJoinApplyRequestFixture.java index 89a7e41f..60c8f902 100644 --- a/src/test/java/com/backend/allreva/rent/fixture/RentJoinApplyRequestFixture.java +++ b/src/test/java/com/backend/allreva/rent/fixture/RentJoinApplyRequestFixture.java @@ -13,14 +13,14 @@ public final class RentJoinApplyRequestFixture { public static RentJoinApplyRequest createRentJoinApplyRequestFixture(final Long rentId) { return new RentJoinApplyRequest( rentId, + LocalDate.of(2024, 9, 20), + BoardingType.ROUND, + 3, "홍길동", "21:30", "010-1234-5678", - 3, - BoardingType.ROUND, RefundType.BOTH, - "123-4567-4344-23", - LocalDate.of(2024, 9, 20) + "123-4567-4344-23" ); } } diff --git a/src/test/java/com/backend/allreva/rent/fixture/RentJoinUpdateRequestFixture.java b/src/test/java/com/backend/allreva/rent/fixture/RentJoinUpdateRequestFixture.java index 1306f1a6..edddb3b0 100644 --- a/src/test/java/com/backend/allreva/rent/fixture/RentJoinUpdateRequestFixture.java +++ b/src/test/java/com/backend/allreva/rent/fixture/RentJoinUpdateRequestFixture.java @@ -15,14 +15,14 @@ public static RentJoinUpdateRequest createRentJoinUpdateRequestFixture( ) { return new RentJoinUpdateRequest( rentJoinId, + LocalDate.of(2024, 9, 20), + BoardingType.ROUND, + 3, "홍길동", "22:00", // fix "010-1234-5678", - 3, - BoardingType.ROUND, RefundType.BOTH, - "123-4567-4344-23", - LocalDate.of(2024, 9, 20) + "123-4567-4344-23" ); } } diff --git a/src/test/java/com/backend/allreva/rent/integration/RentAdminPageTest.java b/src/test/java/com/backend/allreva/rent/integration/RentAdminPageTest.java index 64aaaf71..88962777 100644 --- a/src/test/java/com/backend/allreva/rent/integration/RentAdminPageTest.java +++ b/src/test/java/com/backend/allreva/rent/integration/RentAdminPageTest.java @@ -28,16 +28,16 @@ class RentAdminPageTest extends IntegrationTestSupport { void 내가_등록한_차량_대절_리스트를_조회한다() { // given var registerId = 1L; - var anotherRegisterId = 2L; var savedRent = rentJpaRepository.save(createRentFixture(registerId, 1L)); - rentJpaRepository.save(createRentFixture(anotherRegisterId, 2L)); + var savedRentJoin = rentJoinRepository.save(createRentJoinFixture(savedRent.getId(), registerId)); // when var rentAdminSummaries = rentQueryService.getRentAdminSummariesByMemberId(registerId); // then assertThat(rentAdminSummaries).hasSize(1); - assertThat(rentAdminSummaries.get(0).maxRecruitmentCount()).isEqualTo(savedRent.getAdditionalInfo().getRecruitmentCount()); + assertThat(rentAdminSummaries.get(0).recruitmentCount()).isEqualTo(savedRent.getAdditionalInfo().getRecruitmentCount()); + assertThat(rentAdminSummaries.get(0).participationCount()).isEqualTo(savedRentJoin.getPassengerNum()); } @Test @@ -53,8 +53,8 @@ class RentAdminPageTest extends IntegrationTestSupport { // then assertThat(rentAdminDetail).isNotNull(); assertSoftly(softly -> { - softly.assertThat(rentAdminDetail.getRentRoundCount()).isEqualTo(1); - softly.assertThat(rentAdminDetail.getAdditionalDepositCount()).isEqualTo(1); + softly.assertThat(rentAdminDetail.getRentJoinCountResponse().rentRoundCount()).isEqualTo(1); + softly.assertThat(rentAdminDetail.getRentJoinCountResponse().additionalDepositCount()).isEqualTo(1); softly.assertThat(rentAdminDetail.getRentJoinDetailResponses().get(0).rentJoinId()).isEqualTo(savedRentJoin.getId()); }); } diff --git a/src/test/java/com/backend/allreva/rent/integration/RentJoinPageTest.java b/src/test/java/com/backend/allreva/rent/integration/RentJoinPageTest.java index d98f2f8c..bd6a2129 100644 --- a/src/test/java/com/backend/allreva/rent/integration/RentJoinPageTest.java +++ b/src/test/java/com/backend/allreva/rent/integration/RentJoinPageTest.java @@ -1,11 +1,19 @@ package com.backend.allreva.rent.integration; +import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; + import com.backend.allreva.common.model.Image; import com.backend.allreva.rent.command.domain.Rent; import com.backend.allreva.rent.command.domain.RentBoardingDate; -import com.backend.allreva.rent.command.domain.value.*; +import com.backend.allreva.rent.command.domain.value.AdditionalInfo; +import com.backend.allreva.rent.command.domain.value.Bus; +import com.backend.allreva.rent.command.domain.value.BusSize; +import com.backend.allreva.rent.command.domain.value.BusType; +import com.backend.allreva.rent.command.domain.value.DetailInfo; +import com.backend.allreva.rent.command.domain.value.OperationInfo; +import com.backend.allreva.rent.command.domain.value.Price; +import com.backend.allreva.rent.command.domain.value.Region; import com.backend.allreva.rent.infra.rdb.RentJpaRepository; -import com.backend.allreva.rent.query.application.RentQueryService; import com.backend.allreva.rent_join.command.domain.RentJoin; import com.backend.allreva.rent_join.command.domain.RentJoinRepository; import com.backend.allreva.rent_join.command.domain.value.BoardingType; @@ -13,21 +21,16 @@ import com.backend.allreva.rent_join.command.domain.value.RefundType; import com.backend.allreva.rent_join.query.RentJoinQueryService; import com.backend.allreva.support.IntegrationTestSupport; +import java.time.LocalDate; +import java.util.List; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; -import java.time.LocalDate; -import java.util.List; - -import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; - @SuppressWarnings("NonAsciiCharacters") @Transactional class RentJoinPageTest extends IntegrationTestSupport { - @Autowired - private RentQueryService rentQueryService; @Autowired private RentJoinQueryService rentJoinQueryService; @Autowired @@ -47,7 +50,7 @@ class RentJoinPageTest extends IntegrationTestSupport { rentJoinRepository.save(createRentJoinFixture(savedRent.getId(), user3Id, "김철수", boardingDates.get(1).getDate())); // when - var rentJoinSummaries = rentJoinQueryService.getRentJoinSummariesByMemberId(user2Id); + var rentJoinSummaries = rentJoinQueryService.getRentJoin(user2Id); // then assertThat(rentJoinSummaries).hasSize(1); diff --git a/src/test/java/com/backend/allreva/rent/integration/RentMainPageTest.java b/src/test/java/com/backend/allreva/rent/integration/RentMainPageTest.java index 3f7e36be..6e65f37d 100644 --- a/src/test/java/com/backend/allreva/rent/integration/RentMainPageTest.java +++ b/src/test/java/com/backend/allreva/rent/integration/RentMainPageTest.java @@ -1,12 +1,24 @@ package com.backend.allreva.rent.integration; +import static com.backend.allreva.concert.fixture.ConcertFixture.createConcertFixture; +import static com.backend.allreva.concert.fixture.ConcertHallFixture.createConcertHallFixture; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.SoftAssertions.assertSoftly; + import com.backend.allreva.common.model.Image; import com.backend.allreva.concert.command.domain.ConcertRepository; import com.backend.allreva.hall.command.domain.ConcertHallRepository; import com.backend.allreva.rent.command.domain.Rent; import com.backend.allreva.rent.command.domain.RentBoardingDate; import com.backend.allreva.rent.command.domain.RentRepository; -import com.backend.allreva.rent.command.domain.value.*; +import com.backend.allreva.rent.command.domain.value.AdditionalInfo; +import com.backend.allreva.rent.command.domain.value.Bus; +import com.backend.allreva.rent.command.domain.value.BusSize; +import com.backend.allreva.rent.command.domain.value.BusType; +import com.backend.allreva.rent.command.domain.value.DetailInfo; +import com.backend.allreva.rent.command.domain.value.OperationInfo; +import com.backend.allreva.rent.command.domain.value.Price; +import com.backend.allreva.rent.command.domain.value.Region; import com.backend.allreva.rent.query.application.RentQueryService; import com.backend.allreva.rent_join.command.domain.RentJoin; import com.backend.allreva.rent_join.command.domain.RentJoinRepository; @@ -15,18 +27,12 @@ import com.backend.allreva.rent_join.command.domain.value.RefundType; import com.backend.allreva.support.IntegrationTestSupport; import com.backend.allreva.survey.query.application.response.SortType; +import java.time.LocalDate; +import java.util.List; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; -import java.time.LocalDate; -import java.util.List; - -import static com.backend.allreva.concert.fixture.ConcertFixture.createConcertFixture; -import static com.backend.allreva.concert.fixture.ConcertHallFixture.createConcertHallFixture; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.SoftAssertions.assertSoftly; - @SuppressWarnings("NonAsciiCharacters") @Transactional class RentMainPageTest extends IntegrationTestSupport { @@ -101,7 +107,7 @@ class RentMainPageTest extends IntegrationTestSupport { softly.assertThat(rentDetail.title()).isEqualTo(savedRent.getDetailInfo().getTitle()); softly.assertThat(rentDetail.concertName()).isEqualTo(concert.getConcertInfo().getTitle()); softly.assertThat(rentDetail.dropOffArea()).isEqualTo(concertHall.getName()); - softly.assertThat(rentDetail.currentRecruitmentCounts().get(0)).isEqualTo(2); + softly.assertThat(rentDetail.boardingDates().get(0).participationCount()).isEqualTo(2); }); }