diff --git a/server/src/main/java/com/ticketing/server/global/exception/ErrorCode.java b/server/src/main/java/com/ticketing/server/global/exception/ErrorCode.java index f281c48..454a848 100644 --- a/server/src/main/java/com/ticketing/server/global/exception/ErrorCode.java +++ b/server/src/main/java/com/ticketing/server/global/exception/ErrorCode.java @@ -19,6 +19,7 @@ public enum ErrorCode { /* 404 NOT_FOUND : Resource 를 찾을 수 없음 */ EMAIL_NOT_FOUND(NOT_FOUND, "해당 이메일을 찾을 수 없습니다."), + MOVIE_NOT_FOUND(NOT_FOUND, "해당 제목의 영화를 찾을 수 없습니다."), REFRESH_TOKEN_NOT_FOUND(NOT_FOUND, "리프레쉬 토큰을 찾을 수 없습니다."), /* 409 CONFLICT : Resource 의 현재 상태와 충돌. 보통 중복된 데이터 존재 */ diff --git a/server/src/main/java/com/ticketing/server/global/security/WebSecurityConfig.java b/server/src/main/java/com/ticketing/server/global/security/WebSecurityConfig.java index b1ff01f..3dd30ae 100644 --- a/server/src/main/java/com/ticketing/server/global/security/WebSecurityConfig.java +++ b/server/src/main/java/com/ticketing/server/global/security/WebSecurityConfig.java @@ -54,6 +54,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { .antMatchers(HttpMethod.POST, "/api/auth/refresh").permitAll() .antMatchers(HttpMethod.POST, "/api/users").permitAll() .antMatchers("/api/movies/**").permitAll() + .antMatchers("/api/movieTimes/**").permitAll() .antMatchers("/l7check").permitAll() .antMatchers("/actuator/**").permitAll() .antMatchers("/api/v3/", "/swagger-ui/**", "/swagger/", "/swagger-resources/**", "/v3/api-docs").permitAll() diff --git a/server/src/main/java/com/ticketing/server/movie/application/MovieTimeController.java b/server/src/main/java/com/ticketing/server/movie/application/MovieTimeController.java new file mode 100644 index 0000000..075a75c --- /dev/null +++ b/server/src/main/java/com/ticketing/server/movie/application/MovieTimeController.java @@ -0,0 +1,37 @@ +package com.ticketing.server.movie.application; + +import com.ticketing.server.movie.application.response.MovieTimeListResponse; +import com.ticketing.server.movie.service.interfaces.MovieTimeService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import java.time.LocalDate; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/movieTimes") +@Api(value = "MovieTime API", tags = {"Movie Time"}) +@RequiredArgsConstructor +@Slf4j +public class MovieTimeController { + + private final MovieTimeService movieTimeService; + + @GetMapping + @ApiOperation(value = "영화 시간표 조회") + public ResponseEntity getMovieTimes( + @ApiParam(value = "영화 제목", required = true) @RequestParam String title, + @ApiParam(value = "검색 단어", required = true) @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate runningDate) { + return ResponseEntity.status(HttpStatus.OK).body(MovieTimeListResponse.from(movieTimeService.getMovieTimes(title, runningDate))); + } + + +} diff --git a/server/src/main/java/com/ticketing/server/movie/application/MovieTimesController.java b/server/src/main/java/com/ticketing/server/movie/application/MovieTimesController.java deleted file mode 100644 index b4486f2..0000000 --- a/server/src/main/java/com/ticketing/server/movie/application/MovieTimesController.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.ticketing.server.movie.application; - -import org.springframework.web.bind.annotation.RestController; - -@RestController -public class MovieTimesController { - -} diff --git a/server/src/main/java/com/ticketing/server/movie/application/response/MovieListResponse.java b/server/src/main/java/com/ticketing/server/movie/application/response/MovieListResponse.java index 64c0d4a..56d117a 100644 --- a/server/src/main/java/com/ticketing/server/movie/application/response/MovieListResponse.java +++ b/server/src/main/java/com/ticketing/server/movie/application/response/MovieListResponse.java @@ -1,6 +1,5 @@ package com.ticketing.server.movie.application.response; -import com.fasterxml.jackson.annotation.JsonProperty; import com.ticketing.server.movie.service.dto.MovieDto; import io.swagger.annotations.ApiModelProperty; import java.util.List; @@ -13,7 +12,6 @@ import lombok.Getter; public class MovieListResponse { @ApiModelProperty(value = "영화 제목") - @JsonProperty private List movieDtos; public static MovieListResponse from(List movieDtos) { diff --git a/server/src/main/java/com/ticketing/server/movie/application/response/MovieTimeListResponse.java b/server/src/main/java/com/ticketing/server/movie/application/response/MovieTimeListResponse.java new file mode 100644 index 0000000..7793c99 --- /dev/null +++ b/server/src/main/java/com/ticketing/server/movie/application/response/MovieTimeListResponse.java @@ -0,0 +1,21 @@ +package com.ticketing.server.movie.application.response; + +import com.ticketing.server.movie.service.dto.MovieTimeDto; +import io.swagger.annotations.ApiModelProperty; +import java.util.List; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class MovieTimeListResponse { + + @ApiModelProperty(value = "영화 시간표 정보") + private List movieTimeDtos; + + public static MovieTimeListResponse from(List movieTimeDtos) { + return new MovieTimeListResponse(movieTimeDtos); + } + +} diff --git a/server/src/main/java/com/ticketing/server/movie/domain/MovieTime.java b/server/src/main/java/com/ticketing/server/movie/domain/MovieTime.java index 3d076e0..9e851e5 100644 --- a/server/src/main/java/com/ticketing/server/movie/domain/MovieTime.java +++ b/server/src/main/java/com/ticketing/server/movie/domain/MovieTime.java @@ -1,6 +1,7 @@ package com.ticketing.server.movie.domain; import com.ticketing.server.global.dto.repository.AbstractEntity; +import com.ticketing.server.movie.service.dto.MovieTimeDto; import java.time.LocalDate; import java.time.LocalTime; import javax.persistence.Entity; @@ -35,4 +36,8 @@ public class MovieTime extends AbstractEntity { @NotNull private LocalTime endAt; + public MovieTimeDto toDto() { + return new MovieTimeDto(this.getId(), this.round, this.theater.getTheaterNumber(), this.startAt, this.endAt); + } + } diff --git a/server/src/main/java/com/ticketing/server/movie/domain/repository/MovieTimeRepository.java b/server/src/main/java/com/ticketing/server/movie/domain/repository/MovieTimeRepository.java new file mode 100644 index 0000000..df40c2f --- /dev/null +++ b/server/src/main/java/com/ticketing/server/movie/domain/repository/MovieTimeRepository.java @@ -0,0 +1,16 @@ +package com.ticketing.server.movie.domain.repository; + +import com.ticketing.server.movie.domain.Movie; +import com.ticketing.server.movie.domain.MovieTime; +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.List; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface MovieTimeRepository extends JpaRepository { + + List findByMovieAndRunningDate(Movie movie, LocalDate localDate); + +} diff --git a/server/src/main/java/com/ticketing/server/movie/domain/repository/MovieTimesRepository.java b/server/src/main/java/com/ticketing/server/movie/domain/repository/MovieTimesRepository.java deleted file mode 100644 index 86a1650..0000000 --- a/server/src/main/java/com/ticketing/server/movie/domain/repository/MovieTimesRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.ticketing.server.movie.domain.repository; - -import com.ticketing.server.movie.domain.MovieTime; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface MovieTimesRepository extends JpaRepository { - -} diff --git a/server/src/main/java/com/ticketing/server/movie/service/MovieTimeServiceImpl.java b/server/src/main/java/com/ticketing/server/movie/service/MovieTimeServiceImpl.java new file mode 100644 index 0000000..e67697f --- /dev/null +++ b/server/src/main/java/com/ticketing/server/movie/service/MovieTimeServiceImpl.java @@ -0,0 +1,45 @@ +package com.ticketing.server.movie.service; + +import static com.ticketing.server.global.exception.ErrorCode.MOVIE_NOT_FOUND; + +import com.ticketing.server.global.exception.TicketingException; +import com.ticketing.server.movie.domain.Movie; +import com.ticketing.server.movie.domain.MovieTime; +import com.ticketing.server.movie.domain.repository.MovieRepository; +import com.ticketing.server.movie.domain.repository.MovieTimeRepository; +import com.ticketing.server.movie.service.dto.MovieTimeDto; +import com.ticketing.server.movie.service.interfaces.MovieTimeService; +import java.time.LocalDate; +import java.util.List; +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +@Slf4j +public class MovieTimeServiceImpl implements MovieTimeService { + + private final MovieRepository movieRepository; + + private final MovieTimeRepository movieTimeRepository; + + @Override + public List getMovieTimes(String title, LocalDate runningDate) { + Movie movie = movieRepository.findByTitle(title) + .orElseThrow(MovieTimeServiceImpl::throwMovieNotFound); + + List movieTimes = movieTimeRepository.findByMovieAndRunningDate(movie, runningDate); + + return movieTimes.stream() + .map(movieTime -> movieTime.toDto()) + .collect(Collectors.toList()); + + } + + private static RuntimeException throwMovieNotFound() { + throw new TicketingException(MOVIE_NOT_FOUND); + } + +} diff --git a/server/src/main/java/com/ticketing/server/movie/service/MovieTimesServiceImpl.java b/server/src/main/java/com/ticketing/server/movie/service/MovieTimesServiceImpl.java deleted file mode 100644 index 0e4e26b..0000000 --- a/server/src/main/java/com/ticketing/server/movie/service/MovieTimesServiceImpl.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.ticketing.server.movie.service; - -import com.ticketing.server.movie.service.interfaces.MovieTimesService; -import org.springframework.stereotype.Service; - -@Service -public class MovieTimesServiceImpl implements MovieTimesService { - -} diff --git a/server/src/main/java/com/ticketing/server/movie/service/dto/MovieDto.java b/server/src/main/java/com/ticketing/server/movie/service/dto/MovieDto.java index 92d1261..d2f620a 100644 --- a/server/src/main/java/com/ticketing/server/movie/service/dto/MovieDto.java +++ b/server/src/main/java/com/ticketing/server/movie/service/dto/MovieDto.java @@ -1,12 +1,12 @@ package com.ticketing.server.movie.service.dto; -import com.fasterxml.jackson.annotation.JsonProperty; import lombok.AllArgsConstructor; +import lombok.Getter; @AllArgsConstructor +@Getter public class MovieDto { - @JsonProperty private String title; } diff --git a/server/src/main/java/com/ticketing/server/movie/service/dto/MovieTimeDto.java b/server/src/main/java/com/ticketing/server/movie/service/dto/MovieTimeDto.java new file mode 100644 index 0000000..d8f00ad --- /dev/null +++ b/server/src/main/java/com/ticketing/server/movie/service/dto/MovieTimeDto.java @@ -0,0 +1,21 @@ +package com.ticketing.server.movie.service.dto; + +import java.time.LocalTime; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public class MovieTimeDto { + + private long movieTimeId; + + private Integer theaterNumber; + + private Integer round; + + private LocalTime startAt; + + private LocalTime endAt; + +} diff --git a/server/src/main/java/com/ticketing/server/movie/service/interfaces/MovieTimeService.java b/server/src/main/java/com/ticketing/server/movie/service/interfaces/MovieTimeService.java new file mode 100644 index 0000000..feea844 --- /dev/null +++ b/server/src/main/java/com/ticketing/server/movie/service/interfaces/MovieTimeService.java @@ -0,0 +1,11 @@ +package com.ticketing.server.movie.service.interfaces; + +import com.ticketing.server.movie.service.dto.MovieTimeDto; +import java.time.LocalDate; +import java.util.List; + +public interface MovieTimeService { + + List getMovieTimes(String title, LocalDate runningDate); + +} diff --git a/server/src/main/java/com/ticketing/server/movie/service/interfaces/MovieTimesService.java b/server/src/main/java/com/ticketing/server/movie/service/interfaces/MovieTimesService.java deleted file mode 100644 index 4a84b00..0000000 --- a/server/src/main/java/com/ticketing/server/movie/service/interfaces/MovieTimesService.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.ticketing.server.movie.service.interfaces; - -public interface MovieTimesService { - -}