diff --git a/server/src/intTest/java/com/ticketing/server/movie/domain/repository/MovieRepositoryTest.java b/server/src/intTest/java/com/ticketing/server/movie/domain/repository/MovieRepositoryTest.java index ac022fa..b602966 100644 --- a/server/src/intTest/java/com/ticketing/server/movie/domain/repository/MovieRepositoryTest.java +++ b/server/src/intTest/java/com/ticketing/server/movie/domain/repository/MovieRepositoryTest.java @@ -30,7 +30,7 @@ public class MovieRepositoryTest { @DisplayName("Movie Repository Test - saving movie") void shouldAbleToSaveMovie() { // given - Movie movie = new Movie("범죄도시 2", 106); + Movie movie = new Movie("범죄도시 2", 106L); // when Movie savedMovie = movieRepository.save(movie); diff --git a/server/src/intTest/java/com/ticketing/server/movie/domain/repository/TheaterRepositoryTest.java b/server/src/intTest/java/com/ticketing/server/movie/domain/repository/TheaterRepositoryTest.java index 38420d2..5ab0226 100644 --- a/server/src/intTest/java/com/ticketing/server/movie/domain/repository/TheaterRepositoryTest.java +++ b/server/src/intTest/java/com/ticketing/server/movie/domain/repository/TheaterRepositoryTest.java @@ -20,7 +20,7 @@ public class TheaterRepositoryTest { @DisplayName("Theater Repository Test - saving theater") void ShouldAbleToSaveTheater() { // given - Theater theater = new Theater(1, 100); + Theater theater = new Theater(1); // when Theater savedTheater = theaterRepository.save(theater); diff --git a/server/src/main/java/com/ticketing/server/movie/domain/Movie.java b/server/src/main/java/com/ticketing/server/movie/domain/Movie.java index b82b592..e4779db 100644 --- a/server/src/main/java/com/ticketing/server/movie/domain/Movie.java +++ b/server/src/main/java/com/ticketing/server/movie/domain/Movie.java @@ -1,7 +1,6 @@ package com.ticketing.server.movie.domain; import com.ticketing.server.global.dto.repository.AbstractEntity; -import com.ticketing.server.movie.service.dto.MovieDto; import javax.persistence.Column; import javax.persistence.Entity; import javax.validation.constraints.NotNull; @@ -15,11 +14,11 @@ import lombok.NoArgsConstructor; @AllArgsConstructor public class Movie extends AbstractEntity { - @NotNull - @Column(unique = true) - private String title; + @NotNull + @Column(unique = true) + private String title; - @NotNull - private Integer runningTime; + @NotNull + private Long runningTime; } 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 55ee161..866a801 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,20 +1,21 @@ 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.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; import javax.validation.constraints.NotNull; -import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @Entity @Getter @NoArgsConstructor -@AllArgsConstructor public class MovieTime extends AbstractEntity { @NotNull @@ -36,4 +37,26 @@ public class MovieTime extends AbstractEntity { @NotNull private LocalDateTime endAt; + @OneToMany(mappedBy = "movieTime", cascade = CascadeType.ALL) + private List 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 getSeats() { + return this.theater.getSeats(); + } + } diff --git a/server/src/main/java/com/ticketing/server/movie/domain/Seat.java b/server/src/main/java/com/ticketing/server/movie/domain/Seat.java index ca08810..340b082 100644 --- a/server/src/main/java/com/ticketing/server/movie/domain/Seat.java +++ b/server/src/main/java/com/ticketing/server/movie/domain/Seat.java @@ -6,9 +6,11 @@ import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.validation.constraints.NotNull; import lombok.Getter; +import lombok.NoArgsConstructor; @Entity @Getter +@NoArgsConstructor public class Seat extends AbstractEntity { @NotNull @@ -22,4 +24,14 @@ public class Seat extends AbstractEntity { @NotNull 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); + } } diff --git a/server/src/main/java/com/ticketing/server/movie/domain/Theater.java b/server/src/main/java/com/ticketing/server/movie/domain/Theater.java index 9f8a736..1baf364 100644 --- a/server/src/main/java/com/ticketing/server/movie/domain/Theater.java +++ b/server/src/main/java/com/ticketing/server/movie/domain/Theater.java @@ -1,21 +1,32 @@ package com.ticketing.server.movie.domain; 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.OneToMany; import javax.validation.constraints.NotNull; -import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @Entity @Getter @NoArgsConstructor -@AllArgsConstructor public class Theater extends AbstractEntity { @NotNull private Integer theaterNumber; - private Integer seatCount; + @OneToMany(mappedBy = "theater", cascade = CascadeType.ALL) + private List seats = new ArrayList<>(); + + public Theater(Integer theaterNumber) { + this.theaterNumber = theaterNumber; + } + + public void addSeat(Seat seat) { + seats.add(seat); + } } diff --git a/server/src/main/java/com/ticketing/server/movie/domain/Ticket.java b/server/src/main/java/com/ticketing/server/movie/domain/Ticket.java index 23ecadc..957af7f 100644 --- a/server/src/main/java/com/ticketing/server/movie/domain/Ticket.java +++ b/server/src/main/java/com/ticketing/server/movie/domain/Ticket.java @@ -3,13 +3,17 @@ package com.ticketing.server.movie.domain; import com.ticketing.server.global.dto.repository.AbstractEntity; import com.ticketing.server.payment.domain.Payment; import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.validation.constraints.NotNull; import lombok.Getter; +import lombok.NoArgsConstructor; @Entity @Getter +@NoArgsConstructor public class Ticket extends AbstractEntity { @NotNull @@ -27,9 +31,21 @@ public class Ticket extends AbstractEntity { private Payment payment; @NotNull + @Enumerated(EnumType.STRING) private TicketStatus status; @NotNull 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); + } + } diff --git a/server/src/main/java/com/ticketing/server/movie/domain/TicketStatus.java b/server/src/main/java/com/ticketing/server/movie/domain/TicketStatus.java index 57996c8..c4dd331 100644 --- a/server/src/main/java/com/ticketing/server/movie/domain/TicketStatus.java +++ b/server/src/main/java/com/ticketing/server/movie/domain/TicketStatus.java @@ -6,10 +6,11 @@ import lombok.Getter; @Getter @AllArgsConstructor public enum TicketStatus { - SALE("판매가능"), - SCHEDULED("환불"), - SOLD("판매완료"); - private String name; + SALE("판매가능"), + SCHEDULED("환불"), + SOLD("판매완료"); + + private String name; } diff --git a/server/src/main/java/com/ticketing/server/movie/setup/MovieSetupController.java b/server/src/main/java/com/ticketing/server/movie/setup/MovieSetupController.java new file mode 100644 index 0000000..af50bb3 --- /dev/null +++ b/server/src/main/java/com/ticketing/server/movie/setup/MovieSetupController.java @@ -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(); + } + +} diff --git a/server/src/main/java/com/ticketing/server/movie/setup/MovieSetupService.java b/server/src/main/java/com/ticketing/server/movie/setup/MovieSetupService.java new file mode 100644 index 0000000..5d75567 --- /dev/null +++ b/server/src/main/java/com/ticketing/server/movie/setup/MovieSetupService.java @@ -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 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 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 movies = movieRepository.findAll(); + List theaters = theaterRepository.findAll(); + + LocalDateTime now = LocalDateTime.now(); + + List 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 movieTimes = movieTimeRepository.findAll(); + + List 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); + } + +} diff --git a/server/src/main/resources/application-local.yml b/server/src/main/resources/application-local.yml index 801a1de..a506772 100644 --- a/server/src/main/resources/application-local.yml +++ b/server/src/main/resources/application-local.yml @@ -11,4 +11,4 @@ spring: show_sql: true format_sql: true hibernate: - ddl-auto: update + ddl-auto: create diff --git a/server/src/test/java/com/ticketing/server/movie/domain/MovieTimeTest.java b/server/src/test/java/com/ticketing/server/movie/domain/MovieTimeTest.java new file mode 100644 index 0000000..bd451cb --- /dev/null +++ b/server/src/test/java/com/ticketing/server/movie/domain/MovieTimeTest.java @@ -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)); + } + +} 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 4f500f6..81158bd 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 @@ -49,7 +49,7 @@ public class MovieServiceImplTest { @DisplayName("Movie Service Test - get movies") void shouldAbleToGetMovies() { // given - movie = new Movie("범죄도시2", 106); + movie = new Movie("범죄도시2", 106L); movieDto = movieDto.from(movie); movies.add(movie); movieDtos.add(movieDto); 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 b5ee570..c6236e2 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 @@ -42,7 +42,7 @@ public class MovieTimeServiceImplTest { @DisplayName("MovieTime Service Test - get empty list when there is no valid movie times") void shouldGetEmptyList() { // given - Movie movie = new Movie(title, 106); + Movie movie = new Movie(title, 106L); when(movieRepository.findByTitle(title)) .thenReturn(Optional.of(movie)); @@ -61,11 +61,10 @@ public class MovieTimeServiceImplTest { @DisplayName("MovieTime Service Test - get list when there is valid movie times") void shouldGetMovieTimeList() { // given - Movie movie = new Movie(title, 106); - Theater theater = new Theater(1, 100); - MovieTime movieTime = new MovieTime(movie, theater, 1, - LocalDateTime.of(2022, 7, 1, 17, 0, 0), - LocalDateTime.of(2022, 7, 1, 18, 56, 0) + Movie movie = new Movie(title, 106L); + Theater theater = new Theater(1); + MovieTime movieTime = MovieTime.of(movie, theater, 1, + LocalDateTime.of(2022, 7, 1, 17, 0, 0) ); movieTimes.add(movieTime);