128 lines
3.0 KiB
Java

package roomescape.reservation.domain;
import java.time.LocalDate;
import org.springframework.http.HttpStatus;
import com.fasterxml.jackson.annotation.JsonIgnore;
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 roomescape.member.infrastructure.persistence.Member;
import roomescape.common.exception.ErrorType;
import roomescape.common.exception.RoomescapeException;
import roomescape.theme.domain.Theme;
@Entity
public class Reservation {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private LocalDate date;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "time_id", nullable = false)
private ReservationTime reservationTime;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "theme_id", nullable = false)
private Theme theme;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id", nullable = false)
private Member member;
@Enumerated(value = EnumType.STRING)
private ReservationStatus reservationStatus;
protected Reservation() {
}
public Reservation(
LocalDate date,
ReservationTime reservationTime,
Theme theme,
Member member,
ReservationStatus status
) {
this(null, date, reservationTime, theme, member, status);
}
public Reservation(
Long id,
LocalDate date,
ReservationTime reservationTime,
Theme theme,
Member member,
ReservationStatus status
) {
validateIsNull(date, reservationTime, theme, member, status);
this.id = id;
this.date = date;
this.reservationTime = reservationTime;
this.theme = theme;
this.member = member;
this.reservationStatus = status;
}
private void validateIsNull(LocalDate date, ReservationTime reservationTime, Theme theme, Member member,
ReservationStatus reservationStatus) {
if (date == null || reservationTime == null || theme == null || member == null || reservationStatus == null) {
throw new RoomescapeException(ErrorType.REQUEST_DATA_BLANK, String.format("[values: %s]", this),
HttpStatus.BAD_REQUEST);
}
}
public Long getMemberId() {
return member.getId();
}
public Long getId() {
return id;
}
public LocalDate getDate() {
return date;
}
public ReservationTime getReservationTime() {
return reservationTime;
}
public Theme getTheme() {
return theme;
}
public Member getMember() {
return member;
}
public ReservationStatus getReservationStatus() {
return reservationStatus;
}
@JsonIgnore
public boolean isSameDateAndTime(LocalDate date, ReservationTime time) {
return this.date.equals(date) && time.getStartAt().equals(this.reservationTime.getStartAt());
}
@JsonIgnore
public boolean isWaiting() {
return reservationStatus == ReservationStatus.WAITING;
}
@JsonIgnore
public boolean isSameMember(Long memberId) {
return getMemberId().equals(memberId);
}
}