[#16] Reservation 도메인 코드 코틀린 마이그레이션 #17

Merged
pricelees merged 40 commits from refactor/#16 into main 2025-07-21 12:08:56 +00:00
21 changed files with 206 additions and 314 deletions
Showing only changes of commit 06988674dd - Show all commits

View File

@ -13,7 +13,7 @@ import roomescape.payment.web.PaymentApprove
import roomescape.payment.web.PaymentCancel
import roomescape.payment.web.ReservationPaymentResponse
import roomescape.payment.web.toReservationPaymentResponse
import roomescape.reservation.infrastructure.persistence.Reservation
import roomescape.reservation.infrastructure.persistence.ReservationEntity
import java.time.OffsetDateTime
@Service
@ -24,7 +24,7 @@ class PaymentService(
@Transactional
fun savePayment(
paymentResponse: PaymentApprove.Response,
reservation: Reservation
reservation: ReservationEntity
): ReservationPaymentResponse = PaymentEntity(
orderId = paymentResponse.orderId,
paymentKey = paymentResponse.paymentKey,

View File

@ -1,7 +1,7 @@
package roomescape.payment.infrastructure.persistence
import jakarta.persistence.*
import roomescape.reservation.infrastructure.persistence.Reservation
import roomescape.reservation.infrastructure.persistence.ReservationEntity
import java.time.OffsetDateTime
@Entity
@ -22,7 +22,7 @@ class PaymentEntity(
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "reservation_id", nullable = false)
var reservation: Reservation,
var reservation: ReservationEntity,
@Column(nullable = false)
var approvedAt: OffsetDateTime

View File

@ -13,7 +13,7 @@ import roomescape.common.exception.ErrorType;
import roomescape.common.exception.RoomescapeException;
import roomescape.member.business.MemberService;
import roomescape.member.infrastructure.persistence.MemberEntity;
import roomescape.reservation.infrastructure.persistence.Reservation;
import roomescape.reservation.infrastructure.persistence.ReservationEntity;
import roomescape.reservation.infrastructure.persistence.ReservationRepository;
import roomescape.reservation.infrastructure.persistence.ReservationSearchSpecification;
import roomescape.reservation.infrastructure.persistence.ReservationStatus;
@ -50,7 +50,7 @@ public class ReservationService {
@Transactional(readOnly = true)
public ReservationsResponse findAllReservations() {
Specification<Reservation> spec = new ReservationSearchSpecification().confirmed().build();
Specification<ReservationEntity> spec = new ReservationSearchSpecification().confirmed().build();
List<ReservationResponse> response = findAllReservationByStatus(spec);
return new ReservationsResponse(response);
@ -58,13 +58,13 @@ public class ReservationService {
@Transactional(readOnly = true)
public ReservationsResponse findAllWaiting() {
Specification<Reservation> spec = new ReservationSearchSpecification().waiting().build();
Specification<ReservationEntity> spec = new ReservationSearchSpecification().waiting().build();
List<ReservationResponse> response = findAllReservationByStatus(spec);
return new ReservationsResponse(response);
}
private List<ReservationResponse> findAllReservationByStatus(Specification<Reservation> spec) {
private List<ReservationResponse> findAllReservationByStatus(Specification<ReservationEntity> spec) {
return reservationRepository.findAll(spec)
.stream()
.map(ReservationResponse::from)
@ -76,9 +76,9 @@ public class ReservationService {
reservationRepository.deleteById(reservationId);
}
public Reservation addReservation(ReservationRequest request, Long memberId) {
public ReservationEntity addReservation(ReservationRequest request, Long memberId) {
validateIsReservationExist(request.themeId, request.timeId, request.date);
Reservation reservation = getReservationForSave(request.timeId, request.themeId, request.date, memberId,
ReservationEntity reservation = getReservationForSave(request.timeId, request.themeId, request.date, memberId,
ReservationStatus.CONFIRMED);
return reservationRepository.save(reservation);
}
@ -97,13 +97,13 @@ public class ReservationService {
private ReservationResponse addReservationWithoutPayment(Long themeId, Long timeId, LocalDate date, Long memberId,
ReservationStatus status) {
Reservation reservation = getReservationForSave(timeId, themeId, date, memberId, status);
Reservation saved = reservationRepository.save(reservation);
ReservationEntity reservation = getReservationForSave(timeId, themeId, date, memberId, status);
ReservationEntity saved = reservationRepository.save(reservation);
return ReservationResponse.from(saved);
}
private void validateMemberAlreadyReserve(Long themeId, Long timeId, LocalDate date, Long memberId) {
Specification<Reservation> spec = new ReservationSearchSpecification()
Specification<ReservationEntity> spec = new ReservationSearchSpecification()
.sameMemberId(memberId)
.sameThemeId(themeId)
.sameTimeId(timeId)
@ -116,7 +116,7 @@ public class ReservationService {
}
private void validateIsReservationExist(Long themeId, Long timeId, LocalDate date) {
Specification<Reservation> spec = new ReservationSearchSpecification()
Specification<ReservationEntity> spec = new ReservationSearchSpecification()
.confirmed()
.sameThemeId(themeId)
.sameTimeId(timeId)
@ -143,21 +143,21 @@ public class ReservationService {
}
}
private Reservation getReservationForSave(Long timeId, Long themeId, LocalDate date, Long memberId,
private ReservationEntity getReservationForSave(Long timeId, Long themeId, LocalDate date, Long memberId,
ReservationStatus status) {
ReservationTimeEntity time = reservationTimeService.findTimeById(timeId);
ThemeEntity theme = themeService.findThemeById(themeId);
MemberEntity member = memberService.findById(memberId);
validateDateAndTime(date, time);
return new Reservation(date, time, theme, member, status);
return new ReservationEntity(null, date, time, theme, member, status);
}
@Transactional(readOnly = true)
public ReservationsResponse findFilteredReservations(Long themeId, Long memberId, LocalDate dateFrom,
LocalDate dateTo) {
validateDateForSearch(dateFrom, dateTo);
Specification<Reservation> spec = new ReservationSearchSpecification()
Specification<ReservationEntity> spec = new ReservationSearchSpecification()
.confirmed()
.sameThemeId(themeId)
.sameMemberId(memberId)
@ -197,8 +197,8 @@ public class ReservationService {
}
public void cancelWaiting(Long reservationId, Long memberId) {
Reservation waiting = reservationRepository.findById(reservationId)
.filter(Reservation::isWaiting)
ReservationEntity waiting = reservationRepository.findById(reservationId)
.filter(ReservationEntity::isWaiting)
.filter(r -> r.isSameMember(memberId))
.orElseThrow(() -> throwReservationNotFound(reservationId));
reservationRepository.delete(waiting);
@ -206,8 +206,8 @@ public class ReservationService {
public void denyWaiting(Long reservationId, Long memberId) {
validateIsMemberAdmin(memberId);
Reservation waiting = reservationRepository.findById(reservationId)
.filter(Reservation::isWaiting)
ReservationEntity waiting = reservationRepository.findById(reservationId)
.filter(ReservationEntity::isWaiting)
.orElseThrow(() -> throwReservationNotFound(reservationId));
reservationRepository.delete(waiting);
}

View File

@ -9,7 +9,7 @@ import org.springframework.transaction.annotation.Transactional;
import roomescape.common.exception.ErrorType;
import roomescape.common.exception.RoomescapeException;
import roomescape.reservation.infrastructure.persistence.Reservation;
import roomescape.reservation.infrastructure.persistence.ReservationEntity;
import roomescape.reservation.infrastructure.persistence.ReservationRepository;
import roomescape.reservation.infrastructure.persistence.ReservationTimeEntity;
import roomescape.reservation.infrastructure.persistence.ReservationTimeRepository;
@ -72,7 +72,7 @@ public class ReservationTimeService {
public void removeTimeById(Long id) {
ReservationTimeEntity reservationTime = findTimeById(id);
List<Reservation> usingTimeReservations = reservationRepository.findByReservationTime(reservationTime);
List<ReservationEntity> usingTimeReservations = reservationRepository.findByReservationTime(reservationTime);
if (!usingTimeReservations.isEmpty()) {
throw new RoomescapeException(ErrorType.TIME_IS_USED_CONFLICT, String.format("[timeId: %d]", id),
@ -85,7 +85,7 @@ public class ReservationTimeService {
@Transactional(readOnly = true)
public ReservationTimeInfosResponse findAllAvailableTimesByDateAndTheme(LocalDate date, Long themeId) {
List<ReservationTimeEntity> allTimes = reservationTimeRepository.findAll();
List<Reservation> reservations = reservationRepository.findByThemeId(themeId);
List<ReservationEntity> reservations = reservationRepository.findByThemeId(themeId);
List<ReservationTimeInfoResponse> response = allTimes.stream()
.map(time -> new ReservationTimeInfoResponse(time.getId(), time.getStartAt(),
@ -95,7 +95,8 @@ public class ReservationTimeService {
return new ReservationTimeInfosResponse(response);
}
private boolean isReservationBooked(List<Reservation> reservations, LocalDate date, ReservationTimeEntity time) {
private boolean isReservationBooked(List<ReservationEntity> reservations, LocalDate date,
ReservationTimeEntity time) {
return reservations.stream()
.anyMatch(reservation -> reservation.isSameDateAndTime(date, time));
}

View File

@ -9,7 +9,7 @@ import roomescape.payment.business.PaymentService;
import roomescape.payment.web.PaymentApprove;
import roomescape.payment.web.PaymentCancel;
import roomescape.payment.web.ReservationPaymentResponse;
import roomescape.reservation.infrastructure.persistence.Reservation;
import roomescape.reservation.infrastructure.persistence.ReservationEntity;
import roomescape.reservation.web.ReservationRequest;
import roomescape.reservation.web.ReservationResponse;
@ -29,7 +29,7 @@ public class ReservationWithPaymentService {
public ReservationResponse addReservationWithPayment(ReservationRequest request,
PaymentApprove.Response paymentInfo,
Long memberId) {
Reservation reservation = reservationService.addReservation(request, memberId);
ReservationEntity reservation = reservationService.addReservation(request, memberId);
ReservationPaymentResponse reservationPaymentResponse = paymentService.savePayment(paymentInfo, reservation);
return reservationPaymentResponse.reservation();

View File

@ -1,127 +1,59 @@
package roomescape.reservation.infrastructure.persistence;
package roomescape.reservation.infrastructure.persistence
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.common.exception.ErrorType;
import roomescape.common.exception.RoomescapeException;
import roomescape.member.infrastructure.persistence.MemberEntity;
import roomescape.theme.infrastructure.persistence.ThemeEntity;
import com.fasterxml.jackson.annotation.JsonIgnore
import io.swagger.v3.oas.annotations.media.Schema
import jakarta.persistence.*
import roomescape.member.infrastructure.persistence.MemberEntity
import roomescape.theme.infrastructure.persistence.ThemeEntity
import java.time.LocalDate
@Entity
public class Reservation {
@Table(name = "reservation")
class ReservationEntity(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Long? = null,
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
var date: LocalDate,
private LocalDate date;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "time_id", nullable = false)
var reservationTime: ReservationTimeEntity,
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "time_id", nullable = false)
private ReservationTimeEntity reservationTime;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "theme_id", nullable = false)
var theme: ThemeEntity,
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "theme_id", nullable = false)
private ThemeEntity theme;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id", nullable = false)
var member: MemberEntity,
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id", nullable = false)
private MemberEntity member;
@Enumerated(value = EnumType.STRING)
var reservationStatus: ReservationStatus
) {
@Enumerated(value = EnumType.STRING)
private ReservationStatus reservationStatus;
@JsonIgnore
fun isSameDateAndTime(date: LocalDate?, time: ReservationTimeEntity): Boolean {
return this.date == date && time.startAt == this.reservationTime.startAt
}
protected Reservation() {
}
@JsonIgnore
fun isWaiting(): Boolean = reservationStatus == ReservationStatus.WAITING
public Reservation(
LocalDate date,
ReservationTimeEntity reservationTime,
ThemeEntity theme,
MemberEntity member,
ReservationStatus status
) {
this(null, date, reservationTime, theme, member, status);
}
public Reservation(
Long id,
LocalDate date,
ReservationTimeEntity reservationTime,
ThemeEntity theme,
MemberEntity 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, ReservationTimeEntity reservationTime, ThemeEntity theme, MemberEntity 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 ReservationTimeEntity getReservationTime() {
return reservationTime;
}
public ThemeEntity getTheme() {
return theme;
}
public MemberEntity getMember() {
return member;
}
public ReservationStatus getReservationStatus() {
return reservationStatus;
}
@JsonIgnore
public boolean isSameDateAndTime(LocalDate date, ReservationTimeEntity 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);
}
@JsonIgnore
fun isSameMember(memberId: Long): Boolean {
return this.member.id == memberId
}
}
@Schema(description = "예약 상태를 나타냅니다.", allowableValues = ["CONFIRMED", "CONFIRMED_PAYMENT_REQUIRED", "WAITING"])
enum class ReservationStatus {
@Schema(description = "결제가 완료된 예약")
CONFIRMED,
@Schema(description = "결제가 필요한 예약")
CONFIRMED_PAYMENT_REQUIRED,
@Schema(description = "대기 중인 예약")
WAITING
}

View File

@ -10,15 +10,16 @@ import org.springframework.data.repository.query.Param;
import roomescape.reservation.web.MyReservationResponse;
public interface ReservationRepository extends JpaRepository<Reservation, Long>, JpaSpecificationExecutor<Reservation> {
public interface ReservationRepository
extends JpaRepository<ReservationEntity, Long>, JpaSpecificationExecutor<ReservationEntity> {
List<Reservation> findByReservationTime(ReservationTimeEntity reservationTime);
List<ReservationEntity> findByReservationTime(ReservationTimeEntity reservationTime);
List<Reservation> findByThemeId(Long themeId);
List<ReservationEntity> findByThemeId(Long themeId);
@Modifying
@Query("""
UPDATE Reservation r
UPDATE ReservationEntity r
SET r.reservationStatus = :status
WHERE r.id = :id
""")
@ -27,13 +28,13 @@ public interface ReservationRepository extends JpaRepository<Reservation, Long>,
@Query("""
SELECT EXISTS (
SELECT 1 FROM Reservation r
SELECT 1 FROM ReservationEntity r
WHERE r.theme.id = r2.theme.id
AND r.reservationTime.id = r2.reservationTime.id
AND r.date = r2.date
AND r.reservationStatus != 'WAITING'
)
FROM Reservation r2
FROM ReservationEntity r2
WHERE r2.id = :id
""")
boolean isExistConfirmedReservation(@Param("id") Long reservationId);
@ -45,11 +46,11 @@ public interface ReservationRepository extends JpaRepository<Reservation, Long>,
r.date,
r.reservationTime.startAt,
r.reservationStatus,
(SELECT COUNT (r2) * 1L FROM Reservation r2 WHERE r2.theme = r.theme AND r2.date = r.date AND r2.reservationTime = r.reservationTime AND r2.id < r.id),
(SELECT COUNT (r2) * 1L FROM ReservationEntity r2 WHERE r2.theme = r.theme AND r2.date = r.date AND r2.reservationTime = r.reservationTime AND r2.id < r.id),
p.paymentKey,
p.totalAmount
)
FROM Reservation r
FROM ReservationEntity r
JOIN r.theme t
LEFT JOIN PaymentEntity p
ON p.reservation = r

View File

@ -6,7 +6,7 @@ import roomescape.theme.infrastructure.persistence.ThemeEntity
import java.time.LocalDate
class ReservationSearchSpecification(
private var spec: Specification<Reservation> = Specification { _, _, _ -> null }
private var spec: Specification<ReservationEntity> = Specification { _, _, _ -> null }
) {
fun sameThemeId(themeId: Long?): ReservationSearchSpecification = andIfNotNull(themeId?.let {
Specification { root, _, cb ->
@ -64,11 +64,11 @@ class ReservationSearchSpecification(
}
})
fun build(): Specification<Reservation> {
fun build(): Specification<ReservationEntity> {
return this.spec
}
private fun andIfNotNull(condition: Specification<Reservation>?): ReservationSearchSpecification {
private fun andIfNotNull(condition: Specification<ReservationEntity>?): ReservationSearchSpecification {
condition?.let { this.spec = this.spec.and(condition) }
return this
}

View File

@ -1,13 +0,0 @@
package roomescape.reservation.infrastructure.persistence;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(description = "예약 상태를 나타냅니다.", allowableValues = {"CONFIRMED", "CONFIRMED_PAYMENT_REQUIRED", "WAITING"})
public enum ReservationStatus {
@Schema(description = "결제가 완료된 예약")
CONFIRMED,
@Schema(description = "결제가 필요한 예약")
CONFIRMED_PAYMENT_REQUIRED,
@Schema(description = "대기 중인 예약")
WAITING;
}

View File

@ -4,7 +4,7 @@ import com.fasterxml.jackson.annotation.JsonProperty
import io.swagger.v3.oas.annotations.media.Schema
import roomescape.member.web.MemberResponse
import roomescape.member.web.MemberResponse.Companion.fromEntity
import roomescape.reservation.infrastructure.persistence.Reservation
import roomescape.reservation.infrastructure.persistence.ReservationEntity
import roomescape.reservation.infrastructure.persistence.ReservationStatus
import roomescape.reservation.infrastructure.persistence.ReservationTimeEntity
import roomescape.theme.web.ThemeResponse
@ -73,9 +73,9 @@ data class ReservationResponse(
) {
companion object {
@JvmStatic
fun from(reservation: Reservation): ReservationResponse {
fun from(reservation: ReservationEntity): ReservationResponse {
return ReservationResponse(
reservation.id,
reservation.id!!,
reservation.date,
fromEntity(reservation.member),
ReservationTimeResponse.Companion.from(reservation.reservationTime),

View File

@ -9,7 +9,7 @@ interface ThemeRepository : JpaRepository<ThemeEntity, Long> {
@Query(value = """
SELECT t
FROM ThemeEntity t
RIGHT JOIN Reservation r ON t.id = r.theme.id
RIGHT JOIN ReservationEntity r ON t.id = r.theme.id
WHERE r.date BETWEEN :startDate AND :endDate
GROUP BY r.theme.id
ORDER BY COUNT(r.theme.id) DESC, t.id ASC
@ -24,7 +24,7 @@ interface ThemeRepository : JpaRepository<ThemeEntity, Long> {
@Query(value = """
SELECT EXISTS(
SELECT 1
FROM Reservation r
FROM ReservationEntity r
WHERE r.theme.id = :id
)
""")

View File

@ -22,7 +22,7 @@ import roomescape.payment.infrastructure.persistence.CanceledPaymentRepository;
import roomescape.payment.web.PaymentApprove;
import roomescape.payment.web.PaymentCancel;
import roomescape.payment.web.ReservationPaymentResponse;
import roomescape.reservation.infrastructure.persistence.Reservation;
import roomescape.reservation.infrastructure.persistence.ReservationEntity;
import roomescape.reservation.infrastructure.persistence.ReservationRepository;
import roomescape.reservation.infrastructure.persistence.ReservationStatus;
import roomescape.reservation.infrastructure.persistence.ReservationTimeEntity;
@ -55,12 +55,14 @@ class PaymentServiceTest {
OffsetDateTime.now(), 10000L);
LocalDateTime localDateTime = LocalDateTime.now().plusHours(1L);
LocalDate date = localDateTime.toLocalDate();
ReservationTimeEntity time = reservationTimeRepository.save(new ReservationTimeEntity(null, localDateTime.toLocalTime()));
ReservationTimeEntity time = reservationTimeRepository.save(
new ReservationTimeEntity(null, localDateTime.toLocalTime()));
MemberEntity member = memberRepository.save(
new MemberEntity(null, "member", "email@email.com", "password", Role.MEMBER));
ThemeEntity theme = themeRepository.save(new ThemeEntity(null, "name", "desc", "thumbnail"));
Reservation reservation = reservationRepository.save(new Reservation(date, time, theme, member,
ReservationStatus.CONFIRMED));
ReservationEntity reservation = reservationRepository.save(
new ReservationEntity(null, date, time, theme, member,
ReservationStatus.CONFIRMED));
// when
ReservationPaymentResponse reservationPaymentResponse = paymentService.savePayment(paymentInfo, reservation);
@ -78,12 +80,14 @@ class PaymentServiceTest {
OffsetDateTime.now(), 10000L);
LocalDateTime localDateTime = LocalDateTime.now().plusHours(1L);
LocalDate date = localDateTime.toLocalDate();
ReservationTimeEntity time = reservationTimeRepository.save(new ReservationTimeEntity(null, localDateTime.toLocalTime()));
ReservationTimeEntity time = reservationTimeRepository.save(
new ReservationTimeEntity(null, localDateTime.toLocalTime()));
MemberEntity member = memberRepository.save(
new MemberEntity(null, "member", "email@email.com", "password", Role.MEMBER));
ThemeEntity theme = themeRepository.save(new ThemeEntity(null, "name", "desc", "thumbnail"));
Reservation reservation = reservationRepository.save(new Reservation(date, time, theme, member,
ReservationStatus.CONFIRMED));
ReservationEntity reservation = reservationRepository.save(
new ReservationEntity(null, date, time, theme, member,
ReservationStatus.CONFIRMED));
paymentService.savePayment(paymentInfo, reservation);
@ -116,12 +120,14 @@ class PaymentServiceTest {
OffsetDateTime.now(), 10000L);
LocalDateTime localDateTime = LocalDateTime.now().plusHours(1L);
LocalDate date = localDateTime.toLocalDate();
ReservationTimeEntity time = reservationTimeRepository.save(new ReservationTimeEntity(null, localDateTime.toLocalTime()));
ReservationTimeEntity time = reservationTimeRepository.save(
new ReservationTimeEntity(null, localDateTime.toLocalTime()));
MemberEntity member = memberRepository.save(
new MemberEntity(null, "member", "email@email.com", "password", Role.MEMBER));
ThemeEntity theme = themeRepository.save(new ThemeEntity(null, "name", "desc", "thumbnail"));
Reservation reservation = reservationRepository.save(new Reservation(date, time, theme, member,
ReservationStatus.CONFIRMED));
ReservationEntity reservation = reservationRepository.save(
new ReservationEntity(null, date, time, theme, member,
ReservationStatus.CONFIRMED));
paymentService.savePayment(paymentInfo, reservation);
paymentService.cancelPaymentByAdmin(reservation.getId());

View File

@ -98,6 +98,6 @@ class PaymentRepositoryTest(
entityManager.flush()
entityManager.clear()
}.id
}.id!!
}
}

View File

@ -19,7 +19,7 @@ import roomescape.member.business.MemberService;
import roomescape.member.infrastructure.persistence.MemberEntity;
import roomescape.member.infrastructure.persistence.MemberRepository;
import roomescape.member.infrastructure.persistence.Role;
import roomescape.reservation.infrastructure.persistence.Reservation;
import roomescape.reservation.infrastructure.persistence.ReservationEntity;
import roomescape.reservation.infrastructure.persistence.ReservationRepository;
import roomescape.reservation.infrastructure.persistence.ReservationStatus;
import roomescape.reservation.infrastructure.persistence.ReservationTimeEntity;
@ -233,7 +233,7 @@ class ReservationServiceTest {
reservationService.approveWaiting(waiting.id, admin.getId());
// then
Reservation confirmed = reservationRepository.findById(waiting.id).get();
ReservationEntity confirmed = reservationRepository.findById(waiting.id).get();
assertThat(confirmed.getReservationStatus()).isEqualTo(ReservationStatus.CONFIRMED_PAYMENT_REQUIRED);
}
}

View File

@ -17,7 +17,7 @@ import roomescape.common.exception.RoomescapeException;
import roomescape.member.infrastructure.persistence.MemberEntity;
import roomescape.member.infrastructure.persistence.MemberRepository;
import roomescape.member.infrastructure.persistence.Role;
import roomescape.reservation.infrastructure.persistence.Reservation;
import roomescape.reservation.infrastructure.persistence.ReservationEntity;
import roomescape.reservation.infrastructure.persistence.ReservationRepository;
import roomescape.reservation.infrastructure.persistence.ReservationStatus;
import roomescape.reservation.infrastructure.persistence.ReservationTimeEntity;
@ -57,7 +57,8 @@ class ReservationTimeServiceTest {
@DisplayName("존재하지 않는 ID로 시간을 조회하면 예외가 발생한다.")
void findTimeByIdFail() {
// given
ReservationTimeEntity saved = reservationTimeRepository.save(new ReservationTimeEntity(null, LocalTime.of(12, 30)));
ReservationTimeEntity saved = reservationTimeRepository.save(
new ReservationTimeEntity(null, LocalTime.of(12, 30)));
// when
Long invalidTimeId = saved.getId() + 1;
@ -79,8 +80,9 @@ class ReservationTimeServiceTest {
new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
// when
reservationRepository.save(new Reservation(localDateTime.toLocalDate(), reservationTime, theme, member,
ReservationStatus.CONFIRMED));
reservationRepository.save(
new ReservationEntity(null, localDateTime.toLocalDate(), reservationTime, theme, member,
ReservationStatus.CONFIRMED));
// then
assertThatThrownBy(() -> reservationTimeService.removeTimeById(reservationTime.getId()))

View File

@ -21,7 +21,7 @@ import roomescape.payment.infrastructure.persistence.PaymentEntity;
import roomescape.payment.infrastructure.persistence.PaymentRepository;
import roomescape.payment.web.PaymentApprove;
import roomescape.payment.web.PaymentCancel;
import roomescape.reservation.infrastructure.persistence.Reservation;
import roomescape.reservation.infrastructure.persistence.ReservationEntity;
import roomescape.reservation.infrastructure.persistence.ReservationRepository;
import roomescape.reservation.infrastructure.persistence.ReservationStatus;
import roomescape.reservation.infrastructure.persistence.ReservationTimeEntity;
@ -58,7 +58,8 @@ class ReservationWithPaymentServiceTest {
OffsetDateTime.now(), 10000L);
LocalDateTime localDateTime = LocalDateTime.now().plusDays(1L).withNano(0);
LocalDate date = localDateTime.toLocalDate();
ReservationTimeEntity time = reservationTimeRepository.save(new ReservationTimeEntity(null, localDateTime.toLocalTime()));
ReservationTimeEntity time = reservationTimeRepository.save(
new ReservationTimeEntity(null, localDateTime.toLocalTime()));
MemberEntity member = memberRepository.save(
new MemberEntity(null, "member", "email@email.com", "password", Role.MEMBER));
ThemeEntity theme = themeRepository.save(new ThemeEntity(null, "name", "desc", "thumbnail"));
@ -95,7 +96,8 @@ class ReservationWithPaymentServiceTest {
OffsetDateTime.now(), 10000L);
LocalDateTime localDateTime = LocalDateTime.now().plusDays(1L).withNano(0);
LocalDate date = localDateTime.toLocalDate();
ReservationTimeEntity time = reservationTimeRepository.save(new ReservationTimeEntity(null, localDateTime.toLocalTime()));
ReservationTimeEntity time = reservationTimeRepository.save(
new ReservationTimeEntity(null, localDateTime.toLocalTime()));
MemberEntity member = memberRepository.save(
new MemberEntity(null, "member", "admin@email.com", "password", Role.ADMIN));
ThemeEntity theme = themeRepository.save(new ThemeEntity(null, "name", "desc", "thumbnail"));
@ -124,13 +126,14 @@ class ReservationWithPaymentServiceTest {
OffsetDateTime.now(), 10000L);
LocalDateTime localDateTime = LocalDateTime.now().plusHours(1L);
LocalDate date = localDateTime.toLocalDate();
ReservationTimeEntity time = reservationTimeRepository.save(new ReservationTimeEntity(null, localDateTime.toLocalTime()));
ReservationTimeEntity time = reservationTimeRepository.save(
new ReservationTimeEntity(null, localDateTime.toLocalTime()));
MemberEntity member = memberRepository.save(
new MemberEntity(null, "member", "admin@email.com", "password", Role.ADMIN));
ThemeEntity theme = themeRepository.save(new ThemeEntity(null, "name", "desc", "thumbnail"));
Reservation saved = reservationRepository.save(
new Reservation(date, time, theme, member, ReservationStatus.CONFIRMED_PAYMENT_REQUIRED));
ReservationEntity saved = reservationRepository.save(
new ReservationEntity(null, date, time, theme, member, ReservationStatus.CONFIRMED_PAYMENT_REQUIRED));
// when
boolean result = reservationWithPaymentService.isNotPaidReservation(saved.getId());
@ -147,7 +150,8 @@ class ReservationWithPaymentServiceTest {
OffsetDateTime.now(), 10000L);
LocalDateTime localDateTime = LocalDateTime.now().plusDays(1L).withNano(0);
LocalDate date = localDateTime.toLocalDate();
ReservationTimeEntity time = reservationTimeRepository.save(new ReservationTimeEntity(null, localDateTime.toLocalTime()));
ReservationTimeEntity time = reservationTimeRepository.save(
new ReservationTimeEntity(null, localDateTime.toLocalTime()));
MemberEntity member = memberRepository.save(
new MemberEntity(null, "member", "admin@email.com", "password", Role.ADMIN));
ThemeEntity theme = themeRepository.save(new ThemeEntity(null, "name", "desc", "thumbnail"));

View File

@ -21,19 +21,19 @@ class ReservationSearchSpecificationTest(
) : StringSpec() {
init {
lateinit var confirmedNow: Reservation
lateinit var confirmedNotPaidYesterday: Reservation
lateinit var waitingTomorrow: Reservation
lateinit var confirmedNow: ReservationEntity
lateinit var confirmedNotPaidYesterday: ReservationEntity
lateinit var waitingTomorrow: ReservationEntity
lateinit var member: MemberEntity
lateinit var reservationTime: ReservationTimeEntity
lateinit var theme: ThemeEntity
"동일한 테마의 예약을 조회한다" {
val spec = ReservationSearchSpecification()
.sameThemeId(theme.id)
.build()
.sameThemeId(theme.id)
.build()
val results: List<Reservation> = reservationRepository.findAll(spec)
val results: List<ReservationEntity> = reservationRepository.findAll(spec)
assertSoftly(results) {
this shouldHaveSize 3
@ -43,10 +43,10 @@ class ReservationSearchSpecificationTest(
"동일한 회원의 예약을 조회한다" {
val spec = ReservationSearchSpecification()
.sameMemberId(member.id)
.build()
.sameMemberId(member.id)
.build()
val results: List<Reservation> = reservationRepository.findAll(spec)
val results: List<ReservationEntity> = reservationRepository.findAll(spec)
assertSoftly(results) {
this shouldHaveSize 3
@ -56,10 +56,10 @@ class ReservationSearchSpecificationTest(
"동일한 예약 시간의 예약을 조회한다" {
val spec = ReservationSearchSpecification()
.sameTimeId(reservationTime.id)
.build()
.sameTimeId(reservationTime.id)
.build()
val results: List<Reservation> = reservationRepository.findAll(spec)
val results: List<ReservationEntity> = reservationRepository.findAll(spec)
assertSoftly(results) {
this shouldHaveSize 3
@ -69,10 +69,10 @@ class ReservationSearchSpecificationTest(
"동일한 날짜의 예약을 조회한다" {
val spec = ReservationSearchSpecification()
.sameDate(LocalDate.now())
.build()
.sameDate(LocalDate.now())
.build()
val results: List<Reservation> = reservationRepository.findAll(spec)
val results: List<ReservationEntity> = reservationRepository.findAll(spec)
assertSoftly(results) {
this shouldHaveSize 1
@ -85,7 +85,7 @@ class ReservationSearchSpecificationTest(
.confirmed()
.build()
val results: List<Reservation> = reservationRepository.findAll(spec)
val results: List<ReservationEntity> = reservationRepository.findAll(spec)
assertSoftly(results) {
this shouldHaveSize 2
@ -95,10 +95,10 @@ class ReservationSearchSpecificationTest(
"대기 상태인 예약을 조회한다" {
val spec = ReservationSearchSpecification()
.waiting()
.build()
.waiting()
.build()
val results: List<Reservation> = reservationRepository.findAll(spec)
val results: List<ReservationEntity> = reservationRepository.findAll(spec)
assertSoftly(results) {
this shouldHaveSize 1
@ -108,10 +108,10 @@ class ReservationSearchSpecificationTest(
"예약 날짜가 오늘 이후인 예약을 조회한다" {
val spec = ReservationSearchSpecification()
.dateStartFrom(LocalDate.now())
.build()
.dateStartFrom(LocalDate.now())
.build()
val results: List<Reservation> = reservationRepository.findAll(spec)
val results: List<ReservationEntity> = reservationRepository.findAll(spec)
assertSoftly(results) {
this shouldHaveSize 2
@ -121,10 +121,10 @@ class ReservationSearchSpecificationTest(
"예약 날짜가 내일 이전인 예약을 조회한다" {
val spec = ReservationSearchSpecification()
.dateEndAt(LocalDate.now().plusDays(1))
.build()
.dateEndAt(LocalDate.now().plusDays(1))
.build()
val results: List<Reservation> = reservationRepository.findAll(spec)
val results: List<ReservationEntity> = reservationRepository.findAll(spec)
assertSoftly(results) {
this shouldHaveSize 3

View File

@ -1,55 +0,0 @@
package roomescape.reservation.infrastructure.persistence;
import java.time.LocalDate;
import java.time.LocalTime;
import java.util.stream.Stream;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
import roomescape.common.exception.RoomescapeException;
import roomescape.member.infrastructure.persistence.MemberEntity;
import roomescape.member.infrastructure.persistence.Role;
import roomescape.theme.infrastructure.persistence.ThemeEntity;
public class ReservationTest {
@ParameterizedTest
@MethodSource("validateConstructorParameterBlankSource")
@DisplayName("객체 생성 시, null 또는 공백이 존재하면 예외를 발생한다.")
void validateConstructorParameterBlank(LocalDate date, ReservationTimeEntity reservationTime, ThemeEntity theme,
MemberEntity member) {
// when & then
Assertions.assertThatThrownBy(
() -> new Reservation(date, reservationTime, theme, member, ReservationStatus.CONFIRMED))
.isInstanceOf(RoomescapeException.class);
}
static Stream<Arguments> validateConstructorParameterBlankSource() {
return Stream.of(
Arguments.of(null,
new ReservationTimeEntity(null, LocalTime.now().plusHours(1)),
new ThemeEntity(null, "테마명", "설명", "썸네일URI"),
new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER)),
Arguments.of(
LocalDate.now(),
null,
new ThemeEntity(null, "테마명", "설명", "썸네일URI"),
new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER)),
Arguments.of(
LocalDate.now(),
new ReservationTimeEntity(null, LocalTime.now().plusHours(1)),
null,
new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER)),
Arguments.of(
LocalDate.now(),
new ReservationTimeEntity(null, LocalTime.now().plusHours(1)),
new ThemeEntity(null, "테마명", "설명", "썸네일URI"),
null)
);
}
}

View File

@ -42,7 +42,7 @@ import roomescape.payment.infrastructure.persistence.PaymentEntity;
import roomescape.payment.infrastructure.persistence.PaymentRepository;
import roomescape.payment.web.PaymentApprove;
import roomescape.payment.web.PaymentCancel;
import roomescape.reservation.infrastructure.persistence.Reservation;
import roomescape.reservation.infrastructure.persistence.ReservationEntity;
import roomescape.reservation.infrastructure.persistence.ReservationRepository;
import roomescape.reservation.infrastructure.persistence.ReservationStatus;
import roomescape.reservation.infrastructure.persistence.ReservationTimeEntity;
@ -129,10 +129,11 @@ public class ReservationControllerTest {
new MemberEntity(null, "name1", "email1r@email.com", "password", Role.MEMBER));
// when
reservationRepository.save(new Reservation(LocalDate.now().plusDays(1), reservationTime, theme, member1,
ReservationStatus.CONFIRMED));
Reservation waiting = reservationRepository.save(
new Reservation(LocalDate.now().plusDays(1), reservationTime, theme, member,
reservationRepository.save(
new ReservationEntity(null, LocalDate.now().plusDays(1), reservationTime, theme, member1,
ReservationStatus.CONFIRMED));
ReservationEntity waiting = reservationRepository.save(
new ReservationEntity(null, LocalDate.now().plusDays(1), reservationTime, theme, member,
ReservationStatus.WAITING));
// then
@ -159,10 +160,11 @@ public class ReservationControllerTest {
new MemberEntity(null, "name1", "email1r@email.com", "password", Role.MEMBER));
// when
reservationRepository.save(new Reservation(LocalDate.now().plusDays(1), reservationTime, theme, confirmedMember,
ReservationStatus.CONFIRMED));
Reservation waiting = reservationRepository.save(
new Reservation(LocalDate.now().plusDays(1), reservationTime, theme, waitingMember,
reservationRepository.save(
new ReservationEntity(null, LocalDate.now().plusDays(1), reservationTime, theme, confirmedMember,
ReservationStatus.CONFIRMED));
ReservationEntity waiting = reservationRepository.save(
new ReservationEntity(null, LocalDate.now().plusDays(1), reservationTime, theme, waitingMember,
ReservationStatus.WAITING));
// then
@ -188,11 +190,13 @@ public class ReservationControllerTest {
// when
reservationRepository.save(
new Reservation(LocalDate.now(), reservationTime, theme, member, ReservationStatus.CONFIRMED));
reservationRepository.save(new Reservation(LocalDate.now().plusDays(1), reservationTime, theme, member,
ReservationStatus.CONFIRMED));
reservationRepository.save(new Reservation(LocalDate.now().plusDays(2), reservationTime, theme, member,
ReservationStatus.CONFIRMED));
new ReservationEntity(null, LocalDate.now(), reservationTime, theme, member, ReservationStatus.CONFIRMED));
reservationRepository.save(
new ReservationEntity(null, LocalDate.now().plusDays(1), reservationTime, theme, member,
ReservationStatus.CONFIRMED));
reservationRepository.save(
new ReservationEntity(null, LocalDate.now().plusDays(2), reservationTime, theme, member,
ReservationStatus.CONFIRMED));
// then
RestAssured.given().log().all()
@ -215,8 +219,8 @@ public class ReservationControllerTest {
ReservationTimeEntity reservationTime = reservationTimeRepository.save(
new ReservationTimeEntity(null, LocalTime.of(17, 30)));
ThemeEntity theme = themeRepository.save(new ThemeEntity(null, "테마명", "설명", "썸네일URL"));
Reservation reservation = reservationRepository.save(
new Reservation(LocalDate.now(), reservationTime, theme, member, ReservationStatus.CONFIRMED));
ReservationEntity reservation = reservationRepository.save(
new ReservationEntity(null, LocalDate.now(), reservationTime, theme, member, ReservationStatus.CONFIRMED));
// when & then
RestAssured.given().log().all()
@ -242,9 +246,11 @@ public class ReservationControllerTest {
new MemberEntity(null, "name1", "email1@email.com", "password", Role.MEMBER));
reservationRepository.save(
new Reservation(LocalDate.now(), reservationTime, theme, confirmedMember, ReservationStatus.CONFIRMED));
Reservation waiting = reservationRepository.save(
new Reservation(LocalDate.now(), reservationTime, theme, waitingMember, ReservationStatus.WAITING));
new ReservationEntity(null, LocalDate.now(), reservationTime, theme, confirmedMember,
ReservationStatus.CONFIRMED));
ReservationEntity waiting = reservationRepository.save(
new ReservationEntity(null, LocalDate.now(), reservationTime, theme, waitingMember,
ReservationStatus.WAITING));
// when & then
RestAssured.given().log().all()
@ -269,8 +275,9 @@ public class ReservationControllerTest {
MemberEntity anotherMember = memberRepository.save(
new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
Reservation reservation = reservationRepository.save(
new Reservation(LocalDate.now(), reservationTime, theme, anotherMember, ReservationStatus.CONFIRMED));
ReservationEntity reservation = reservationRepository.save(
new ReservationEntity(null, LocalDate.now(), reservationTime, theme, anotherMember,
ReservationStatus.CONFIRMED));
// when & then
RestAssured.given().log().all()
@ -359,10 +366,10 @@ public class ReservationControllerTest {
String accessToken = getAccessTokenCookieByLogin("email@email.com", "password");
// when : 예약은 2개, 예약 대기는 1개 조회되어야 한다.
reservationRepository.save(new Reservation(date, time, theme, member, ReservationStatus.CONFIRMED));
reservationRepository.save(new ReservationEntity(null, date, time, theme, member, ReservationStatus.CONFIRMED));
reservationRepository.save(
new Reservation(date, time1, theme, member, ReservationStatus.CONFIRMED_PAYMENT_REQUIRED));
reservationRepository.save(new Reservation(date, time2, theme, member, ReservationStatus.WAITING));
new ReservationEntity(null, date, time1, theme, member, ReservationStatus.CONFIRMED_PAYMENT_REQUIRED));
reservationRepository.save(new ReservationEntity(null, date, time2, theme, member, ReservationStatus.WAITING));
// then
RestAssured.given().log().all()
@ -385,7 +392,7 @@ public class ReservationControllerTest {
String accessToken = getAdminAccessTokenCookieByLogin("admin@email.com", "password");
// when
Reservation saved = reservationRepository.save(new Reservation(date, time, theme,
ReservationEntity saved = reservationRepository.save(new ReservationEntity(null, date, time, theme,
memberRepository.save(new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER)),
ReservationStatus.CONFIRMED_PAYMENT_REQUIRED));
@ -410,8 +417,8 @@ public class ReservationControllerTest {
MemberEntity member = memberRepository.save(
new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
Reservation saved = reservationRepository.save(
new Reservation(date, time, theme, member, ReservationStatus.CONFIRMED));
ReservationEntity saved = reservationRepository.save(
new ReservationEntity(null, date, time, theme, member, ReservationStatus.CONFIRMED));
PaymentEntity savedPaymentEntity = paymentRepository.save(
new PaymentEntity(null, "pk", "oi", 1000L, saved, OffsetDateTime.now().minusHours(1L)));
@ -540,7 +547,8 @@ public class ReservationControllerTest {
new MemberEntity(null, "name1", "email1@email.com", "password", Role.MEMBER));
String accessToken = getAccessTokenCookieByLogin(member.getEmail(), member.getPassword());
reservationRepository.save(new Reservation(date, time, theme, member1, ReservationStatus.CONFIRMED));
reservationRepository.save(
new ReservationEntity(null, date, time, theme, member1, ReservationStatus.CONFIRMED));
// when & then
RestAssured.given().log().all()
@ -567,8 +575,8 @@ public class ReservationControllerTest {
new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
String accessToken = getAdminAccessTokenCookieByLogin("admin@email.com", "password");
Reservation waiting = reservationRepository.save(
new Reservation(date, time, theme, member, ReservationStatus.WAITING));
ReservationEntity waiting = reservationRepository.save(
new ReservationEntity(null, date, time, theme, member, ReservationStatus.WAITING));
// when
RestAssured.given().log().all()

View File

@ -24,7 +24,7 @@ import io.restassured.http.Header;
import roomescape.member.infrastructure.persistence.MemberEntity;
import roomescape.member.infrastructure.persistence.MemberRepository;
import roomescape.member.infrastructure.persistence.Role;
import roomescape.reservation.infrastructure.persistence.Reservation;
import roomescape.reservation.infrastructure.persistence.ReservationEntity;
import roomescape.reservation.infrastructure.persistence.ReservationRepository;
import roomescape.reservation.infrastructure.persistence.ReservationStatus;
import roomescape.reservation.infrastructure.persistence.ReservationTimeEntity;
@ -221,19 +221,25 @@ public class ReservationTimeControllerTest {
void readReservationByDateAndThemeId() {
// given
LocalDate today = LocalDate.now();
ReservationTimeEntity reservationTime1 = reservationTimeRepository.save(new ReservationTimeEntity(null, LocalTime.of(17, 0)));
ReservationTimeEntity reservationTime2 = reservationTimeRepository.save(new ReservationTimeEntity(null, LocalTime.of(17, 30)));
ReservationTimeEntity reservationTime3 = reservationTimeRepository.save(new ReservationTimeEntity(null, LocalTime.of(18, 30)));
ReservationTimeEntity reservationTime1 = reservationTimeRepository.save(
new ReservationTimeEntity(null, LocalTime.of(17, 0)));
ReservationTimeEntity reservationTime2 = reservationTimeRepository.save(
new ReservationTimeEntity(null, LocalTime.of(17, 30)));
ReservationTimeEntity reservationTime3 = reservationTimeRepository.save(
new ReservationTimeEntity(null, LocalTime.of(18, 30)));
ThemeEntity theme = themeRepository.save(new ThemeEntity(null, "테마명1", "설명", "썸네일URL"));
MemberEntity member = memberRepository.save(
new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
reservationRepository.save(
new Reservation(today.plusDays(1), reservationTime1, theme, member, ReservationStatus.CONFIRMED));
new ReservationEntity(null, today.plusDays(1), reservationTime1, theme, member,
ReservationStatus.CONFIRMED));
reservationRepository.save(
new Reservation(today.plusDays(1), reservationTime2, theme, member, ReservationStatus.CONFIRMED));
new ReservationEntity(null, today.plusDays(1), reservationTime2, theme, member,
ReservationStatus.CONFIRMED));
reservationRepository.save(
new Reservation(today.plusDays(1), reservationTime3, theme, member, ReservationStatus.CONFIRMED));
new ReservationEntity(null, today.plusDays(1), reservationTime3, theme, member,
ReservationStatus.CONFIRMED));
// when & then
RestAssured.given().log().all()

View File

@ -8,7 +8,7 @@ import roomescape.payment.infrastructure.persistence.CanceledPaymentEntity
import roomescape.payment.infrastructure.persistence.PaymentEntity
import roomescape.payment.web.PaymentApprove
import roomescape.payment.web.PaymentCancel
import roomescape.reservation.infrastructure.persistence.Reservation
import roomescape.reservation.infrastructure.persistence.ReservationEntity
import roomescape.reservation.infrastructure.persistence.ReservationStatus
import roomescape.reservation.infrastructure.persistence.ReservationTimeEntity
import roomescape.theme.infrastructure.persistence.ThemeEntity
@ -75,7 +75,7 @@ object ReservationFixture {
reservationTime: ReservationTimeEntity = ReservationTimeFixture.create(),
member: MemberEntity = MemberFixture.create(),
status: ReservationStatus = ReservationStatus.CONFIRMED_PAYMENT_REQUIRED
): Reservation = Reservation(id, date, reservationTime, theme, member, status)
): ReservationEntity = ReservationEntity(id, date, reservationTime, theme, member, status)
}
object JwtFixture {