diff --git a/src/main/java/com/sumte/guesthouse/service/GuesthouseCommandServiceImpl.java b/src/main/java/com/sumte/guesthouse/service/GuesthouseCommandServiceImpl.java index 44589d1..8c58dd0 100644 --- a/src/main/java/com/sumte/guesthouse/service/GuesthouseCommandServiceImpl.java +++ b/src/main/java/com/sumte/guesthouse/service/GuesthouseCommandServiceImpl.java @@ -19,6 +19,15 @@ import com.sumte.guesthouse.repository.GuesthouseTargetAudienceRepository; import com.sumte.guesthouse.repository.OptionServicesRepository; import com.sumte.guesthouse.repository.TargetAudienceRepository; +import com.sumte.payment.entity.Payment; +import com.sumte.payment.repository.PaymentRepository; +import com.sumte.payment.repository.PaymentTermsRepository; +import com.sumte.payment.repository.RefundRepository; +import com.sumte.reservation.entity.Reservation; +import com.sumte.reservation.repository.ReservationRepository; +import com.sumte.review.repository.ReviewRepository; +import com.sumte.room.entity.Room; +import com.sumte.room.repository.RoomRepository; import com.sumte.user.repository.FavoriteRepository; import jakarta.transaction.Transactional; @@ -36,6 +45,12 @@ public class GuesthouseCommandServiceImpl implements GuesthouseCommandService { private final GuesthouseTargetAudienceRepository guesthouseTargetAudienceRepository; private final GuesthouseOptionServicesRepository guesthouseOptionServicesRepository; private final FavoriteRepository favoriteRepository; + private final ReviewRepository reviewRepository; + private final ReservationRepository reservationRepository; + private final RoomRepository roomRepository; + private final PaymentRepository paymentRepository; + private final RefundRepository refundRepository; + private final PaymentTermsRepository paymentTermsRepository; @Override public GuesthouseResponseDTO.Register registerGuesthouse(GuesthouseRequestDTO.Register dto) { @@ -141,17 +156,52 @@ public GuesthouseResponseDTO.delete deleteGuesthouse(Long guesthouseId) { if (guesthouse == null) { throw new SumteException(CommonErrorCode.NOT_EXIST); - } else { - guesthouseOptionServicesRepository.deleteByGuesthouseId(guesthouseId); - guesthouseTargetAudienceRepository.deleteByGuesthouseId(guesthouseId); - favoriteRepository.deleteByGuesthouseId(guesthouseId); - guesthouseRepository.delete(guesthouse); - return GuesthouseResponseDTO.delete.builder() - .name(guesthouse.getName()) - .addressDetail(guesthouse.getAddressDetail()) - .build(); } + // 1. guesthouse 하위 room 리스트 조회 + List rooms = roomRepository.findByGuesthouseId(guesthouseId); + + for (Room room : rooms) { + Long roomId = room.getId(); + + // 2. 해당 room의 reservation 조회 + List reservations = reservationRepository.findByRoomId(roomId); + for (Reservation reservation : reservations) { + Long reservationId = reservation.getId(); + + // 3. reservation의 payment 조회 + List payments = paymentRepository.findByReservationId(reservationId); + for (Payment payment : payments) { + Long paymentId = payment.getId(); + + // 4. paymentTerms, refund 먼저 삭제 + paymentTermsRepository.deleteByPaymentId(paymentId); + refundRepository.deleteByPaymentId(paymentId); + } + + // 5. payment 삭제 + paymentRepository.deleteByReservationId(reservationId); + + // 6. reservation 삭제 + reservationRepository.deleteByRoomId(roomId); + } + + // 7. 리뷰 삭제 + reviewRepository.deleteByRoomId(roomId); + + } + + // 9. Guesthouse 관련 연관 테이블 삭제 + guesthouseOptionServicesRepository.deleteByGuesthouseId(guesthouseId); + guesthouseTargetAudienceRepository.deleteByGuesthouseId(guesthouseId); + favoriteRepository.deleteByGuesthouseId(guesthouseId); + + // 11. Guesthouse 삭제 (room은 cascade로 같이 삭제됨) + guesthouseRepository.delete(guesthouse); + return GuesthouseResponseDTO.delete.builder() + .name(guesthouse.getName()) + .addressDetail(guesthouse.getAddressDetail()) + .build(); } @Override diff --git a/src/main/java/com/sumte/payment/repository/PaymentRepository.java b/src/main/java/com/sumte/payment/repository/PaymentRepository.java index c19214b..b01ab4e 100644 --- a/src/main/java/com/sumte/payment/repository/PaymentRepository.java +++ b/src/main/java/com/sumte/payment/repository/PaymentRepository.java @@ -1,11 +1,17 @@ package com.sumte.payment.repository; -import com.sumte.payment.entity.Payment; -import com.sumte.reservation.entity.Reservation; +import java.util.List; +import java.util.Optional; + import org.springframework.data.jpa.repository.JpaRepository; -import java.util.Optional; +import com.sumte.payment.entity.Payment; +import com.sumte.reservation.entity.Reservation; public interface PaymentRepository extends JpaRepository { - Optional findByReservation(Reservation reservation); + Optional findByReservation(Reservation reservation); + + List findByReservationId(Long reservationId); + + void deleteByReservationId(Long reservationId); } diff --git a/src/main/java/com/sumte/payment/repository/PaymentTermsRepository.java b/src/main/java/com/sumte/payment/repository/PaymentTermsRepository.java new file mode 100644 index 0000000..0d155c0 --- /dev/null +++ b/src/main/java/com/sumte/payment/repository/PaymentTermsRepository.java @@ -0,0 +1,9 @@ +package com.sumte.payment.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.sumte.payment.entity.PaymentTerms; + +public interface PaymentTermsRepository extends JpaRepository { + void deleteByPaymentId(Long paymentId); +} diff --git a/src/main/java/com/sumte/payment/repository/RefundRepository.java b/src/main/java/com/sumte/payment/repository/RefundRepository.java index b7055e3..edd783b 100644 --- a/src/main/java/com/sumte/payment/repository/RefundRepository.java +++ b/src/main/java/com/sumte/payment/repository/RefundRepository.java @@ -1,7 +1,9 @@ package com.sumte.payment.repository; -import com.sumte.payment.entity.Refund; import org.springframework.data.jpa.repository.JpaRepository; +import com.sumte.payment.entity.Refund; + public interface RefundRepository extends JpaRepository { + void deleteByPaymentId(Long paymentId); } diff --git a/src/main/java/com/sumte/reservation/repository/ReservationRepository.java b/src/main/java/com/sumte/reservation/repository/ReservationRepository.java index 94c68ff..8196154 100644 --- a/src/main/java/com/sumte/reservation/repository/ReservationRepository.java +++ b/src/main/java/com/sumte/reservation/repository/ReservationRepository.java @@ -1,85 +1,89 @@ package com.sumte.reservation.repository; -import com.sumte.reservation.entity.ReservationStatus; -import com.sumte.room.entity.Room; -import com.sumte.user.entity.User; +import java.time.LocalDate; +import java.util.List; + import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; - -import com.sumte.reservation.entity.Reservation; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; -import java.time.LocalDate; -import java.util.List; +import com.sumte.reservation.entity.Reservation; +import com.sumte.reservation.entity.ReservationStatus; +import com.sumte.room.entity.Room; +import com.sumte.user.entity.User; public interface ReservationRepository extends JpaRepository { @Query(""" -SELECT CASE WHEN COUNT(r) > 0 THEN true ELSE false END -FROM Reservation r -JOIN Payment p ON p.reservation = r -WHERE r.room = :room - AND r.reservationStatus <> com.sumte.reservation.entity.ReservationStatus.CANCELED - AND p.paymentStatus = com.sumte.payment.entity.PaymentStatus.PAID - AND r.startDate < :endDate - AND r.endDate > :startDate -""") + SELECT CASE WHEN COUNT(r) > 0 THEN true ELSE false END + FROM Reservation r + JOIN Payment p ON p.reservation = r + WHERE r.room = :room + AND r.reservationStatus <> com.sumte.reservation.entity.ReservationStatus.CANCELED + AND p.paymentStatus = com.sumte.payment.entity.PaymentStatus.PAID + AND r.startDate < :endDate + AND r.endDate > :startDate + """) boolean existsOverlappingReservation(@Param("room") Room room, - @Param("startDate") LocalDate startDate, - @Param("endDate") LocalDate endDate); + @Param("startDate") LocalDate startDate, + @Param("endDate") LocalDate endDate); List findByReservationStatusNot(ReservationStatus status); @Query(""" -select r -from Reservation r -where r.user = :user - and exists ( - select 1 - from Payment p - where p.reservation = r - and p.paymentStatus = com.sumte.payment.entity.PaymentStatus.PAID - ) -""") + select r + from Reservation r + where r.user = :user + and exists ( + select 1 + from Payment p + where p.reservation = r + and p.paymentStatus = com.sumte.payment.entity.PaymentStatus.PAID + ) + """) Page findAllPaidByUser(@Param("user") User user, Pageable pageable); @Query(""" - select r from Reservation r - where r.room.guesthouse.id = :guesthouseId - and r.reservationStatus <> com.sumte.reservation.entity.ReservationStatus.CANCELED - and exists ( - select 1 - from Payment p - where p.reservation = r - and p.paymentStatus = com.sumte.payment.entity.PaymentStatus.PAID - ) - and r.startDate < :endExclusive - and r.endDate > :startInclusive - """) + select r from Reservation r + where r.room.guesthouse.id = :guesthouseId + and r.reservationStatus <> com.sumte.reservation.entity.ReservationStatus.CANCELED + and exists ( + select 1 + from Payment p + where p.reservation = r + and p.paymentStatus = com.sumte.payment.entity.PaymentStatus.PAID + ) + and r.startDate < :endExclusive + and r.endDate > :startInclusive + """) List findActivePaidByGuesthouseAndOverlap( - @Param("guesthouseId") Long guesthouseId, - @Param("startInclusive") java.time.LocalDate startInclusive, - @Param("endExclusive") java.time.LocalDate endExclusive + @Param("guesthouseId") Long guesthouseId, + @Param("startInclusive") java.time.LocalDate startInclusive, + @Param("endExclusive") java.time.LocalDate endExclusive ); @Query(""" - select r from Reservation r - where r.room = :room - and r.reservationStatus <> com.sumte.reservation.entity.ReservationStatus.CANCELED - and exists ( - select 1 - from Payment p - where p.reservation = r - and p.paymentStatus = com.sumte.payment.entity.PaymentStatus.PAID - ) - and r.startDate < :endExclusive - and r.endDate > :startInclusive - """) + select r from Reservation r + where r.room = :room + and r.reservationStatus <> com.sumte.reservation.entity.ReservationStatus.CANCELED + and exists ( + select 1 + from Payment p + where p.reservation = r + and p.paymentStatus = com.sumte.payment.entity.PaymentStatus.PAID + ) + and r.startDate < :endExclusive + and r.endDate > :startInclusive + """) List findActivePaidByRoomAndOverlap( - @Param("room") com.sumte.room.entity.Room room, - @Param("startInclusive") java.time.LocalDate startInclusive, - @Param("endExclusive") java.time.LocalDate endExclusive + @Param("room") com.sumte.room.entity.Room room, + @Param("startInclusive") java.time.LocalDate startInclusive, + @Param("endExclusive") java.time.LocalDate endExclusive ); + List findByRoomId(Long roomId); + + void deleteByRoomId(Long roomId); + } diff --git a/src/main/java/com/sumte/review/repository/ReviewRepository.java b/src/main/java/com/sumte/review/repository/ReviewRepository.java index 019aba4..6ea1258 100644 --- a/src/main/java/com/sumte/review/repository/ReviewRepository.java +++ b/src/main/java/com/sumte/review/repository/ReviewRepository.java @@ -33,4 +33,6 @@ public interface ReviewRepository extends JpaRepository { // int countByRoomGuesthouseId(Long guesthouseId); boolean existsByUserIdAndReservationId(Long userId, Long reservationId); + + void deleteByRoomId(Long roomId); } \ No newline at end of file diff --git a/src/main/java/com/sumte/room/repository/RoomRepository.java b/src/main/java/com/sumte/room/repository/RoomRepository.java index efd7a86..aa6b166 100644 --- a/src/main/java/com/sumte/room/repository/RoomRepository.java +++ b/src/main/java/com/sumte/room/repository/RoomRepository.java @@ -26,4 +26,6 @@ public interface RoomRepository extends JpaRepository { List findAllByGuesthouseId(Long guesthouseId); long countByGuesthouseId(Long guesthouseId); + + List findByGuesthouseId(Long guesthouseId); } \ No newline at end of file