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
2 changes: 2 additions & 0 deletions src/main/java/com/sumte/SumteApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableJpaAuditing
@EnableScheduling
public class SumteApplication {

public static void main(String[] args) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
package com.sumte.payment.repository;

import com.sumte.payment.entity.Payment;
import com.sumte.reservation.entity.Reservation;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.Optional;

public interface PaymentRepository extends JpaRepository<Payment, Long> {
Optional<Payment> findByReservation(Reservation reservation);
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public ReservationResponseDTO.CreateReservationDTO toCreateResponse(Reservation
.build();
}

public ReservationResponseDTO.MyReservationDTO toMyReservationDTO(Reservation reservation) {
public ReservationResponseDTO.MyReservationDTO toMyReservationDTO(Reservation reservation, boolean canWriteReview, boolean reviewWritten) {
Room room = reservation.getRoom();
Guesthouse guestHouse = room.getGuesthouse();
int nightCount = (int) ChronoUnit.DAYS.between(reservation.getStartDate(), reservation.getEndDate());
Expand All @@ -48,7 +48,9 @@ public ReservationResponseDTO.MyReservationDTO toMyReservationDTO(Reservation re
.adultCount(reservation.getAdultCount())
.childCount(reservation.getChildCount())
.nightCount(nightCount)
.status(reservation.getReservationStatus().name())
.status(reservation.getReservationStatus())
.canWriteReview(canWriteReview)
.reviewWritten(reviewWritten)
.build();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.sumte.reservation.dto;

import com.sumte.reservation.entity.ReservationStatus;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
Expand Down Expand Up @@ -30,7 +31,10 @@ public static class MyReservationDTO {
private Long adultCount;
private Long childCount;
private int nightCount;
private String status;
private ReservationStatus status;

private boolean canWriteReview;
private boolean reviewWritten;
}

@Builder
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,4 +51,5 @@ public class Reservation extends BaseTimeEntity {
public void cancel() {
this.reservationStatus = ReservationStatus.CANCELED;
}
public void complete() {this.reservationStatus = ReservationStatus.COMPLETED;}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.sumte.reservation.repository;

import com.sumte.reservation.entity.ReservationStatus;
import com.sumte.room.entity.Room;
import com.sumte.user.entity.User;
import org.springframework.data.domain.Page;
Expand All @@ -11,6 +12,7 @@
import org.springframework.data.repository.query.Param;

import java.time.LocalDate;
import java.util.List;

public interface ReservationRepository extends JpaRepository<Reservation, Long> {
@Query("""
Expand All @@ -25,5 +27,6 @@ boolean existsOverlappingReservation(@Param("room") Room room,

Page<Reservation> findAllByUser(User user, Pageable pageable);

List<Reservation> findByReservationStatusNot(ReservationStatus status);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.sumte.reservation.scheduler;

import com.sumte.reservation.service.ReservationService;
import lombok.RequiredArgsConstructor;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
@RequiredArgsConstructor
public class ReservationStatusScheduler {
private final ReservationService reservationService;

@Scheduled(cron = "0 0 * * * *")
public void autoUpdateCompletedReservations() {
reservationService.updateCompletedReservations();
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,5 @@ public interface ReservationService {
Page<ReservationResponseDTO.MyReservationDTO> getMyReservations(Long userId, Pageable pageable);
ReservationResponseDTO.ReservationDetailDTO getReservationDetail(Long reservationId, Long userId);
void cancelReservation(Long reservationId, Long userId);
void updateCompletedReservations();
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@
import com.sumte.apiPayload.code.error.CommonErrorCode;
import com.sumte.apiPayload.code.error.ReservationErrorCode;
import com.sumte.apiPayload.exception.SumteException;
import com.sumte.payment.entity.Payment;
import com.sumte.payment.entity.PaymentStatus;
import com.sumte.payment.repository.PaymentRepository;
import com.sumte.reservation.entity.ReservationStatus;
import com.sumte.review.repository.ReviewRepository;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
Expand All @@ -21,6 +25,11 @@
import lombok.RequiredArgsConstructor;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDate;
import java.time.LocalTime;
import java.util.List;
import java.util.Optional;

@Service
@RequiredArgsConstructor
public class ReservationServiceImpl implements ReservationService {
Expand All @@ -29,6 +38,8 @@ public class ReservationServiceImpl implements ReservationService {
private final ReservationConverter reservationConverter;
private final RoomRepository roomRepository;
private final UserRepository userRepository;
private final PaymentRepository paymentRepository;
private final ReviewRepository reviewRepository;

@Override
@Transactional
Expand Down Expand Up @@ -65,7 +76,14 @@ public Page<ReservationResponseDTO.MyReservationDTO> getMyReservations(Long user
.orElseThrow(() -> new SumteException(CommonErrorCode.USER_NOT_FOUND));

Page<Reservation> reservations = reservationRepository.findAllByUser(user, pageable);
return reservations.map(reservationConverter::toMyReservationDTO);
return reservations.map(reservation -> {
boolean isComplete = reservation.getReservationStatus().equals(ReservationStatus.COMPLETED);

boolean reviewWritten = reviewRepository.existsByUserIdAndRoomGuesthouseId(user.getId(), reservation.getRoom().getGuesthouse().getId());
boolean canWriteReview = isComplete && !reviewWritten;

return reservationConverter.toMyReservationDTO(reservation,canWriteReview,reviewWritten);
});
}

@Override
Expand Down Expand Up @@ -98,4 +116,32 @@ public void cancelReservation(Long reservationId, Long userId) {
reservation.cancel();
}

@Override
@Transactional
public void updateCompletedReservations() {
LocalDate today = LocalDate.now();
LocalTime now = LocalTime.now();

List<Reservation> reservations = reservationRepository.findByReservationStatusNot(ReservationStatus.COMPLETED);
for (Reservation reservation : reservations) {
LocalDate endDate = reservation.getEndDate();
LocalTime checkoutTime = reservation.getRoom().getCheckout();

boolean isAfterCheckout = endDate.isBefore(today) || (endDate.isEqual(today) && checkoutTime.isBefore(now));

if (!isAfterCheckout) continue;

Optional<Payment> paymentOpt = paymentRepository.findByReservation(reservation);

boolean isPaid = paymentOpt
.map(Payment::getPaymentStatus)
.filter(status -> status == PaymentStatus.PAID)
.isPresent();

if (isPaid) {
reservation.complete();
}
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,6 @@ public interface ReviewRepository extends JpaRepository<Review, Long> {

//내가 작성한 리뷰 조회 (단순 내가 작성한 리뷰만 조회하는거라 넣었는데 다시 확인(중복) )
Page<Review> findAllByUserId(Long userId, Pageable pageable);

boolean existsByUserIdAndRoomGuesthouseId(Long userId, Long roomGuesthouseId);
}