generated from pricelees/issue-pr-template
[#18] 코드 정리 및 일부 컨벤션 통일 #19
@ -29,7 +29,7 @@ class PaymentService(
|
||||
): PaymentCreateResponse = PaymentEntity(
|
||||
orderId = paymentResponse.orderId,
|
||||
paymentKey = paymentResponse.paymentKey,
|
||||
totalAmount = paymentResponse.amount,
|
||||
totalAmount = paymentResponse.totalAmount,
|
||||
reservation = reservation,
|
||||
approvedAt = paymentResponse.approvedAt
|
||||
).also {
|
||||
|
||||
@ -3,8 +3,8 @@ package roomescape.payment.web
|
||||
import com.fasterxml.jackson.databind.annotation.JsonDeserialize
|
||||
import roomescape.payment.infrastructure.client.PaymentCancelResponseDeserializer
|
||||
import roomescape.payment.infrastructure.persistence.PaymentEntity
|
||||
import roomescape.reservation.web.ReservationResponse
|
||||
import roomescape.reservation.web.toCreateResponse
|
||||
import roomescape.reservation.web.ReservationRetrieveResponse
|
||||
import roomescape.reservation.web.toRetrieveResponse
|
||||
import java.time.OffsetDateTime
|
||||
|
||||
data class PaymentCancelRequest(
|
||||
@ -26,7 +26,7 @@ data class PaymentCreateResponse(
|
||||
val orderId: String,
|
||||
val paymentKey: String,
|
||||
val totalAmount: Long,
|
||||
val reservation: ReservationResponse,
|
||||
val reservation: ReservationRetrieveResponse,
|
||||
val approvedAt: OffsetDateTime
|
||||
)
|
||||
|
||||
@ -35,6 +35,6 @@ fun PaymentEntity.toCreateResponse(): PaymentCreateResponse = PaymentCreateRespo
|
||||
orderId = this.orderId,
|
||||
paymentKey = this.paymentKey,
|
||||
totalAmount = this.totalAmount,
|
||||
reservation = this.reservation.toCreateResponse(),
|
||||
reservation = this.reservation.toRetrieveResponse(),
|
||||
approvedAt = this.approvedAt
|
||||
)
|
||||
@ -24,26 +24,26 @@ class ReservationService(
|
||||
) {
|
||||
|
||||
@Transactional(readOnly = true)
|
||||
fun findAllReservations(): ReservationsResponse {
|
||||
fun findAllReservations(): ReservationRetrieveListResponse {
|
||||
val spec: Specification<ReservationEntity> = ReservationSearchSpecification()
|
||||
.confirmed()
|
||||
.build()
|
||||
|
||||
|
||||
return ReservationsResponse(findAllReservationByStatus(spec))
|
||||
return ReservationRetrieveListResponse(findAllReservationByStatus(spec))
|
||||
}
|
||||
|
||||
@Transactional(readOnly = true)
|
||||
fun findAllWaiting(): ReservationsResponse {
|
||||
fun findAllWaiting(): ReservationRetrieveListResponse {
|
||||
val spec: Specification<ReservationEntity> = ReservationSearchSpecification()
|
||||
.waiting()
|
||||
.build()
|
||||
|
||||
return ReservationsResponse(findAllReservationByStatus(spec))
|
||||
return ReservationRetrieveListResponse(findAllReservationByStatus(spec))
|
||||
}
|
||||
|
||||
private fun findAllReservationByStatus(spec: Specification<ReservationEntity>): List<ReservationResponse> {
|
||||
return reservationRepository.findAll(spec).map { it.toCreateResponse() }
|
||||
private fun findAllReservationByStatus(spec: Specification<ReservationEntity>): List<ReservationRetrieveResponse> {
|
||||
return reservationRepository.findAll(spec).map { it.toRetrieveResponse() }
|
||||
}
|
||||
|
||||
fun removeReservationById(reservationId: Long, memberId: Long) {
|
||||
@ -51,7 +51,7 @@ class ReservationService(
|
||||
reservationRepository.deleteById(reservationId)
|
||||
}
|
||||
|
||||
fun addReservation(request: ReservationRequest, memberId: Long): ReservationEntity {
|
||||
fun addReservation(request: ReservationCreateWithPaymentRequest, memberId: Long): ReservationEntity {
|
||||
validateIsReservationExist(request.themeId, request.timeId, request.date)
|
||||
return getReservationForSave(
|
||||
request.timeId,
|
||||
@ -64,7 +64,7 @@ class ReservationService(
|
||||
}
|
||||
}
|
||||
|
||||
fun addReservationByAdmin(request: AdminReservationRequest): ReservationResponse {
|
||||
fun addReservationByAdmin(request: AdminReservationCreateRequest): ReservationRetrieveResponse {
|
||||
validateIsReservationExist(request.themeId, request.timeId, request.date)
|
||||
|
||||
return addReservationWithoutPayment(
|
||||
@ -76,7 +76,7 @@ class ReservationService(
|
||||
)
|
||||
}
|
||||
|
||||
fun addWaiting(request: WaitingRequest, memberId: Long): ReservationResponse {
|
||||
fun addWaiting(request: WaitingCreateRequest, memberId: Long): ReservationRetrieveResponse {
|
||||
validateMemberAlreadyReserve(request.themeId, request.timeId, request.date, memberId)
|
||||
return addReservationWithoutPayment(
|
||||
request.themeId,
|
||||
@ -93,10 +93,10 @@ class ReservationService(
|
||||
date: LocalDate,
|
||||
memberId: Long,
|
||||
status: ReservationStatus
|
||||
): ReservationResponse = getReservationForSave(timeId, themeId, date, memberId, status)
|
||||
): ReservationRetrieveResponse = getReservationForSave(timeId, themeId, date, memberId, status)
|
||||
.also {
|
||||
reservationRepository.save(it)
|
||||
}.toCreateResponse()
|
||||
}.toRetrieveResponse()
|
||||
|
||||
|
||||
private fun validateMemberAlreadyReserve(themeId: Long?, timeId: Long?, date: LocalDate?, memberId: Long?) {
|
||||
@ -169,7 +169,7 @@ class ReservationService(
|
||||
memberId: Long?,
|
||||
dateFrom: LocalDate?,
|
||||
dateTo: LocalDate?
|
||||
): ReservationsResponse {
|
||||
): ReservationRetrieveListResponse {
|
||||
validateDateForSearch(dateFrom, dateTo)
|
||||
val spec: Specification<ReservationEntity> = ReservationSearchSpecification()
|
||||
.confirmed()
|
||||
@ -179,7 +179,7 @@ class ReservationService(
|
||||
.dateEndAt(dateTo)
|
||||
.build()
|
||||
|
||||
return ReservationsResponse(findAllReservationByStatus(spec))
|
||||
return ReservationRetrieveListResponse(findAllReservationByStatus(spec))
|
||||
}
|
||||
|
||||
private fun validateDateForSearch(startFrom: LocalDate?, endAt: LocalDate?) {
|
||||
@ -195,8 +195,8 @@ class ReservationService(
|
||||
}
|
||||
|
||||
@Transactional(readOnly = true)
|
||||
fun findMemberReservations(memberId: Long): MyReservationsResponse {
|
||||
return MyReservationsResponse(reservationRepository.findMyReservations(memberId))
|
||||
fun findMemberReservations(memberId: Long): MyReservationRetrieveListResponse {
|
||||
return MyReservationRetrieveListResponse(reservationRepository.findMyReservations(memberId))
|
||||
}
|
||||
|
||||
fun approveWaiting(reservationId: Long, memberId: Long) {
|
||||
|
||||
@ -7,8 +7,8 @@ import roomescape.payment.infrastructure.client.PaymentApproveResponse
|
||||
import roomescape.payment.web.PaymentCancelRequest
|
||||
import roomescape.payment.web.PaymentCancelResponse
|
||||
import roomescape.reservation.infrastructure.persistence.ReservationEntity
|
||||
import roomescape.reservation.web.ReservationRequest
|
||||
import roomescape.reservation.web.ReservationResponse
|
||||
import roomescape.reservation.web.ReservationCreateWithPaymentRequest
|
||||
import roomescape.reservation.web.ReservationRetrieveResponse
|
||||
import java.time.OffsetDateTime
|
||||
|
||||
@Service
|
||||
@ -18,10 +18,10 @@ class ReservationWithPaymentService(
|
||||
private val paymentService: PaymentService
|
||||
) {
|
||||
fun addReservationWithPayment(
|
||||
request: ReservationRequest,
|
||||
request: ReservationCreateWithPaymentRequest,
|
||||
paymentInfo: PaymentApproveResponse,
|
||||
memberId: Long
|
||||
): ReservationResponse {
|
||||
): ReservationRetrieveResponse {
|
||||
val reservation: ReservationEntity = reservationService.addReservation(request, memberId)
|
||||
|
||||
return paymentService.createPayment(paymentInfo, reservation)
|
||||
|
||||
@ -26,14 +26,14 @@ interface ReservationAPI {
|
||||
@Admin
|
||||
@Operation(summary = "모든 예약 정보 조회", tags = ["관리자 로그인이 필요한 API"])
|
||||
@ApiResponses(ApiResponse(responseCode = "200", description = "성공", useReturnTypeSchema = true))
|
||||
fun getAllReservations(): ResponseEntity<CommonApiResponse<ReservationsResponse>>
|
||||
fun getAllReservations(): ResponseEntity<CommonApiResponse<ReservationRetrieveListResponse>>
|
||||
|
||||
@LoginRequired
|
||||
@Operation(summary = "자신의 예약 및 대기 조회", tags = ["로그인이 필요한 API"])
|
||||
@ApiResponses(ApiResponse(responseCode = "200", description = "성공", useReturnTypeSchema = true))
|
||||
fun getMemberReservations(
|
||||
@MemberId @Parameter(hidden = true) memberId: Long
|
||||
): ResponseEntity<CommonApiResponse<MyReservationsResponse>>
|
||||
): ResponseEntity<CommonApiResponse<MyReservationRetrieveListResponse>>
|
||||
|
||||
@Admin
|
||||
@Operation(summary = "관리자의 예약 검색", description = "특정 조건에 해당되는 예약 검색", tags = ["관리자 로그인이 필요한 API"])
|
||||
@ -45,7 +45,7 @@ interface ReservationAPI {
|
||||
@RequestParam(required = false) memberId: Long?,
|
||||
@RequestParam(required = false) dateFrom: LocalDate?,
|
||||
@RequestParam(required = false) dateTo: LocalDate?
|
||||
): ResponseEntity<CommonApiResponse<ReservationsResponse>>
|
||||
): ResponseEntity<CommonApiResponse<ReservationRetrieveListResponse>>
|
||||
|
||||
@Admin
|
||||
@Operation(summary = "관리자의 예약 취소", tags = ["관리자 로그인이 필요한 API"])
|
||||
@ -68,9 +68,9 @@ interface ReservationAPI {
|
||||
)
|
||||
)
|
||||
fun saveReservation(
|
||||
@Valid @RequestBody reservationRequest: ReservationRequest,
|
||||
@Valid @RequestBody reservationCreateWithPaymentRequest: ReservationCreateWithPaymentRequest,
|
||||
@MemberId @Parameter(hidden = true) memberId: Long
|
||||
): ResponseEntity<CommonApiResponse<ReservationResponse>>
|
||||
): ResponseEntity<CommonApiResponse<ReservationRetrieveResponse>>
|
||||
|
||||
@Admin
|
||||
@Operation(summary = "관리자 예약 추가", tags = ["관리자 로그인이 필요한 API"])
|
||||
@ -83,13 +83,13 @@ interface ReservationAPI {
|
||||
)
|
||||
)
|
||||
fun saveReservationByAdmin(
|
||||
@Valid @RequestBody adminReservationRequest: AdminReservationRequest,
|
||||
): ResponseEntity<CommonApiResponse<ReservationResponse>>
|
||||
@Valid @RequestBody adminReservationRequest: AdminReservationCreateRequest,
|
||||
): ResponseEntity<CommonApiResponse<ReservationRetrieveResponse>>
|
||||
|
||||
@Admin
|
||||
@Operation(summary = "모든 예약 대기 조회", tags = ["관리자 로그인이 필요한 API"])
|
||||
@ApiResponses(ApiResponse(responseCode = "200", description = "성공", useReturnTypeSchema = true))
|
||||
fun getAllWaiting(): ResponseEntity<CommonApiResponse<ReservationsResponse>>
|
||||
fun getAllWaiting(): ResponseEntity<CommonApiResponse<ReservationRetrieveListResponse>>
|
||||
|
||||
@LoginRequired
|
||||
@Operation(summary = "예약 대기 신청", tags = ["로그인이 필요한 API"])
|
||||
@ -102,9 +102,9 @@ interface ReservationAPI {
|
||||
)
|
||||
)
|
||||
fun saveWaiting(
|
||||
@Valid @RequestBody waitingRequest: WaitingRequest,
|
||||
@Valid @RequestBody waitingCreateRequest: WaitingCreateRequest,
|
||||
@MemberId @Parameter(hidden = true) memberId: Long,
|
||||
): ResponseEntity<CommonApiResponse<ReservationResponse>>
|
||||
): ResponseEntity<CommonApiResponse<ReservationRetrieveResponse>>
|
||||
|
||||
@LoginRequired
|
||||
@Operation(summary = "예약 대기 취소", tags = ["로그인이 필요한 API"])
|
||||
|
||||
@ -5,7 +5,7 @@ import org.springframework.data.jpa.repository.JpaSpecificationExecutor
|
||||
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.MyReservationResponse
|
||||
import roomescape.reservation.web.MyReservationRetrieveResponse
|
||||
import java.time.LocalDate
|
||||
|
||||
interface ReservationRepository
|
||||
@ -42,7 +42,7 @@ interface ReservationRepository
|
||||
fun isExistConfirmedReservation(@Param("id") reservationId: Long): Boolean
|
||||
|
||||
@Query("""
|
||||
SELECT new roomescape.reservation.web.MyReservationResponse(
|
||||
SELECT new roomescape.reservation.web.MyReservationRetrieveResponse(
|
||||
r.id,
|
||||
t.name,
|
||||
r.date,
|
||||
@ -58,5 +58,5 @@ interface ReservationRepository
|
||||
ON p.reservation = r
|
||||
WHERE r.member.id = :memberId
|
||||
""")
|
||||
fun findMyReservations(memberId: Long): List<MyReservationResponse>
|
||||
fun findMyReservations(memberId: Long): List<MyReservationRetrieveResponse>
|
||||
}
|
||||
|
||||
@ -24,8 +24,8 @@ class ReservationController(
|
||||
private val paymentClient: TossPaymentClient
|
||||
) : ReservationAPI {
|
||||
@GetMapping("/reservations")
|
||||
override fun getAllReservations(): ResponseEntity<CommonApiResponse<ReservationsResponse>> {
|
||||
val response: ReservationsResponse = reservationService.findAllReservations()
|
||||
override fun getAllReservations(): ResponseEntity<CommonApiResponse<ReservationRetrieveListResponse>> {
|
||||
val response: ReservationRetrieveListResponse = reservationService.findAllReservations()
|
||||
|
||||
return ResponseEntity.ok(CommonApiResponse(response))
|
||||
}
|
||||
@ -33,8 +33,8 @@ class ReservationController(
|
||||
@GetMapping("/reservations-mine")
|
||||
override fun getMemberReservations(
|
||||
@MemberId @Parameter(hidden = true) memberId: Long
|
||||
): ResponseEntity<CommonApiResponse<MyReservationsResponse>> {
|
||||
val response: MyReservationsResponse = reservationService.findMemberReservations(memberId)
|
||||
): ResponseEntity<CommonApiResponse<MyReservationRetrieveListResponse>> {
|
||||
val response: MyReservationRetrieveListResponse = reservationService.findMemberReservations(memberId)
|
||||
|
||||
return ResponseEntity.ok(CommonApiResponse(response))
|
||||
}
|
||||
@ -45,8 +45,8 @@ class ReservationController(
|
||||
@RequestParam(required = false) memberId: Long?,
|
||||
@RequestParam(required = false) dateFrom: LocalDate?,
|
||||
@RequestParam(required = false) dateTo: LocalDate?
|
||||
): ResponseEntity<CommonApiResponse<ReservationsResponse>> {
|
||||
val response: ReservationsResponse = reservationService.findFilteredReservations(themeId, memberId, dateFrom, dateTo)
|
||||
): ResponseEntity<CommonApiResponse<ReservationRetrieveListResponse>> {
|
||||
val response: ReservationRetrieveListResponse = reservationService.findFilteredReservations(themeId, memberId, dateFrom, dateTo)
|
||||
|
||||
return ResponseEntity.ok(CommonApiResponse(response))
|
||||
}
|
||||
@ -72,20 +72,20 @@ class ReservationController(
|
||||
|
||||
@PostMapping("/reservations")
|
||||
override fun saveReservation(
|
||||
@Valid @RequestBody reservationRequest: ReservationRequest,
|
||||
@Valid @RequestBody reservationCreateWithPaymentRequest: ReservationCreateWithPaymentRequest,
|
||||
@MemberId @Parameter(hidden = true) memberId: Long
|
||||
): ResponseEntity<CommonApiResponse<ReservationResponse>> {
|
||||
val paymentRequest: PaymentApproveRequest = reservationRequest.paymentRequest
|
||||
): ResponseEntity<CommonApiResponse<ReservationRetrieveResponse>> {
|
||||
val paymentRequest: PaymentApproveRequest = reservationCreateWithPaymentRequest.toPaymentApproveRequest()
|
||||
val paymentResponse: PaymentApproveResponse = paymentClient.confirmPayment(paymentRequest)
|
||||
|
||||
try {
|
||||
val reservationResponse: ReservationResponse = reservationWithPaymentService.addReservationWithPayment(
|
||||
reservationRequest,
|
||||
val reservationRetrieveResponse: ReservationRetrieveResponse = reservationWithPaymentService.addReservationWithPayment(
|
||||
reservationCreateWithPaymentRequest,
|
||||
paymentResponse,
|
||||
memberId
|
||||
)
|
||||
return ResponseEntity.created(URI.create("/reservations/${reservationResponse.id}"))
|
||||
.body(CommonApiResponse(reservationResponse))
|
||||
return ResponseEntity.created(URI.create("/reservations/${reservationRetrieveResponse.id}"))
|
||||
.body(CommonApiResponse(reservationRetrieveResponse))
|
||||
} catch (e: RoomescapeException) {
|
||||
val cancelRequest = PaymentCancelRequest(paymentRequest.paymentKey,
|
||||
paymentRequest.amount, e.message!!)
|
||||
@ -98,9 +98,9 @@ class ReservationController(
|
||||
|
||||
@PostMapping("/reservations/admin")
|
||||
override fun saveReservationByAdmin(
|
||||
@Valid @RequestBody adminReservationRequest: AdminReservationRequest
|
||||
): ResponseEntity<CommonApiResponse<ReservationResponse>> {
|
||||
val response: ReservationResponse =
|
||||
@Valid @RequestBody adminReservationRequest: AdminReservationCreateRequest
|
||||
): ResponseEntity<CommonApiResponse<ReservationRetrieveResponse>> {
|
||||
val response: ReservationRetrieveResponse =
|
||||
reservationService.addReservationByAdmin(adminReservationRequest)
|
||||
|
||||
return ResponseEntity.created(URI.create("/reservations/${response.id}"))
|
||||
@ -108,19 +108,19 @@ class ReservationController(
|
||||
}
|
||||
|
||||
@GetMapping("/reservations/waiting")
|
||||
override fun getAllWaiting(): ResponseEntity<CommonApiResponse<ReservationsResponse>> {
|
||||
val response: ReservationsResponse = reservationService.findAllWaiting()
|
||||
override fun getAllWaiting(): ResponseEntity<CommonApiResponse<ReservationRetrieveListResponse>> {
|
||||
val response: ReservationRetrieveListResponse = reservationService.findAllWaiting()
|
||||
|
||||
return ResponseEntity.ok(CommonApiResponse(response))
|
||||
}
|
||||
|
||||
@PostMapping("/reservations/waiting")
|
||||
override fun saveWaiting(
|
||||
@Valid @RequestBody waitingRequest: WaitingRequest,
|
||||
@Valid @RequestBody waitingCreateRequest: WaitingCreateRequest,
|
||||
@MemberId @Parameter(hidden = true) memberId: Long,
|
||||
): ResponseEntity<CommonApiResponse<ReservationResponse>> {
|
||||
val response: ReservationResponse = reservationService.addWaiting(
|
||||
waitingRequest,
|
||||
): ResponseEntity<CommonApiResponse<ReservationRetrieveResponse>> {
|
||||
val response: ReservationRetrieveResponse = reservationService.addWaiting(
|
||||
waitingCreateRequest,
|
||||
memberId
|
||||
)
|
||||
|
||||
|
||||
@ -1,31 +1,19 @@
|
||||
package roomescape.reservation.web
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore
|
||||
import io.swagger.v3.oas.annotations.media.Schema
|
||||
import roomescape.payment.infrastructure.client.PaymentApproveRequest
|
||||
import java.time.LocalDate
|
||||
|
||||
@Schema(name = "관리자 예약 저장 요청", description = "관리자의 예약 저장 요청시 사용됩니다.")
|
||||
data class AdminReservationRequest(
|
||||
@field:Schema(description = "예약 날짜. 지난 날짜는 지정할 수 없으며, yyyy-MM-dd 형식으로 입력해야 합니다.", type = "string", example = "2022-12-31")
|
||||
data class AdminReservationCreateRequest(
|
||||
val date: LocalDate,
|
||||
@field:Schema(description = "예약 시간 ID.", example = "1")
|
||||
val timeId: Long,
|
||||
@field:Schema(description = "테마 ID", example = "1")
|
||||
val themeId: Long,
|
||||
@field:Schema(description = "회원 ID", example = "1")
|
||||
val memberId: Long
|
||||
)
|
||||
|
||||
@Schema(name = "회원의 예약 저장 요청", description = "회원의 예약 요청시 사용됩니다.")
|
||||
data class ReservationRequest(
|
||||
@field:Schema(description = "예약 날짜. 지난 날짜는 지정할 수 없으며, yyyy-MM-dd 형식으로 입력해야 합니다.", type = "string", example = "2022-12-31")
|
||||
data class ReservationCreateWithPaymentRequest(
|
||||
val date: LocalDate,
|
||||
|
||||
@field:Schema(description = "예약 시간 ID.", example = "1")
|
||||
val timeId: Long,
|
||||
|
||||
@field:Schema(description = "테마 ID", example = "1")
|
||||
val themeId: Long,
|
||||
|
||||
@field:Schema(description = "결제 위젯을 통해 받은 결제 키")
|
||||
@ -39,23 +27,14 @@ data class ReservationRequest(
|
||||
|
||||
@field:Schema(description = "결제 타입", example = "NORMAL")
|
||||
val paymentType: String
|
||||
) {
|
||||
@get:JsonIgnore
|
||||
val paymentRequest: PaymentApproveRequest
|
||||
get() = PaymentApproveRequest(paymentKey, orderId, amount, paymentType)
|
||||
}
|
||||
)
|
||||
|
||||
@Schema(name = "예약 대기 저장 요청", description = "회원의 예약 대기 요청시 사용됩니다.")
|
||||
data class WaitingRequest(
|
||||
fun ReservationCreateWithPaymentRequest.toPaymentApproveRequest(): PaymentApproveRequest = PaymentApproveRequest(
|
||||
paymentKey, orderId, amount, paymentType
|
||||
)
|
||||
|
||||
@field:Schema(description = "예약 날짜. 지난 날짜는 지정할 수 없으며, yyyy-MM-dd 형식으로 입력해야 합니다.", type = "string", example = "2022-12-31")
|
||||
data class WaitingCreateRequest(
|
||||
val date: LocalDate,
|
||||
|
||||
|
||||
@field:Schema(description = "예약 시간 ID", example = "1")
|
||||
val timeId: Long,
|
||||
|
||||
|
||||
@field:Schema(description = "테마 ID", example = "1")
|
||||
val themeId: Long
|
||||
)
|
||||
|
||||
@ -11,65 +11,42 @@ import roomescape.theme.web.toResponse
|
||||
import java.time.LocalDate
|
||||
import java.time.LocalTime
|
||||
|
||||
@Schema(name = "회원의 예약 및 대기 응답", description = "회원의 예약 및 대기 정보 응답시 사용됩니다.")
|
||||
data class MyReservationResponse(
|
||||
@field:Schema(description = "예약 번호. 예약을 식별할 때 사용합니다.")
|
||||
data class MyReservationRetrieveResponse(
|
||||
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의 값을 가집니다.")
|
||||
@field:Schema(description = "대기 순번. 확정된 예약은 0의 값을 가집니다.")
|
||||
val rank: Long,
|
||||
|
||||
@field:Schema(description = "결제 키. 결제가 완료된 예약에만 값이 존재합니다.")
|
||||
val paymentKey: String?,
|
||||
|
||||
@field:Schema(description = "결제 금액. 결제가 완료된 예약에만 값이 존재합니다.")
|
||||
val amount: Long?
|
||||
)
|
||||
|
||||
@Schema(name = "회원의 예약 및 대기 목록 조회 응답", description = "회원의 예약 및 대기 목록 조회 응답시 사용됩니다.")
|
||||
data class MyReservationsResponse(
|
||||
data class MyReservationRetrieveListResponse(
|
||||
@field:Schema(description = "현재 로그인한 회원의 예약 및 대기 목록")
|
||||
val reservations: List<MyReservationResponse>
|
||||
val reservations: List<MyReservationRetrieveResponse>
|
||||
)
|
||||
|
||||
@Schema(name = "예약 정보", description = "예약 저장 및 조회 응답에 사용됩니다.")
|
||||
data class ReservationResponse(
|
||||
|
||||
@field:Schema(description = "예약 번호. 예약을 식별할 때 사용합니다.")
|
||||
data class ReservationRetrieveResponse(
|
||||
val id: Long,
|
||||
|
||||
@field:Schema(description = "예약 날짜", type = "string", example = "2022-12-31")
|
||||
val date: LocalDate,
|
||||
|
||||
@field:Schema(description = "예약한 회원 정보")
|
||||
@field:JsonProperty("member")
|
||||
val member: MemberRetrieveResponse,
|
||||
|
||||
@field:Schema(description = "예약 시간 정보")
|
||||
@field:JsonProperty("time")
|
||||
val time: TimeCreateResponse,
|
||||
|
||||
@field:Schema(description = "예약한 테마 정보")
|
||||
@field:JsonProperty("theme")
|
||||
val theme: ThemeResponse,
|
||||
|
||||
@field:Schema(description = "예약 상태", type = "string")
|
||||
val status: ReservationStatus
|
||||
)
|
||||
|
||||
fun ReservationEntity.toCreateResponse(): ReservationResponse = ReservationResponse(
|
||||
fun ReservationEntity.toRetrieveResponse(): ReservationRetrieveResponse = ReservationRetrieveResponse(
|
||||
id = this.id!!,
|
||||
date = this.date,
|
||||
member = this.member.toRetrieveResponse(),
|
||||
@ -78,8 +55,6 @@ fun ReservationEntity.toCreateResponse(): ReservationResponse = ReservationRespo
|
||||
status = this.reservationStatus
|
||||
)
|
||||
|
||||
@Schema(name = "예약 목록 조회 응답", description = "모든 예약 정보 조회 응답시 사용됩니다.")
|
||||
data class ReservationsResponse(
|
||||
@field:Schema(description = "모든 예약 및 대기 목록")
|
||||
val reservations: List<ReservationResponse>
|
||||
data class ReservationRetrieveListResponse(
|
||||
val reservations: List<ReservationRetrieveResponse>
|
||||
)
|
||||
|
||||
@ -52,7 +52,7 @@ class TossPaymentClientTest(
|
||||
assertSoftly(paymentResponse) {
|
||||
this.paymentKey shouldBe paymentRequest.paymentKey
|
||||
this.orderId shouldBe paymentRequest.orderId
|
||||
this.amount shouldBe paymentRequest.amount
|
||||
this.totalAmount shouldBe paymentRequest.amount
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -13,8 +13,8 @@ import roomescape.payment.web.PaymentCancelRequest
|
||||
import roomescape.payment.web.toCreateResponse
|
||||
import roomescape.reservation.infrastructure.persistence.ReservationEntity
|
||||
import roomescape.reservation.infrastructure.persistence.ReservationStatus
|
||||
import roomescape.reservation.web.ReservationRequest
|
||||
import roomescape.reservation.web.ReservationResponse
|
||||
import roomescape.reservation.web.ReservationCreateWithPaymentRequest
|
||||
import roomescape.reservation.web.ReservationRetrieveResponse
|
||||
import roomescape.util.*
|
||||
|
||||
class ReservationWithPaymentServiceTest : FunSpec({
|
||||
@ -26,37 +26,37 @@ class ReservationWithPaymentServiceTest : FunSpec({
|
||||
paymentService = paymentService
|
||||
)
|
||||
|
||||
val reservationRequest: ReservationRequest = ReservationFixture.createRequest()
|
||||
val reservationCreateWithPaymentRequest: ReservationCreateWithPaymentRequest = ReservationFixture.createRequest()
|
||||
val paymentApproveResponse = PaymentFixture.createApproveResponse()
|
||||
val memberId = 1L
|
||||
val reservationEntity: ReservationEntity = ReservationFixture.create(
|
||||
id = 1L,
|
||||
date = reservationRequest.date,
|
||||
time = TimeFixture.create(id = reservationRequest.timeId),
|
||||
theme = ThemeFixture.create(id = reservationRequest.themeId),
|
||||
date = reservationCreateWithPaymentRequest.date,
|
||||
time = TimeFixture.create(id = reservationCreateWithPaymentRequest.timeId),
|
||||
theme = ThemeFixture.create(id = reservationCreateWithPaymentRequest.themeId),
|
||||
member = MemberFixture.create(id = memberId),
|
||||
status = ReservationStatus.CONFIRMED
|
||||
)
|
||||
val paymentEntity: PaymentEntity = PaymentFixture.create(
|
||||
id = 1L,
|
||||
orderId = reservationRequest.orderId,
|
||||
paymentKey = reservationRequest.paymentKey,
|
||||
totalAmount = reservationRequest.amount,
|
||||
orderId = reservationCreateWithPaymentRequest.orderId,
|
||||
paymentKey = reservationCreateWithPaymentRequest.paymentKey,
|
||||
totalAmount = reservationCreateWithPaymentRequest.amount,
|
||||
reservation = reservationEntity,
|
||||
)
|
||||
|
||||
context("addReservationWithPayment") {
|
||||
test("예약 및 결제 정보를 저장한다.") {
|
||||
every {
|
||||
reservationService.addReservation(reservationRequest, memberId)
|
||||
reservationService.addReservation(reservationCreateWithPaymentRequest, memberId)
|
||||
} returns reservationEntity
|
||||
|
||||
every {
|
||||
paymentService.createPayment(paymentApproveResponse, reservationEntity)
|
||||
} returns paymentEntity.toCreateResponse()
|
||||
|
||||
val result: ReservationResponse = reservationWithPaymentService.addReservationWithPayment(
|
||||
request = reservationRequest,
|
||||
val result: ReservationRetrieveResponse = reservationWithPaymentService.addReservationWithPayment(
|
||||
request = reservationCreateWithPaymentRequest,
|
||||
paymentInfo = paymentApproveResponse,
|
||||
memberId = memberId
|
||||
)
|
||||
|
||||
@ -8,7 +8,7 @@ import jakarta.persistence.EntityManager
|
||||
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest
|
||||
import org.springframework.data.repository.findByIdOrNull
|
||||
import roomescape.payment.infrastructure.persistence.PaymentEntity
|
||||
import roomescape.reservation.web.MyReservationResponse
|
||||
import roomescape.reservation.web.MyReservationRetrieveResponse
|
||||
import roomescape.theme.infrastructure.persistence.ThemeEntity
|
||||
import roomescape.util.PaymentFixture
|
||||
import roomescape.util.ReservationFixture
|
||||
@ -168,7 +168,7 @@ class ReservationRepositoryTest(
|
||||
entityManager.clear()
|
||||
}
|
||||
|
||||
val result: List<MyReservationResponse> = reservationRepository.findMyReservations(reservation.member.id!!)
|
||||
val result: List<MyReservationRetrieveResponse> = reservationRepository.findMyReservations(reservation.member.id!!)
|
||||
|
||||
result shouldHaveSize 1
|
||||
assertSoftly(result.first()) {
|
||||
@ -179,7 +179,7 @@ class ReservationRepositoryTest(
|
||||
}
|
||||
|
||||
test("결제 정보가 없다면 paymentKey와 amount는 null로 반환한다.") {
|
||||
val result: List<MyReservationResponse> = reservationRepository.findMyReservations(reservation.member.id!!)
|
||||
val result: List<MyReservationRetrieveResponse> = reservationRepository.findMyReservations(reservation.member.id!!)
|
||||
|
||||
result shouldHaveSize 1
|
||||
assertSoftly(result.first()) {
|
||||
|
||||
@ -66,7 +66,7 @@ class ReservationControllerTest(
|
||||
val paymentApproveResponse = PaymentFixture.createApproveResponse().copy(
|
||||
paymentKey = reservationRequest.paymentKey,
|
||||
orderId = reservationRequest.orderId,
|
||||
amount = reservationRequest.amount,
|
||||
totalAmount = reservationRequest.amount,
|
||||
)
|
||||
|
||||
every {
|
||||
@ -116,7 +116,7 @@ class ReservationControllerTest(
|
||||
val paymentApproveResponse = PaymentFixture.createApproveResponse().copy(
|
||||
paymentKey = reservationRequest.paymentKey,
|
||||
orderId = reservationRequest.orderId,
|
||||
amount = reservationRequest.amount,
|
||||
totalAmount = reservationRequest.amount,
|
||||
)
|
||||
|
||||
every {
|
||||
@ -409,8 +409,8 @@ class ReservationControllerTest(
|
||||
context("POST /reservations/admin") {
|
||||
test("관리자가 예약을 추가하면 결제 대기 상태로 예약 생성") {
|
||||
val member = login(MemberFixture.create(role = Role.ADMIN))
|
||||
val adminRequest: AdminReservationRequest = createRequest().let {
|
||||
AdminReservationRequest(
|
||||
val adminRequest: AdminReservationCreateRequest = createRequest().let {
|
||||
AdminReservationCreateRequest(
|
||||
date = it.date,
|
||||
themeId = it.themeId,
|
||||
timeId = it.timeId,
|
||||
@ -473,8 +473,8 @@ class ReservationControllerTest(
|
||||
context("POST /reservations/waiting") {
|
||||
test("회원이 대기 예약을 추가한다.") {
|
||||
val member = login(MemberFixture.create(role = Role.MEMBER))
|
||||
val waitingRequest: WaitingRequest = createRequest().let {
|
||||
WaitingRequest(
|
||||
val waitingCreateRequest: WaitingCreateRequest = createRequest().let {
|
||||
WaitingCreateRequest(
|
||||
date = it.date,
|
||||
themeId = it.themeId,
|
||||
timeId = it.timeId
|
||||
@ -484,7 +484,7 @@ class ReservationControllerTest(
|
||||
Given {
|
||||
port(port)
|
||||
contentType(MediaType.APPLICATION_JSON_VALUE)
|
||||
body(waitingRequest)
|
||||
body(waitingCreateRequest)
|
||||
}.When {
|
||||
post("/reservations/waiting")
|
||||
}.Then {
|
||||
@ -513,7 +513,7 @@ class ReservationControllerTest(
|
||||
}
|
||||
|
||||
// 이미 예약된 시간, 테마로 대기 예약 요청
|
||||
val waitingRequest = WaitingRequest(
|
||||
val waitingCreateRequest = WaitingCreateRequest(
|
||||
date = reservationRequest.date,
|
||||
themeId = reservationRequest.themeId,
|
||||
timeId = reservationRequest.timeId
|
||||
@ -522,7 +522,7 @@ class ReservationControllerTest(
|
||||
Given {
|
||||
port(port)
|
||||
contentType(MediaType.APPLICATION_JSON_VALUE)
|
||||
body(waitingRequest)
|
||||
body(waitingCreateRequest)
|
||||
}.When {
|
||||
post("/reservations/waiting")
|
||||
}.Then {
|
||||
@ -734,14 +734,14 @@ class ReservationControllerTest(
|
||||
fun createRequest(
|
||||
theme: ThemeEntity = ThemeFixture.create(),
|
||||
time: TimeEntity = TimeFixture.create(),
|
||||
): ReservationRequest {
|
||||
lateinit var reservationRequest: ReservationRequest
|
||||
): ReservationCreateWithPaymentRequest {
|
||||
lateinit var reservationCreateWithPaymentRequest: ReservationCreateWithPaymentRequest
|
||||
|
||||
transactionTemplate.executeWithoutResult {
|
||||
entityManager.persist(theme)
|
||||
entityManager.persist(time)
|
||||
|
||||
reservationRequest = ReservationFixture.createRequest(
|
||||
reservationCreateWithPaymentRequest = ReservationFixture.createRequest(
|
||||
themeId = theme.id!!,
|
||||
timeId = time.id!!,
|
||||
)
|
||||
@ -750,7 +750,7 @@ class ReservationControllerTest(
|
||||
entityManager.clear()
|
||||
}
|
||||
|
||||
return reservationRequest
|
||||
return reservationCreateWithPaymentRequest
|
||||
}
|
||||
|
||||
fun login(member: MemberEntity): MemberEntity {
|
||||
|
||||
@ -13,8 +13,8 @@ import roomescape.payment.web.PaymentCancelResponse
|
||||
import roomescape.reservation.infrastructure.persistence.ReservationEntity
|
||||
import roomescape.reservation.infrastructure.persistence.ReservationStatus
|
||||
import roomescape.reservation.infrastructure.persistence.TimeEntity
|
||||
import roomescape.reservation.web.ReservationRequest
|
||||
import roomescape.reservation.web.WaitingRequest
|
||||
import roomescape.reservation.web.ReservationCreateWithPaymentRequest
|
||||
import roomescape.reservation.web.WaitingCreateRequest
|
||||
import roomescape.theme.infrastructure.persistence.ThemeEntity
|
||||
import java.time.LocalDate
|
||||
import java.time.LocalTime
|
||||
@ -88,7 +88,7 @@ object ReservationFixture {
|
||||
orderId: String = "orderId",
|
||||
amount: Long = 10000L,
|
||||
paymentType: String = "NORMAL",
|
||||
): ReservationRequest = ReservationRequest(
|
||||
): ReservationCreateWithPaymentRequest = ReservationCreateWithPaymentRequest(
|
||||
date = date,
|
||||
timeId = timeId,
|
||||
themeId = themeId,
|
||||
@ -102,7 +102,7 @@ object ReservationFixture {
|
||||
date: LocalDate = LocalDate.now().plusWeeks(1),
|
||||
themeId: Long = 1L,
|
||||
timeId: Long = 1L
|
||||
): WaitingRequest = WaitingRequest(
|
||||
): WaitingCreateRequest = WaitingCreateRequest(
|
||||
date = date,
|
||||
timeId = timeId,
|
||||
themeId = themeId
|
||||
@ -168,7 +168,7 @@ object PaymentFixture {
|
||||
paymentKey = PAYMENT_KEY,
|
||||
orderId = ORDER_ID,
|
||||
approvedAt = OffsetDateTime.now(),
|
||||
amount = AMOUNT
|
||||
totalAmount = AMOUNT
|
||||
)
|
||||
|
||||
fun createCancelRequest(): PaymentCancelRequest = PaymentCancelRequest(
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user