[#18] 코드 정리 및 일부 컨벤션 통일 #19

Merged
pricelees merged 24 commits from refactor/#18 into main 2025-07-22 09:05:31 +00:00
14 changed files with 108 additions and 154 deletions
Showing only changes of commit 35981f53ad - Show all commits

View File

@ -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 {

View File

@ -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
)

View File

@ -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) {

View File

@ -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)

View File

@ -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"])

View File

@ -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>
}

View File

@ -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
)

View File

@ -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
)

View File

@ -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>
)

View File

@ -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
}
}

View File

@ -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
)

View File

@ -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()) {

View File

@ -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 {

View File

@ -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(