diff --git a/src/main/java/com/beat/domain/booking/dao/BookingRepository.java b/src/main/java/com/beat/domain/booking/dao/BookingRepository.java index cd12d617..6f5a59c0 100644 --- a/src/main/java/com/beat/domain/booking/dao/BookingRepository.java +++ b/src/main/java/com/beat/domain/booking/dao/BookingRepository.java @@ -8,6 +8,7 @@ import org.springframework.data.repository.query.Param; import com.beat.domain.booking.domain.Booking; +import com.beat.domain.booking.domain.BookingStatus; public interface BookingRepository extends JpaRepository { @Query("SELECT b FROM Booking b " + @@ -33,6 +34,9 @@ Optional findFirstByBookerNameAndBookerPhoneNumberAndBirthDateAndPasswo List findByUsersId(Long userId); - @Query("SELECT COUNT(b) > 0 FROM Booking b WHERE b.schedule.id IN :scheduleIds AND b.bookingStatus != 'BOOKING_CANCELLED'") - boolean existsByScheduleIdIn(@Param("scheduleIds") List scheduleIds); -} \ No newline at end of file + @Query("SELECT COUNT(b) > 0 FROM Booking b WHERE b.schedule.id IN :scheduleIds AND b.bookingStatus NOT IN :excludedStatuses") + boolean existsActiveBookingByScheduleIds( + @Param("scheduleIds") List scheduleIds, + @Param("excludedStatuses") List excludedStatuses + ); +} diff --git a/src/main/java/com/beat/domain/performance/application/PerformanceManagementService.java b/src/main/java/com/beat/domain/performance/application/PerformanceManagementService.java index 47da088c..543ad059 100644 --- a/src/main/java/com/beat/domain/performance/application/PerformanceManagementService.java +++ b/src/main/java/com/beat/domain/performance/application/PerformanceManagementService.java @@ -4,12 +4,12 @@ import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; import java.util.List; -import java.util.stream.Collectors; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.beat.domain.booking.dao.BookingRepository; +import com.beat.domain.booking.domain.BookingStatus; import com.beat.domain.cast.dao.CastRepository; import com.beat.domain.cast.domain.Cast; import com.beat.domain.member.dao.MemberRepository; @@ -96,7 +96,7 @@ public PerformanceResponse createPerformance(Long memberId, PerformanceRequest r performance ); }) - .collect(Collectors.toList()); + .toList(); performance.assignScheduleNumbers(schedules); scheduleRepository.saveAll(schedules); @@ -105,7 +105,7 @@ public PerformanceResponse createPerformance(Long memberId, PerformanceRequest r List performanceDates = schedules.stream() .map(Schedule::getPerformanceDate) - .collect(Collectors.toList()); + .toList(); performance.updatePerformancePeriod(performanceDates); performanceRepository.save(performance); @@ -116,7 +116,7 @@ public PerformanceResponse createPerformance(Long memberId, PerformanceRequest r castRequest.castPhoto(), performance )) - .collect(Collectors.toList()); + .toList(); castRepository.saveAll(casts); List staffs = request.staffList().stream() @@ -126,7 +126,7 @@ public PerformanceResponse createPerformance(Long memberId, PerformanceRequest r staffRequest.staffPhoto(), performance )) - .collect(Collectors.toList()); + .toList(); staffRepository.saveAll(staffs); List performanceImageList = request.performanceImageList().stream() @@ -134,7 +134,7 @@ public PerformanceResponse createPerformance(Long memberId, PerformanceRequest r performanceImageRequest.performanceImage(), performance )) - .collect(Collectors.toList()); + .toList(); performanceImageRepository.saveAll(performanceImageList); return mapToPerformanceResponse(performance, schedules, casts, staffs, performanceImageList); @@ -150,7 +150,7 @@ private PerformanceResponse mapToPerformanceResponse(Performance performance, Li calculateDueDate(schedule.getPerformanceDate().toLocalDate()), schedule.getScheduleNumber() )) - .collect(Collectors.toList()); + .toList(); List castResponses = casts.stream() .map(cast -> CastResponse.of( @@ -159,7 +159,7 @@ private PerformanceResponse mapToPerformanceResponse(Performance performance, Li cast.getCastRole(), cast.getCastPhoto() )) - .collect(Collectors.toList()); + .toList(); List staffResponses = staffs.stream() .map(staff -> StaffResponse.of( @@ -168,14 +168,14 @@ private PerformanceResponse mapToPerformanceResponse(Performance performance, Li staff.getStaffRole(), staff.getStaffPhoto() )) - .collect(Collectors.toList()); + .toList(); List performanceImageResponses = performanceImages.stream() .map(image -> PerformanceImageResponse.of( image.getId(), image.getPerformanceImageUrl() )) - .collect(Collectors.toList()); + .toList(); return PerformanceResponse.of( performance.getUsers().getId(), @@ -226,9 +226,10 @@ public void deletePerformance(Long memberId, Long performanceId) { List scheduleIds = scheduleRepository.findIdsByPerformanceId(performanceId); - boolean hasBookings = bookingRepository.existsByScheduleIdIn(scheduleIds); + List statusesToExclude = List.of(BookingStatus.BOOKING_CANCELLED, BookingStatus.BOOKING_DELETED); + boolean isBookerExist = bookingRepository.existsActiveBookingByScheduleIds(scheduleIds, statusesToExclude); - if (hasBookings) { + if (isBookerExist) { throw new ForbiddenException(PerformanceErrorCode.PERFORMANCE_DELETE_FAILED); } diff --git a/src/main/java/com/beat/domain/performance/application/PerformanceModifyService.java b/src/main/java/com/beat/domain/performance/application/PerformanceModifyService.java index e705f4ed..90da2118 100644 --- a/src/main/java/com/beat/domain/performance/application/PerformanceModifyService.java +++ b/src/main/java/com/beat/domain/performance/application/PerformanceModifyService.java @@ -5,12 +5,12 @@ import java.time.temporal.ChronoUnit; import java.util.List; import java.util.Objects; -import java.util.stream.Collectors; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.beat.domain.booking.dao.BookingRepository; +import com.beat.domain.booking.domain.BookingStatus; import com.beat.domain.cast.dao.CastRepository; import com.beat.domain.cast.domain.Cast; import com.beat.domain.cast.exception.CastErrorCode; @@ -73,7 +73,9 @@ public PerformanceModifyResponse modifyPerformance(Long memberId, PerformanceMod validateOwnership(userId, performance); List scheduleIds = scheduleRepository.findIdsByPerformanceId(request.performanceId()); - boolean isBookerExist = bookingRepository.existsByScheduleIdIn(scheduleIds); + + List statusesToExclude = List.of(BookingStatus.BOOKING_CANCELLED, BookingStatus.BOOKING_DELETED); + boolean isBookerExist = bookingRepository.existsActiveBookingByScheduleIds(scheduleIds, statusesToExclude); if (isBookerExist && request.ticketPrice() != performance.getTicketPrice()) { log.error("Ticket price update failed due to existing bookings for performanceId: {}", performance.getId()); @@ -148,7 +150,7 @@ private void updatePerformanceDetails(Performance performance, PerformanceModify List performanceDates = request.scheduleModifyRequests().stream() .map(ScheduleModifyRequest::performanceDate) - .collect(Collectors.toList()); + .toList(); performance.updatePerformancePeriod(performanceDates); if (!isBookerExist) { @@ -167,11 +169,11 @@ private List processSchedules(List requestScheduleIds = scheduleRequests.stream() .map(ScheduleModifyRequest::scheduleId) .filter(Objects::nonNull) - .collect(Collectors.toList()); + .toList(); List schedulesToDelete = existingScheduleIds.stream() .filter(id -> !requestScheduleIds.contains(id)) - .collect(Collectors.toList()); + .toList(); deleteRemainingSchedules(schedulesToDelete); @@ -191,7 +193,7 @@ private List processSchedules(List processSchedules(List processStaffs(List staffRe return updateStaff(request, performance); } }) - .collect(Collectors.toList()); + .toList(); deleteRemainingStaffs(existingStaffIds); diff --git a/src/main/java/com/beat/domain/performance/application/PerformanceService.java b/src/main/java/com/beat/domain/performance/application/PerformanceService.java index 06943d44..6925ebea 100644 --- a/src/main/java/com/beat/domain/performance/application/PerformanceService.java +++ b/src/main/java/com/beat/domain/performance/application/PerformanceService.java @@ -11,6 +11,7 @@ import org.springframework.transaction.annotation.Transactional; import com.beat.domain.booking.dao.BookingRepository; +import com.beat.domain.booking.domain.BookingStatus; import com.beat.domain.cast.dao.CastRepository; import com.beat.domain.cast.domain.Cast; import com.beat.domain.member.dao.MemberRepository; @@ -76,7 +77,7 @@ public PerformanceDetailResponse getPerformanceDetail(Long performanceId) { return PerformanceDetailScheduleResponse.of(schedule.getId(), schedule.getPerformanceDate(), schedule.getScheduleNumber().name(), dueDate, schedule.isBooking()); }) - .collect(Collectors.toList()); + .toList(); int minDueDate = scheduleService.getMinDueDate(scheduleRepository.findAllByPerformanceId(performanceId)); @@ -84,19 +85,19 @@ public PerformanceDetailResponse getPerformanceDetail(Long performanceId) { .stream() .map(cast -> PerformanceDetailCastResponse.of(cast.getId(), cast.getCastName(), cast.getCastRole(), cast.getCastPhoto())) - .collect(Collectors.toList()); + .toList(); List staffList = staffRepository.findByPerformanceId(performanceId) .stream() .map(staff -> PerformanceDetailStaffResponse.of(staff.getId(), staff.getStaffName(), staff.getStaffRole(), staff.getStaffPhoto())) - .collect(Collectors.toList()); + .toList(); List performanceImageList = performanceImageRepository.findAllByPerformanceId( performanceId) .stream() .map(image -> PerformanceDetailImageResponse.of(image.getId(), image.getPerformanceImageUrl())) - .collect(Collectors.toList()); + .toList(); log.info("Successfully completed getPerformanceDetail for performanceId: {}", performanceId); return PerformanceDetailResponse.of(performance.getId(), performance.getPerformanceTitle(), @@ -119,7 +120,7 @@ public BookingPerformanceDetailResponse getBookingPerformanceDetail(Long perform return BookingPerformanceDetailScheduleResponse.of(schedule.getId(), schedule.getPerformanceDate(), schedule.getScheduleNumber().name(), scheduleService.getAvailableTicketCount(schedule), schedule.isBooking(), dueDate); - }).collect(Collectors.toList()); + }).toList(); return BookingPerformanceDetailResponse.of(performance.getId(), performance.getPerformanceTitle(), performance.getPerformancePeriod(), scheduleList, performance.getTicketPrice(), @@ -146,7 +147,7 @@ public MakerPerformanceResponse getMemberPerformances(Long memberId) { return MakerPerformanceDetailResponse.of(performance.getId(), performance.getGenre().name(), performance.getPerformanceTitle(), performance.getPosterImage(), performance.getPerformancePeriod(), minDueDate); - }).collect(Collectors.toList()); + }).toList(); List positiveDueDates = performanceDetails.stream() .filter(detail -> detail.minDueDate() >= 0) @@ -156,7 +157,7 @@ public MakerPerformanceResponse getMemberPerformances(Long memberId) { List negativeDueDates = performanceDetails.stream() .filter(detail -> detail.minDueDate() < 0) .sorted(Comparator.comparingInt(MakerPerformanceDetailResponse::minDueDate).reversed()) - .collect(Collectors.toList()); + .toList(); positiveDueDates.addAll(negativeDueDates); @@ -186,7 +187,8 @@ public PerformanceModifyDetailResponse getPerformanceEdit(Long memberId, Long pe List scheduleIds = scheduleRepository.findIdsByPerformanceId(performanceId); - boolean isBookerExist = bookingRepository.existsByScheduleIdIn(scheduleIds); + List statusesToExclude = List.of(BookingStatus.BOOKING_CANCELLED, BookingStatus.BOOKING_DELETED); + boolean isBookerExist = bookingRepository.existsActiveBookingByScheduleIds(scheduleIds, statusesToExclude); List schedules = scheduleRepository.findAllByPerformanceId(performanceId); List casts = castRepository.findAllByPerformanceId(performanceId); @@ -203,21 +205,21 @@ private PerformanceModifyDetailResponse mapToPerformanceEditResponse(Performance .map(schedule -> ScheduleResponse.of(schedule.getId(), schedule.getPerformanceDate(), schedule.getTotalTicketCount(), calculateDueDate(schedule.getPerformanceDate()), schedule.getScheduleNumber())) - .collect(Collectors.toList()); + .toList(); List castResponses = casts.stream() .map(cast -> CastResponse.of(cast.getId(), cast.getCastName(), cast.getCastRole(), cast.getCastPhoto())) - .collect(Collectors.toList()); + .toList(); List staffResponses = staffs.stream() .map(staff -> StaffResponse.of(staff.getId(), staff.getStaffName(), staff.getStaffRole(), staff.getStaffPhoto())) - .collect(Collectors.toList()); + .toList(); List performanceImageResponses = performanceImages.stream() .map(performanceImage -> PerformanceImageResponse.of(performanceImage.getId(), performanceImage.getPerformanceImageUrl())) - .collect(Collectors.toList()); + .toList(); return PerformanceModifyDetailResponse.of(performance.getUsers().getId(), performance.getId(), performance.getPerformanceTitle(), performance.getGenre(), performance.getRunningTime(), diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 66f574ea..3f75c712 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,3 +1,3 @@ spring: profiles: - default: local \ No newline at end of file + default: dev