Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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) {
Expand Down Expand Up @@ -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<Room> rooms = roomRepository.findByGuesthouseId(guesthouseId);

for (Room room : rooms) {
Long roomId = room.getId();

// 2. 해당 room의 reservation 조회
List<Reservation> reservations = reservationRepository.findByRoomId(roomId);
for (Reservation reservation : reservations) {
Long reservationId = reservation.getId();

// 3. reservation의 payment 조회
List<Payment> 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
Expand Down
14 changes: 10 additions & 4 deletions src/main/java/com/sumte/payment/repository/PaymentRepository.java
Original file line number Diff line number Diff line change
@@ -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<Payment, Long> {
Optional<Payment> findByReservation(Reservation reservation);
Optional<Payment> findByReservation(Reservation reservation);

List<Payment> findByReservationId(Long reservationId);

void deleteByReservationId(Long reservationId);
}
Original file line number Diff line number Diff line change
@@ -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<PaymentTerms, Long> {
void deleteByPaymentId(Long paymentId);
}
Original file line number Diff line number Diff line change
@@ -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<Refund, Long> {
void deleteByPaymentId(Long paymentId);
}
Original file line number Diff line number Diff line change
@@ -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<Reservation, Long> {
@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<Reservation> 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<Reservation> 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<Reservation> 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<Reservation> 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<Reservation> findByRoomId(Long roomId);

void deleteByRoomId(Long roomId);

}
Original file line number Diff line number Diff line change
Expand Up @@ -33,4 +33,6 @@ public interface ReviewRepository extends JpaRepository<Review, Long> {
// int countByRoomGuesthouseId(Long guesthouseId);

boolean existsByUserIdAndReservationId(Long userId, Long reservationId);

void deleteByRoomId(Long roomId);
}
2 changes: 2 additions & 0 deletions src/main/java/com/sumte/room/repository/RoomRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,6 @@ public interface RoomRepository extends JpaRepository<Room, Long> {
List<Room> findAllByGuesthouseId(Long guesthouseId);

long countByGuesthouseId(Long guesthouseId);

List<Room> findByGuesthouseId(Long guesthouseId);
}