diff --git a/src/main/java/roomescape/member/infrastructure/persistence/MemberEntity.kt b/src/main/java/roomescape/member/infrastructure/persistence/MemberEntity.kt index 3014948d..f9ec13eb 100644 --- a/src/main/java/roomescape/member/infrastructure/persistence/MemberEntity.kt +++ b/src/main/java/roomescape/member/infrastructure/persistence/MemberEntity.kt @@ -3,6 +3,7 @@ package roomescape.member.infrastructure.persistence import jakarta.persistence.* @Entity +@Table(name = "member") class MemberEntity( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/src/main/java/roomescape/payment/web/PaymentDTO.kt b/src/main/java/roomescape/payment/web/PaymentDTO.kt index 2f549b36..a6261cce 100644 --- a/src/main/java/roomescape/payment/web/PaymentDTO.kt +++ b/src/main/java/roomescape/payment/web/PaymentDTO.kt @@ -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 { diff --git a/src/main/java/roomescape/reservation/business/ReservationService.java b/src/main/java/roomescape/reservation/business/ReservationService.java index b6be3a21..4f8d0933 100644 --- a/src/main/java/roomescape/reservation/business/ReservationService.java +++ b/src/main/java/roomescape/reservation/business/ReservationService.java @@ -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); } diff --git a/src/main/java/roomescape/reservation/business/ReservationTimeService.java b/src/main/java/roomescape/reservation/business/ReservationTimeService.java index 19716136..f0062ef5 100644 --- a/src/main/java/roomescape/reservation/business/ReservationTimeService.java +++ b/src/main/java/roomescape/reservation/business/ReservationTimeService.java @@ -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 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); } } diff --git a/src/main/java/roomescape/reservation/business/ReservationWithPaymentService.java b/src/main/java/roomescape/reservation/business/ReservationWithPaymentService.java index e1bb4c74..9e01b26b 100644 --- a/src/main/java/roomescape/reservation/business/ReservationWithPaymentService.java +++ b/src/main/java/roomescape/reservation/business/ReservationWithPaymentService.java @@ -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 diff --git a/src/main/java/roomescape/reservation/infrastructure/persistence/ReservationRepository.java b/src/main/java/roomescape/reservation/infrastructure/persistence/ReservationRepository.java index 987dd6b4..b6dd32de 100644 --- a/src/main/java/roomescape/reservation/infrastructure/persistence/ReservationRepository.java +++ b/src/main/java/roomescape/reservation/infrastructure/persistence/ReservationRepository.java @@ -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, JpaSpecificationExecutor { @@ -39,13 +39,13 @@ public interface ReservationRepository extends JpaRepository, 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 ) diff --git a/src/main/java/roomescape/reservation/web/ReservationController.java b/src/main/java/roomescape/reservation/web/ReservationController.java index 90303267..1fe53e0d 100644 --- a/src/main/java/roomescape/reservation/web/ReservationController.java +++ b/src/main/java/roomescape/reservation/web/ReservationController.java @@ -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); } } diff --git a/src/main/java/roomescape/reservation/web/ReservationRequest.kt b/src/main/java/roomescape/reservation/web/ReservationRequest.kt new file mode 100644 index 00000000..fa081bc9 --- /dev/null +++ b/src/main/java/roomescape/reservation/web/ReservationRequest.kt @@ -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 +) diff --git a/src/main/java/roomescape/reservation/web/ReservationResponse.kt b/src/main/java/roomescape/reservation/web/ReservationResponse.kt new file mode 100644 index 00000000..d3ea1ec2 --- /dev/null +++ b/src/main/java/roomescape/reservation/web/ReservationResponse.kt @@ -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 +) + +@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 +) + +@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) + } + } +} diff --git a/src/main/java/roomescape/reservation/web/ReservationTimeController.java b/src/main/java/roomescape/reservation/web/ReservationTimeController.java index bd494779..389a182e 100644 --- a/src/main/java/roomescape/reservation/web/ReservationTimeController.java +++ b/src/main/java/roomescape/reservation/web/ReservationTimeController.java @@ -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); } diff --git a/src/main/java/roomescape/reservation/web/ReservationTimeDTO.kt b/src/main/java/roomescape/reservation/web/ReservationTimeDTO.kt new file mode 100644 index 00000000..299c727b --- /dev/null +++ b/src/main/java/roomescape/reservation/web/ReservationTimeDTO.kt @@ -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 +) + +@Schema(name = "예약 시간 정보 목록 응답", description = "모든 예약 시간 조회 응답시 사용됩니다.") +@JvmRecord +data class ReservationTimesResponse( + @field:Schema(description = "모든 시간 목록") + val times: List +) diff --git a/src/main/java/roomescape/reservation/web/request/AdminReservationRequest.java b/src/main/java/roomescape/reservation/web/request/AdminReservationRequest.java deleted file mode 100644 index af07eab7..00000000 --- a/src/main/java/roomescape/reservation/web/request/AdminReservationRequest.java +++ /dev/null @@ -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 -) { -} diff --git a/src/main/java/roomescape/reservation/web/request/ReservationRequest.java b/src/main/java/roomescape/reservation/web/request/ReservationRequest.java deleted file mode 100644 index 88805c05..00000000 --- a/src/main/java/roomescape/reservation/web/request/ReservationRequest.java +++ /dev/null @@ -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); - } -} diff --git a/src/main/java/roomescape/reservation/web/request/ReservationTimeRequest.java b/src/main/java/roomescape/reservation/web/request/ReservationTimeRequest.java deleted file mode 100644 index 74c60b84..00000000 --- a/src/main/java/roomescape/reservation/web/request/ReservationTimeRequest.java +++ /dev/null @@ -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); - } -} diff --git a/src/main/java/roomescape/reservation/web/request/WaitingRequest.java b/src/main/java/roomescape/reservation/web/request/WaitingRequest.java deleted file mode 100644 index da794d3f..00000000 --- a/src/main/java/roomescape/reservation/web/request/WaitingRequest.java +++ /dev/null @@ -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 -) { -} diff --git a/src/main/java/roomescape/reservation/web/response/MyReservationResponse.java b/src/main/java/roomescape/reservation/web/response/MyReservationResponse.java deleted file mode 100644 index ba7dfe16..00000000 --- a/src/main/java/roomescape/reservation/web/response/MyReservationResponse.java +++ /dev/null @@ -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); - } -} diff --git a/src/main/java/roomescape/reservation/web/response/MyReservationsResponse.java b/src/main/java/roomescape/reservation/web/response/MyReservationsResponse.java deleted file mode 100644 index 6d9b70e0..00000000 --- a/src/main/java/roomescape/reservation/web/response/MyReservationsResponse.java +++ /dev/null @@ -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 myReservationResponses -) { -} diff --git a/src/main/java/roomescape/reservation/web/response/ReservationResponse.java b/src/main/java/roomescape/reservation/web/response/ReservationResponse.java deleted file mode 100644 index a6aa290c..00000000 --- a/src/main/java/roomescape/reservation/web/response/ReservationResponse.java +++ /dev/null @@ -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() - ); - } -} diff --git a/src/main/java/roomescape/reservation/web/response/ReservationTimeInfoResponse.java b/src/main/java/roomescape/reservation/web/response/ReservationTimeInfoResponse.java deleted file mode 100644 index 6912ef81..00000000 --- a/src/main/java/roomescape/reservation/web/response/ReservationTimeInfoResponse.java +++ /dev/null @@ -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 -) { -} diff --git a/src/main/java/roomescape/reservation/web/response/ReservationTimeInfosResponse.java b/src/main/java/roomescape/reservation/web/response/ReservationTimeInfosResponse.java deleted file mode 100644 index 97ee2ef9..00000000 --- a/src/main/java/roomescape/reservation/web/response/ReservationTimeInfosResponse.java +++ /dev/null @@ -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 reservationTimes -) { -} diff --git a/src/main/java/roomescape/reservation/web/response/ReservationTimeResponse.java b/src/main/java/roomescape/reservation/web/response/ReservationTimeResponse.java deleted file mode 100644 index 8edcae24..00000000 --- a/src/main/java/roomescape/reservation/web/response/ReservationTimeResponse.java +++ /dev/null @@ -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()); - } -} diff --git a/src/main/java/roomescape/reservation/web/response/ReservationTimesResponse.java b/src/main/java/roomescape/reservation/web/response/ReservationTimesResponse.java deleted file mode 100644 index 196721c5..00000000 --- a/src/main/java/roomescape/reservation/web/response/ReservationTimesResponse.java +++ /dev/null @@ -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 times -) { -} diff --git a/src/main/java/roomescape/reservation/web/response/ReservationsResponse.java b/src/main/java/roomescape/reservation/web/response/ReservationsResponse.java deleted file mode 100644 index 1b9811b5..00000000 --- a/src/main/java/roomescape/reservation/web/response/ReservationsResponse.java +++ /dev/null @@ -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 reservations -) { -} diff --git a/src/main/java/roomescape/theme/web/ThemeDTO.kt b/src/main/java/roomescape/theme/web/ThemeDTO.kt index 27c4ea61..b814a43a 100644 --- a/src/main/java/roomescape/theme/web/ThemeDTO.kt +++ b/src/main/java/roomescape/theme/web/ThemeDTO.kt @@ -64,5 +64,5 @@ data class ThemesResponse( ) fun List.toResponse(): ThemesResponse = ThemesResponse( - themes = this.map { it.toResponse()} + themes = this.map { it.toResponse() } ) diff --git a/src/test/java/roomescape/auth/business/AuthServiceTest.kt b/src/test/java/roomescape/auth/business/AuthServiceTest.kt index f819ff3b..90fb95cb 100644 --- a/src/test/java/roomescape/auth/business/AuthServiceTest.kt +++ b/src/test/java/roomescape/auth/business/AuthServiceTest.kt @@ -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({ diff --git a/src/test/java/roomescape/auth/infrastructure/jwt/JwtHandlerTest.kt b/src/test/java/roomescape/auth/infrastructure/jwt/JwtHandlerTest.kt index 4626bab1..53f12279 100644 --- a/src/test/java/roomescape/auth/infrastructure/jwt/JwtHandlerTest.kt +++ b/src/test/java/roomescape/auth/infrastructure/jwt/JwtHandlerTest.kt @@ -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 diff --git a/src/test/java/roomescape/payment/business/PaymentServiceTest.java b/src/test/java/roomescape/payment/business/PaymentServiceTest.java index 1731aab3..ef6a43e1 100644 --- a/src/test/java/roomescape/payment/business/PaymentServiceTest.java +++ b/src/test/java/roomescape/payment/business/PaymentServiceTest.java @@ -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)); diff --git a/src/test/java/roomescape/payment/infrastructure/persistence/CanceledPaymentRepositoryTest.kt b/src/test/java/roomescape/payment/infrastructure/persistence/CanceledPaymentRepositoryTest.kt index 1043a737..a764351f 100644 --- a/src/test/java/roomescape/payment/infrastructure/persistence/CanceledPaymentRepositoryTest.kt +++ b/src/test/java/roomescape/payment/infrastructure/persistence/CanceledPaymentRepositoryTest.kt @@ -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" diff --git a/src/test/java/roomescape/reservation/business/ReservationServiceTest.java b/src/test/java/roomescape/reservation/business/ReservationServiceTest.java index b5136835..c61b8dbf 100644 --- a/src/test/java/roomescape/reservation/business/ReservationServiceTest.java +++ b/src/test/java/roomescape/reservation/business/ReservationServiceTest.java @@ -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); } } diff --git a/src/test/java/roomescape/reservation/business/ReservationTimeServiceTest.java b/src/test/java/roomescape/reservation/business/ReservationTimeServiceTest.java index a6c91918..0fc57aed 100644 --- a/src/test/java/roomescape/reservation/business/ReservationTimeServiceTest.java +++ b/src/test/java/roomescape/reservation/business/ReservationTimeServiceTest.java @@ -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, diff --git a/src/test/java/roomescape/reservation/business/ReservationWithPaymentServiceTest.java b/src/test/java/roomescape/reservation/business/ReservationWithPaymentServiceTest.java index 8d321b7c..45017021 100644 --- a/src/test/java/roomescape/reservation/business/ReservationWithPaymentServiceTest.java +++ b/src/test/java/roomescape/reservation/business/ReservationWithPaymentServiceTest.java @@ -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(); diff --git a/src/test/java/roomescape/reservation/infrastructure/persistence/ReservationSearchSpecificationTest.java b/src/test/java/roomescape/reservation/infrastructure/persistence/ReservationSearchSpecificationTest.java index a9b75a04..4b37df53 100644 --- a/src/test/java/roomescape/reservation/infrastructure/persistence/ReservationSearchSpecificationTest.java +++ b/src/test/java/roomescape/reservation/infrastructure/persistence/ReservationSearchSpecificationTest.java @@ -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")); diff --git a/src/test/java/roomescape/reservation/infrastructure/persistence/ReservationTest.java b/src/test/java/roomescape/reservation/infrastructure/persistence/ReservationTest.java index 061b0326..db467956 100644 --- a/src/test/java/roomescape/reservation/infrastructure/persistence/ReservationTest.java +++ b/src/test/java/roomescape/reservation/infrastructure/persistence/ReservationTest.java @@ -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 { diff --git a/src/test/java/roomescape/reservation/web/ReservationControllerTest.java b/src/test/java/roomescape/reservation/web/ReservationControllerTest.java index bc772916..8c7d727a 100644 --- a/src/test/java/roomescape/reservation/web/ReservationControllerTest.java +++ b/src/test/java/roomescape/reservation/web/ReservationControllerTest.java @@ -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"); diff --git a/src/test/java/roomescape/reservation/web/ReservationTimeControllerTest.java b/src/test/java/roomescape/reservation/web/ReservationTimeControllerTest.java index 3aa5883b..d809a355 100644 --- a/src/test/java/roomescape/reservation/web/ReservationTimeControllerTest.java +++ b/src/test/java/roomescape/reservation/web/ReservationTimeControllerTest.java @@ -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)); diff --git a/src/test/java/roomescape/util/Fixtures.kt b/src/test/java/roomescape/util/Fixtures.kt index d61b70ba..6343eab1 100644 --- a/src/test/java/roomescape/util/Fixtures.kt +++ b/src/test/java/roomescape/util/Fixtures.kt @@ -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