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

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

View File

@ -3,6 +3,7 @@ package roomescape.member.infrastructure.persistence
import jakarta.persistence.*
@Entity
@Table(name = "member")
class MemberEntity(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)

View File

@ -4,7 +4,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties
import com.fasterxml.jackson.databind.annotation.JsonDeserialize
import roomescape.payment.infrastructure.client.PaymentCancelResponseDeserializer
import roomescape.payment.infrastructure.persistence.PaymentEntity
import roomescape.reservation.web.response.ReservationResponse
import roomescape.reservation.web.ReservationResponse
import java.time.OffsetDateTime
class PaymentApprove {

View File

@ -14,18 +14,18 @@ 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.ReservationStatus;
import roomescape.reservation.infrastructure.persistence.ReservationTime;
import roomescape.reservation.infrastructure.persistence.ReservationRepository;
import roomescape.reservation.infrastructure.persistence.ReservationSearchSpecification;
import roomescape.reservation.web.request.AdminReservationRequest;
import roomescape.reservation.web.request.ReservationRequest;
import roomescape.reservation.web.request.WaitingRequest;
import roomescape.reservation.web.response.MyReservationsResponse;
import roomescape.reservation.web.response.ReservationResponse;
import roomescape.reservation.web.response.ReservationsResponse;
import roomescape.theme.infrastructure.persistence.ThemeEntity;
import roomescape.reservation.infrastructure.persistence.ReservationStatus;
import roomescape.reservation.infrastructure.persistence.ReservationTime;
import roomescape.reservation.web.AdminReservationRequest;
import roomescape.reservation.web.MyReservationsResponse;
import roomescape.reservation.web.ReservationRequest;
import roomescape.reservation.web.ReservationResponse;
import roomescape.reservation.web.ReservationsResponse;
import roomescape.reservation.web.WaitingRequest;
import roomescape.theme.business.ThemeService;
import roomescape.theme.infrastructure.persistence.ThemeEntity;
@Service
@Transactional
@ -77,21 +77,21 @@ public class ReservationService {
}
public Reservation addReservation(ReservationRequest request, Long memberId) {
validateIsReservationExist(request.themeId(), request.timeId(), request.date());
Reservation reservation = getReservationForSave(request.timeId(), request.themeId(), request.date(), memberId,
validateIsReservationExist(request.themeId, request.timeId, request.date);
Reservation reservation = getReservationForSave(request.timeId, request.themeId, request.date, memberId,
ReservationStatus.CONFIRMED);
return reservationRepository.save(reservation);
}
public ReservationResponse addReservationByAdmin(AdminReservationRequest request) {
validateIsReservationExist(request.themeId(), request.timeId(), request.date());
return addReservationWithoutPayment(request.themeId(), request.timeId(), request.date(),
request.memberId(), ReservationStatus.CONFIRMED_PAYMENT_REQUIRED);
validateIsReservationExist(request.themeId, request.timeId, request.date);
return addReservationWithoutPayment(request.themeId, request.timeId, request.date,
request.memberId, ReservationStatus.CONFIRMED_PAYMENT_REQUIRED);
}
public ReservationResponse addWaiting(WaitingRequest request, Long memberId) {
validateMemberAlreadyReserve(request.themeId(), request.timeId(), request.date(), memberId);
return addReservationWithoutPayment(request.themeId(), request.timeId(), request.date(), memberId,
validateMemberAlreadyReserve(request.themeId, request.timeId, request.date, memberId);
return addReservationWithoutPayment(request.themeId, request.timeId, request.date, memberId,
ReservationStatus.WAITING);
}

View File

@ -10,14 +10,14 @@ 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.ReservationTime;
import roomescape.reservation.infrastructure.persistence.ReservationRepository;
import roomescape.reservation.infrastructure.persistence.ReservationTime;
import roomescape.reservation.infrastructure.persistence.ReservationTimeRepository;
import roomescape.reservation.web.request.ReservationTimeRequest;
import roomescape.reservation.web.response.ReservationTimeInfoResponse;
import roomescape.reservation.web.response.ReservationTimeInfosResponse;
import roomescape.reservation.web.response.ReservationTimeResponse;
import roomescape.reservation.web.response.ReservationTimesResponse;
import roomescape.reservation.web.ReservationTimeInfoResponse;
import roomescape.reservation.web.ReservationTimeInfosResponse;
import roomescape.reservation.web.ReservationTimeRequest;
import roomescape.reservation.web.ReservationTimeResponse;
import roomescape.reservation.web.ReservationTimesResponse;
@Service
@Transactional
@ -53,18 +53,20 @@ public class ReservationTimeService {
public ReservationTimeResponse addTime(ReservationTimeRequest reservationTimeRequest) {
validateTimeDuplication(reservationTimeRequest);
ReservationTime reservationTime = reservationTimeRepository.save(reservationTimeRequest.toTime());
ReservationTime reservationTime = reservationTimeRepository.save(
new ReservationTime(reservationTimeRequest.startAt)
);
return ReservationTimeResponse.from(reservationTime);
}
private void validateTimeDuplication(ReservationTimeRequest reservationTimeRequest) {
List<ReservationTime> duplicateReservationTimes = reservationTimeRepository.findByStartAt(
reservationTimeRequest.startAt());
reservationTimeRequest.startAt);
if (!duplicateReservationTimes.isEmpty()) {
throw new RoomescapeException(ErrorType.TIME_DUPLICATED,
String.format("[startAt: %s]", reservationTimeRequest.startAt()), HttpStatus.CONFLICT);
String.format("[startAt: %s]", reservationTimeRequest.startAt), HttpStatus.CONFLICT);
}
}

View File

@ -10,8 +10,8 @@ import roomescape.payment.web.PaymentApprove;
import roomescape.payment.web.PaymentCancel;
import roomescape.payment.web.ReservationPaymentResponse;
import roomescape.reservation.infrastructure.persistence.Reservation;
import roomescape.reservation.web.request.ReservationRequest;
import roomescape.reservation.web.response.ReservationResponse;
import roomescape.reservation.web.ReservationRequest;
import roomescape.reservation.web.ReservationResponse;
@Service
@Transactional

View File

@ -8,7 +8,7 @@ import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import roomescape.reservation.web.response.MyReservationResponse;
import roomescape.reservation.web.MyReservationResponse;
public interface ReservationRepository extends JpaRepository<Reservation, Long>, JpaSpecificationExecutor<Reservation> {
@ -39,13 +39,13 @@ public interface ReservationRepository extends JpaRepository<Reservation, Long>,
boolean isExistConfirmedReservation(@Param("id") Long reservationId);
@Query("""
SELECT new roomescape.reservation.dto.response.MyReservationResponse(
SELECT new roomescape.reservation.web.MyReservationResponse(
r.id,
t.name,
r.date,
r.reservationTime.startAt,
r.reservationStatus,
(SELECT COUNT (r2) 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 Reservation 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
)

View File

@ -33,12 +33,6 @@ import roomescape.common.exception.RoomescapeException;
import roomescape.payment.infrastructure.client.TossPaymentClient;
import roomescape.payment.web.PaymentApprove;
import roomescape.payment.web.PaymentCancel;
import roomescape.reservation.web.request.AdminReservationRequest;
import roomescape.reservation.web.request.ReservationRequest;
import roomescape.reservation.web.request.WaitingRequest;
import roomescape.reservation.web.response.MyReservationsResponse;
import roomescape.reservation.web.response.ReservationResponse;
import roomescape.reservation.web.response.ReservationsResponse;
import roomescape.reservation.business.ReservationService;
import roomescape.reservation.business.ReservationWithPaymentService;
@ -142,7 +136,7 @@ public class ReservationController {
@MemberId @Parameter(hidden = true) Long memberId,
HttpServletResponse response
) {
PaymentApprove.Request paymentRequest = reservationRequest.getPaymentRequest();
PaymentApprove.Request paymentRequest = reservationRequest.paymentRequest();
PaymentApprove.Response paymentResponse = paymentClient.confirmPayment(paymentRequest);
try {
@ -265,7 +259,7 @@ public class ReservationController {
ReservationResponse reservationResponse,
HttpServletResponse response
) {
response.setHeader(HttpHeaders.LOCATION, "/reservations/" + reservationResponse.id());
response.setHeader(HttpHeaders.LOCATION, "/reservations/" + reservationResponse.id);
return RoomescapeApiResponse.success(reservationResponse);
}
}

View File

@ -0,0 +1,66 @@
package roomescape.reservation.web
import com.fasterxml.jackson.annotation.JsonIgnore
import io.swagger.v3.oas.annotations.media.Schema
import roomescape.payment.web.PaymentApprove
import java.time.LocalDate
@Schema(name = "관리자 예약 저장 요청", description = "관리자의 예약 저장 요청시 사용됩니다.")
@JvmRecord
data class AdminReservationRequest(
@JvmField @field:Schema(description = "예약 날짜. 지난 날짜는 지정할 수 없으며, yyyy-MM-dd 형식으로 입력해야 합니다.", type = "string", example = "2022-12-31")
val date: LocalDate,
@JvmField @field:Schema(description = "예약 시간 ID.", example = "1")
val timeId: Long,
@JvmField @field:Schema(description = "테마 ID", example = "1")
val themeId: Long,
@JvmField @field:Schema(description = "회원 ID", example = "1")
val memberId: Long
)
@Schema(name = "회원의 예약 저장 요청", description = "회원의 예약 요청시 사용됩니다.")
@JvmRecord
data class ReservationRequest(
@JvmField
@field:Schema(description = "예약 날짜. 지난 날짜는 지정할 수 없으며, yyyy-MM-dd 형식으로 입력해야 합니다.", type = "string", example = "2022-12-31")
val date: LocalDate,
@JvmField
@field:Schema(description = "예약 시간 ID.", example = "1")
val timeId: Long,
@JvmField @field:Schema(description = "테마 ID", example = "1")
val themeId: Long,
@field:Schema(description = "결제 위젯을 통해 받은 결제 키")
val paymentKey: String,
@field:Schema(description = "결제 위젯을 통해 받은 주문번호.")
val orderId: String,
@field:Schema(description = "결제 위젯을 통해 받은 결제 금액")
val amount: Long,
@field:Schema(description = "결제 타입", example = "NORMAL")
val paymentType: String
) {
@get:JsonIgnore
val paymentRequest: PaymentApprove.Request
get() = PaymentApprove.Request(paymentKey, orderId, amount, paymentType)
}
@Schema(name = "예약 대기 저장 요청", description = "회원의 예약 대기 요청시 사용됩니다.")
@JvmRecord
data class WaitingRequest(
@JvmField
@field:Schema(description = "예약 날짜. 지난 날짜는 지정할 수 없으며, yyyy-MM-dd 형식으로 입력해야 합니다.", type = "string", example = "2022-12-31")
val date: LocalDate,
@JvmField
@field:Schema(description = "예약 시간 ID", example = "1")
val timeId: Long,
@JvmField
@field:Schema(description = "테마 ID", example = "1")
val themeId: Long
)

View File

@ -0,0 +1,113 @@
package roomescape.reservation.web
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.ReservationStatus
import roomescape.reservation.infrastructure.persistence.ReservationTime
import roomescape.theme.web.ThemeResponse
import java.time.LocalDate
import java.time.LocalTime
@Schema(name = "회원의 예약 및 대기 응답", description = "회원의 예약 및 대기 정보 응답시 사용됩니다.")
@JvmRecord
data class MyReservationResponse(
@field:Schema(description = "예약 번호. 예약을 식별할 때 사용합니다.")
val id: Long,
@field:Schema(description = "테마 이름")
val themeName: String,
@field:Schema(description = "예약 날짜", type = "string", example = "2022-12-31")
val date: LocalDate,
@field:Schema(description = "예약 시간", type = "string", example = "09:00")
val time: LocalTime,
@field:Schema(description = "예약 상태", type = "string")
val status: ReservationStatus,
@field:Schema(description = "예약 대기 상태일 때의 대기 순번. 확정된 예약은 0의 값을 가집니다.")
val rank: Long,
@field:Schema(description = "결제 키. 결제가 완료된 예약에만 값이 존재합니다.")
val paymentKey: String?,
@field:Schema(description = "결제 금액. 결제가 완료된 예약에만 값이 존재합니다.")
val amount: Long?
)
@Schema(name = "회원의 예약 및 대기 목록 조회 응답", description = "회원의 예약 및 대기 목록 조회 응답시 사용됩니다.")
@JvmRecord
data class MyReservationsResponse(
@field:Schema(description = "현재 로그인한 회원의 예약 및 대기 목록")
val myReservationResponses: List<MyReservationResponse>
)
@Schema(name = "예약 정보", description = "예약 저장 및 조회 응답에 사용됩니다.")
@JvmRecord
data class ReservationResponse(
@JvmField
@field:Schema(description = "예약 번호. 예약을 식별할 때 사용합니다.")
val id: Long,
@field:Schema(description = "예약 날짜", type = "string", example = "2022-12-31")
val date: LocalDate,
@field:Schema(description = "예약한 회원 정보")
@field:JsonProperty("member")
val member: MemberResponse,
@field:Schema(description = "예약 시간 정보")
@field:JsonProperty("time")
val time: ReservationTimeResponse,
@field:Schema(description = "예약한 테마 정보")
@field:JsonProperty("theme")
val theme: ThemeResponse,
@field:Schema(description = "예약 상태", type = "string")
val status: ReservationStatus
) {
companion object {
@JvmStatic
fun from(reservation: Reservation): ReservationResponse {
return ReservationResponse(
reservation.id,
reservation.date,
fromEntity(reservation.member),
ReservationTimeResponse.Companion.from(reservation.reservationTime),
ThemeResponse.Companion.from(reservation.theme),
reservation.reservationStatus
)
}
}
}
@Schema(name = "예약 목록 조회 응답", description = "모든 예약 정보 조회 응답시 사용됩니다.")
@JvmRecord
data class ReservationsResponse(
@field:Schema(description = "모든 예약 및 대기 목록")
val reservations: List<ReservationResponse>
)
@Schema(name = "예약 시간 정보", description = "예약 시간 추가 및 조회 응답시 사용됩니다.")
@JvmRecord
data class ReservationTimeResponse(
@JvmField
@field:Schema(description = "예약 시간 번호. 예약 시간을 식별할 때 사용합니다.")
val id: Long,
@field:Schema(description = "예약 시간", type = "string", example = "09:00")
val startAt: LocalTime
) {
companion object {
@JvmStatic
fun from(reservationTime: ReservationTime): ReservationTimeResponse {
return ReservationTimeResponse(reservationTime.id, reservationTime.startAt)
}
}
}

View File

@ -27,10 +27,6 @@ import roomescape.auth.web.support.Admin;
import roomescape.auth.web.support.LoginRequired;
import roomescape.common.dto.response.RoomescapeApiResponse;
import roomescape.common.dto.response.RoomescapeErrorResponse;
import roomescape.reservation.web.request.ReservationTimeRequest;
import roomescape.reservation.web.response.ReservationTimeInfosResponse;
import roomescape.reservation.web.response.ReservationTimeResponse;
import roomescape.reservation.web.response.ReservationTimesResponse;
import roomescape.reservation.business.ReservationTimeService;
@RestController
@ -68,7 +64,7 @@ public class ReservationTimeController {
HttpServletResponse response
) {
ReservationTimeResponse reservationTimeResponse = reservationTimeService.addTime(reservationTimeRequest);
response.setHeader(HttpHeaders.LOCATION, "/times/" + reservationTimeResponse.id());
response.setHeader(HttpHeaders.LOCATION, "/times/" + reservationTimeResponse.id);
return RoomescapeApiResponse.success(reservationTimeResponse);
}

View File

@ -0,0 +1,40 @@
package roomescape.reservation.web
import io.swagger.v3.oas.annotations.media.Schema
import java.time.LocalTime
@Schema(name = "예약 시간 저장 요청", description = "예약 시간 저장 요청시 사용됩니다.")
@JvmRecord
data class ReservationTimeRequest(
@JvmField
@field:Schema(description = "예약 시간. HH:mm 형식으로 입력해야 합니다.", type = "string", example = "09:00")
val startAt: LocalTime
)
@Schema(name = "특정 테마, 날짜에 대한 시간 정보 응답", description = "특정 날짜와 테마에 대해, 예약 가능 여부를 포함한 시간 정보를 저장합니다.")
@JvmRecord
data class ReservationTimeInfoResponse(
@field:Schema(description = "예약 시간 번호. 예약 시간을 식별할 때 사용합니다.")
val timeId: Long,
@field:Schema(description = "예약 시간", type = "string", example = "09:00")
val startAt: LocalTime,
@field:Schema(description = "이미 예약이 완료된 시간인지 여부")
val alreadyBooked: Boolean
)
@Schema(name = "예약 시간 정보 목록 응답", description = "특정 테마, 날짜에 대한 모든 예약 가능 시간 정보를 저장합니다.")
@JvmRecord
data class ReservationTimeInfosResponse(
@field:Schema(description = "특정 테마, 날짜에 대한 예약 가능 여부를 포함한 시간 목록")
val reservationTimes: List<ReservationTimeInfoResponse>
)
@Schema(name = "예약 시간 정보 목록 응답", description = "모든 예약 시간 조회 응답시 사용됩니다.")
@JvmRecord
data class ReservationTimesResponse(
@field:Schema(description = "모든 시간 목록")
val times: List<ReservationTimeResponse>
)

View File

@ -1,18 +0,0 @@
package roomescape.reservation.web.request;
import java.time.LocalDate;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(name = "관리자 예약 저장 요청", description = "관리자의 예약 저장 요청시 사용됩니다.")
public record AdminReservationRequest(
@Schema(description = "예약 날짜. 지난 날짜는 지정할 수 없으며, yyyy-MM-dd 형식으로 입력해야 합니다.", type = "string", example = "2022-12-31")
LocalDate date,
@Schema(description = "예약 시간 ID.", example = "1")
Long timeId,
@Schema(description = "테마 ID", example = "1")
Long themeId,
@Schema(description = "회원 ID", example = "1")
Long memberId
) {
}

View File

@ -1,36 +0,0 @@
package roomescape.reservation.web.request;
import java.time.LocalDate;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import roomescape.payment.web.PaymentApprove;
@Schema(name = "회원의 예약 저장 요청", description = "회원의 예약 요청시 사용됩니다.")
public record ReservationRequest(
@NotNull(message = "예약 날짜는 null일 수 없습니다.")
@Schema(description = "예약 날짜. 지난 날짜는 지정할 수 없으며, yyyy-MM-dd 형식으로 입력해야 합니다.", type = "string", example = "2022-12-31")
LocalDate date,
@NotNull(message = "예약 요청의 timeId는 null일 수 없습니다.")
@Schema(description = "예약 시간 ID.", example = "1")
Long timeId,
@NotNull(message = "예약 요청의 themeId는 null일 수 없습니다.")
@Schema(description = "테마 ID", example = "1")
Long themeId,
@Schema(description = "결제 위젯을 통해 받은 결제 키")
String paymentKey,
@Schema(description = "결제 위젯을 통해 받은 주문번호.")
String orderId,
@Schema(description = "결제 위젯을 통해 받은 결제 금액")
Long amount,
@Schema(description = "결제 타입", example = "NORMAL")
String paymentType
) {
@JsonIgnore
public PaymentApprove.Request getPaymentRequest() {
return new PaymentApprove.Request(paymentKey, orderId, amount, paymentType);
}
}

View File

@ -1,31 +0,0 @@
package roomescape.reservation.web.request;
import java.time.LocalTime;
import org.springframework.http.HttpStatus;
import io.micrometer.common.util.StringUtils;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import roomescape.common.exception.ErrorType;
import roomescape.common.exception.RoomescapeException;
import roomescape.reservation.infrastructure.persistence.ReservationTime;
@Schema(name = "예약 시간 저장 요청", description = "예약 시간 저장 요청시 사용됩니다.")
public record ReservationTimeRequest(
@NotNull(message = "예약 시간은 null일 수 없습니다.")
@Schema(description = "예약 시간. HH:mm 형식으로 입력해야 합니다.", type = "string", example = "09:00")
LocalTime startAt
) {
public ReservationTimeRequest {
if (StringUtils.isBlank(startAt.toString())) {
throw new RoomescapeException(ErrorType.REQUEST_DATA_BLANK,
String.format("[values: %s]", this), HttpStatus.BAD_REQUEST);
}
}
public ReservationTime toTime() {
return new ReservationTime(this.startAt);
}
}

View File

@ -1,20 +0,0 @@
package roomescape.reservation.web.request;
import java.time.LocalDate;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
@Schema(name = "예약 대기 저장 요청", description = "회원의 예약 대기 요청시 사용됩니다.")
public record WaitingRequest(
@NotNull(message = "예약 날짜는 null일 수 없습니다.")
@Schema(description = "예약 날짜. 지난 날짜는 지정할 수 없으며, yyyy-MM-dd 형식으로 입력해야 합니다.", type = "string", example = "2022-12-31")
LocalDate date,
@NotNull(message = "예약 요청의 timeId는 null일 수 없습니다.")
@Schema(description = "예약 시간 ID", example = "1")
Long timeId,
@NotNull(message = "예약 요청의 themeId는 null일 수 없습니다.")
@Schema(description = "테마 ID", example = "1")
Long themeId
) {
}

View File

@ -1,33 +0,0 @@
package roomescape.reservation.web.response;
import java.time.LocalDate;
import java.time.LocalTime;
import io.swagger.v3.oas.annotations.media.Schema;
import roomescape.reservation.infrastructure.persistence.ReservationStatus;
@Schema(name = "회원의 예약 및 대기 응답", description = "회원의 예약 및 대기 정보 응답시 사용됩니다.")
public record MyReservationResponse(
@Schema(description = "예약 번호. 예약을 식별할 때 사용합니다.")
Long id,
@Schema(description = "테마 이름")
String themeName,
@Schema(description = "예약 날짜", type = "string", example = "2022-12-31")
LocalDate date,
@Schema(description = "예약 시간", type = "string", example = "09:00")
LocalTime time,
@Schema(description = "예약 상태", type = "string")
ReservationStatus status,
@Schema(description = "예약 대기 상태일 때의 대기 순번. 확정된 예약은 0의 값을 가집니다.")
Long rank,
@Schema(description = "결제 키. 결제가 완료된 예약에만 값이 존재합니다.")
String paymentKey,
@Schema(description = "결제 금액. 결제가 완료된 예약에만 값이 존재합니다.")
Long amount
) {
public MyReservationResponse(Long id, String themeName, LocalDate date, LocalTime time, ReservationStatus status,
Integer rank, String paymentKey, Long amount) {
this(id, themeName, date, time, status, rank.longValue(), paymentKey, amount);
}
}

View File

@ -1,11 +0,0 @@
package roomescape.reservation.web.response;
import java.util.List;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(name = "회원의 예약 및 대기 목록 조회 응답", description = "회원의 예약 및 대기 목록 조회 응답시 사용됩니다.")
public record MyReservationsResponse(
@Schema(description = "현재 로그인한 회원의 예약 및 대기 목록") List<MyReservationResponse> myReservationResponses
) {
}

View File

@ -1,42 +0,0 @@
package roomescape.reservation.web.response;
import java.time.LocalDate;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import roomescape.member.web.MemberResponse;
import roomescape.reservation.infrastructure.persistence.Reservation;
import roomescape.reservation.infrastructure.persistence.ReservationStatus;
import roomescape.theme.web.ThemeResponse;
@Schema(name = "예약 정보", description = "예약 저장 및 조회 응답에 사용됩니다.")
public record ReservationResponse(
@Schema(description = "예약 번호. 예약을 식별할 때 사용합니다.")
Long id,
@Schema(description = "예약 날짜", type = "string", example = "2022-12-31")
LocalDate date,
@JsonProperty("member")
@Schema(description = "예약한 회원 정보")
MemberResponse member,
@JsonProperty("time")
@Schema(description = "예약 시간 정보")
ReservationTimeResponse time,
@JsonProperty("theme")
@Schema(description = "예약한 테마 정보")
ThemeResponse theme,
@Schema(description = "예약 상태", type = "string")
ReservationStatus status
) {
public static ReservationResponse from(Reservation reservation) {
return new ReservationResponse(
reservation.getId(),
reservation.getDate(),
MemberResponse.fromEntity(reservation.getMember()),
ReservationTimeResponse.from(reservation.getReservationTime()),
ThemeResponse.from(reservation.getTheme()),
reservation.getReservationStatus()
);
}
}

View File

@ -1,16 +0,0 @@
package roomescape.reservation.web.response;
import java.time.LocalTime;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(name = "특정 테마, 날짜에 대한 시간 정보 응답", description = "특정 날짜와 테마에 대해, 예약 가능 여부를 포함한 시간 정보를 저장합니다.")
public record ReservationTimeInfoResponse(
@Schema(description = "예약 시간 번호. 예약 시간을 식별할 때 사용합니다.")
Long timeId,
@Schema(description = "예약 시간", type = "string", example = "09:00")
LocalTime startAt,
@Schema(description = "이미 예약이 완료된 시간인지 여부")
boolean alreadyBooked
) {
}

View File

@ -1,11 +0,0 @@
package roomescape.reservation.web.response;
import java.util.List;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(name = "예약 시간 정보 목록 응답", description = "특정 테마, 날짜에 대한 모든 예약 가능 시간 정보를 저장합니다.")
public record ReservationTimeInfosResponse(
@Schema(description = "특정 테마, 날짜에 대한 예약 가능 여부를 포함한 시간 목록") List<ReservationTimeInfoResponse> reservationTimes
) {
}

View File

@ -1,19 +0,0 @@
package roomescape.reservation.web.response;
import java.time.LocalTime;
import io.swagger.v3.oas.annotations.media.Schema;
import roomescape.reservation.infrastructure.persistence.ReservationTime;
@Schema(name = "예약 시간 정보", description = "예약 시간 추가 및 조회 응답시 사용됩니다.")
public record ReservationTimeResponse(
@Schema(description = "예약 시간 번호. 예약 시간을 식별할 때 사용합니다.")
Long id,
@Schema(description = "예약 시간", type = "string", example = "09:00")
LocalTime startAt
) {
public static ReservationTimeResponse from(ReservationTime reservationTime) {
return new ReservationTimeResponse(reservationTime.getId(), reservationTime.getStartAt());
}
}

View File

@ -1,11 +0,0 @@
package roomescape.reservation.web.response;
import java.util.List;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(name = "예약 시간 정보 목록 응답", description = "모든 예약 시간 조회 응답시 사용됩니다.")
public record ReservationTimesResponse(
@Schema(description = "모든 시간 목록") List<ReservationTimeResponse> times
) {
}

View File

@ -1,11 +0,0 @@
package roomescape.reservation.web.response;
import java.util.List;
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(name = "예약 목록 조회 응답", description = "모든 예약 정보 조회 응답시 사용됩니다.")
public record ReservationsResponse(
@Schema(description = "모든 예약 및 대기 목록") List<ReservationResponse> reservations
) {
}

View File

@ -64,5 +64,5 @@ data class ThemesResponse(
)
fun List<ThemeEntity>.toResponse(): ThemesResponse = ThemesResponse(
themes = this.map { it.toResponse()}
themes = this.map { it.toResponse() }
)

View File

@ -7,15 +7,15 @@ import io.kotest.matchers.shouldBe
import io.mockk.every
import io.mockk.mockk
import org.springframework.data.repository.findByIdOrNull
import roomescape.util.JwtFixture
import roomescape.util.MemberFixture
import roomescape.member.business.MemberService
import roomescape.member.infrastructure.persistence.MemberEntity
import roomescape.member.infrastructure.persistence.MemberRepository
import roomescape.auth.infrastructure.jwt.JwtHandler
import roomescape.auth.service.AuthService
import roomescape.common.exception.ErrorType
import roomescape.common.exception.RoomescapeException
import roomescape.member.business.MemberService
import roomescape.member.infrastructure.persistence.MemberEntity
import roomescape.member.infrastructure.persistence.MemberRepository
import roomescape.util.JwtFixture
import roomescape.util.MemberFixture
class AuthServiceTest : BehaviorSpec({

View File

@ -5,9 +5,9 @@ import io.jsonwebtoken.SignatureAlgorithm
import io.kotest.assertions.throwables.shouldThrow
import io.kotest.core.spec.style.FunSpec
import io.kotest.matchers.shouldBe
import roomescape.util.JwtFixture
import roomescape.common.exception.ErrorType
import roomescape.common.exception.RoomescapeException
import roomescape.util.JwtFixture
import java.util.*
import kotlin.random.Random

View File

@ -23,9 +23,9 @@ 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.ReservationRepository;
import roomescape.reservation.infrastructure.persistence.ReservationStatus;
import roomescape.reservation.infrastructure.persistence.ReservationTime;
import roomescape.reservation.infrastructure.persistence.ReservationRepository;
import roomescape.reservation.infrastructure.persistence.ReservationTimeRepository;
import roomescape.theme.infrastructure.persistence.ThemeEntity;
import roomescape.theme.infrastructure.persistence.ThemeRepository;
@ -56,7 +56,8 @@ class PaymentServiceTest {
LocalDateTime localDateTime = LocalDateTime.now().plusHours(1L);
LocalDate date = localDateTime.toLocalDate();
ReservationTime time = reservationTimeRepository.save(new ReservationTime(localDateTime.toLocalTime()));
MemberEntity member = memberRepository.save(new MemberEntity(null, "member", "email@email.com", "password", Role.MEMBER));
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));
@ -65,7 +66,7 @@ class PaymentServiceTest {
ReservationPaymentResponse reservationPaymentResponse = paymentService.savePayment(paymentInfo, reservation);
// then
assertThat(reservationPaymentResponse.reservation().id()).isEqualTo(reservation.getId());
assertThat(reservationPaymentResponse.reservation().id).isEqualTo(reservation.getId());
assertThat(reservationPaymentResponse.paymentKey()).isEqualTo(paymentInfo.paymentKey);
}
@ -78,7 +79,8 @@ class PaymentServiceTest {
LocalDateTime localDateTime = LocalDateTime.now().plusHours(1L);
LocalDate date = localDateTime.toLocalDate();
ReservationTime time = reservationTimeRepository.save(new ReservationTime(localDateTime.toLocalTime()));
MemberEntity member = memberRepository.save(new MemberEntity(null, "member", "email@email.com", "password", Role.MEMBER));
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));
@ -115,7 +117,8 @@ class PaymentServiceTest {
LocalDateTime localDateTime = LocalDateTime.now().plusHours(1L);
LocalDate date = localDateTime.toLocalDate();
ReservationTime time = reservationTimeRepository.save(new ReservationTime(localDateTime.toLocalTime()));
MemberEntity member = memberRepository.save(new MemberEntity(null, "member", "email@email.com", "password", Role.MEMBER));
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));

View File

@ -11,7 +11,7 @@ import java.util.*
@DataJpaTest
class CanceledPaymentRepositoryTest(
@Autowired val canceledPaymentRepository: CanceledPaymentRepository,
): FunSpec() {
) : FunSpec() {
init {
context("paymentKey로 CanceledPaymentEntity 조회") {
val paymentKey = "test-payment-key"

View File

@ -14,22 +14,22 @@ import org.springframework.context.annotation.Import;
import org.springframework.test.context.jdbc.Sql;
import org.springframework.test.context.jdbc.Sql.ExecutionPhase;
import roomescape.common.exception.RoomescapeException;
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.ReservationRepository;
import roomescape.reservation.infrastructure.persistence.ReservationStatus;
import roomescape.reservation.infrastructure.persistence.ReservationTime;
import roomescape.reservation.infrastructure.persistence.ReservationRepository;
import roomescape.reservation.infrastructure.persistence.ReservationTimeRepository;
import roomescape.reservation.web.request.ReservationRequest;
import roomescape.reservation.web.request.WaitingRequest;
import roomescape.reservation.web.response.ReservationResponse;
import roomescape.common.exception.RoomescapeException;
import roomescape.reservation.web.ReservationRequest;
import roomescape.reservation.web.ReservationResponse;
import roomescape.reservation.web.WaitingRequest;
import roomescape.theme.business.ThemeService;
import roomescape.theme.infrastructure.persistence.ThemeEntity;
import roomescape.theme.infrastructure.persistence.ThemeRepository;
import roomescape.theme.business.ThemeService;
@SpringBootTest
@Sql(scripts = "/truncate.sql", executionPhase = ExecutionPhase.BEFORE_TEST_METHOD)
@ -53,8 +53,10 @@ class ReservationServiceTest {
// given
ReservationTime reservationTime = reservationTimeRepository.save(new ReservationTime(LocalTime.of(12, 30)));
ThemeEntity theme = themeRepository.save(new ThemeEntity(null, "테마명", "설명", "썸네일URL"));
MemberEntity member1 = memberRepository.save(new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
MemberEntity member2 = memberRepository.save(new MemberEntity(null, "name2", "email2@email.com", "password", Role.MEMBER));
MemberEntity member1 = memberRepository.save(
new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
MemberEntity member2 = memberRepository.save(
new MemberEntity(null, "name2", "email2@email.com", "password", Role.MEMBER));
LocalDate date = LocalDate.now().plusDays(1L);
// when
@ -75,7 +77,8 @@ class ReservationServiceTest {
// given
ReservationTime reservationTime = reservationTimeRepository.save(new ReservationTime(LocalTime.of(12, 30)));
ThemeEntity theme = themeRepository.save(new ThemeEntity(null, "테마명", "설명", "썸네일URL"));
MemberEntity member = memberRepository.save(new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
MemberEntity member = memberRepository.save(
new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
LocalDate date = LocalDate.now().plusDays(1L);
// when
@ -95,8 +98,10 @@ class ReservationServiceTest {
// given
ReservationTime reservationTime = reservationTimeRepository.save(new ReservationTime(LocalTime.of(12, 30)));
ThemeEntity theme = themeRepository.save(new ThemeEntity(null, "테마명", "설명", "썸네일URL"));
MemberEntity member = memberRepository.save(new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
MemberEntity member1 = memberRepository.save(new MemberEntity(null, "name1", "email1@email.com", "password", Role.MEMBER));
MemberEntity member = memberRepository.save(
new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
MemberEntity member1 = memberRepository.save(
new MemberEntity(null, "name1", "email1@email.com", "password", Role.MEMBER));
LocalDate date = LocalDate.now().plusDays(1L);
// when
@ -119,7 +124,8 @@ class ReservationServiceTest {
// given
ReservationTime reservationTime = reservationTimeRepository.save(new ReservationTime(LocalTime.of(12, 30)));
ThemeEntity theme = themeRepository.save(new ThemeEntity(null, "테마명", "설명", "썸네일URL"));
MemberEntity member = memberRepository.save(new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
MemberEntity member = memberRepository.save(
new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
LocalDate beforeDate = LocalDate.now().minusDays(1L);
// when & then
@ -136,7 +142,8 @@ class ReservationServiceTest {
LocalDateTime beforeTime = LocalDateTime.now().minusHours(1L).withNano(0);
ReservationTime reservationTime = reservationTimeRepository.save(new ReservationTime(beforeTime.toLocalTime()));
ThemeEntity theme = themeRepository.save(new ThemeEntity(null, "테마명", "설명", "썸네일URL"));
MemberEntity member = memberRepository.save(new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
MemberEntity member = memberRepository.save(
new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
// when & then
assertThatThrownBy(() -> reservationService.addReservation(
@ -180,9 +187,12 @@ class ReservationServiceTest {
// given
ReservationTime reservationTime = reservationTimeRepository.save(new ReservationTime(LocalTime.of(12, 30)));
ThemeEntity theme = themeRepository.save(new ThemeEntity(null, "테마명", "설명", "썸네일URL"));
MemberEntity admin = memberRepository.save(new MemberEntity(null, "admin", "admin@email.com", "password", Role.ADMIN));
MemberEntity member = memberRepository.save(new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
MemberEntity member1 = memberRepository.save(new MemberEntity(null, "name1", "email1@email.com", "password", Role.MEMBER));
MemberEntity admin = memberRepository.save(
new MemberEntity(null, "admin", "admin@email.com", "password", Role.ADMIN));
MemberEntity member = memberRepository.save(
new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
MemberEntity member1 = memberRepository.save(
new MemberEntity(null, "name1", "email1@email.com", "password", Role.MEMBER));
reservationService.addReservation(
new ReservationRequest(LocalDate.now().plusDays(1L), reservationTime.getId(), theme.getId(),
@ -193,7 +203,7 @@ class ReservationServiceTest {
member1.getId());
// when & then
assertThatThrownBy(() -> reservationService.approveWaiting(waiting.id(), admin.getId()))
assertThatThrownBy(() -> reservationService.approveWaiting(waiting.id, admin.getId()))
.isInstanceOf(RoomescapeException.class);
}
@ -203,17 +213,19 @@ class ReservationServiceTest {
// given
ReservationTime reservationTime = reservationTimeRepository.save(new ReservationTime(LocalTime.of(12, 30)));
ThemeEntity theme = themeRepository.save(new ThemeEntity(null, "테마명", "설명", "썸네일URL"));
MemberEntity admin = memberRepository.save(new MemberEntity(null, "admin", "admin@email.com", "password", Role.ADMIN));
MemberEntity member = memberRepository.save(new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
MemberEntity admin = memberRepository.save(
new MemberEntity(null, "admin", "admin@email.com", "password", Role.ADMIN));
MemberEntity member = memberRepository.save(
new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
// when
ReservationResponse waiting = reservationService.addWaiting(
new WaitingRequest(LocalDate.now().plusDays(1L), reservationTime.getId(), theme.getId()),
member.getId());
reservationService.approveWaiting(waiting.id(), admin.getId());
reservationService.approveWaiting(waiting.id, admin.getId());
// then
Reservation confirmed = reservationRepository.findById(waiting.id()).get();
Reservation confirmed = reservationRepository.findById(waiting.id).get();
assertThat(confirmed.getReservationStatus()).isEqualTo(ReservationStatus.CONFIRMED_PAYMENT_REQUIRED);
}
}

View File

@ -13,16 +13,16 @@ import org.springframework.context.annotation.Import;
import org.springframework.test.context.jdbc.Sql;
import org.springframework.test.context.jdbc.Sql.ExecutionPhase;
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.ReservationRepository;
import roomescape.reservation.infrastructure.persistence.ReservationStatus;
import roomescape.reservation.infrastructure.persistence.ReservationTime;
import roomescape.reservation.infrastructure.persistence.ReservationRepository;
import roomescape.reservation.infrastructure.persistence.ReservationTimeRepository;
import roomescape.reservation.web.request.ReservationTimeRequest;
import roomescape.common.exception.RoomescapeException;
import roomescape.reservation.web.ReservationTimeRequest;
import roomescape.theme.infrastructure.persistence.ThemeEntity;
import roomescape.theme.infrastructure.persistence.ThemeRepository;
@ -75,7 +75,8 @@ class ReservationTimeServiceTest {
ReservationTime reservationTime = reservationTimeRepository.save(
new ReservationTime(localDateTime.toLocalTime()));
ThemeEntity theme = themeRepository.save(new ThemeEntity(null, "테마명", "설명", "썸네일URL"));
MemberEntity member = memberRepository.save(new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
MemberEntity member = memberRepository.save(
new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
// when
reservationRepository.save(new Reservation(localDateTime.toLocalDate(), reservationTime, theme, member,

View File

@ -22,12 +22,12 @@ 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.ReservationRepository;
import roomescape.reservation.infrastructure.persistence.ReservationStatus;
import roomescape.reservation.infrastructure.persistence.ReservationTime;
import roomescape.reservation.infrastructure.persistence.ReservationRepository;
import roomescape.reservation.infrastructure.persistence.ReservationTimeRepository;
import roomescape.reservation.web.request.ReservationRequest;
import roomescape.reservation.web.response.ReservationResponse;
import roomescape.reservation.web.ReservationRequest;
import roomescape.reservation.web.ReservationResponse;
import roomescape.theme.infrastructure.persistence.ThemeEntity;
import roomescape.theme.infrastructure.persistence.ThemeRepository;
@ -59,7 +59,8 @@ class ReservationWithPaymentServiceTest {
LocalDateTime localDateTime = LocalDateTime.now().plusDays(1L).withNano(0);
LocalDate date = localDateTime.toLocalDate();
ReservationTime time = reservationTimeRepository.save(new ReservationTime(localDateTime.toLocalTime()));
MemberEntity member = memberRepository.save(new MemberEntity(null, "member", "email@email.com", "password", Role.MEMBER));
MemberEntity member = memberRepository.save(
new MemberEntity(null, "member", "email@email.com", "password", Role.MEMBER));
ThemeEntity theme = themeRepository.save(new ThemeEntity(null, "name", "desc", "thumbnail"));
ReservationRequest reservationRequest = new ReservationRequest(date, time.getId(), theme.getId(), "payment-key",
"order-id", 10000L, "NORMAL");
@ -69,7 +70,7 @@ class ReservationWithPaymentServiceTest {
reservationRequest, paymentInfo, member.getId());
// then
reservationRepository.findById(reservationResponse.id())
reservationRepository.findById(reservationResponse.id)
.ifPresent(reservation -> {
assertThat(reservation.getMember().getId()).isEqualTo(member.getId());
assertThat(reservation.getTheme().getId()).isEqualTo(theme.getId());
@ -80,7 +81,7 @@ class ReservationWithPaymentServiceTest {
PaymentEntity payment = paymentRepository.findByPaymentKey("payment-key");
assertThat(payment).isNotNull();
assertThat(payment.getReservation().getId()).isEqualTo(reservationResponse.id());
assertThat(payment.getReservation().getId()).isEqualTo(reservationResponse.id);
assertThat(payment.getPaymentKey()).isEqualTo("payment-key");
assertThat(payment.getOrderId()).isEqualTo("order-id");
assertThat(payment.getTotalAmount()).isEqualTo(10000L);
@ -95,7 +96,8 @@ class ReservationWithPaymentServiceTest {
LocalDateTime localDateTime = LocalDateTime.now().plusDays(1L).withNano(0);
LocalDate date = localDateTime.toLocalDate();
ReservationTime time = reservationTimeRepository.save(new ReservationTime(localDateTime.toLocalTime()));
MemberEntity member = memberRepository.save(new MemberEntity(null, "member", "admin@email.com", "password", Role.ADMIN));
MemberEntity member = memberRepository.save(
new MemberEntity(null, "member", "admin@email.com", "password", Role.ADMIN));
ThemeEntity theme = themeRepository.save(new ThemeEntity(null, "name", "desc", "thumbnail"));
ReservationRequest reservationRequest = new ReservationRequest(date, time.getId(), theme.getId(), "payment-key",
"order-id", 10000L, "NORMAL");
@ -105,11 +107,11 @@ class ReservationWithPaymentServiceTest {
// when
PaymentCancel.Request paymentCancelRequest = reservationWithPaymentService.removeReservationWithPayment(
reservationResponse.id(), member.getId());
reservationResponse.id, member.getId());
// then
assertThat(paymentCancelRequest.cancelReason).isEqualTo("고객 요청");
assertThat(reservationRepository.findById(reservationResponse.id())).isEmpty();
assertThat(reservationRepository.findById(reservationResponse.id)).isEmpty();
assertThat(paymentRepository.findByPaymentKey("payment-key")).isNull();
assertThat(canceledPaymentRepository.findByPaymentKey("payment-key")).isNotNull();
}
@ -123,7 +125,8 @@ class ReservationWithPaymentServiceTest {
LocalDateTime localDateTime = LocalDateTime.now().plusHours(1L);
LocalDate date = localDateTime.toLocalDate();
ReservationTime time = reservationTimeRepository.save(new ReservationTime(localDateTime.toLocalTime()));
MemberEntity member = memberRepository.save(new MemberEntity(null, "member", "admin@email.com", "password", Role.ADMIN));
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(
@ -145,7 +148,8 @@ class ReservationWithPaymentServiceTest {
LocalDateTime localDateTime = LocalDateTime.now().plusDays(1L).withNano(0);
LocalDate date = localDateTime.toLocalDate();
ReservationTime time = reservationTimeRepository.save(new ReservationTime(localDateTime.toLocalTime()));
MemberEntity member = memberRepository.save(new MemberEntity(null, "member", "admin@email.com", "password", Role.ADMIN));
MemberEntity member = memberRepository.save(
new MemberEntity(null, "member", "admin@email.com", "password", Role.ADMIN));
ThemeEntity theme = themeRepository.save(new ThemeEntity(null, "name", "desc", "thumbnail"));
ReservationRequest reservationRequest = new ReservationRequest(date, time.getId(), theme.getId(), "payment-key",
"order-id", 10000L, "NORMAL");
@ -154,7 +158,7 @@ class ReservationWithPaymentServiceTest {
reservationRequest, paymentInfo, member.getId());
// when
boolean result = reservationWithPaymentService.isNotPaidReservation(reservationResponse.id());
boolean result = reservationWithPaymentService.isNotPaidReservation(reservationResponse.id);
// then
assertThat(result).isFalse();

View File

@ -47,7 +47,8 @@ class ReservationSearchSpecificationTest {
@BeforeEach
void setUp() {
LocalDateTime dateTime = LocalDateTime.now();
MemberEntity member = memberRepository.save(new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
MemberEntity member = memberRepository.save(
new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
ReservationTime time = timeRepository.save(new ReservationTime(dateTime.toLocalTime()));
ThemeEntity theme = themeRepository.save(new ThemeEntity(null, "name", "description", "thumbnail"));

View File

@ -10,9 +10,9 @@ 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.common.exception.RoomescapeException;
import roomescape.theme.infrastructure.persistence.ThemeEntity;
public class ReservationTest {

View File

@ -2,6 +2,7 @@ package roomescape.reservation.web;
import static org.assertj.core.api.Assertions.*;
import static org.hamcrest.Matchers.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*;
@ -42,13 +43,10 @@ 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.ReservationRepository;
import roomescape.reservation.infrastructure.persistence.ReservationStatus;
import roomescape.reservation.infrastructure.persistence.ReservationTime;
import roomescape.reservation.infrastructure.persistence.ReservationRepository;
import roomescape.reservation.infrastructure.persistence.ReservationTimeRepository;
import roomescape.reservation.web.request.AdminReservationRequest;
import roomescape.reservation.web.request.ReservationRequest;
import roomescape.reservation.web.request.WaitingRequest;
import roomescape.theme.infrastructure.persistence.ThemeEntity;
import roomescape.theme.infrastructure.persistence.ThemeRepository;
@ -120,12 +118,14 @@ public class ReservationControllerTest {
@DisplayName("대기중인 예약을 취소한다.")
void cancelWaiting() {
// given
MemberEntity member = memberRepository.save(new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
MemberEntity member = memberRepository.save(
new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
String accessTokenCookie = getAccessTokenCookieByLogin("email@email.com", "password");
ReservationTime reservationTime = reservationTimeRepository.save(new ReservationTime(LocalTime.of(17, 30)));
ThemeEntity theme = themeRepository.save(new ThemeEntity(null, "테마명", "설명", "썸네일URL"));
MemberEntity member1 = memberRepository.save(new MemberEntity(null, "name1", "email1r@email.com", "password", Role.MEMBER));
MemberEntity member1 = memberRepository.save(
new MemberEntity(null, "name1", "email1r@email.com", "password", Role.MEMBER));
// when
reservationRepository.save(new Reservation(LocalDate.now().plusDays(1), reservationTime, theme, member1,
@ -180,7 +180,8 @@ public class ReservationControllerTest {
ReservationTime reservationTime = reservationTimeRepository.save(new ReservationTime(LocalTime.of(17, 30)));
ThemeEntity theme = themeRepository.save(new ThemeEntity(null, "테마명", "설명", "썸네일URL"));
MemberEntity member = memberRepository.save(new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
MemberEntity member = memberRepository.save(
new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
// when
reservationRepository.save(
@ -204,7 +205,8 @@ public class ReservationControllerTest {
@DisplayName("예약 취소는 관리자만 할 수 있다.")
void canRemoveMyReservation() {
// given
MemberEntity member = memberRepository.save(new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
MemberEntity member = memberRepository.save(
new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
String accessTokenCookie = getAccessTokenCookieByLogin(member.getEmail(), member.getPassword());
ReservationTime reservationTime = reservationTimeRepository.save(new ReservationTime(LocalTime.of(17, 30)));
@ -252,7 +254,8 @@ public class ReservationControllerTest {
@DisplayName("본인의 예약이 아니더라도 관리자 권한이 있으면 예약 정보를 삭제할 수 있다.")
void readReservationsSizeAfterPostAndDelete() {
// given
MemberEntity member = memberRepository.save(new MemberEntity(null, "name", "admin@admin.com", "password", Role.ADMIN));
MemberEntity member = memberRepository.save(
new MemberEntity(null, "name", "admin@admin.com", "password", Role.ADMIN));
String accessTokenCookie = getAccessTokenCookieByLogin(member.getEmail(), member.getPassword());
ReservationTime reservationTime = reservationTimeRepository.save(new ReservationTime(LocalTime.of(17, 30)));
@ -342,7 +345,8 @@ public class ReservationControllerTest {
ReservationTime time1 = reservationTimeRepository.save(new ReservationTime(LocalTime.of(18, 30)));
ReservationTime time2 = reservationTimeRepository.save(new ReservationTime(LocalTime.of(19, 30)));
MemberEntity member = memberRepository.save(new MemberEntity(null, "name", "email@email.com", "password", Role.ADMIN));
MemberEntity member = memberRepository.save(
new MemberEntity(null, "name", "email@email.com", "password", Role.ADMIN));
String accessToken = getAccessTokenCookieByLogin("email@email.com", "password");
// when : 예약은 2개, 예약 대기는 1개 조회되어야 한다.
@ -392,7 +396,8 @@ public class ReservationControllerTest {
LocalDate date = LocalDate.now().plusDays(1);
ThemeEntity theme = themeRepository.save(new ThemeEntity(null, "테마명", "설명", "썸네일URL"));
ReservationTime time = reservationTimeRepository.save(new ReservationTime(LocalTime.of(17, 30)));
MemberEntity member = memberRepository.save(new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
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));
@ -422,7 +427,8 @@ public class ReservationControllerTest {
LocalDate date = localDateTime.toLocalDate();
ReservationTime time = reservationTimeRepository.save(new ReservationTime(localDateTime.toLocalTime()));
ThemeEntity theme = themeRepository.save(new ThemeEntity(null, "테마명", "설명", "썸네일URL"));
MemberEntity member = memberRepository.save(new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
MemberEntity member = memberRepository.save(
new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
String accessToken = getAccessTokenCookieByLogin(member.getEmail(), member.getPassword());
// when : 이전 날짜의 예약을 추가하여 결제 승인 이후 DB 저장 과정에서 예외를 발생시킨다.
@ -515,8 +521,10 @@ public class ReservationControllerTest {
LocalDate date = localDateTime.toLocalDate();
ReservationTime time = reservationTimeRepository.save(new ReservationTime(localDateTime.toLocalTime()));
ThemeEntity theme = themeRepository.save(new ThemeEntity(null, "테마명", "설명", "썸네일URL"));
MemberEntity member = memberRepository.save(new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
MemberEntity member1 = memberRepository.save(new MemberEntity(null, "name1", "email1@email.com", "password", Role.MEMBER));
MemberEntity member = memberRepository.save(
new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
MemberEntity member1 = memberRepository.save(
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));
@ -541,7 +549,8 @@ public class ReservationControllerTest {
LocalDate date = localDateTime.toLocalDate();
ReservationTime time = reservationTimeRepository.save(new ReservationTime(localDateTime.toLocalTime()));
ThemeEntity theme = themeRepository.save(new ThemeEntity(null, "테마명", "설명", "썸네일URL"));
MemberEntity member = memberRepository.save(new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
MemberEntity member = memberRepository.save(
new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
String accessToken = getAdminAccessTokenCookieByLogin("admin@email.com", "password");
Reservation waiting = reservationRepository.save(
@ -586,7 +595,8 @@ public class ReservationControllerTest {
LocalDate date = localDateTime.toLocalDate();
ReservationTime time = reservationTimeRepository.save(new ReservationTime(localDateTime.toLocalTime()));
ThemeEntity theme = themeRepository.save(new ThemeEntity(null, "테마명", "설명", "썸네일URL"));
MemberEntity member = memberRepository.save(new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
MemberEntity member = memberRepository.save(
new MemberEntity(null, "name", "email@email.com", "password", Role.MEMBER));
String adminAccessToken = getAdminAccessTokenCookieByLogin("admin@email.com", "password");

View File

@ -25,9 +25,9 @@ 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.ReservationRepository;
import roomescape.reservation.infrastructure.persistence.ReservationStatus;
import roomescape.reservation.infrastructure.persistence.ReservationTime;
import roomescape.reservation.infrastructure.persistence.ReservationRepository;
import roomescape.reservation.infrastructure.persistence.ReservationTimeRepository;
import roomescape.theme.infrastructure.persistence.ThemeEntity;
import roomescape.theme.infrastructure.persistence.ThemeRepository;
@ -225,7 +225,8 @@ public class ReservationTimeControllerTest {
ReservationTime reservationTime2 = reservationTimeRepository.save(new ReservationTime(LocalTime.of(17, 30)));
ReservationTime reservationTime3 = reservationTimeRepository.save(new ReservationTime(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));
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));

View File

@ -33,6 +33,7 @@ object MemberFixture {
account = "admin",
role = Role.ADMIN
)
fun adminLoginRequest(): LoginRequest = LoginRequest(
email = admin().email,
password = admin().password
@ -43,6 +44,7 @@ object MemberFixture {
account = "user",
role = Role.MEMBER
)
fun userLoginRequest(): LoginRequest = LoginRequest(
email = user().email,
password = user().password