Compare commits
2 Commits
feature/ad
...
feature/fi
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0e2ba4abae | ||
|
|
4abebf9a8c |
15
README.md
15
README.md
@@ -44,7 +44,7 @@
|
||||
|
||||
``` mermaid
|
||||
erDiagram
|
||||
MOVIE ||--o{ MOVIE_TIME : ""
|
||||
MOVIE ||--o{ MOVIE_TIMES : ""
|
||||
MOVIE {
|
||||
bigint id PK "영화 ID"
|
||||
varchar title "영화제목"
|
||||
@@ -52,7 +52,7 @@ erDiagram
|
||||
datetime created_at "등록일시"
|
||||
datetime updated_at "수정일시"
|
||||
}
|
||||
THEATER ||--o{ MOVIE_TIME : ""
|
||||
THEATER ||--o{ MOVIE_TIMES : ""
|
||||
THEATER ||--|{ SEAT : ""
|
||||
THEATER {
|
||||
bigint id PK "상영관 ID"
|
||||
@@ -70,8 +70,8 @@ erDiagram
|
||||
datetime created_at "등록일시"
|
||||
datetime updated_at "수정일시"
|
||||
}
|
||||
MOVIE_TIME ||--o{ TICKET : ""
|
||||
MOVIE_TIME {
|
||||
MOVIE_TIMES ||--o{ TICKET : ""
|
||||
MOVIE_TIMES {
|
||||
bigint id PK "상영시간표 ID"
|
||||
bigint movie_id FK "영화 ID"
|
||||
bigint theater_id FK "상영관 ID"
|
||||
@@ -84,8 +84,8 @@ erDiagram
|
||||
TICKET {
|
||||
bigint id PK "티켓 ID"
|
||||
bigint seat_id FK "좌석 ID"
|
||||
bigint movie_time_id FK "상영시간표 ID"
|
||||
bigint payment_id "결제 ID"
|
||||
bigint movie_times_id FK "상영시간표 ID"
|
||||
bigint payment_id FK "결제 ID"
|
||||
varchar status "상태 - 구매가능/예약진행중/판매완료"
|
||||
int ticket_price "가격"
|
||||
datetime created_at "등록일시"
|
||||
@@ -94,8 +94,7 @@ erDiagram
|
||||
TICKET }|--|| PAYMENT : ""
|
||||
PAYMENT {
|
||||
bigint id PK "결제 ID"
|
||||
bigint user_id "유저ID"
|
||||
varchar movie_title "영화제목"
|
||||
bigint user_id FK "유저ID"
|
||||
varchar type "결제 타입 - 예) 네이버페이, 카카오페이"
|
||||
varchar status "상태 - 완료/환불/실패"
|
||||
varchar failed_message "실패사유 - 컬럼명을 알아보기 쉬운가?"
|
||||
|
||||
@@ -25,7 +25,6 @@ public enum ErrorCode {
|
||||
|
||||
/* 409 CONFLICT : Resource 의 현재 상태와 충돌. 보통 중복된 데이터 존재 */
|
||||
DUPLICATE_EMAIL(CONFLICT, "이메일이 이미 존재합니다."),
|
||||
DUPLICATE_MOVIE(CONFLICT, "해당 영화 정보가 이미 존재합니다."),
|
||||
DELETED_EMAIL(CONFLICT, "이미 삭제된 이메일 입니다.");
|
||||
|
||||
private final HttpStatus httpStatus;
|
||||
@@ -66,10 +65,6 @@ 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(HttpMethod.GET,"/api/movies").permitAll()
|
||||
.antMatchers("/api/movies/**").permitAll()
|
||||
.antMatchers("/api/movieTimes/**").permitAll()
|
||||
.antMatchers("/l7check").permitAll()
|
||||
.antMatchers("/actuator/**").permitAll()
|
||||
|
||||
@@ -1,20 +1,14 @@
|
||||
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;
|
||||
|
||||
@@ -25,29 +19,12 @@ import org.springframework.web.bind.annotation.RestController;
|
||||
@Slf4j
|
||||
public class MovieController {
|
||||
|
||||
private final MovieService movieService;
|
||||
private final MovieService movieService;
|
||||
|
||||
@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()
|
||||
)
|
||||
);
|
||||
}
|
||||
@GetMapping()
|
||||
@ApiOperation(value = "영화 목록 조회")
|
||||
public ResponseEntity<MovieListResponse> getMovies() {
|
||||
return ResponseEntity.status(HttpStatus.OK).body(MovieListResponse.from(movieService.getMovies()));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,25 +0,0 @@
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
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,13 +1,10 @@
|
||||
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.MovieRegisterDTO;
|
||||
import com.ticketing.server.movie.service.dto.MovieDto;
|
||||
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;
|
||||
@@ -18,27 +15,15 @@ import org.springframework.stereotype.Service;
|
||||
@Slf4j
|
||||
public class MovieServiceImpl implements MovieService {
|
||||
|
||||
private final MovieRepository movieRepository;
|
||||
private final MovieRepository movieRepository;
|
||||
|
||||
@Override
|
||||
public MovieDTO registerMovie(MovieRegisterDTO movieRegisterDto) {
|
||||
Optional<Movie> movie = movieRepository.findByTitle(movieRegisterDto.getTitle());
|
||||
public List<MovieDto> getMovies() {
|
||||
List<Movie> movies = movieRepository.findValidMovies();
|
||||
|
||||
if(movie.isEmpty()) {
|
||||
return MovieDTO.from(movieRepository.save(movieRegisterDto.toMovie()));
|
||||
}
|
||||
return movies.stream()
|
||||
.map(MovieDto::from)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
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());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
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,13 +1,10 @@
|
||||
package com.ticketing.server.movie.service.interfaces;
|
||||
|
||||
import com.ticketing.server.movie.service.dto.MovieDTO;
|
||||
import com.ticketing.server.movie.service.dto.MovieRegisterDTO;
|
||||
import com.ticketing.server.movie.service.dto.MovieDto;
|
||||
import java.util.List;
|
||||
|
||||
public interface MovieService {
|
||||
|
||||
MovieDTO registerMovie(MovieRegisterDTO movieRegisterDto);
|
||||
|
||||
List<MovieDTO> getMovies();
|
||||
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,10 +5,11 @@ 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;
|
||||
@@ -20,9 +21,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;
|
||||
@@ -38,10 +39,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
|
||||
@@ -51,16 +52,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