testController
@GetMapping("/admin/test/showtime")
public ResponseEntity<?> showtimetest() {
Admin sessionAdmin = (Admin) session.getAttribute("sessionAdmin");
int cinemaId = 1;
LocalDate startDate = LocalDate.of(2024, 9, 25);
// DTO 생성
AdminShowtimeResponse.CinemaScheduleWithMoviesDTO cinemaSchedule = adminService.상영관별상영스케줄(sessionAdmin, startDate);
// DTO 상태를 확인
for (int i = 0; i < cinemaSchedule.getCinemaSchedule().getScreens().size(); i++) {
System.out.println("Screen " + (i + 1) + " can add showtime: " + cinemaSchedule.getCinemaSchedule().getScreens().get(i).getCanAddShowtime());
}
// JSON 형식으로 DTO 반환
return ResponseEntity.ok(cinemaSchedule);
}
결과 json
{
"cinemaSchedule": {
"cinemaId": 1,
"cinemaName": "서면롯데시네마",
"screens": [
{
"screenId": 1,
"screenName": "서면1상영관",
"showtimes": [
{
"showtimeId": 7,
"movieName": "Interstellar",
"runtime": 169,
"startedAt": "18:00"
},
{
"showtimeId": 12,
"movieName": "Parasite",
"runtime": 132,
"startedAt": "20:00"
}
],
"nextAvailableTime": "2024-09-25T22:42:00",
"canAddShowtime": "true",
"formattedNextAvailableTime": "2024-09-25 22:42"
},
{
"screenId": 2,
"screenName": "서면2상영관",
"showtimes": [ ],
"nextAvailableTime": "2024-09-25T00:00:00",
"canAddShowtime": "true",
"formattedNextAvailableTime": "2024-09-25 00:00"
},
{
"screenId": 3,
"screenName": "서면3상영관",
"showtimes": [ ],
"nextAvailableTime": "2024-09-25T00:00:00",
"canAddShowtime": "true",
"formattedNextAvailableTime": "2024-09-25 00:00"
},
{
"screenId": 4,
"screenName": "서면4상영관",
"showtimes": [ ],
"nextAvailableTime": "2024-09-25T00:00:00",
"canAddShowtime": "true",
"formattedNextAvailableTime": "2024-09-25 00:00"
}
]
},
"movieList": [
{
"movieId": 1,
"movieName": "Interstellar",
"runtime": 169
},
{
"movieId": 2,
"movieName": "Parasite",
"runtime": 132
},
{
"movieId": 3,
"movieName": "The Godfather",
"runtime": 175
},
{
"movieId": 4,
"movieName": "Your Name",
"runtime": 112
},
{
"movieId": 5,
"movieName": "Spirited Away",
"runtime": 125
}
]
}
Service
public AdminShowtimeResponse.CinemaScheduleWithMoviesDTO 상영관별상영스케줄(Admin sessionAdmin, LocalDate selectedDate) {
System.out.println(selectedDate);
// 영화 목록을 가져옴
List<Movie> movies = movieRepository.findAll();
List<AdminShowtimeResponse.movieDTO> movieDTOList = new ArrayList<>();
for (Movie movie : movies) {
movieDTOList.add(new AdminShowtimeResponse.movieDTO(movie));
}
Long cinemaId = 1L;
// 영화관 정보를 가져옴
Cinema cinema = cinemaRepository.findById(cinemaId)
.orElseThrow(() -> new IllegalArgumentException("Cinema not found"));
// CinemaWithScreensDTO에 영화관 정보를 저장
AdminShowtimeResponse.CinemaWithScreensDTO cinemaWithScreensDTO = new AdminShowtimeResponse.CinemaWithScreensDTO(cinema);
// 상영관들의 ID 리스트를 추출
List<Long> screenIds = new ArrayList<>();
for (Screen screen : cinema.getScreens()) {
screenIds.add(screen.getId());
}
// 각 상영관에 대한 ScreenDTO 생성
for (Screen screen : cinema.getScreens()) {
AdminShowtimeResponse.ScreenDTO screenDTO = new AdminShowtimeResponse.ScreenDTO(screen);
cinemaWithScreensDTO.addScreen(screenDTO); // 각 상영관 정보를 추가
}
// 상영시간을 조회 (주어진 날짜와 상영관 ID 리스트에 맞게)
List<Showtime> showtimes = showtimeRepository.findByScreenIdsAndShowDate(screenIds, selectedDate);
// 각 상영관에 대해 showtime 추가 및 검증
for (AdminShowtimeResponse.ScreenDTO screenDTO : cinemaWithScreensDTO.getScreens()) {
// 상영관에 해당하는 상영시간 필터링
List<Showtime> screenShowtimes = new ArrayList<>();
for (Showtime showtime : showtimes) {
if (showtime.getScreen().getId().equals(screenDTO.getScreenId())) {
screenShowtimes.add(showtime);
}
}
// 상영 시간이 있을 경우
if (!screenShowtimes.isEmpty()) {
for (Showtime showtime : screenShowtimes) {
AdminShowtimeResponse.ShowtimeDTO showtimeDTO = new AdminShowtimeResponse.ShowtimeDTO(showtime);
screenDTO.addShowtime(showtimeDTO);
// 마지막 상영 종료 시간을 계산 (상영 시작 시간 + 런타임 + 30분)
LocalDateTime showtimeEnd = showtime.getStartedAt().toLocalDateTime()
.plusMinutes(showtime.getMovie().getRuntime() + 30);
// selectedDate의 다음날 자정 기준으로 비교
LocalDateTime midnight = selectedDate.plusDays(1).atTime(0, 0); // 다음날 자정
// 자정 기준 검증
if (showtimeEnd.isBefore(midnight)) {
screenDTO.setCanAddShowtime("true");
screenDTO.setNextAvailableTime(showtimeEnd);
} else {
screenDTO.setCanAddShowtime(null);
}
}
} else {
// 상영 시간이 없을 경우
LocalDate previousDate = selectedDate.minusDays(1);
System.out.println("상영시간이 없을경우");
List<Showtime> previousDayShowtimes = showtimeRepository.findByScreenIdsAndShowDate(Collections.singletonList(screenDTO.getScreenId()), previousDate);
if (previousDayShowtimes.isEmpty()) {
// 전날에도 상영 시간이 없는 경우
screenDTO.setNextAvailableTime(selectedDate.atStartOfDay()); // 0시로 설정
screenDTO.setCanAddShowtime("true");
} else {
// 전날 상영 시간이 있는 경우
Showtime lastShowtime = previousDayShowtimes.get(previousDayShowtimes.size() - 1);
LocalDateTime previousEndTime = lastShowtime.getStartedAt().toLocalDateTime()
.plusMinutes(lastShowtime.getMovie().getRuntime() + 30);
if (previousEndTime.isBefore(selectedDate.atStartOfDay())) {
screenDTO.setNextAvailableTime(selectedDate.atStartOfDay()); // 0시로 설정
} else {
screenDTO.setNextAvailableTime(previousEndTime);
}
screenDTO.setCanAddShowtime("true");
}
}
}
// 최종적으로 CinemaScheduleWithMoviesDTO 반환
return new AdminShowtimeResponse.CinemaScheduleWithMoviesDTO(cinemaWithScreensDTO, movieDTOList);
}
리포지토리 테스트
@Test
public void findScreensWithShowtimesByIdsAndDate_test(){
Long cinemaId = 1L;
Cinema cinemas = cinemaRepository.mFindByIdWithScreen(cinemaId);
List<Long> screenIds = new ArrayList<>();;
for (Screen screen : cinemas.getScreens()) {
screenIds.add(screen.getId());
System.out.println(screen.getId());
}
;
LocalDate date12 = LocalDate.of(2024, 9, 12); // 2024년 9월 12일
LocalDate date13 = LocalDate.of(2024, 9, 13); // 2024년 9월 13일
List<Screen> screens1 =screenRepository.findScreensWithShowtimesByIdsAndDate(screenIds,date12);
System.out.println("--------------------");
System.out.println("12일");
for (Screen screen : screens1) {
System.out.println(screen.getName());
for (Showtime showtime : screen.getShowtimes()){
System.out.println(showtime.getStartedAt());
}
}
System.out.println("33333333333333333333");
System.out.println("13일");
List<Screen> screens2 =screenRepository.findScreensWithShowtimesByIdsAndDate(screenIds,date13);
for (Screen screen : screens2) {
System.out.println(screen.getName());
for (Showtime showtime : screen.getShowtimes()){
System.out.println(showtime.getStartedAt());
}
}
}
@Test
public void admin_mFindAllwithScreenByIds(){
Long cinemaId = 1L;
Cinema cinemas = cinemaRepository.mFindByIdWithScreen(cinemaId);
List<Long> screenIds = new ArrayList<>();;
for (Screen screen : cinemas.getScreens()) {
screenIds.add(screen.getId());
}
for (Long screenId : screenIds) {
System.out.println("상영관id = " + screenId);
}
// 저장된 상영관 ID들을 통해 상영관과 그에 속한 showtime을 조회
List<Screen> screensWithShowtimes = screenRepository.findScreensWithShowtimesByIds(screenIds);
// 결과 출력 (테스트용)
for (Screen screen : screensWithShowtimes) {
System.out.println("상영관 id = " + screen.getId());
for (Showtime showtime : screen.getShowtimes()) {
System.out.println("상영시간 = " + showtime.getMovie().getRuntime());
}
}
}
Share article