From dbd2b9fb0c15312c6e0b6af92bccc9e4d1c87538 Mon Sep 17 00:00:00 2001 From: pricelees Date: Thu, 16 Oct 2025 13:16:44 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20PaymentClient=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EB=B0=9B=EC=9D=80=20=EC=99=B8=EB=B6=80=20API=20=EC=9D=91?= =?UTF-8?q?=EB=8B=B5=EC=9D=84=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=EB=A1=9C=20?= =?UTF-8?q?=EB=A7=A4=ED=95=91=ED=95=98=EB=8A=94=20=ED=99=95=EC=9E=A5?= =?UTF-8?q?=ED=95=A8=EC=88=98=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EC=9D=B4?= =?UTF-8?q?=EC=A0=84=20=EC=BB=A4=EB=B0=8B=EC=9D=98=20PaymentEventListenerT?= =?UTF-8?q?est=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PaymentClientDTOMappingExtensions.kt | 87 +++++++++++++++++++ .../event => }/PaymentEventListenerTest.kt | 5 +- 2 files changed, 90 insertions(+), 2 deletions(-) rename service/src/test/kotlin/com/sangdol/roomescape/payment/{business/event => }/PaymentEventListenerTest.kt (95%) diff --git a/service/src/main/kotlin/com/sangdol/roomescape/payment/mapper/PaymentClientDTOMappingExtensions.kt b/service/src/main/kotlin/com/sangdol/roomescape/payment/mapper/PaymentClientDTOMappingExtensions.kt index cc2979a8..e5794fd0 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/payment/mapper/PaymentClientDTOMappingExtensions.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/payment/mapper/PaymentClientDTOMappingExtensions.kt @@ -1,5 +1,7 @@ package com.sangdol.roomescape.payment.mapper +import com.sangdol.roomescape.payment.business.domain.* +import com.sangdol.roomescape.payment.business.event.PaymentEvent import com.sangdol.roomescape.payment.dto.CancelDetail import com.sangdol.roomescape.payment.dto.PaymentGatewayResponse import com.sangdol.roomescape.payment.exception.PaymentErrorCode @@ -94,3 +96,88 @@ fun CancelDetail.toEntity( transferDiscountAmount = this.transferDiscountAmount, easypayDiscountAmount = this.easyPayDiscountAmount ) + +fun PaymentGatewayResponse.toEvent(reservationId: Long): PaymentEvent { + return PaymentEvent( + reservationId = reservationId, + paymentKey = this.paymentKey, + orderId = this.orderId, + type = this.type, + status = this.status, + totalAmount = this.totalAmount, + vat = this.vat, + suppliedAmount = this.suppliedAmount, + method = this.method, + requestedAt = this.requestedAt.toInstant(), + approvedAt = this.approvedAt.toInstant(), + detail = this.toDetail() + ) +} + +fun PaymentGatewayResponse.toDetail(): PaymentDetail { + return when(this.method) { + PaymentMethod.TRANSFER -> this.toBankTransferDetail() + PaymentMethod.CARD -> this.toCardDetail() + PaymentMethod.EASY_PAY -> { + if (this.card != null) { + this.toEasypayCardDetail() + } else { + this.toEasypayPrepaidDetail() + } + } + + else -> throw PaymentException(PaymentErrorCode.NOT_SUPPORTED_PAYMENT_TYPE) + } +} + +private fun PaymentGatewayResponse.toBankTransferDetail(): BankTransferPaymentDetail { + val bankTransfer = this.transfer ?: throw PaymentException(PaymentErrorCode.PAYMENT_UNEXPECTED_ERROR) + + return BankTransferPaymentDetail( + bankCode = bankTransfer.bankCode, + settlementStatus = bankTransfer.settlementStatus + ) +} + +private fun PaymentGatewayResponse.toCardDetail(): CardPaymentDetail { + val cardDetail = this.card ?: throw PaymentException(PaymentErrorCode.PAYMENT_UNEXPECTED_ERROR) + + return CardPaymentDetail( + issuerCode = cardDetail.issuerCode, + number = cardDetail.number, + amount = cardDetail.amount, + cardType = cardDetail.cardType, + ownerType = cardDetail.ownerType, + isInterestFree = cardDetail.isInterestFree, + approveNo = cardDetail.approveNo, + installmentPlanMonths = cardDetail.installmentPlanMonths + ) +} + +private fun PaymentGatewayResponse.toEasypayCardDetail(): EasypayCardPaymentDetail { + val cardDetail = this.card ?: throw PaymentException(PaymentErrorCode.PAYMENT_UNEXPECTED_ERROR) + val easypay = this.easyPay ?: throw PaymentException(PaymentErrorCode.PAYMENT_UNEXPECTED_ERROR) + + return EasypayCardPaymentDetail( + issuerCode = cardDetail.issuerCode, + number = cardDetail.number, + amount = cardDetail.amount, + cardType = cardDetail.cardType, + ownerType = cardDetail.ownerType, + isInterestFree = cardDetail.isInterestFree, + approveNo = cardDetail.approveNo, + installmentPlanMonths = cardDetail.installmentPlanMonths, + easypayProvider = easypay.provider, + easypayDiscountAmount = easypay.discountAmount + ) +} + +private fun PaymentGatewayResponse.toEasypayPrepaidDetail(): EasypayPrepaidPaymentDetail { + val easypay = this.easyPay ?: throw PaymentException(PaymentErrorCode.PAYMENT_UNEXPECTED_ERROR) + + return EasypayPrepaidPaymentDetail( + provider = easypay.provider, + amount = easypay.amount, + discountAmount = easypay.discountAmount + ) +} diff --git a/service/src/test/kotlin/com/sangdol/roomescape/payment/business/event/PaymentEventListenerTest.kt b/service/src/test/kotlin/com/sangdol/roomescape/payment/PaymentEventListenerTest.kt similarity index 95% rename from service/src/test/kotlin/com/sangdol/roomescape/payment/business/event/PaymentEventListenerTest.kt rename to service/src/test/kotlin/com/sangdol/roomescape/payment/PaymentEventListenerTest.kt index c8a987f9..1808ea2d 100644 --- a/service/src/test/kotlin/com/sangdol/roomescape/payment/business/event/PaymentEventListenerTest.kt +++ b/service/src/test/kotlin/com/sangdol/roomescape/payment/PaymentEventListenerTest.kt @@ -1,6 +1,7 @@ -package com.sangdol.roomescape.payment.business.event +package com.sangdol.roomescape.payment import com.sangdol.roomescape.payment.business.domain.PaymentMethod +import com.sangdol.roomescape.payment.business.event.PaymentEventListener import com.sangdol.roomescape.payment.infrastructure.persistence.PaymentCardDetailEntity import com.sangdol.roomescape.payment.infrastructure.persistence.PaymentDetailRepository import com.sangdol.roomescape.payment.infrastructure.persistence.PaymentRepository @@ -50,4 +51,4 @@ class PaymentEventListenerTest( } } } -} +} \ No newline at end of file