Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feature] 잔여 좌석 조회 API 구현 #89

Closed
wants to merge 6 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package com.picketing.www.business.domain.reservation;

import java.util.ArrayList;
import java.util.List;

import org.springframework.data.annotation.Id;

import com.picketing.www.business.domain.User;
import com.picketing.www.business.domain.show.Show;
import com.picketing.www.persistence.table.BaseEntity;

import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Entity
@Table(name = "RESERVATION")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@Builder(access = AccessLevel.PROTECTED)
@Getter(AccessLevel.PROTECTED)
public class Reservation extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "show_id")
private Show show;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;

@OneToMany(mappedBy = "reservation")
private List<ReservedSeat> reservedSeatList = new ArrayList<>();
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.picketing.www.business.domain.show.seat;
package com.picketing.www.business.domain.reservation;

import com.picketing.www.business.domain.show.Show;
import com.picketing.www.persistence.table.BaseEntity;

import jakarta.persistence.Entity;
Expand All @@ -18,20 +17,19 @@
import lombok.NoArgsConstructor;

@Entity
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@Builder(access = AccessLevel.PROTECTED)
@Table(name = "SEAT")
@Getter
public class Seat extends BaseEntity {
@Table(name = "RESERVED_SEAT")
@Getter(AccessLevel.PROTECTED)
public class ReservedSeat extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "SHOW_ID")
private Show show;
@JoinColumn(name = "reservation_id")
private Reservation reservation;

// TODO 23.09.13: Time schedule id mapping. @ManyToOne
private Long timeScheduleId;
// private TimeScheduleSeatGrade timeScheduleSeatGrade;
}
Original file line number Diff line number Diff line change
@@ -1,21 +1,41 @@
package com.picketing.www.business.domain.schedule;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

import com.picketing.www.persistence.table.BaseEntity;

import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import lombok.NoArgsConstructor;

@Entity
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Builder(access = AccessLevel.PROTECTED)
@Table(name = "DATE_SCHEDULE")
public class DateSchedule extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private LocalDate showDate; // 공연 일자

@Builder
public class DateSchedule {
@Getter
final Long id;
final Long showId;
final String name;
final LocalDate startDate;
final LocalDate endDate;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "schedule_id")
private Schedule showSchedule;

@Setter
List<TimeSchedule> timeSchedules;
@OneToMany(mappedBy = "dateSchedule")
private List<TimeSchedule> timeSchedules = new ArrayList<>();
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,45 @@
package com.picketing.www.business.domain.schedule;

import java.util.ArrayList;
import java.util.List;

import com.picketing.www.business.domain.show.Show;
import com.picketing.www.business.domain.show.seat.TheaterSeatGrade;
import com.picketing.www.persistence.table.BaseEntity;

import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.NoArgsConstructor;

@Builder
@Entity
@Table(name = "SCHEDULE")
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Schedule extends BaseEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "show_id")
private Show show;

public class Schedule {
List<DateSchedule> dateSchedules;
// 특정 공연장에 대한 좌석 가격 목록 (공연장이 하나이므로 항상 똑같은 목록을 가진다)
@OneToMany(mappedBy = "theaterSchedule")
private List<TheaterSeatGrade> theaterSeatGrades = new ArrayList<>(); // 공연장 (단 하나만 존재한다고 가정) + 좌석 정보

@Builder
public Schedule(List<DateSchedule> dateSchedules) {
this.dateSchedules = dateSchedules;
}
@OneToMany(mappedBy = "showSchedule")
private List<DateSchedule> dateSchedules = new ArrayList<>(); // 날짜 스케줄
}
Original file line number Diff line number Diff line change
@@ -1,22 +1,42 @@
package com.picketing.www.business.domain.schedule;

import java.time.LocalTime;
import java.util.ArrayList;
import java.util.List;

import com.picketing.www.persistence.table.BaseEntity;

import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.NoArgsConstructor;

