From 73cc0241d32a108549c86f1018c8f964524dafdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=90=EC=B0=BD=ED=98=84?= Date: Mon, 11 Jul 2022 16:02:40 +0900 Subject: [PATCH] Feature/add movie (#59) * add: MovieTitleResponse * add: MovieRegisterDTO * add: DUPLICATE MOVIE exception * add: registerMovie() in MovieService * feat: add movie information - STAFF * refactor: variable DTO -> Dto --- .../server/global/exception/ErrorCode.java | 5 +++ .../global/security/WebSecurityConfig.java | 2 +- .../movie/application/MovieController.java | 35 +++++++++++++++---- .../request/MovieRegisterRequest.java | 25 +++++++++++++ .../response/MovieListResponse.java | 6 ++-- .../response/MovieTimeListResponse.java | 6 ++-- .../response/MovieTitleResponse.java | 20 +++++++++++ .../movie/service/MovieServiceImpl.java | 31 +++++++++++----- .../movie/service/MovieTimeServiceImpl.java | 6 ++-- .../dto/{MovieDto.java => MovieDTO.java} | 6 ++-- .../movie/service/dto/MovieRegisterDTO.java | 24 +++++++++++++ .../{MovieTimeDto.java => MovieTimeDTO.java} | 6 ++-- .../service/interfaces/MovieService.java | 7 ++-- .../service/interfaces/MovieTimeService.java | 4 +-- .../movie/service/MovieServiceImplTest.java | 17 +++++---- .../service/MovieTimeServiceImplTest.java | 10 +++--- 16 files changed, 162 insertions(+), 48 deletions(-) create mode 100644 server/src/main/java/com/ticketing/server/movie/application/request/MovieRegisterRequest.java create mode 100644 server/src/main/java/com/ticketing/server/movie/application/response/MovieTitleResponse.java rename server/src/main/java/com/ticketing/server/movie/service/dto/{MovieDto.java => MovieDTO.java} (70%) create mode 100644 server/src/main/java/com/ticketing/server/movie/service/dto/MovieRegisterDTO.java rename server/src/main/java/com/ticketing/server/movie/service/dto/{MovieTimeDto.java => MovieTimeDTO.java} (78%) 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 cea053a..27ec239 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 @@ -25,6 +25,7 @@ public enum ErrorCode { /* 409 CONFLICT : Resource 의 현재 상태와 충돌. 보통 중복된 데이터 존재 */ DUPLICATE_EMAIL(CONFLICT, "이메일이 이미 존재합니다."), + DUPLICATE_MOVIE(CONFLICT, "해당 영화 정보가 이미 존재합니다."), DELETED_EMAIL(CONFLICT, "이미 삭제된 이메일 입니다."); private final HttpStatus httpStatus; @@ -65,6 +66,10 @@ public enum ErrorCode { throw new TicketingException(DUPLICATE_EMAIL); } + public static TicketingException throwDuplicateMovie() { + throw new TicketingException(DUPLICATE_MOVIE); + } + public static TicketingException throwDeletedEmail() { throw new TicketingException(DELETED_EMAIL); } 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 3dd30ae..b42cfa0 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 @@ -53,7 +53,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { .antMatchers(HttpMethod.POST, "/api/auth/token").permitAll() .antMatchers(HttpMethod.POST, "/api/auth/refresh").permitAll() .antMatchers(HttpMethod.POST, "/api/users").permitAll() - .antMatchers("/api/movies/**").permitAll() + .antMatchers(HttpMethod.GET,"/api/movies").permitAll() .antMatchers("/api/movieTimes/**").permitAll() .antMatchers("/l7check").permitAll() .antMatchers("/actuator/**").permitAll() diff --git a/server/src/main/java/com/ticketing/server/movie/application/MovieController.java b/server/src/main/java/com/ticketing/server/movie/application/MovieController.java index 4c344c8..570c890 100644 --- a/server/src/main/java/com/ticketing/server/movie/application/MovieController.java +++ b/server/src/main/java/com/ticketing/server/movie/application/MovieController.java @@ -1,14 +1,20 @@ package com.ticketing.server.movie.application; +import com.ticketing.server.movie.application.request.MovieRegisterRequest; import com.ticketing.server.movie.application.response.MovieListResponse; +import com.ticketing.server.movie.application.response.MovieTitleResponse; import com.ticketing.server.movie.service.interfaces.MovieService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import javax.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.security.access.annotation.Secured; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -19,12 +25,29 @@ import org.springframework.web.bind.annotation.RestController; @Slf4j public class MovieController { - private final MovieService movieService; + private final MovieService movieService; - @GetMapping() - @ApiOperation(value = "영화 목록 조회") - public ResponseEntity getMovies() { - return ResponseEntity.status(HttpStatus.OK).body(MovieListResponse.from(movieService.getMovies())); - } + @PostMapping() + @ApiOperation(value = "영화 정보 등록") + @Secured("ROLE_STAFF") + public ResponseEntity registerMovie(@RequestBody @Valid MovieRegisterRequest request) { + return ResponseEntity.status(HttpStatus.OK) + .body( + MovieTitleResponse.from( + movieService.registerMovie(request.toMovieRegisterDTO()) + ) + ); + } + + @GetMapping() + @ApiOperation(value = "영화 목록 조회") + public ResponseEntity getMovies() { + return ResponseEntity.status(HttpStatus.OK) + .body( + MovieListResponse.from( + movieService.getMovies() + ) + ); + } } diff --git a/server/src/main/java/com/ticketing/server/movie/application/request/MovieRegisterRequest.java b/server/src/main/java/com/ticketing/server/movie/application/request/MovieRegisterRequest.java new file mode 100644 index 0000000..1d2ee4f --- /dev/null +++ b/server/src/main/java/com/ticketing/server/movie/application/request/MovieRegisterRequest.java @@ -0,0 +1,25 @@ +package com.ticketing.server.movie.application.request; + +import com.ticketing.server.movie.service.dto.MovieRegisterDTO; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class MovieRegisterRequest { + + @NotEmpty(message = "{validation.not.empty.title}") + private String title; + + @NotNull(message = "{validation.not.null.runningTime}") + private Long runningTime; + + public MovieRegisterDTO toMovieRegisterDTO() { + return new MovieRegisterDTO(this.title, this.runningTime); + } + +} 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 56d117a..5b3eab1 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,6 @@ package com.ticketing.server.movie.application.response; -import com.ticketing.server.movie.service.dto.MovieDto; +import com.ticketing.server.movie.service.dto.MovieDTO; import io.swagger.annotations.ApiModelProperty; import java.util.List; import lombok.AccessLevel; @@ -12,9 +12,9 @@ import lombok.Getter; public class MovieListResponse { @ApiModelProperty(value = "영화 제목") - private List movieDtos; + private List movieDtos; - public static MovieListResponse from(List movieDtos) { + public static MovieListResponse from(List movieDtos) { return new MovieListResponse(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 index 7793c99..f7b5137 100644 --- 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 @@ -1,6 +1,6 @@ package com.ticketing.server.movie.application.response; -import com.ticketing.server.movie.service.dto.MovieTimeDto; +import com.ticketing.server.movie.service.dto.MovieTimeDTO; import io.swagger.annotations.ApiModelProperty; import java.util.List; import lombok.AccessLevel; @@ -12,9 +12,9 @@ import lombok.Getter; public class MovieTimeListResponse { @ApiModelProperty(value = "영화 시간표 정보") - private List movieTimeDtos; + private List movieTimeDTOS; - public static MovieTimeListResponse from(List movieTimeDtos) { + public static MovieTimeListResponse from(List movieTimeDtos) { return new MovieTimeListResponse(movieTimeDtos); } diff --git a/server/src/main/java/com/ticketing/server/movie/application/response/MovieTitleResponse.java b/server/src/main/java/com/ticketing/server/movie/application/response/MovieTitleResponse.java new file mode 100644 index 0000000..aa056df --- /dev/null +++ b/server/src/main/java/com/ticketing/server/movie/application/response/MovieTitleResponse.java @@ -0,0 +1,20 @@ +package com.ticketing.server.movie.application.response; + +import com.ticketing.server.movie.service.dto.MovieDTO; +import io.swagger.annotations.ApiModelProperty; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class MovieTitleResponse { + + @ApiModelProperty(value = "영화 제목") + private String title; + + public static MovieTitleResponse from(MovieDTO movieDto) { + return new MovieTitleResponse(movieDto.getTitle()); + } + +} diff --git a/server/src/main/java/com/ticketing/server/movie/service/MovieServiceImpl.java b/server/src/main/java/com/ticketing/server/movie/service/MovieServiceImpl.java index 9ec005d..1c142f0 100644 --- a/server/src/main/java/com/ticketing/server/movie/service/MovieServiceImpl.java +++ b/server/src/main/java/com/ticketing/server/movie/service/MovieServiceImpl.java @@ -1,10 +1,13 @@ package com.ticketing.server.movie.service; +import com.ticketing.server.global.exception.ErrorCode; import com.ticketing.server.movie.domain.Movie; import com.ticketing.server.movie.domain.repository.MovieRepository; -import com.ticketing.server.movie.service.dto.MovieDto; +import com.ticketing.server.movie.service.dto.MovieDTO; +import com.ticketing.server.movie.service.dto.MovieRegisterDTO; import com.ticketing.server.movie.service.interfaces.MovieService; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -15,15 +18,27 @@ import org.springframework.stereotype.Service; @Slf4j public class MovieServiceImpl implements MovieService { - private final MovieRepository movieRepository; + private final MovieRepository movieRepository; - public List getMovies() { - List movies = movieRepository.findValidMovies(); + @Override + public MovieDTO registerMovie(MovieRegisterDTO movieRegisterDto) { + Optional movie = movieRepository.findByTitle(movieRegisterDto.getTitle()); - return movies.stream() - .map(MovieDto::from) - .collect(Collectors.toList()); + if(movie.isEmpty()) { + return MovieDTO.from(movieRepository.save(movieRegisterDto.toMovie())); + } - } + throw ErrorCode.throwDuplicateMovie(); + } + + @Override + public List getMovies() { + List movies = movieRepository.findValidMovies(); + + return movies.stream() + .map(MovieDTO::from) + .collect(Collectors.toList()); + + } } 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 index 72d2752..79ea4b0 100644 --- a/server/src/main/java/com/ticketing/server/movie/service/MovieTimeServiceImpl.java +++ b/server/src/main/java/com/ticketing/server/movie/service/MovieTimeServiceImpl.java @@ -5,7 +5,7 @@ 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.dto.MovieTimeDTO; import com.ticketing.server.movie.service.interfaces.MovieTimeService; import java.time.LocalDate; import java.time.LocalDateTime; @@ -25,7 +25,7 @@ public class MovieTimeServiceImpl implements MovieTimeService { private final MovieTimeRepository movieTimeRepository; @Override - public List getMovieTimes(String title, LocalDate runningDate) { + public List getMovieTimes(String title, LocalDate runningDate) { Movie movie = movieRepository.findByTitle(title) .orElseThrow(ErrorCode::throwMovieNotFound); @@ -35,7 +35,7 @@ public class MovieTimeServiceImpl implements MovieTimeService { List movieTimes = movieTimeRepository.findValidMovieTimes(movie, startOfDay, endOfDay); return movieTimes.stream() - .map(MovieTimeDto::from) + .map(MovieTimeDTO::from) .collect(Collectors.toList()); } 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 similarity index 70% rename from server/src/main/java/com/ticketing/server/movie/service/dto/MovieDto.java rename to server/src/main/java/com/ticketing/server/movie/service/dto/MovieDTO.java index cdef848..546a5f4 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 @@ -7,12 +7,12 @@ import lombok.Getter; @Getter @AllArgsConstructor(access = AccessLevel.PRIVATE) -public class MovieDto { +public class MovieDTO { private String title; - public static MovieDto from(Movie movie) { - return new MovieDto(movie.getTitle()); + public static MovieDTO from(Movie movie) { + return new MovieDTO(movie.getTitle()); } } diff --git a/server/src/main/java/com/ticketing/server/movie/service/dto/MovieRegisterDTO.java b/server/src/main/java/com/ticketing/server/movie/service/dto/MovieRegisterDTO.java new file mode 100644 index 0000000..08c8ad2 --- /dev/null +++ b/server/src/main/java/com/ticketing/server/movie/service/dto/MovieRegisterDTO.java @@ -0,0 +1,24 @@ +package com.ticketing.server.movie.service.dto; + +import com.ticketing.server.movie.domain.Movie; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class MovieRegisterDTO { + + @NotEmpty(message = "{validation.not.empty.title}") + private String title; + + @NotNull(message = "{validation.not.null.runningTime}") + private Long runningTime; + + public Movie toMovie() { + return new Movie(this.title, this.runningTime); + } +} 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 similarity index 78% rename from server/src/main/java/com/ticketing/server/movie/service/dto/MovieTimeDto.java rename to server/src/main/java/com/ticketing/server/movie/service/dto/MovieTimeDTO.java index e8832c4..e83b1c2 100644 --- 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 @@ -8,7 +8,7 @@ import lombok.Getter; @Getter @AllArgsConstructor(access = AccessLevel.PRIVATE) -public class MovieTimeDto { +public class MovieTimeDTO { private Long movieTimeId; @@ -20,8 +20,8 @@ public class MovieTimeDto { private LocalDateTime endAt; - public static MovieTimeDto from(MovieTime movieTime) { - return new MovieTimeDto(movieTime.getId(), movieTime.getTheater().getTheaterNumber(), + public static MovieTimeDTO from(MovieTime movieTime) { + return new MovieTimeDTO(movieTime.getId(), movieTime.getTheater().getTheaterNumber(), movieTime.getRound(), movieTime.getStartAt(), movieTime.getEndAt()); } diff --git a/server/src/main/java/com/ticketing/server/movie/service/interfaces/MovieService.java b/server/src/main/java/com/ticketing/server/movie/service/interfaces/MovieService.java index 6294731..cfad36c 100644 --- a/server/src/main/java/com/ticketing/server/movie/service/interfaces/MovieService.java +++ b/server/src/main/java/com/ticketing/server/movie/service/interfaces/MovieService.java @@ -1,10 +1,13 @@ package com.ticketing.server.movie.service.interfaces; -import com.ticketing.server.movie.service.dto.MovieDto; +import com.ticketing.server.movie.service.dto.MovieDTO; +import com.ticketing.server.movie.service.dto.MovieRegisterDTO; import java.util.List; public interface MovieService { - List getMovies(); + MovieDTO registerMovie(MovieRegisterDTO movieRegisterDto); + + List getMovies(); } 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 index feea844..0e5edb7 100644 --- 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 @@ -1,11 +1,11 @@ package com.ticketing.server.movie.service.interfaces; -import com.ticketing.server.movie.service.dto.MovieTimeDto; +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); + List getMovieTimes(String title, LocalDate runningDate); } diff --git a/server/src/test/java/com/ticketing/server/movie/service/MovieServiceImplTest.java b/server/src/test/java/com/ticketing/server/movie/service/MovieServiceImplTest.java index 81158bd..3e0b210 100644 --- a/server/src/test/java/com/ticketing/server/movie/service/MovieServiceImplTest.java +++ b/server/src/test/java/com/ticketing/server/movie/service/MovieServiceImplTest.java @@ -5,11 +5,10 @@ import static org.mockito.Mockito.when; import com.ticketing.server.movie.domain.Movie; import com.ticketing.server.movie.domain.repository.MovieRepository; -import com.ticketing.server.movie.service.dto.MovieDto; +import com.ticketing.server.movie.service.dto.MovieDTO; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -21,9 +20,9 @@ import org.mockito.junit.jupiter.MockitoExtension; public class MovieServiceImplTest { Movie movie; - MovieDto movieDto; + MovieDTO movieDto; List movies = new ArrayList<>(); - List movieDtos = new ArrayList<>(); + List movieDTOS = new ArrayList<>(); @Mock MovieRepository movieRepository; @@ -39,10 +38,10 @@ public class MovieServiceImplTest { .thenReturn(Collections.emptyList()); // when - List movieDtoList = movieService.getMovies(); + List movieDTOList = movieService.getMovies(); // then - assertTrue(movieDtoList.isEmpty()); + assertTrue(movieDTOList.isEmpty()); } @Test @@ -52,16 +51,16 @@ public class MovieServiceImplTest { movie = new Movie("범죄도시2", 106L); movieDto = movieDto.from(movie); movies.add(movie); - movieDtos.add(movieDto); + movieDTOS.add(movieDto); when(movieRepository.findValidMovies()) .thenReturn(movies); // when - List movieDtoList = movieService.getMovies(); + List movieDTOList = movieService.getMovies(); // then - assertTrue(!movieDtoList.isEmpty()); + assertTrue(!movieDTOList.isEmpty()); } } diff --git a/server/src/test/java/com/ticketing/server/movie/service/MovieTimeServiceImplTest.java b/server/src/test/java/com/ticketing/server/movie/service/MovieTimeServiceImplTest.java index c6236e2..b2c269b 100644 --- a/server/src/test/java/com/ticketing/server/movie/service/MovieTimeServiceImplTest.java +++ b/server/src/test/java/com/ticketing/server/movie/service/MovieTimeServiceImplTest.java @@ -9,7 +9,7 @@ import com.ticketing.server.movie.domain.MovieTime; import com.ticketing.server.movie.domain.Theater; 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.dto.MovieTimeDTO; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.ArrayList; @@ -51,10 +51,10 @@ public class MovieTimeServiceImplTest { .thenReturn(Collections.emptyList()); // when - List movieTimeDtoList = movieTimeService.getMovieTimes(title, LocalDate.now()); + List movieTimeDTOList = movieTimeService.getMovieTimes(title, LocalDate.now()); // then - assertTrue(movieTimeDtoList.isEmpty()); + assertTrue(movieTimeDTOList.isEmpty()); } @Test @@ -76,10 +76,10 @@ public class MovieTimeServiceImplTest { .thenReturn(movieTimes); // when - List movieTimeDtoList = movieTimeService.getMovieTimes(title, LocalDate.of(2022, 07, 01)); + List movieTimeDTOList = movieTimeService.getMovieTimes(title, LocalDate.of(2022, 07, 01)); // then - assertTrue(!movieTimeDtoList.isEmpty()); + assertTrue(!movieTimeDTOList.isEmpty()); } }