package roomescape.payment.implement import com.github.f4b6a3.tsid.TsidFactory import io.github.oshai.kotlinlogging.KLogger import io.github.oshai.kotlinlogging.KotlinLogging import org.springframework.stereotype.Component import roomescape.common.config.next import roomescape.payment.infrastructure.persistence.CanceledPaymentEntity import roomescape.payment.infrastructure.persistence.CanceledPaymentRepository import roomescape.payment.infrastructure.persistence.PaymentEntity import roomescape.payment.infrastructure.persistence.PaymentRepository import roomescape.reservation.infrastructure.persistence.ReservationEntity import java.time.OffsetDateTime private val log: KLogger = KotlinLogging.logger {} @Component class PaymentWriter( private val paymentRepository: PaymentRepository, private val canceledPaymentRepository: CanceledPaymentRepository, private val tsidFactory: TsidFactory, ) { fun create( paymentKey: String, orderId: String, totalAmount: Long, approvedAt: OffsetDateTime, reservation: ReservationEntity ): PaymentEntity { log.debug { "[PaymentWriter.create] 시작: paymentKey=${paymentKey}, reservationId=${reservation.id}" } val payment = PaymentEntity( _id = tsidFactory.next(), orderId = orderId, paymentKey = paymentKey, totalAmount = totalAmount, reservation = reservation, approvedAt = approvedAt ) return paymentRepository.save(payment) .also { log.debug { "[PaymentWriter.create] 완료: paymentId=${it.id}, reservationId=${reservation.id}" } } } fun createCanceled( payment: PaymentEntity, cancelReason: String, canceledAt: OffsetDateTime, ): CanceledPaymentEntity = createCanceled( cancelReason = cancelReason, canceledAt = canceledAt, cancelAmount = payment.totalAmount, approvedAt = payment.approvedAt, paymentKey = payment.paymentKey ) fun createCanceled( cancelReason: String, cancelAmount: Long, canceledAt: OffsetDateTime, approvedAt: OffsetDateTime, paymentKey: String, ): CanceledPaymentEntity { log.debug { "[PaymentWriter.createCanceled] 시작: paymentKey=$paymentKey cancelAmount=$cancelAmount" } val canceledPayment = CanceledPaymentEntity( _id = tsidFactory.next(), paymentKey = paymentKey, cancelReason = cancelReason, cancelAmount = cancelAmount, approvedAt = approvedAt, canceledAt = canceledAt ) return canceledPaymentRepository.save(canceledPayment) .also { paymentRepository.deleteByPaymentKey(paymentKey) log.debug { "[PaymentWriter.createCanceled] 완료: paymentKey=${paymentKey}, canceledPaymentId=${it.id}" } } } }