@Entity
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Builder(access = AccessLevel.PROTECTED)
@Table(name = "TIME_SCHEDULE")
public class TimeSchedule extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "date_schedule_id")
private DateSchedule dateSchedule;

private LocalTime startTime;

@OneToMany(mappedBy = "timeSchedule")
private List<TimeScheduleSeatGrade> timeScheduleSeatGradeList = new ArrayList<>();

public class TimeSchedule {
final Long id;
final Long dateScheduleId;
final String name;
final LocalTime startTime;
final LocalTime endTime;

@Builder
public TimeSchedule(Long id, Long dateScheduleId, String name, LocalTime startTime, LocalTime endTime) {
this.id = id;
this.dateScheduleId = dateScheduleId;
this.name = name;
this.startTime = startTime;
this.endTime = endTime;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.picketing.www.business.domain.schedule;

import com.picketing.www.business.domain.show.seat.SeatGrade;
import com.picketing.www.persistence.table.BaseEntity;

import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

@Entity
@Table(name = "TIME_SCHEDULE_SEAT_GRADE")
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class TimeScheduleSeatGrade extends BaseEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "time_schedule_id")
private TimeSchedule timeSchedule;

@Enumerated(EnumType.STRING)
private SeatGrade seatGrade; // 현재 좌석 등급 및 가격이 모두 고정이므로, 같은 SeatGrade Enum 객체를 사용
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
package com.picketing.www.business.domain.show;

import java.time.LocalDate;
import java.util.List;

import com.picketing.www.business.domain.show.seat.Seat;
import com.picketing.www.business.type.AgeGroup;
import com.picketing.www.business.type.Genre;
import com.picketing.www.business.type.SubGenre;
Expand All @@ -15,7 +13,6 @@
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
Expand Down Expand Up @@ -54,7 +51,4 @@ public class Show extends BaseEntity {
private String details;
private boolean isBookable;
private Long ownerId;

@OneToMany(mappedBy = "show")
private List<Seat> seatList;
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
package com.picketing.www.business.domain.show.seat;

import org.springframework.stereotype.Component;

import com.picketing.www.presentation.dto.request.seat.SaveSeatRequest;

@Component
public class SeatFactory {

public Seat createSeat(SaveSeatRequest saveSeatRequest) {
return Seat.builder()
.show(saveSeatRequest.show())
.timeScheduleId(saveSeatRequest.timeScheduleId())
.build();
}
}
// package com.picketing.www.business.domain.show.seat;
//
// import org.springframework.stereotype.Component;
//
// import com.picketing.www.presentation.dto.request.seat.SaveSeatRequest;
//
// @Component
// public class SeatFactory {
//
// public Seat createSeat(SaveSeatRequest saveSeatRequest) {
// return Seat.builder()
// .show(saveSeatRequest.show())
// .timeScheduleId(saveSeatRequest.timeScheduleId())
// .build();
// }
// }
Original file line number Diff line number Diff line change
@@ -1,36 +1,21 @@
package com.picketing.www.business.domain.show.seat;

import java.math.BigDecimal;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@Builder(access = AccessLevel.PROTECTED)
@Getter(AccessLevel.PROTECTED)
@Table(name = "SEAT_GRADE")
public class SeatGrade {
@Getter
@AllArgsConstructor
public enum SeatGrade {

VIP("VIP석", 165000L, 2000),
SR("SR석", 154000L, 1000),
R("R석", 143000L, 800),
S("S석", 121000L, 500),
A("A석", 100000L, 300);

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private final String name; // 공연장의 좌석 명칭

@ManyToOne
@JoinColumn(name = "SEAT_ID")
private Seat seat;
private final Long price; // 공연장의 좌석 가격 (원래는 공연마다 가격이 달라지므로, 이 엔티티 필드가 아니지만, 현재는 공연 좌석이 고정되어 있으므로 price를 공연 좌석에 둡니다)

private BigDecimal price;
private final int count; // 공연장의 좌석 개수
}
Loading
Loading