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

View File

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

View File

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

View File

@ -9,7 +9,7 @@ import org.springframework.transaction.annotation.Transactional;
import roomescape.common.exception.ErrorType; import roomescape.common.exception.ErrorType;
import roomescape.common.exception.RoomescapeException; 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.ReservationRepository;
import roomescape.reservation.infrastructure.persistence.ReservationTimeEntity; import roomescape.reservation.infrastructure.persistence.ReservationTimeEntity;
import roomescape.reservation.infrastructure.persistence.ReservationTimeRepository; import roomescape.reservation.infrastructure.persistence.ReservationTimeRepository;
@ -72,7 +72,7 @@ public class ReservationTimeService {
public void removeTimeById(Long id) { public void removeTimeById(Long id) {
ReservationTimeEntity reservationTime = findTimeById(id); ReservationTimeEntity reservationTime = findTimeById(id);
List<Reservation> usingTimeReservations = reservationRepository.findByReservationTime(reservationTime); List<ReservationEntity> usingTimeReservations = reservationRepository.findByReservationTime(reservationTime);
if (!usingTimeReservations.isEmpty()) { if (!usingTimeReservations.isEmpty()) {
throw new RoomescapeException(ErrorType.TIME_IS_USED_CONFLICT, String.format("[timeId: %d]", id), throw new RoomescapeException(ErrorType.TIME_IS_USED_CONFLICT, String.format("[timeId: %d]", id),
@ -85,7 +85,7 @@ public class ReservationTimeService {
@Transactional(readOnly = true) @Transactional(readOnly = true)
public ReservationTimeInfosResponse findAllAvailableTimesByDateAndTheme(LocalDate date, Long themeId) { public ReservationTimeInfosResponse findAllAvailableTimesByDateAndTheme(LocalDate date, Long themeId) {
List<ReservationTimeEntity> allTimes = reservationTimeRepository.findAll(); List<ReservationTimeEntity> allTimes = reservationTimeRepository.findAll();
List<Reservation> reservations = reservationRepository.findByThemeId(themeId); List<ReservationEntity> reservations = reservationRepository.findByThemeId(themeId);
List<ReservationTimeInfoResponse> response = allTimes.stream() List<ReservationTimeInfoResponse> response = allTimes.stream()
.map(time -> new ReservationTimeInfoResponse(time.getId(), time.getStartAt(), .map(time -> new ReservationTimeInfoResponse(time.getId(), time.getStartAt(),
@ -95,7 +95,8 @@ public class ReservationTimeService {
return new ReservationTimeInfosResponse(response); 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() return reservations.stream()
.anyMatch(reservation -> reservation.isSameDateAndTime(date, time)); .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.PaymentApprove;
import roomescape.payment.web.PaymentCancel; import roomescape.payment.web.PaymentCancel;
import roomescape.payment.web.ReservationPaymentResponse; 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.ReservationRequest;
import roomescape.reservation.web.ReservationResponse; import roomescape.reservation.web.ReservationResponse;
@ -29,7 +29,7 @@ public class ReservationWithPaymentService {
public ReservationResponse addReservationWithPayment(ReservationRequest request, public ReservationResponse addReservationWithPayment(ReservationRequest request,
PaymentApprove.Response paymentInfo, PaymentApprove.Response paymentInfo,
Long memberId) { Long memberId) {
Reservation reservation = reservationService.addReservation(request, memberId); ReservationEntity reservation = reservationService.addReservation(request, memberId);
ReservationPaymentResponse reservationPaymentResponse = paymentService.savePayment(paymentInfo, reservation); ReservationPaymentResponse reservationPaymentResponse = paymentService.savePayment(paymentInfo, reservation);
return reservationPaymentResponse.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 com.fasterxml.jackson.annotation.JsonIgnore
import io.swagger.v3.oas.annotations.media.Schema
import org.springframework.http.HttpStatus; import jakarta.persistence.*
import roomescape.member.infrastructure.persistence.MemberEntity
import com.fasterxml.jackson.annotation.JsonIgnore; import roomescape.theme.infrastructure.persistence.ThemeEntity
import java.time.LocalDate
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;
@Entity @Entity
public class Reservation { @Table(name = "reservation")
class ReservationEntity(
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; var id: Long? = null,
private LocalDate date; var date: LocalDate,
@ManyToOne(fetch = FetchType.LAZY) @ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "time_id", nullable = false) @JoinColumn(name = "time_id", nullable = false)
private ReservationTimeEntity reservationTime; var reservationTime: ReservationTimeEntity,
@ManyToOne(fetch = FetchType.LAZY) @ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "theme_id", nullable = false) @JoinColumn(name = "theme_id", nullable = false)
private ThemeEntity theme; var theme: ThemeEntity,
@ManyToOne(fetch = FetchType.LAZY) @ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id", nullable = false) @JoinColumn(name = "member_id", nullable = false)
private MemberEntity member; var member: MemberEntity,
@Enumerated(value = EnumType.STRING) @Enumerated(value = EnumType.STRING)
private ReservationStatus reservationStatus; var reservationStatus: ReservationStatus
protected Reservation() {
}
public Reservation(
LocalDate date,
ReservationTimeEntity reservationTime,
ThemeEntity theme,
MemberEntity member,
ReservationStatus status
) { ) {
this(null, date, reservationTime, theme, member, status);
}
public Reservation( @JsonIgnore
Long id, fun isSameDateAndTime(date: LocalDate?, time: ReservationTimeEntity): Boolean {
LocalDate date, return this.date == date && time.startAt == this.reservationTime.startAt
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 @JsonIgnore
public boolean isSameDateAndTime(LocalDate date, ReservationTimeEntity time) { fun isWaiting(): Boolean = reservationStatus == ReservationStatus.WAITING
return this.date.equals(date) && time.getStartAt().equals(this.reservationTime.getStartAt());
}
@JsonIgnore @JsonIgnore
public boolean isWaiting() { fun isSameMember(memberId: Long): Boolean {
return reservationStatus == ReservationStatus.WAITING; return this.member.id == memberId
}
} }
@JsonIgnore @Schema(description = "예약 상태를 나타냅니다.", allowableValues = ["CONFIRMED", "CONFIRMED_PAYMENT_REQUIRED", "WAITING"])
public boolean isSameMember(Long memberId) { enum class ReservationStatus {
return getMemberId().equals(memberId); @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; 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 @Modifying
@Query(""" @Query("""
UPDATE Reservation r UPDATE ReservationEntity r
SET r.reservationStatus = :status SET r.reservationStatus = :status
WHERE r.id = :id WHERE r.id = :id
""") """)
@ -27,13 +28,13 @@ public interface ReservationRepository extends JpaRepository<Reservation, Long>,
@Query(""" @Query("""
SELECT EXISTS ( SELECT EXISTS (
SELECT 1 FROM Reservation r SELECT 1 FROM ReservationEntity r
WHERE r.theme.id = r2.theme.id WHERE r.theme.id = r2.theme.id
AND r.reservationTime.id = r2.reservationTime.id AND r.reservationTime.id = r2.reservationTime.id
AND r.date = r2.date AND r.date = r2.date
AND r.reservationStatus != 'WAITING' AND r.reservationStatus != 'WAITING'
) )
FROM Reservation r2 FROM ReservationEntity r2
WHERE r2.id = :id WHERE r2.id = :id
""") """)
boolean isExistConfirmedReservation(@Param("id") Long reservationId); boolean isExistConfirmedReservation(@Param("id") Long reservationId);
@ -45,11 +46,11 @@ public interface ReservationRepository extends JpaRepository<Reservation, Long>,
r.date, r.date,
r.reservationTime.startAt, r.reservationTime.startAt,
r.reservationStatus, 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.paymentKey,
p.totalAmount p.totalAmount
) )
FROM Reservation r FROM ReservationEntity r
JOIN r.theme t JOIN r.theme t
LEFT JOIN PaymentEntity p LEFT JOIN PaymentEntity p
ON p.reservation = r ON p.reservation = r

View File

@ -6,7 +6,7 @@ import roomescape.theme.infrastructure.persistence.ThemeEntity
import java.time.LocalDate import java.time.LocalDate
class ReservationSearchSpecification( class ReservationSearchSpecification(
private var spec: Specification<Reservation> = Specification { _, _, _ -> null } private var spec: Specification<ReservationEntity> = Specification { _, _, _ -> null }
) { ) {
fun sameThemeId(themeId: Long?): ReservationSearchSpecification = andIfNotNull(themeId?.let { fun sameThemeId(themeId: Long?): ReservationSearchSpecification = andIfNotNull(themeId?.let {
Specification { root, _, cb -> Specification { root, _, cb ->
@ -64,11 +64,11 @@ class ReservationSearchSpecification(
} }
}) })
fun build(): Specification<Reservation> { fun build(): Specification<ReservationEntity> {
return this.spec 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) } condition?.let { this.spec = this.spec.and(condition) }
return this 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 io.swagger.v3.oas.annotations.media.Schema
import roomescape.member.web.MemberResponse import roomescape.member.web.MemberResponse
import roomescape.member.web.MemberResponse.Companion.fromEntity 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.ReservationStatus
import roomescape.reservation.infrastructure.persistence.ReservationTimeEntity import roomescape.reservation.infrastructure.persistence.ReservationTimeEntity
import roomescape.theme.web.ThemeResponse import roomescape.theme.web.ThemeResponse
@ -73,9 +73,9 @@ data class ReservationResponse(
) { ) {
companion object { companion object {
@JvmStatic @JvmStatic
fun from(reservation: Reservation): ReservationResponse { fun from(reservation: ReservationEntity): ReservationResponse {
return ReservationResponse( return ReservationResponse(
reservation.id, reservation.id!!,
reservation.date, reservation.date,
fromEntity(reservation.member), fromEntity(reservation.member),
ReservationTimeResponse.Companion.from(reservation.reservationTime), ReservationTimeResponse.Companion.from(reservation.reservationTime),

View File

@ -9,7 +9,7 @@ interface ThemeRepository : JpaRepository<ThemeEntity, Long> {
@Query(value = """ @Query(value = """
SELECT t SELECT t
FROM ThemeEntity 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 WHERE r.date BETWEEN :startDate AND :endDate
GROUP BY r.theme.id GROUP BY r.theme.id
ORDER BY COUNT(r.theme.id) DESC, t.id ASC ORDER BY COUNT(r.theme.id) DESC, t.id ASC
@ -24,7 +24,7 @@ interface ThemeRepository : JpaRepository<ThemeEntity, Long> {
@Query(value = """ @Query(value = """
SELECT EXISTS( SELECT EXISTS(
SELECT 1 SELECT 1
FROM Reservation r FROM ReservationEntity r
WHERE r.theme.id = :id 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.PaymentApprove;
import roomescape.payment.web.PaymentCancel; import roomescape.payment.web.PaymentCancel;
import roomescape.payment.web.ReservationPaymentResponse; 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.ReservationRepository;
import roomescape.reservation.infrastructure.persistence.ReservationStatus; import roomescape.reservation.infrastructure.persistence.ReservationStatus;
import roomescape.reservation.infrastructure.persistence.ReservationTimeEntity; import roomescape.reservation.infrastructure.persistence.ReservationTimeEntity;
@ -55,11 +55,13 @@ class PaymentServiceTest {
OffsetDateTime.now(), 10000L); OffsetDateTime.now(), 10000L);
LocalDateTime localDateTime = LocalDateTime.now().plusHours(1L); LocalDateTime localDateTime = LocalDateTime.now().plusHours(1L);
LocalDate date = localDateTime.toLocalDate(); 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( MemberEntity member = memberRepository.save(
new MemberEntity(null, "member", "email@email.com", "password", Role.MEMBER)); new MemberEntity(null, "member", "email@email.com", "password", Role.MEMBER));
ThemeEntity theme = themeRepository.save(new ThemeEntity(null, "name", "desc", "thumbnail")); ThemeEntity theme = themeRepository.save(new ThemeEntity(null, "name", "desc", "thumbnail"));
Reservation reservation = reservationRepository.save(new Reservation(date, time, theme, member, ReservationEntity reservation = reservationRepository.save(
new ReservationEntity(null, date, time, theme, member,
ReservationStatus.CONFIRMED)); ReservationStatus.CONFIRMED));
// when // when
@ -78,11 +80,13 @@ class PaymentServiceTest {
OffsetDateTime.now(), 10000L); OffsetDateTime.now(), 10000L);
LocalDateTime localDateTime = LocalDateTime.now().plusHours(1L); LocalDateTime localDateTime = LocalDateTime.now().plusHours(1L);
LocalDate date = localDateTime.toLocalDate(); 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( MemberEntity member = memberRepository.save(
new MemberEntity(null, "member", "email@email.com", "password", Role.MEMBER)); new MemberEntity(null, "member", "email@email.com", "password", Role.MEMBER));
ThemeEntity theme = themeRepository.save(new ThemeEntity(null, "name", "desc", "thumbnail")); ThemeEntity theme = themeRepository.save(new ThemeEntity(null, "name", "desc", "thumbnail"));
Reservation reservation = reservationRepository.save(new Reservation(date, time, theme, member, ReservationEntity reservation = reservationRepository.save(
new ReservationEntity(null, date, time, theme, member,
ReservationStatus.CONFIRMED)); ReservationStatus.CONFIRMED));
paymentService.savePayment(paymentInfo, reservation); paymentService.savePayment(paymentInfo, reservation);
@ -116,11 +120,13 @@ class PaymentServiceTest {
OffsetDateTime.now(), 10000L); OffsetDateTime.now(), 10000L);
LocalDateTime localDateTime = LocalDateTime.now().plusHours(1L); LocalDateTime localDateTime = LocalDateTime.now().plusHours(1L);
LocalDate date = localDateTime.toLocalDate(); 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( MemberEntity member = memberRepository.save(
new MemberEntity(null, "member", "email@email.com", "password", Role.MEMBER)); new MemberEntity(null, "member", "email@email.com", "password", Role.MEMBER));
ThemeEntity theme = themeRepository.save(new ThemeEntity(null, "name", "desc", "thumbnail")); ThemeEntity theme = themeRepository.save(new ThemeEntity(null, "name", "desc", "thumbnail"));
Reservation reservation = reservationRepository.save(new Reservation(date, time, theme, member, ReservationEntity reservation = reservationRepository.save(
new ReservationEntity(null, date, time, theme, member,
ReservationStatus.CONFIRMED)); ReservationStatus.CONFIRMED));
paymentService.savePayment(paymentInfo, reservation); paymentService.savePayment(paymentInfo, reservation);

View File

@ -98,6 +98,6 @@ class PaymentRepositoryTest(
entityManager.flush() entityManager.flush()
entityManager.clear() 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.MemberEntity;
import roomescape.member.infrastructure.persistence.MemberRepository; import roomescape.member.infrastructure.persistence.MemberRepository;
import roomescape.member.infrastructure.persistence.Role; 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.ReservationRepository;
import roomescape.reservation.infrastructure.persistence.ReservationStatus; import roomescape.reservation.infrastructure.persistence.ReservationStatus;
import roomescape.reservation.infrastructure.persistence.ReservationTimeEntity; import roomescape.reservation.infrastructure.persistence.ReservationTimeEntity;
@ -233,7 +233,7 @@ class ReservationServiceTest {
reservationService.approveWaiting(waiting.id, admin.getId()); reservationService.approveWaiting(waiting.id, admin.getId());
// then // then
Reservation confirmed = reservationRepository.findById(waiting.id).get(); ReservationEntity confirmed = reservationRepository.findById(waiting.id).get();
assertThat(confirmed.getReservationStatus()).isEqualTo(ReservationStatus.CONFIRMED_PAYMENT_REQUIRED); 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.MemberEntity;
import roomescape.member.infrastructure.persistence.MemberRepository; import roomescape.member.infrastructure.persistence.MemberRepository;
import roomescape.member.infrastructure.persistence.Role; 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.ReservationRepository;
import roomescape.reservation.infrastructure.persistence.ReservationStatus; import roomescape.reservation.infrastructure.persistence.ReservationStatus;
import roomescape.reservation.infrastructure.persistence.ReservationTimeEntity; import roomescape.reservation.infrastructure.persistence.ReservationTimeEntity;
@ -57,7 +57,8 @@ class ReservationTimeServiceTest {
@DisplayName("존재하지 않는 ID로 시간을 조회하면 예외가 발생한다.") @DisplayName("존재하지 않는 ID로 시간을 조회하면 예외가 발생한다.")
void findTimeByIdFail() { void findTimeByIdFail() {
// given // given
ReservationTimeEntity saved = reservationTimeRepository.save(new ReservationTimeEntity(null, LocalTime.of(12, 30))); ReservationTimeEntity saved = reservationTimeRepository.save(
new ReservationTimeEntity(null, LocalTime.of(12, 30)));
// when // when
Long invalidTimeId = saved.getId() + 1; Long invalidTimeId = saved.getId() + 1;
@ -79,7 +80,8 @@ class ReservationTimeServiceTest {
new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER)); new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
// when // when
reservationRepository.save(new Reservation(localDateTime.toLocalDate(), reservationTime, theme, member, reservationRepository.save(
new ReservationEntity(null, localDateTime.toLocalDate(), reservationTime, theme, member,
ReservationStatus.CONFIRMED)); ReservationStatus.CONFIRMED));
// then // then

View File

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

View File

@ -21,9 +21,9 @@ class ReservationSearchSpecificationTest(
) : StringSpec() { ) : StringSpec() {
init { init {
lateinit var confirmedNow: Reservation lateinit var confirmedNow: ReservationEntity
lateinit var confirmedNotPaidYesterday: Reservation lateinit var confirmedNotPaidYesterday: ReservationEntity
lateinit var waitingTomorrow: Reservation lateinit var waitingTomorrow: ReservationEntity
lateinit var member: MemberEntity lateinit var member: MemberEntity
lateinit var reservationTime: ReservationTimeEntity lateinit var reservationTime: ReservationTimeEntity
lateinit var theme: ThemeEntity lateinit var theme: ThemeEntity
@ -33,7 +33,7 @@ class ReservationSearchSpecificationTest(
.sameThemeId(theme.id) .sameThemeId(theme.id)
.build() .build()
val results: List<Reservation> = reservationRepository.findAll(spec) val results: List<ReservationEntity> = reservationRepository.findAll(spec)
assertSoftly(results) { assertSoftly(results) {
this shouldHaveSize 3 this shouldHaveSize 3
@ -46,7 +46,7 @@ class ReservationSearchSpecificationTest(
.sameMemberId(member.id) .sameMemberId(member.id)
.build() .build()
val results: List<Reservation> = reservationRepository.findAll(spec) val results: List<ReservationEntity> = reservationRepository.findAll(spec)
assertSoftly(results) { assertSoftly(results) {
this shouldHaveSize 3 this shouldHaveSize 3
@ -59,7 +59,7 @@ class ReservationSearchSpecificationTest(
.sameTimeId(reservationTime.id) .sameTimeId(reservationTime.id)
.build() .build()
val results: List<Reservation> = reservationRepository.findAll(spec) val results: List<ReservationEntity> = reservationRepository.findAll(spec)
assertSoftly(results) { assertSoftly(results) {
this shouldHaveSize 3 this shouldHaveSize 3
@ -72,7 +72,7 @@ class ReservationSearchSpecificationTest(
.sameDate(LocalDate.now()) .sameDate(LocalDate.now())
.build() .build()
val results: List<Reservation> = reservationRepository.findAll(spec) val results: List<ReservationEntity> = reservationRepository.findAll(spec)
assertSoftly(results) { assertSoftly(results) {
this shouldHaveSize 1 this shouldHaveSize 1
@ -85,7 +85,7 @@ class ReservationSearchSpecificationTest(
.confirmed() .confirmed()
.build() .build()
val results: List<Reservation> = reservationRepository.findAll(spec) val results: List<ReservationEntity> = reservationRepository.findAll(spec)
assertSoftly(results) { assertSoftly(results) {
this shouldHaveSize 2 this shouldHaveSize 2
@ -98,7 +98,7 @@ class ReservationSearchSpecificationTest(
.waiting() .waiting()
.build() .build()
val results: List<Reservation> = reservationRepository.findAll(spec) val results: List<ReservationEntity> = reservationRepository.findAll(spec)
assertSoftly(results) { assertSoftly(results) {
this shouldHaveSize 1 this shouldHaveSize 1
@ -111,7 +111,7 @@ class ReservationSearchSpecificationTest(
.dateStartFrom(LocalDate.now()) .dateStartFrom(LocalDate.now())
.build() .build()
val results: List<Reservation> = reservationRepository.findAll(spec) val results: List<ReservationEntity> = reservationRepository.findAll(spec)
assertSoftly(results) { assertSoftly(results) {
this shouldHaveSize 2 this shouldHaveSize 2
@ -124,7 +124,7 @@ class ReservationSearchSpecificationTest(
.dateEndAt(LocalDate.now().plusDays(1)) .dateEndAt(LocalDate.now().plusDays(1))
.build() .build()
val results: List<Reservation> = reservationRepository.findAll(spec) val results: List<ReservationEntity> = reservationRepository.findAll(spec)
assertSoftly(results) { assertSoftly(results) {
this shouldHaveSize 3 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.infrastructure.persistence.PaymentRepository;
import roomescape.payment.web.PaymentApprove; import roomescape.payment.web.PaymentApprove;
import roomescape.payment.web.PaymentCancel; 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.ReservationRepository;
import roomescape.reservation.infrastructure.persistence.ReservationStatus; import roomescape.reservation.infrastructure.persistence.ReservationStatus;
import roomescape.reservation.infrastructure.persistence.ReservationTimeEntity; import roomescape.reservation.infrastructure.persistence.ReservationTimeEntity;
@ -129,10 +129,11 @@ public class ReservationControllerTest {
new MemberEntity(null, "name1", "email1r@email.com", "password", Role.MEMBER)); new MemberEntity(null, "name1", "email1r@email.com", "password", Role.MEMBER));
// when // when
reservationRepository.save(new Reservation(LocalDate.now().plusDays(1), reservationTime, theme, member1, reservationRepository.save(
new ReservationEntity(null, LocalDate.now().plusDays(1), reservationTime, theme, member1,
ReservationStatus.CONFIRMED)); ReservationStatus.CONFIRMED));
Reservation waiting = reservationRepository.save( ReservationEntity waiting = reservationRepository.save(
new Reservation(LocalDate.now().plusDays(1), reservationTime, theme, member, new ReservationEntity(null, LocalDate.now().plusDays(1), reservationTime, theme, member,
ReservationStatus.WAITING)); ReservationStatus.WAITING));
// then // then
@ -159,10 +160,11 @@ public class ReservationControllerTest {
new MemberEntity(null, "name1", "email1r@email.com", "password", Role.MEMBER)); new MemberEntity(null, "name1", "email1r@email.com", "password", Role.MEMBER));
// when // when
reservationRepository.save(new Reservation(LocalDate.now().plusDays(1), reservationTime, theme, confirmedMember, reservationRepository.save(
new ReservationEntity(null, LocalDate.now().plusDays(1), reservationTime, theme, confirmedMember,
ReservationStatus.CONFIRMED)); ReservationStatus.CONFIRMED));
Reservation waiting = reservationRepository.save( ReservationEntity waiting = reservationRepository.save(
new Reservation(LocalDate.now().plusDays(1), reservationTime, theme, waitingMember, new ReservationEntity(null, LocalDate.now().plusDays(1), reservationTime, theme, waitingMember,
ReservationStatus.WAITING)); ReservationStatus.WAITING));
// then // then
@ -188,10 +190,12 @@ public class ReservationControllerTest {
// when // when
reservationRepository.save( reservationRepository.save(
new Reservation(LocalDate.now(), reservationTime, theme, member, ReservationStatus.CONFIRMED)); new ReservationEntity(null, LocalDate.now(), reservationTime, theme, member, ReservationStatus.CONFIRMED));
reservationRepository.save(new Reservation(LocalDate.now().plusDays(1), reservationTime, theme, member, reservationRepository.save(
new ReservationEntity(null, LocalDate.now().plusDays(1), reservationTime, theme, member,
ReservationStatus.CONFIRMED)); ReservationStatus.CONFIRMED));
reservationRepository.save(new Reservation(LocalDate.now().plusDays(2), reservationTime, theme, member, reservationRepository.save(
new ReservationEntity(null, LocalDate.now().plusDays(2), reservationTime, theme, member,
ReservationStatus.CONFIRMED)); ReservationStatus.CONFIRMED));
// then // then
@ -215,8 +219,8 @@ public class ReservationControllerTest {
ReservationTimeEntity reservationTime = reservationTimeRepository.save( ReservationTimeEntity reservationTime = reservationTimeRepository.save(
new ReservationTimeEntity(null, LocalTime.of(17, 30))); new ReservationTimeEntity(null, LocalTime.of(17, 30)));
ThemeEntity theme = themeRepository.save(new ThemeEntity(null, "테마명", "설명", "썸네일URL")); ThemeEntity theme = themeRepository.save(new ThemeEntity(null, "테마명", "설명", "썸네일URL"));
Reservation reservation = reservationRepository.save( ReservationEntity reservation = reservationRepository.save(
new Reservation(LocalDate.now(), reservationTime, theme, member, ReservationStatus.CONFIRMED)); new ReservationEntity(null, LocalDate.now(), reservationTime, theme, member, ReservationStatus.CONFIRMED));
// when & then // when & then
RestAssured.given().log().all() RestAssured.given().log().all()
@ -242,9 +246,11 @@ public class ReservationControllerTest {
new MemberEntity(null, "name1", "email1@email.com", "password", Role.MEMBER)); new MemberEntity(null, "name1", "email1@email.com", "password", Role.MEMBER));
reservationRepository.save( reservationRepository.save(
new Reservation(LocalDate.now(), reservationTime, theme, confirmedMember, ReservationStatus.CONFIRMED)); new ReservationEntity(null, LocalDate.now(), reservationTime, theme, confirmedMember,
Reservation waiting = reservationRepository.save( ReservationStatus.CONFIRMED));
new Reservation(LocalDate.now(), reservationTime, theme, waitingMember, ReservationStatus.WAITING)); ReservationEntity waiting = reservationRepository.save(
new ReservationEntity(null, LocalDate.now(), reservationTime, theme, waitingMember,
ReservationStatus.WAITING));
// when & then // when & then
RestAssured.given().log().all() RestAssured.given().log().all()
@ -269,8 +275,9 @@ public class ReservationControllerTest {
MemberEntity anotherMember = memberRepository.save( MemberEntity anotherMember = memberRepository.save(
new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER)); new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
Reservation reservation = reservationRepository.save( ReservationEntity reservation = reservationRepository.save(
new Reservation(LocalDate.now(), reservationTime, theme, anotherMember, ReservationStatus.CONFIRMED)); new ReservationEntity(null, LocalDate.now(), reservationTime, theme, anotherMember,
ReservationStatus.CONFIRMED));
// when & then // when & then
RestAssured.given().log().all() RestAssured.given().log().all()
@ -359,10 +366,10 @@ public class ReservationControllerTest {
String accessToken = getAccessTokenCookieByLogin("email@email.com", "password"); String accessToken = getAccessTokenCookieByLogin("email@email.com", "password");
// when : 예약은 2개, 예약 대기는 1개 조회되어야 한다. // 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( reservationRepository.save(
new Reservation(date, time1, theme, member, ReservationStatus.CONFIRMED_PAYMENT_REQUIRED)); new ReservationEntity(null, date, time1, theme, member, ReservationStatus.CONFIRMED_PAYMENT_REQUIRED));
reservationRepository.save(new Reservation(date, time2, theme, member, ReservationStatus.WAITING)); reservationRepository.save(new ReservationEntity(null, date, time2, theme, member, ReservationStatus.WAITING));
// then // then
RestAssured.given().log().all() RestAssured.given().log().all()
@ -385,7 +392,7 @@ public class ReservationControllerTest {
String accessToken = getAdminAccessTokenCookieByLogin("admin@email.com", "password"); String accessToken = getAdminAccessTokenCookieByLogin("admin@email.com", "password");
// when // 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)), memberRepository.save(new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER)),
ReservationStatus.CONFIRMED_PAYMENT_REQUIRED)); ReservationStatus.CONFIRMED_PAYMENT_REQUIRED));
@ -410,8 +417,8 @@ public class ReservationControllerTest {
MemberEntity member = memberRepository.save( MemberEntity member = memberRepository.save(
new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER)); new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
Reservation saved = reservationRepository.save( ReservationEntity saved = reservationRepository.save(
new Reservation(date, time, theme, member, ReservationStatus.CONFIRMED)); new ReservationEntity(null, date, time, theme, member, ReservationStatus.CONFIRMED));
PaymentEntity savedPaymentEntity = paymentRepository.save( PaymentEntity savedPaymentEntity = paymentRepository.save(
new PaymentEntity(null, "pk", "oi", 1000L, saved, OffsetDateTime.now().minusHours(1L))); 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)); new MemberEntity(null, "name1", "email1@email.com", "password", Role.MEMBER));
String accessToken = getAccessTokenCookieByLogin(member.getEmail(), member.getPassword()); 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 // when & then
RestAssured.given().log().all() RestAssured.given().log().all()
@ -567,8 +575,8 @@ public class ReservationControllerTest {
new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER)); new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
String accessToken = getAdminAccessTokenCookieByLogin("admin@email.com", "password"); String accessToken = getAdminAccessTokenCookieByLogin("admin@email.com", "password");
Reservation waiting = reservationRepository.save( ReservationEntity waiting = reservationRepository.save(
new Reservation(date, time, theme, member, ReservationStatus.WAITING)); new ReservationEntity(null, date, time, theme, member, ReservationStatus.WAITING));
// when // when
RestAssured.given().log().all() 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.MemberEntity;
import roomescape.member.infrastructure.persistence.MemberRepository; import roomescape.member.infrastructure.persistence.MemberRepository;
import roomescape.member.infrastructure.persistence.Role; 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.ReservationRepository;
import roomescape.reservation.infrastructure.persistence.ReservationStatus; import roomescape.reservation.infrastructure.persistence.ReservationStatus;
import roomescape.reservation.infrastructure.persistence.ReservationTimeEntity; import roomescape.reservation.infrastructure.persistence.ReservationTimeEntity;
@ -221,19 +221,25 @@ public class ReservationTimeControllerTest {
void readReservationByDateAndThemeId() { void readReservationByDateAndThemeId() {
// given // given
LocalDate today = LocalDate.now(); LocalDate today = LocalDate.now();
ReservationTimeEntity reservationTime1 = reservationTimeRepository.save(new ReservationTimeEntity(null, LocalTime.of(17, 0))); ReservationTimeEntity reservationTime1 = reservationTimeRepository.save(
ReservationTimeEntity reservationTime2 = reservationTimeRepository.save(new ReservationTimeEntity(null, LocalTime.of(17, 30))); new ReservationTimeEntity(null, LocalTime.of(17, 0)));
ReservationTimeEntity reservationTime3 = reservationTimeRepository.save(new ReservationTimeEntity(null, LocalTime.of(18, 30))); 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")); ThemeEntity theme = themeRepository.save(new ThemeEntity(null, "테마명1", "설명", "썸네일URL"));
MemberEntity member = memberRepository.save( MemberEntity member = memberRepository.save(
new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER)); new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
reservationRepository.save( 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( 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( 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 // when & then
RestAssured.given().log().all() 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.infrastructure.persistence.PaymentEntity
import roomescape.payment.web.PaymentApprove import roomescape.payment.web.PaymentApprove
import roomescape.payment.web.PaymentCancel 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.ReservationStatus
import roomescape.reservation.infrastructure.persistence.ReservationTimeEntity import roomescape.reservation.infrastructure.persistence.ReservationTimeEntity
import roomescape.theme.infrastructure.persistence.ThemeEntity import roomescape.theme.infrastructure.persistence.ThemeEntity
@ -75,7 +75,7 @@ object ReservationFixture {
reservationTime: ReservationTimeEntity = ReservationTimeFixture.create(), reservationTime: ReservationTimeEntity = ReservationTimeFixture.create(),
member: MemberEntity = MemberFixture.create(), member: MemberEntity = MemberFixture.create(),
status: ReservationStatus = ReservationStatus.CONFIRMED_PAYMENT_REQUIRED status: ReservationStatus = ReservationStatus.CONFIRMED_PAYMENT_REQUIRED
): Reservation = Reservation(id, date, reservationTime, theme, member, status) ): ReservationEntity = ReservationEntity(id, date, reservationTime, theme, member, status)
} }
object JwtFixture { object JwtFixture {