generated from pricelees/issue-pr-template
<!-- 제목 양식 --> <!-- [이슈번호] 작업 요약 (예시: [#10] Gitea 템플릿 생성) --> ## 📝 관련 이슈 및 PR **PR과 관련된 이슈 번호** - #44 ## ✨ 작업 내용 <!-- 어떤 작업을 했는지 알려주세요! --> - 매장 기능 도입 및 기존 기능에 적용 - 관리자 타입(본사, 매장, 전체) 분리 및 API별 적용 ## 🧪 테스트 <!-- 어떤 테스트를 생각했고 진행했는지 알려주세요! --> - 신규 기능 및 매장 기능 도입으로 수정된 기존 API 모두 통합 테스트 완료 ## 📚 참고 자료 및 기타 <!-- 참고한 자료, 또는 논의할 사항이 있다면 알려주세요! --> - 아직 미결제 예약 스케쥴링 작업 등 추가적인 작업이 필요하긴 하지만, 이 작업들은 배포 후 추가로 진행할 예정 - 다음 작업은 배포 + 초기 데이터 삽입 Reviewed-on: #45 Co-authored-by: pricelees <priceelees@gmail.com> Co-committed-by: pricelees <priceelees@gmail.com>
211 lines
8.1 KiB
Kotlin
211 lines
8.1 KiB
Kotlin
package roomescape.supports
|
|
|
|
import org.springframework.data.repository.findByIdOrNull
|
|
import roomescape.common.config.next
|
|
import roomescape.payment.business.PaymentWriter
|
|
import roomescape.payment.infrastructure.client.CardDetail
|
|
import roomescape.payment.infrastructure.client.EasyPayDetail
|
|
import roomescape.payment.infrastructure.client.TransferDetail
|
|
import roomescape.payment.infrastructure.common.PaymentMethod
|
|
import roomescape.payment.infrastructure.persistence.CanceledPaymentEntity
|
|
import roomescape.payment.infrastructure.persistence.PaymentEntity
|
|
import roomescape.payment.infrastructure.persistence.PaymentRepository
|
|
import roomescape.payment.web.PaymentConfirmRequest
|
|
import roomescape.payment.web.PaymentWithDetailResponse
|
|
import roomescape.payment.web.toDetailResponse
|
|
import roomescape.payment.web.toPaymentDetailResponse
|
|
import roomescape.reservation.infrastructure.persistence.ReservationEntity
|
|
import roomescape.reservation.infrastructure.persistence.ReservationRepository
|
|
import roomescape.reservation.infrastructure.persistence.ReservationStatus
|
|
import roomescape.reservation.web.PendingReservationCreateRequest
|
|
import roomescape.reservation.web.toEntity
|
|
import roomescape.schedule.infrastructure.persistence.ScheduleEntity
|
|
import roomescape.schedule.infrastructure.persistence.ScheduleRepository
|
|
import roomescape.schedule.infrastructure.persistence.ScheduleStatus
|
|
import roomescape.schedule.web.ScheduleCreateRequest
|
|
import roomescape.store.infrastructure.persistence.StoreEntity
|
|
import roomescape.store.infrastructure.persistence.StoreRepository
|
|
import roomescape.store.infrastructure.persistence.StoreStatus
|
|
import roomescape.theme.infrastructure.persistence.ThemeEntity
|
|
import roomescape.theme.infrastructure.persistence.ThemeRepository
|
|
import roomescape.theme.web.ThemeCreateRequest
|
|
import roomescape.theme.web.toEntity
|
|
import roomescape.user.infrastructure.persistence.UserEntity
|
|
import java.time.LocalDateTime
|
|
|
|
class DummyInitializer(
|
|
private val storeRepository: StoreRepository,
|
|
private val themeRepository: ThemeRepository,
|
|
private val scheduleRepository: ScheduleRepository,
|
|
private val reservationRepository: ReservationRepository,
|
|
private val paymentRepository: PaymentRepository,
|
|
private val paymentWriter: PaymentWriter
|
|
) {
|
|
|
|
fun createStore(
|
|
id: Long = tsidFactory.next(),
|
|
name: String = "행복${randomPhoneNumber()}호점",
|
|
address: String = "강북구 행복로 $name",
|
|
contact: String = randomPhoneNumber(),
|
|
businessRegNum: String = randomBusinessRegNum(),
|
|
regionCode: String = "1111000000",
|
|
status: StoreStatus = StoreStatus.ACTIVE
|
|
): StoreEntity {
|
|
return StoreEntity(
|
|
id = id,
|
|
name = name,
|
|
address = address,
|
|
contact = contact,
|
|
businessRegNum = businessRegNum,
|
|
regionCode = regionCode,
|
|
status = status
|
|
).also {
|
|
storeRepository.save(it)
|
|
}
|
|
}
|
|
|
|
fun createTheme(
|
|
request: ThemeCreateRequest = ThemeFixture.createRequest
|
|
): ThemeEntity {
|
|
return request.toEntity(tsidFactory.next()).also { themeRepository.save(it) }
|
|
}
|
|
|
|
fun createSchedule(
|
|
storeId: Long = tsidFactory.next(),
|
|
request: ScheduleCreateRequest = ScheduleFixture.createRequest,
|
|
status: ScheduleStatus = ScheduleStatus.AVAILABLE
|
|
): ScheduleEntity {
|
|
val themeId: Long = if (themeRepository.existsById(request.themeId)) {
|
|
request.themeId
|
|
} else {
|
|
createTheme().id
|
|
}
|
|
|
|
val storeId: Long = if (storeRepository.existsById(storeId)) {
|
|
storeId
|
|
} else {
|
|
createStore(id = storeId).id
|
|
}
|
|
|
|
val schedule: ScheduleEntity = ScheduleFixture.create(
|
|
date = request.date, time = request.time, storeId = storeId, themeId = themeId,
|
|
).apply {
|
|
this.status = status
|
|
}
|
|
|
|
return scheduleRepository.save(schedule)
|
|
}
|
|
|
|
fun createPendingReservation(
|
|
user: UserEntity,
|
|
storeId: Long = tsidFactory.next(),
|
|
themeRequest: ThemeCreateRequest = ThemeFixture.createRequest,
|
|
scheduleRequest: ScheduleCreateRequest = ScheduleFixture.createRequest,
|
|
reservationRequest: PendingReservationCreateRequest = ReservationFixture.pendingCreateRequest,
|
|
): ReservationEntity {
|
|
val themeId: Long = if (themeRepository.existsById(scheduleRequest.themeId)) {
|
|
scheduleRequest.themeId
|
|
} else {
|
|
createTheme(themeRequest).id
|
|
}
|
|
|
|
val scheduleId: Long = if (scheduleRepository.existsById(reservationRequest.scheduleId)) {
|
|
reservationRequest.scheduleId
|
|
} else {
|
|
createSchedule(
|
|
storeId = storeId,
|
|
request = scheduleRequest.copy(themeId = themeId),
|
|
status = ScheduleStatus.HOLD
|
|
).id
|
|
}
|
|
|
|
val reservation = ReservationFixture.pendingCreateRequest.copy(
|
|
scheduleId = scheduleId,
|
|
reserverName = reservationRequest.reserverName,
|
|
reserverContact = reservationRequest.reserverContact,
|
|
participantCount = reservationRequest.participantCount,
|
|
requirement = reservationRequest.requirement,
|
|
).toEntity(id = tsidFactory.next(), userId = user.id)
|
|
|
|
return reservationRepository.save(reservation)
|
|
}
|
|
|
|
fun createConfirmReservation(
|
|
user: UserEntity,
|
|
storeId: Long = tsidFactory.next(),
|
|
themeRequest: ThemeCreateRequest = ThemeFixture.createRequest,
|
|
scheduleRequest: ScheduleCreateRequest = ScheduleFixture.createRequest,
|
|
reservationRequest: PendingReservationCreateRequest = ReservationFixture.pendingCreateRequest,
|
|
): ReservationEntity {
|
|
return createPendingReservation(user, storeId, themeRequest, scheduleRequest, reservationRequest).apply {
|
|
this.status = ReservationStatus.CONFIRMED
|
|
}.also {
|
|
reservationRepository.save(it)
|
|
|
|
scheduleRepository.findByIdOrNull(it.scheduleId)?.let { schedule ->
|
|
schedule.status = ScheduleStatus.RESERVED
|
|
scheduleRepository.save(schedule)
|
|
}
|
|
}
|
|
}
|
|
|
|
fun createPayment(
|
|
reservationId: Long,
|
|
request: PaymentConfirmRequest = PaymentFixture.confirmRequest,
|
|
cardDetail: CardDetail? = null,
|
|
easyPayDetail: EasyPayDetail? = null,
|
|
transferDetail: TransferDetail? = null,
|
|
): PaymentWithDetailResponse {
|
|
val method = if (easyPayDetail != null) {
|
|
PaymentMethod.EASY_PAY
|
|
} else if (cardDetail != null) {
|
|
PaymentMethod.CARD
|
|
} else if (transferDetail != null) {
|
|
PaymentMethod.TRANSFER
|
|
} else {
|
|
throw AssertionError("결제타입 확인 필요.")
|
|
}
|
|
|
|
val clientConfirmResponse = PaymentFixture.confirmResponse(
|
|
paymentKey = request.paymentKey,
|
|
amount = request.amount,
|
|
method = method,
|
|
cardDetail = cardDetail,
|
|
easyPayDetail = easyPayDetail,
|
|
transferDetail = transferDetail
|
|
)
|
|
|
|
val payment = paymentWriter.createPayment(
|
|
reservationId = reservationId,
|
|
orderId = request.orderId,
|
|
paymentType = request.paymentType,
|
|
paymentClientConfirmResponse = clientConfirmResponse
|
|
)
|
|
|
|
val detail = paymentWriter.createDetail(clientConfirmResponse, payment.id)
|
|
|
|
return payment.toDetailResponse(detail = detail.toPaymentDetailResponse(), cancel = null)
|
|
}
|
|
|
|
fun cancelPayment(
|
|
userId: Long,
|
|
reservationId: Long,
|
|
cancelReason: String,
|
|
): CanceledPaymentEntity {
|
|
val payment: PaymentEntity = paymentRepository.findByReservationId(reservationId)
|
|
?: throw AssertionError("Unexpected Exception Occurred.")
|
|
|
|
val clientCancelResponse = PaymentFixture.cancelResponse(
|
|
amount = payment.totalAmount,
|
|
cancelReason = cancelReason,
|
|
)
|
|
|
|
return paymentWriter.cancel(
|
|
userId,
|
|
payment,
|
|
requestedAt = LocalDateTime.now(),
|
|
clientCancelResponse
|
|
)
|
|
}
|
|
}
|