Compare commits
6 Commits
feature/ge
...
feature/ad
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
30dd038afc | ||
|
|
e47b0a8110 | ||
|
|
0a74de08be | ||
|
|
15443d9d24 | ||
|
|
2dd4121782 | ||
|
|
697de67d56 |
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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<MovieListResponse> getMovies() {
|
||||
return ResponseEntity.status(HttpStatus.OK).body(MovieListResponse.from(movieService.getMovies()));
|
||||
}
|
||||
@PostMapping()
|
||||
@ApiOperation(value = "영화 정보 등록")
|
||||
@Secured("ROLE_STAFF")
|
||||
public ResponseEntity<MovieTitleResponse> registerMovie(@RequestBody @Valid MovieRegisterRequest request) {
|
||||
return ResponseEntity.status(HttpStatus.OK)
|
||||
.body(
|
||||
MovieTitleResponse.from(
|
||||
movieService.registerMovie(request.toMovieRegisterDTO())
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
@GetMapping()
|
||||
@ApiOperation(value = "영화 목록 조회")
|
||||
public ResponseEntity<MovieListResponse> getMovies() {
|
||||
return ResponseEntity.status(HttpStatus.OK)
|
||||
.body(
|
||||
MovieListResponse.from(
|
||||
movieService.getMovies()
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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<MovieDto> movieDtos;
|
||||
private List<MovieDTO> movieDtos;
|
||||
|
||||
public static MovieListResponse from(List<MovieDto> movieDtos) {
|
||||
public static MovieListResponse from(List<MovieDTO> movieDtos) {
|
||||
return new MovieListResponse(movieDtos);
|
||||
}
|
||||
|
||||
|
||||
@@ -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<MovieTimeDto> movieTimeDtos;
|
||||
private List<MovieTimeDTO> movieTimeDTOS;
|
||||
|
||||
public static MovieTimeListResponse from(List<MovieTimeDto> movieTimeDtos) {
|
||||
public static MovieTimeListResponse from(List<MovieTimeDTO> movieTimeDtos) {
|
||||
return new MovieTimeListResponse(movieTimeDtos);
|
||||
}
|
||||
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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<MovieDto> getMovies() {
|
||||
List<Movie> movies = movieRepository.findValidMovies();
|
||||
@Override
|
||||
public MovieDTO registerMovie(MovieRegisterDTO movieRegisterDto) {
|
||||
Optional<Movie> 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<MovieDTO> getMovies() {
|
||||
List<Movie> movies = movieRepository.findValidMovies();
|
||||
|
||||
return movies.stream()
|
||||
.map(MovieDTO::from)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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<MovieTimeDto> getMovieTimes(String title, LocalDate runningDate) {
|
||||
public List<MovieTimeDTO> getMovieTimes(String title, LocalDate runningDate) {
|
||||
Movie movie = movieRepository.findByTitle(title)
|
||||
.orElseThrow(ErrorCode::throwMovieNotFound);
|
||||
|
||||
@@ -35,7 +35,7 @@ public class MovieTimeServiceImpl implements MovieTimeService {
|
||||
List<MovieTime> movieTimes = movieTimeRepository.findValidMovieTimes(movie, startOfDay, endOfDay);
|
||||
|
||||
return movieTimes.stream()
|
||||
.map(MovieTimeDto::from)
|
||||
.map(MovieTimeDTO::from)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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<MovieDto> getMovies();
|
||||
MovieDTO registerMovie(MovieRegisterDTO movieRegisterDto);
|
||||
|
||||
List<MovieDTO> getMovies();
|
||||
|
||||
}
|
||||
|
||||
@@ -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<MovieTimeDto> getMovieTimes(String title, LocalDate runningDate);
|
||||
List<MovieTimeDTO> getMovieTimes(String title, LocalDate runningDate);
|
||||
|
||||
}
|
||||
|
||||
@@ -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<Movie> movies = new ArrayList<>();
|
||||
List<MovieDto> movieDtos = new ArrayList<>();
|
||||
List<MovieDTO> movieDTOS = new ArrayList<>();
|
||||
|
||||
@Mock
|
||||
MovieRepository movieRepository;
|
||||
@@ -39,10 +38,10 @@ public class MovieServiceImplTest {
|
||||
.thenReturn(Collections.emptyList());
|
||||
|
||||
// when
|
||||
List<MovieDto> movieDtoList = movieService.getMovies();
|
||||
List<MovieDTO> 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<MovieDto> movieDtoList = movieService.getMovies();
|
||||
List<MovieDTO> movieDTOList = movieService.getMovies();
|
||||
|
||||
// then
|
||||
assertTrue(!movieDtoList.isEmpty());
|
||||
assertTrue(!movieDTOList.isEmpty());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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<MovieTimeDto> movieTimeDtoList = movieTimeService.getMovieTimes(title, LocalDate.now());
|
||||
List<MovieTimeDTO> 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<MovieTimeDto> movieTimeDtoList = movieTimeService.getMovieTimes(title, LocalDate.of(2022, 07, 01));
|
||||
List<MovieTimeDTO> movieTimeDTOList = movieTimeService.getMovieTimes(title, LocalDate.of(2022, 07, 01));
|
||||
|
||||
// then
|
||||
assertTrue(!movieTimeDtoList.isEmpty());
|
||||
assertTrue(!movieTimeDTOList.isEmpty());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user