generated from pricelees/issue-pr-template
<!-- 제목 양식 --> <!-- [이슈번호] 작업 요약 (예시: [#10] Gitea 템플릿 생성) --> ## 📝 관련 이슈 및 PR **PR과 관련된 이슈 번호** - #30 ## ✨ 작업 내용 <!-- 어떤 작업을 했는지 알려주세요! --> - ReservationService를 읽기(Find) / 쓰기(Write) 서비스로 분리 - 모든 도메인에 repository를 사용하는 Finder, Writer, Validator 도입 -> ReservationService에 있는 조회, 검증, 쓰기 작업을 별도의 클래스로 분리하기 위함이었고, 이 과정에서 다른 도메인에도 도입함. ## 🧪 테스트 <!-- 어떤 테스트를 생각했고 진행했는지 알려주세요! --> 새로 추가된 기능 & 클래스는 모두 테스트 추가하였고, 작업 후 전체 테스트 완료 ## 📚 참고 자료 및 기타 <!-- 참고한 자료, 또는 논의할 사항이 있다면 알려주세요! --> Reviewed-on: #31 Co-authored-by: pricelees <priceelees@gmail.com> Co-committed-by: pricelees <priceelees@gmail.com>
82 lines
2.9 KiB
Kotlin
82 lines
2.9 KiB
Kotlin
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}" }
|
|
}
|
|
}
|
|
}
|