Skip to content

Commit 376e07f

Browse files
committed
[feat] #50 reservationStatus 업데이트 및 예약 목록 조회 api
1 parent dd93ca8 commit 376e07f

File tree

7 files changed

+129
-11
lines changed

7 files changed

+129
-11
lines changed

src/main/java/com/okagaka/OkaGaka/domain/aidecision/service/AsyncDecisionService.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -374,17 +374,17 @@ private void performFinalAnalysisAndSaveDecision(CarRequest carRequest, LocalDat
374374
User user = carRequest.getUser();
375375
Vehicle vehicle = user.getFamilyGroup().getVehicle();
376376

377-
// // 1. 대중교통 정보 조회 (API 제한으로 임시 비활성화)
378-
// System.out.println(">> [임시] 대중교통 API 호출을 건너뜁니다.");
379-
// TransitInfo transitInfo = null; // API 호출 대신 null을 할당
377+
// 1. 대중교통 정보 조회 (API 제한으로 임시 비활성화)
378+
System.out.println(">> [임시] 대중교통 API 호출을 건너뜁니다.");
379+
TransitInfo transitInfo = null; // API 호출 대신 null을 할당
380380

381-
// 1. 대중교통 정보 조회
382-
TransitInfo transitInfo = transitService.getTransitInfo(
383-
String.valueOf(carRequest.getRequesterLongitude()),
384-
String.valueOf(carRequest.getRequesterLatitude()),
385-
String.valueOf(carRequest.getDestinationLongitude()),
386-
String.valueOf(carRequest.getDestinationLatitude())
387-
);
381+
// // 1. 대중교통 정보 조회
382+
// TransitInfo transitInfo = transitService.getTransitInfo(
383+
// String.valueOf(carRequest.getRequesterLongitude()),
384+
// String.valueOf(carRequest.getRequesterLatitude()),
385+
// String.valueOf(carRequest.getDestinationLongitude()),
386+
// String.valueOf(carRequest.getDestinationLatitude())
387+
// );
388388

389389
if (transitInfo == null) {
390390
System.out.println(">> 조회된 대중교통 경로가 없습니다.");

src/main/java/com/okagaka/OkaGaka/domain/reservation/controller/ReservationController.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.okagaka.OkaGaka.common.response.ApiResponse;
44
import com.okagaka.OkaGaka.common.security.CustomUserDetails;
55
import com.okagaka.OkaGaka.domain.reservation.dto.CarpoolProposalResponse;
6+
import com.okagaka.OkaGaka.domain.reservation.dto.ReservationListResponse;
67
import com.okagaka.OkaGaka.domain.reservation.service.ReservationService;
78
import com.okagaka.OkaGaka.domain.reservation.dto.ReservationResponse;
89
import com.okagaka.OkaGaka.domain.reservation.dto.ReservationRequest;
@@ -82,5 +83,18 @@ public ResponseEntity<ApiResponse<List<CarpoolProposalResponse>>> getReceivedCar
8283
return ResponseEntity.ok(ApiResponse.success(proposals));
8384
}
8485

86+
/**
87+
* 로그인한 사용자의 예약 목록 조회
88+
*/
89+
@Operation(summary = "내 예약 목록 조회", description = "로그인한 사용자의 모든 예약 정보를 최신순으로 반환합니다.")
90+
@GetMapping
91+
public ResponseEntity<ApiResponse<List<ReservationListResponse>>> getUserReservations(
92+
@AuthenticationPrincipal CustomUserDetails userDetails
93+
) {
94+
Long userId = userDetails.getUserId();
95+
List<ReservationListResponse> reservations = reservationService.getUserReservations(userId);
96+
return ResponseEntity.ok(ApiResponse.success(reservations));
97+
}
98+
8599

86100
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.okagaka.OkaGaka.domain.reservation.dto;
2+
3+
import com.okagaka.OkaGaka.domain.reservation.entity.Reservation;
4+
import com.okagaka.OkaGaka.domain.reservation.enums.ReservationStatus;
5+
import lombok.Builder;
6+
import lombok.Getter;
7+
8+
import java.time.LocalDateTime;
9+
10+
@Getter
11+
@Builder
12+
public class ReservationListResponse {
13+
14+
private Long reservationId;
15+
private String title;
16+
private ReservationStatus status;
17+
private LocalDateTime departureDateTime;
18+
private LocalDateTime arrivalDateTime;
19+
20+
// Reservation 엔티티를 받아 ReservationListResponse 객체를 생성하는 정적 메서드
21+
public static ReservationListResponse from(Reservation reservation) {
22+
return ReservationListResponse.builder()
23+
.reservationId(reservation.getId())
24+
.title(reservation.getTitle())
25+
.status(reservation.getStatus())
26+
.departureDateTime(reservation.getDepartureDateTime())
27+
.arrivalDateTime(reservation.getArrivalDateTime())
28+
.build();
29+
}
30+
31+
}

src/main/java/com/okagaka/OkaGaka/domain/reservation/enums/ReservationStatus.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,6 @@ public enum ReservationStatus {
1414
CARPOOL,
1515
// REJECTED,
1616
CANCELLED,
17-
// COMPLETED,
17+
COMPLETED,
1818
// COMPLICT
1919
}

src/main/java/com/okagaka/OkaGaka/domain/reservation/repository/ReservationRepository.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ public interface ReservationRepository extends JpaRepository<Reservation, Long>{
1818
// 특정 사용자 ID로 예약 목록 조회
1919
List<Reservation> findByUserId(Long userId);
2020

21+
2122
// 특정 사용자와 예약 상태로 예약 목록 조회
2223
List<Reservation> findByUserIdAndStatus(Long userId, ReservationStatus status);
2324

@@ -71,4 +72,7 @@ List<Reservation> findOverlappingReservationsForVehicle(
7172
@Param("endDateTime") LocalDateTime endDateTime
7273
);
7374

75+
// 특정 상태 리스트에 속하면서, 특정 시간보다 도착 시간이 이른 모든 예약을 조회하는 메소드
76+
List<Reservation> findAllByStatusInAndArrivalDateTimeBefore(List<ReservationStatus> statuses, LocalDateTime dateTime);
77+
7478
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.okagaka.OkaGaka.domain.reservation.service;
2+
3+
4+
import com.okagaka.OkaGaka.domain.reservation.entity.Reservation;
5+
import com.okagaka.OkaGaka.domain.reservation.enums.ReservationStatus;
6+
import com.okagaka.OkaGaka.domain.reservation.repository.ReservationRepository;
7+
import lombok.RequiredArgsConstructor;
8+
import org.springframework.scheduling.annotation.Scheduled;
9+
import org.springframework.stereotype.Component;
10+
import org.springframework.transaction.annotation.Transactional;
11+
12+
import java.time.LocalDateTime;
13+
import java.util.List;
14+
15+
16+
@Component
17+
@RequiredArgsConstructor
18+
public class ReservationScheduler {
19+
20+
private final ReservationRepository reservationRepository;
21+
22+
// 예상 도착 시간보다 10분 늦는 경우까지 여유를 둡니다.
23+
private static final int GRACE_PERIOD_MINUTES = 10;
24+
25+
/**
26+
* 5분마다 한 번씩 실행되며, 완료된 예약 상태를 업데이트합니다.
27+
*/
28+
@Scheduled(fixedRate = 300000) // 5분 = 300,000 밀리초
29+
@Transactional
30+
public void updateCompletedReservations() {
31+
System.out.println(">> [Scheduler] 완료된 예약 상태 업데이트 시작...");
32+
33+
// 현재 시간에서 유예 기간을 뺀 시점을 기준으로 완료된 예약을 조회합니다.
34+
LocalDateTime checkTime = LocalDateTime.now().minusMinutes(GRACE_PERIOD_MINUTES);
35+
36+
// 1. 'CONFIRMED' 또는 'CARPOOL' 상태이며, 도착 시간이 지난 모든 예약을 조회합니다.
37+
List<Reservation> completedReservations = reservationRepository.findAllByStatusInAndArrivalDateTimeBefore(
38+
List.of(ReservationStatus.CONFIRMED, ReservationStatus.CARPOOL),
39+
checkTime
40+
);
41+
42+
if (completedReservations.isEmpty()) {
43+
System.out.println(">> [Scheduler] 완료된 예약이 없습니다.");
44+
return;
45+
}
46+
47+
// 2. 조회된 예약들의 상태를 'COMPLETED'로 변경합니다.
48+
System.out.printf(">> [Scheduler] %d개의 완료된 예약을 업데이트합니다.%n", completedReservations.size());
49+
for (Reservation reservation : completedReservations) {
50+
reservation.setStatus(ReservationStatus.COMPLETED);
51+
}
52+
53+
// @Transactional에 의해 메소드가 종료되면 변경 사항이 DB에 자동으로 저장됩니다.
54+
}
55+
}

src/main/java/com/okagaka/OkaGaka/domain/reservation/service/ReservationService.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.okagaka.OkaGaka.domain.reservation.service;
22

33
import com.okagaka.OkaGaka.domain.reservation.dto.CarpoolProposalResponse;
4+
import com.okagaka.OkaGaka.domain.reservation.dto.ReservationListResponse;
45
import com.okagaka.OkaGaka.domain.reservation.enums.ProposalStatus;
56
import lombok.RequiredArgsConstructor;
67
import org.springframework.stereotype.Service;
@@ -448,4 +449,17 @@ public List<CarpoolProposalResponse> getReceivedCarpoolProposals(Long userId) {
448449
})
449450
.collect(Collectors.toList());
450451
}
452+
453+
/**
454+
* 로그인한 사용자의 모든 예약 목록을 조회합니다.
455+
* @param userId 로그인한 사용자의 ID
456+
* @return 예약 목록 DTO 리스트
457+
*/
458+
public List<ReservationListResponse> getUserReservations(Long userId) {
459+
// userId를 기준으로 Reservation 목록을 조회
460+
return reservationRepository.findByUserId(userId)
461+
.stream()
462+
.map(ReservationListResponse::from) // Reservation 엔티티를 ReservationResponse DTO로 변환
463+
.collect(Collectors.toList());
464+
}
451465
}

0 commit comments

Comments
 (0)