Compare commits
1 Commits
develop
...
feature/ge
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fd14666c8b |
@@ -30,7 +30,7 @@ public class MovieRepositoryTest {
|
|||||||
@DisplayName("Movie Repository Test - saving movie")
|
@DisplayName("Movie Repository Test - saving movie")
|
||||||
void shouldAbleToSaveMovie() {
|
void shouldAbleToSaveMovie() {
|
||||||
// given
|
// given
|
||||||
Movie movie = new Movie("범죄도시 2", 106);
|
Movie movie = new Movie("범죄도시 2", 106L);
|
||||||
|
|
||||||
// when
|
// when
|
||||||
Movie savedMovie = movieRepository.save(movie);
|
Movie savedMovie = movieRepository.save(movie);
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ public class TheaterRepositoryTest {
|
|||||||
@DisplayName("Theater Repository Test - saving theater")
|
@DisplayName("Theater Repository Test - saving theater")
|
||||||
void ShouldAbleToSaveTheater() {
|
void ShouldAbleToSaveTheater() {
|
||||||
// given
|
// given
|
||||||
Theater theater = new Theater(1, 100);
|
Theater theater = new Theater(1);
|
||||||
|
|
||||||
// when
|
// when
|
||||||
Theater savedTheater = theaterRepository.save(theater);
|
Theater savedTheater = theaterRepository.save(theater);
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package com.ticketing.server.movie.domain;
|
package com.ticketing.server.movie.domain;
|
||||||
|
|
||||||
import com.ticketing.server.global.dto.repository.AbstractEntity;
|
import com.ticketing.server.global.dto.repository.AbstractEntity;
|
||||||
import com.ticketing.server.movie.service.dto.MovieDto;
|
|
||||||
import javax.persistence.Column;
|
import javax.persistence.Column;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.validation.constraints.NotNull;
|
import javax.validation.constraints.NotNull;
|
||||||
@@ -15,11 +14,11 @@ import lombok.NoArgsConstructor;
|
|||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public class Movie extends AbstractEntity {
|
public class Movie extends AbstractEntity {
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Column(unique = true)
|
@Column(unique = true)
|
||||||
private String title;
|
private String title;
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private Integer runningTime;
|
private Long runningTime;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,20 +1,21 @@
|
|||||||
package com.ticketing.server.movie.domain;
|
package com.ticketing.server.movie.domain;
|
||||||
|
|
||||||
import com.ticketing.server.global.dto.repository.AbstractEntity;
|
import com.ticketing.server.global.dto.repository.AbstractEntity;
|
||||||
import com.ticketing.server.movie.service.dto.MovieTimeDto;
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import javax.persistence.CascadeType;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.JoinColumn;
|
import javax.persistence.JoinColumn;
|
||||||
import javax.persistence.ManyToOne;
|
import javax.persistence.ManyToOne;
|
||||||
|
import javax.persistence.OneToMany;
|
||||||
import javax.validation.constraints.NotNull;
|
import javax.validation.constraints.NotNull;
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
@Getter
|
@Getter
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@AllArgsConstructor
|
|
||||||
public class MovieTime extends AbstractEntity {
|
public class MovieTime extends AbstractEntity {
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -36,4 +37,26 @@ public class MovieTime extends AbstractEntity {
|
|||||||
@NotNull
|
@NotNull
|
||||||
private LocalDateTime endAt;
|
private LocalDateTime endAt;
|
||||||
|
|
||||||
|
@OneToMany(mappedBy = "movieTime", cascade = CascadeType.ALL)
|
||||||
|
private List<Ticket> tickets = new ArrayList<>();
|
||||||
|
|
||||||
|
private MovieTime(Movie movie, Theater theater, int round, LocalDateTime startAt, LocalDateTime endAt) {
|
||||||
|
this.movie = movie;
|
||||||
|
this.theater = theater;
|
||||||
|
this.round = round;
|
||||||
|
this.startAt = startAt;
|
||||||
|
this.endAt = endAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static MovieTime of(Movie movie, Theater theater, int round, LocalDateTime startAt) {
|
||||||
|
Long runningTime = movie.getRunningTime();
|
||||||
|
LocalDateTime endAt = startAt.plusMinutes(runningTime);
|
||||||
|
|
||||||
|
return new MovieTime(movie, theater, round, startAt, endAt);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Seat> getSeats() {
|
||||||
|
return this.theater.getSeats();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,9 +6,11 @@ import javax.persistence.JoinColumn;
|
|||||||
import javax.persistence.ManyToOne;
|
import javax.persistence.ManyToOne;
|
||||||
import javax.validation.constraints.NotNull;
|
import javax.validation.constraints.NotNull;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
@Getter
|
@Getter
|
||||||
|
@NoArgsConstructor
|
||||||
public class Seat extends AbstractEntity {
|
public class Seat extends AbstractEntity {
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -22,4 +24,14 @@ public class Seat extends AbstractEntity {
|
|||||||
@NotNull
|
@NotNull
|
||||||
private Integer seatRow;
|
private Integer seatRow;
|
||||||
|
|
||||||
|
public Seat(Integer seatColumn, Integer seatRow, Theater theater) {
|
||||||
|
this.seatColumn = seatColumn;
|
||||||
|
this.seatRow = seatRow;
|
||||||
|
setTheater(theater);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setTheater(Theater theater) {
|
||||||
|
this.theater = theater;
|
||||||
|
theater.addSeat(this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,21 +1,32 @@
|
|||||||
package com.ticketing.server.movie.domain;
|
package com.ticketing.server.movie.domain;
|
||||||
|
|
||||||
import com.ticketing.server.global.dto.repository.AbstractEntity;
|
import com.ticketing.server.global.dto.repository.AbstractEntity;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import javax.persistence.CascadeType;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.OneToMany;
|
||||||
import javax.validation.constraints.NotNull;
|
import javax.validation.constraints.NotNull;
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
@Getter
|
@Getter
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@AllArgsConstructor
|
|
||||||
public class Theater extends AbstractEntity {
|
public class Theater extends AbstractEntity {
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private Integer theaterNumber;
|
private Integer theaterNumber;
|
||||||
|
|
||||||
private Integer seatCount;
|
@OneToMany(mappedBy = "theater", cascade = CascadeType.ALL)
|
||||||
|
private List<Seat> seats = new ArrayList<>();
|
||||||
|
|
||||||
|
public Theater(Integer theaterNumber) {
|
||||||
|
this.theaterNumber = theaterNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addSeat(Seat seat) {
|
||||||
|
seats.add(seat);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,13 +3,17 @@ package com.ticketing.server.movie.domain;
|
|||||||
import com.ticketing.server.global.dto.repository.AbstractEntity;
|
import com.ticketing.server.global.dto.repository.AbstractEntity;
|
||||||
import com.ticketing.server.payment.domain.Payment;
|
import com.ticketing.server.payment.domain.Payment;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.EnumType;
|
||||||
|
import javax.persistence.Enumerated;
|
||||||
import javax.persistence.JoinColumn;
|
import javax.persistence.JoinColumn;
|
||||||
import javax.persistence.ManyToOne;
|
import javax.persistence.ManyToOne;
|
||||||
import javax.validation.constraints.NotNull;
|
import javax.validation.constraints.NotNull;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
@Getter
|
@Getter
|
||||||
|
@NoArgsConstructor
|
||||||
public class Ticket extends AbstractEntity {
|
public class Ticket extends AbstractEntity {
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -27,9 +31,21 @@ public class Ticket extends AbstractEntity {
|
|||||||
private Payment payment;
|
private Payment payment;
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
@Enumerated(EnumType.STRING)
|
||||||
private TicketStatus status;
|
private TicketStatus status;
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private Integer ticketPrice;
|
private Integer ticketPrice;
|
||||||
|
|
||||||
|
private Ticket(Seat seat, MovieTime movieTime, Integer ticketPrice) {
|
||||||
|
this.seat = seat;
|
||||||
|
this.movieTime = movieTime;
|
||||||
|
this.ticketPrice = ticketPrice;
|
||||||
|
this.status = TicketStatus.SALE;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Ticket of(Seat seat, MovieTime movieTime, Integer ticketPrice) {
|
||||||
|
return new Ticket(seat, movieTime, ticketPrice);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,10 +6,11 @@ import lombok.Getter;
|
|||||||
@Getter
|
@Getter
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public enum TicketStatus {
|
public enum TicketStatus {
|
||||||
SALE("판매가능"),
|
|
||||||
SCHEDULED("환불"),
|
|
||||||
SOLD("판매완료");
|
|
||||||
|
|
||||||
private String name;
|
SALE("판매가능"),
|
||||||
|
SCHEDULED("환불"),
|
||||||
|
SOLD("판매완료");
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
package com.ticketing.server.movie.setup;
|
||||||
|
|
||||||
|
import javax.annotation.PostConstruct;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.context.annotation.Profile;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
@Profile(value = {"local"})
|
||||||
|
@RestController
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class MovieSetupController {
|
||||||
|
|
||||||
|
private final MovieSetupService movieSetupService;
|
||||||
|
|
||||||
|
@PostConstruct
|
||||||
|
public void setup() {
|
||||||
|
movieSetupService.init();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
package com.ticketing.server.movie.setup;
|
||||||
|
|
||||||
|
import com.ticketing.server.movie.domain.Movie;
|
||||||
|
import com.ticketing.server.movie.domain.MovieTime;
|
||||||
|
import com.ticketing.server.movie.domain.Seat;
|
||||||
|
import com.ticketing.server.movie.domain.Theater;
|
||||||
|
import com.ticketing.server.movie.domain.Ticket;
|
||||||
|
import com.ticketing.server.movie.domain.repository.MovieRepository;
|
||||||
|
import com.ticketing.server.movie.domain.repository.MovieTimeRepository;
|
||||||
|
import com.ticketing.server.movie.domain.repository.TheaterRepository;
|
||||||
|
import com.ticketing.server.movie.domain.repository.TicketRepository;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class MovieSetupService {
|
||||||
|
|
||||||
|
private final MovieRepository movieRepository;
|
||||||
|
private final MovieTimeRepository movieTimeRepository;
|
||||||
|
private final TheaterRepository theaterRepository;
|
||||||
|
private final TicketRepository ticketRepository;
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
public void init() {
|
||||||
|
initMovie();
|
||||||
|
initTheater();
|
||||||
|
initMovieTime();
|
||||||
|
initTicket();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initMovie() {
|
||||||
|
List<Movie> movies = Arrays.asList(
|
||||||
|
new Movie("탑건: 매버릭", 130L),
|
||||||
|
new Movie("헤어질 결심", 138L),
|
||||||
|
new Movie("마녀2", 137L),
|
||||||
|
new Movie("범죄도시2", 106L),
|
||||||
|
new Movie("버즈 라이트이어", 105L)
|
||||||
|
);
|
||||||
|
|
||||||
|
movieRepository.saveAll(movies);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initTheater() {
|
||||||
|
List<Theater> theaters = Arrays.asList(
|
||||||
|
new Theater(1),
|
||||||
|
new Theater(2)
|
||||||
|
);
|
||||||
|
|
||||||
|
for (Theater theater : theaters) {
|
||||||
|
for (int i = 1; i <= 2; i++) {
|
||||||
|
for (int j = 1; j <= 10; j++) {
|
||||||
|
new Seat(i, j, theater);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
theaterRepository.saveAll(theaters);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initMovieTime() {
|
||||||
|
List<Movie> movies = movieRepository.findAll();
|
||||||
|
List<Theater> theaters = theaterRepository.findAll();
|
||||||
|
|
||||||
|
LocalDateTime now = LocalDateTime.now();
|
||||||
|
|
||||||
|
List<MovieTime> movieTimes = new ArrayList<>();
|
||||||
|
for (Theater theater : theaters) {
|
||||||
|
movieTimes.add(MovieTime.of(movies.get(0), theater, 1, LocalDateTime.of(now.getYear(), now.getMonthValue(), now.getDayOfMonth(), 8, 0)));
|
||||||
|
movieTimes.add(MovieTime.of(movies.get(0), theater, 3, LocalDateTime.of(now.getYear(), now.getMonthValue(), now.getDayOfMonth(), 12, 0)));
|
||||||
|
movieTimes.add(MovieTime.of(movies.get(1), theater, 2, LocalDateTime.of(now.getYear(), now.getMonthValue(), now.getDayOfMonth(), 10, 0)));
|
||||||
|
movieTimes.add(MovieTime.of(movies.get(2), theater, 4, LocalDateTime.of(now.getYear(), now.getMonthValue(), now.getDayOfMonth(), 14, 0)));
|
||||||
|
movieTimes.add(MovieTime.of(movies.get(0), theater, 5, LocalDateTime.of(now.getYear(), now.getMonthValue(), now.getDayOfMonth(), 16, 0)));
|
||||||
|
movieTimes.add(MovieTime.of(movies.get(3), theater, 6, LocalDateTime.of(now.getYear(), now.getMonthValue(), now.getDayOfMonth(), 18, 0)));
|
||||||
|
movieTimes.add(MovieTime.of(movies.get(0), theater, 7, LocalDateTime.of(now.getYear(), now.getMonthValue(), now.getDayOfMonth(), 21, 0)));
|
||||||
|
movieTimes.add(MovieTime.of(movies.get(4), theater, 8, LocalDateTime.of(now.getYear(), now.getMonthValue(), now.getDayOfMonth(), 23, 0)));
|
||||||
|
}
|
||||||
|
|
||||||
|
movieTimeRepository.saveAll(movieTimes);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initTicket() {
|
||||||
|
List<MovieTime> movieTimes = movieTimeRepository.findAll();
|
||||||
|
|
||||||
|
List<Ticket> tickets = new ArrayList<>();
|
||||||
|
Integer ticketPrice = 15_000;
|
||||||
|
for (MovieTime movieTime : movieTimes) {
|
||||||
|
for (Seat seat : movieTime.getSeats()) {
|
||||||
|
tickets.add(Ticket.of(seat, movieTime, ticketPrice));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ticketRepository.saveAll(tickets);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -11,4 +11,4 @@ spring:
|
|||||||
show_sql: true
|
show_sql: true
|
||||||
format_sql: true
|
format_sql: true
|
||||||
hibernate:
|
hibernate:
|
||||||
ddl-auto: update
|
ddl-auto: create
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
package com.ticketing.server.movie.domain;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import org.junit.jupiter.api.DisplayName;
|
||||||
|
import org.junit.jupiter.params.ParameterizedTest;
|
||||||
|
import org.junit.jupiter.params.provider.ValueSource;
|
||||||
|
|
||||||
|
class MovieTimeTest {
|
||||||
|
|
||||||
|
@ParameterizedTest
|
||||||
|
@DisplayName("영화상영시간 생성")
|
||||||
|
@ValueSource(longs = {130L, 140L, 30L})
|
||||||
|
void createMovieTime(Long runningTime) {
|
||||||
|
// given
|
||||||
|
Movie movie = new Movie("범죄도시2", runningTime);
|
||||||
|
Theater theater = new Theater(1);
|
||||||
|
LocalDateTime startAt = LocalDateTime.of(2022, 7, 4, 8, 10);
|
||||||
|
|
||||||
|
// when
|
||||||
|
MovieTime movieTime = MovieTime.of(movie, theater, 1, startAt);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assertThat(movieTime.getEndAt()).isEqualTo(startAt.plusMinutes(runningTime));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -49,7 +49,7 @@ public class MovieServiceImplTest {
|
|||||||
@DisplayName("Movie Service Test - get movies")
|
@DisplayName("Movie Service Test - get movies")
|
||||||
void shouldAbleToGetMovies() {
|
void shouldAbleToGetMovies() {
|
||||||
// given
|
// given
|
||||||
movie = new Movie("범죄도시2", 106);
|
movie = new Movie("범죄도시2", 106L);
|
||||||
movieDto = movieDto.from(movie);
|
movieDto = movieDto.from(movie);
|
||||||
movies.add(movie);
|
movies.add(movie);
|
||||||
movieDtos.add(movieDto);
|
movieDtos.add(movieDto);
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ public class MovieTimeServiceImplTest {
|
|||||||
@DisplayName("MovieTime Service Test - get empty list when there is no valid movie times")
|
@DisplayName("MovieTime Service Test - get empty list when there is no valid movie times")
|
||||||
void shouldGetEmptyList() {
|
void shouldGetEmptyList() {
|
||||||
// given
|
// given
|
||||||
Movie movie = new Movie(title, 106);
|
Movie movie = new Movie(title, 106L);
|
||||||
|
|
||||||
when(movieRepository.findByTitle(title))
|
when(movieRepository.findByTitle(title))
|
||||||
.thenReturn(Optional.of(movie));
|
.thenReturn(Optional.of(movie));
|
||||||
@@ -61,11 +61,10 @@ public class MovieTimeServiceImplTest {
|
|||||||
@DisplayName("MovieTime Service Test - get list when there is valid movie times")
|
@DisplayName("MovieTime Service Test - get list when there is valid movie times")
|
||||||
void shouldGetMovieTimeList() {
|
void shouldGetMovieTimeList() {
|
||||||
// given
|
// given
|
||||||
Movie movie = new Movie(title, 106);
|
Movie movie = new Movie(title, 106L);
|
||||||
Theater theater = new Theater(1, 100);
|
Theater theater = new Theater(1);
|
||||||
MovieTime movieTime = new MovieTime(movie, theater, 1,
|
MovieTime movieTime = MovieTime.of(movie, theater, 1,
|
||||||
LocalDateTime.of(2022, 7, 1, 17, 0, 0),
|
LocalDateTime.of(2022, 7, 1, 17, 0, 0)
|
||||||
LocalDateTime.of(2022, 7, 1, 18, 56, 0)
|
|
||||||
);
|
);
|
||||||
|
|
||||||
movieTimes.add(movieTime);
|
movieTimes.add(movieTime);
|
||||||
|
|||||||
Reference in New Issue
Block a user