generated from pricelees/issue-pr-template
[#56] 예약 & 결제 프로세스 및 패키지 구조 재정의 #57
@ -9,8 +9,9 @@ import com.sangdol.roomescape.reservation.exception.ReservationException
|
|||||||
import com.sangdol.roomescape.reservation.infrastructure.persistence.*
|
import com.sangdol.roomescape.reservation.infrastructure.persistence.*
|
||||||
import com.sangdol.roomescape.reservation.web.*
|
import com.sangdol.roomescape.reservation.web.*
|
||||||
import com.sangdol.roomescape.schedule.business.ScheduleService
|
import com.sangdol.roomescape.schedule.business.ScheduleService
|
||||||
|
import com.sangdol.roomescape.schedule.dto.ScheduleStateResponse
|
||||||
|
import com.sangdol.roomescape.schedule.dto.ScheduleWithThemeAndStoreResponse
|
||||||
import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleStatus
|
import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleStatus
|
||||||
import com.sangdol.roomescape.schedule.web.ScheduleOverviewResponse
|
|
||||||
import com.sangdol.roomescape.theme.business.ThemeService
|
import com.sangdol.roomescape.theme.business.ThemeService
|
||||||
import com.sangdol.roomescape.user.business.UserService
|
import com.sangdol.roomescape.user.business.UserService
|
||||||
import com.sangdol.roomescape.user.dto.UserContactResponse
|
import com.sangdol.roomescape.user.dto.UserContactResponse
|
||||||
@ -43,7 +44,7 @@ class ReservationService(
|
|||||||
log.info { "[createPendingReservation] Pending 예약 생성 시작: schedule=${request.scheduleId}" }
|
log.info { "[createPendingReservation] Pending 예약 생성 시작: schedule=${request.scheduleId}" }
|
||||||
|
|
||||||
run {
|
run {
|
||||||
val schedule = scheduleService.findSummaryWithLock(request.scheduleId)
|
val schedule: ScheduleStateResponse = scheduleService.findStateWithLock(request.scheduleId)
|
||||||
val theme = themeService.findInfoById(schedule.themeId)
|
val theme = themeService.findInfoById(schedule.themeId)
|
||||||
|
|
||||||
reservationValidator.validateCanCreate(schedule, theme, request)
|
reservationValidator.validateCanCreate(schedule, theme, request)
|
||||||
@ -103,8 +104,16 @@ class ReservationService(
|
|||||||
)
|
)
|
||||||
|
|
||||||
return ReservationOverviewListResponse(reservations.map {
|
return ReservationOverviewListResponse(reservations.map {
|
||||||
val schedule: ScheduleOverviewResponse = scheduleService.findScheduleOverviewById(it.scheduleId)
|
val response: ScheduleWithThemeAndStoreResponse = scheduleService.findWithThemeAndStore(it.scheduleId)
|
||||||
it.toOverviewResponse(schedule)
|
val schedule = response.schedule
|
||||||
|
|
||||||
|
it.toOverviewResponse(
|
||||||
|
scheduleDate = schedule.date,
|
||||||
|
scheduleStartFrom = schedule.startFrom,
|
||||||
|
scheduleEndAt = schedule.endAt,
|
||||||
|
storeName = response.theme.name,
|
||||||
|
themeName = response.store.name
|
||||||
|
)
|
||||||
}).also {
|
}).also {
|
||||||
log.info { "[findSummaryByMemberId] ${it.reservations.size}개의 예약 조회 완료: userId=${user.id}" }
|
log.info { "[findSummaryByMemberId] ${it.reservations.size}개의 예약 조회 완료: userId=${user.id}" }
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,8 +5,8 @@ import com.sangdol.common.utils.toKoreaDateTime
|
|||||||
import com.sangdol.roomescape.reservation.exception.ReservationErrorCode
|
import com.sangdol.roomescape.reservation.exception.ReservationErrorCode
|
||||||
import com.sangdol.roomescape.reservation.exception.ReservationException
|
import com.sangdol.roomescape.reservation.exception.ReservationException
|
||||||
import com.sangdol.roomescape.reservation.web.PendingReservationCreateRequest
|
import com.sangdol.roomescape.reservation.web.PendingReservationCreateRequest
|
||||||
|
import com.sangdol.roomescape.schedule.dto.ScheduleStateResponse
|
||||||
import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleStatus
|
import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleStatus
|
||||||
import com.sangdol.roomescape.schedule.dto.ScheduleSummaryResponse
|
|
||||||
import com.sangdol.roomescape.theme.dto.ThemeInfoResponse
|
import com.sangdol.roomescape.theme.dto.ThemeInfoResponse
|
||||||
import io.github.oshai.kotlinlogging.KLogger
|
import io.github.oshai.kotlinlogging.KLogger
|
||||||
import io.github.oshai.kotlinlogging.KotlinLogging
|
import io.github.oshai.kotlinlogging.KotlinLogging
|
||||||
@ -20,14 +20,14 @@ private val log: KLogger = KotlinLogging.logger {}
|
|||||||
class ReservationValidator {
|
class ReservationValidator {
|
||||||
|
|
||||||
fun validateCanCreate(
|
fun validateCanCreate(
|
||||||
schedule: ScheduleSummaryResponse,
|
schedule: ScheduleStateResponse,
|
||||||
theme: ThemeInfoResponse,
|
theme: ThemeInfoResponse,
|
||||||
request: PendingReservationCreateRequest
|
request: PendingReservationCreateRequest
|
||||||
) {
|
) {
|
||||||
validateSchedule(schedule)
|
validateSchedule(schedule)
|
||||||
validateReservationInfo(theme, request)
|
validateReservationInfo(theme, request)
|
||||||
}
|
}
|
||||||
private fun validateSchedule(schedule: ScheduleSummaryResponse) {
|
private fun validateSchedule(schedule: ScheduleStateResponse) {
|
||||||
if (schedule.status != ScheduleStatus.HOLD) {
|
if (schedule.status != ScheduleStatus.HOLD) {
|
||||||
log.info { "[validateCanCreate] ${schedule.status}로의 일정 상태 변경에 따른 실패" }
|
log.info { "[validateCanCreate] ${schedule.status}로의 일정 상태 변경에 따른 실패" }
|
||||||
throw ReservationException(ReservationErrorCode.EXPIRED_HELD_SCHEDULE)
|
throw ReservationException(ReservationErrorCode.EXPIRED_HELD_SCHEDULE)
|
||||||
@ -40,7 +40,7 @@ class ReservationValidator {
|
|||||||
throw ReservationException(ReservationErrorCode.EXPIRED_HELD_SCHEDULE)
|
throw ReservationException(ReservationErrorCode.EXPIRED_HELD_SCHEDULE)
|
||||||
}
|
}
|
||||||
|
|
||||||
val scheduleDateTime = LocalDateTime.of(schedule.date, schedule.time)
|
val scheduleDateTime = LocalDateTime.of(schedule.date, schedule.startFrom)
|
||||||
val nowDateTime = KoreaDateTime.now()
|
val nowDateTime = KoreaDateTime.now()
|
||||||
if (scheduleDateTime.isBefore(nowDateTime)) {
|
if (scheduleDateTime.isBefore(nowDateTime)) {
|
||||||
log.info { "[validateCanCreate] 과거 시간인 일정으로 인한 실패: scheduleDateTime=${scheduleDateTime}(KST), now=${nowDateTime}" }
|
log.info { "[validateCanCreate] 과거 시간인 일정으로 인한 실패: scheduleDateTime=${scheduleDateTime}(KST), now=${nowDateTime}" }
|
||||||
|
|||||||
@ -3,7 +3,6 @@ package com.sangdol.roomescape.reservation.web
|
|||||||
import com.sangdol.roomescape.payment.web.PaymentWithDetailResponse
|
import com.sangdol.roomescape.payment.web.PaymentWithDetailResponse
|
||||||
import com.sangdol.roomescape.reservation.infrastructure.persistence.ReservationEntity
|
import com.sangdol.roomescape.reservation.infrastructure.persistence.ReservationEntity
|
||||||
import com.sangdol.roomescape.reservation.infrastructure.persistence.ReservationStatus
|
import com.sangdol.roomescape.reservation.infrastructure.persistence.ReservationStatus
|
||||||
import com.sangdol.roomescape.schedule.web.ScheduleOverviewResponse
|
|
||||||
import com.sangdol.roomescape.user.dto.UserContactResponse
|
import com.sangdol.roomescape.user.dto.UserContactResponse
|
||||||
import jakarta.validation.constraints.NotEmpty
|
import jakarta.validation.constraints.NotEmpty
|
||||||
import java.time.Instant
|
import java.time.Instant
|
||||||
@ -46,14 +45,18 @@ data class ReservationOverviewResponse(
|
|||||||
)
|
)
|
||||||
|
|
||||||
fun ReservationEntity.toOverviewResponse(
|
fun ReservationEntity.toOverviewResponse(
|
||||||
schedule: ScheduleOverviewResponse
|
scheduleDate: LocalDate,
|
||||||
|
scheduleStartFrom: LocalTime,
|
||||||
|
scheduleEndAt: LocalTime,
|
||||||
|
storeName: String,
|
||||||
|
themeName: String
|
||||||
) = ReservationOverviewResponse(
|
) = ReservationOverviewResponse(
|
||||||
id = this.id,
|
id = this.id,
|
||||||
storeName = schedule.storeName,
|
storeName = storeName,
|
||||||
themeName = schedule.themeName,
|
themeName = themeName,
|
||||||
date = schedule.date,
|
date = scheduleDate,
|
||||||
startFrom = schedule.startFrom,
|
startFrom = scheduleStartFrom,
|
||||||
endAt = schedule.endAt,
|
endAt = scheduleEndAt,
|
||||||
status = this.status
|
status = this.status
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@ -15,7 +15,7 @@ import com.sangdol.roomescape.schedule.exception.ScheduleException
|
|||||||
import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleEntity
|
import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleEntity
|
||||||
import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleEntityFactory
|
import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleEntityFactory
|
||||||
import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleRepository
|
import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleRepository
|
||||||
import com.sangdol.roomescape.schedule.mapper.toAdminSummaryListResponse
|
import com.sangdol.roomescape.schedule.mapper.toAdminSummaryResponse
|
||||||
import io.github.oshai.kotlinlogging.KLogger
|
import io.github.oshai.kotlinlogging.KLogger
|
||||||
import io.github.oshai.kotlinlogging.KotlinLogging
|
import io.github.oshai.kotlinlogging.KotlinLogging
|
||||||
import org.springframework.data.repository.findByIdOrNull
|
import org.springframework.data.repository.findByIdOrNull
|
||||||
@ -32,9 +32,6 @@ class AdminScheduleService(
|
|||||||
private val idGenerator: IDGenerator,
|
private val idGenerator: IDGenerator,
|
||||||
private val adminService: AdminService
|
private val adminService: AdminService
|
||||||
) {
|
) {
|
||||||
// ========================================
|
|
||||||
// All-Admin (본사, 매장 모두 사용가능)
|
|
||||||
// ========================================
|
|
||||||
@Transactional(readOnly = true)
|
@Transactional(readOnly = true)
|
||||||
fun searchSchedules(storeId: Long, date: LocalDate?, themeId: Long?): AdminScheduleSummaryListResponse {
|
fun searchSchedules(storeId: Long, date: LocalDate?, themeId: Long?): AdminScheduleSummaryListResponse {
|
||||||
log.info { "[searchSchedules] 일정 검색 시작: storeId=$storeId, date=$date, themeId=$themeId" }
|
log.info { "[searchSchedules] 일정 검색 시작: storeId=$storeId, date=$date, themeId=$themeId" }
|
||||||
@ -46,7 +43,7 @@ class AdminScheduleService(
|
|||||||
.filter { (themeId == null) || (it.themeId == themeId) }
|
.filter { (themeId == null) || (it.themeId == themeId) }
|
||||||
.sortedBy { it.time }
|
.sortedBy { it.time }
|
||||||
|
|
||||||
return schedules.toAdminSummaryListResponse()
|
return schedules.toAdminSummaryResponse()
|
||||||
.also {
|
.also {
|
||||||
log.info { "[searchSchedules] ${it.schedules.size} 개의 일정 조회 완료" }
|
log.info { "[searchSchedules] ${it.schedules.size} 개의 일정 조회 완료" }
|
||||||
}
|
}
|
||||||
@ -65,9 +62,6 @@ class AdminScheduleService(
|
|||||||
.also { log.info { "[findDetail] 일정 감사 정보 조회 완료: id=$id" } }
|
.also { log.info { "[findDetail] 일정 감사 정보 조회 완료: id=$id" } }
|
||||||
}
|
}
|
||||||
|
|
||||||
// ========================================
|
|
||||||
// Store-Admin (매장 관리자 로그인 필요)
|
|
||||||
// ========================================
|
|
||||||
@Transactional
|
@Transactional
|
||||||
fun createSchedule(storeId: Long, request: ScheduleCreateRequest): ScheduleCreateResponse {
|
fun createSchedule(storeId: Long, request: ScheduleCreateRequest): ScheduleCreateResponse {
|
||||||
log.info { "[createSchedule] 일정 생성 시작: storeId=${storeId}, date=${request.date}, time=${request.time}, themeId=${request.themeId}" }
|
log.info { "[createSchedule] 일정 생성 시작: storeId=${storeId}, date=${request.date}, time=${request.time}, themeId=${request.themeId}" }
|
||||||
|
|||||||
@ -1,32 +1,21 @@
|
|||||||
package com.sangdol.roomescape.schedule.business
|
package com.sangdol.roomescape.schedule.business
|
||||||
|
|
||||||
import com.sangdol.common.persistence.IDGenerator
|
|
||||||
import com.sangdol.common.utils.KoreaDate
|
import com.sangdol.common.utils.KoreaDate
|
||||||
import com.sangdol.common.utils.KoreaTime
|
import com.sangdol.common.utils.KoreaTime
|
||||||
import com.sangdol.roomescape.admin.business.AdminService
|
|
||||||
import com.sangdol.roomescape.common.types.AuditingInfo
|
|
||||||
import com.sangdol.roomescape.common.types.Auditor
|
|
||||||
import com.sangdol.roomescape.schedule.business.domain.ScheduleOverview
|
import com.sangdol.roomescape.schedule.business.domain.ScheduleOverview
|
||||||
import com.sangdol.roomescape.schedule.dto.AdminScheduleSummaryListResponse
|
import com.sangdol.roomescape.schedule.dto.ScheduleStateResponse
|
||||||
import com.sangdol.roomescape.schedule.dto.ScheduleCreateRequest
|
import com.sangdol.roomescape.schedule.dto.ScheduleWithThemeAndStoreResponse
|
||||||
import com.sangdol.roomescape.schedule.dto.ScheduleCreateResponse
|
|
||||||
import com.sangdol.roomescape.schedule.dto.ScheduleOverviewResponse
|
|
||||||
import com.sangdol.roomescape.schedule.dto.ScheduleSummaryResponse
|
|
||||||
import com.sangdol.roomescape.schedule.dto.ScheduleUpdateRequest
|
|
||||||
import com.sangdol.roomescape.schedule.dto.ScheduleWithThemeListResponse
|
import com.sangdol.roomescape.schedule.dto.ScheduleWithThemeListResponse
|
||||||
import com.sangdol.roomescape.schedule.mapper.toAdminSummaryListResponse
|
|
||||||
import com.sangdol.roomescape.schedule.mapper.toOverviewResponse
|
|
||||||
import com.sangdol.roomescape.schedule.mapper.toResponse
|
|
||||||
import com.sangdol.roomescape.schedule.mapper.toSummaryResponse
|
|
||||||
import com.sangdol.roomescape.schedule.exception.ScheduleErrorCode
|
import com.sangdol.roomescape.schedule.exception.ScheduleErrorCode
|
||||||
import com.sangdol.roomescape.schedule.exception.ScheduleException
|
import com.sangdol.roomescape.schedule.exception.ScheduleException
|
||||||
import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleEntity
|
import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleEntity
|
||||||
import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleEntityFactory
|
|
||||||
import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleRepository
|
import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleRepository
|
||||||
import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleStatus
|
import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleStatus
|
||||||
|
import com.sangdol.roomescape.schedule.mapper.toResponseWithTheme
|
||||||
|
import com.sangdol.roomescape.schedule.mapper.toResponseWithThemeAndStore
|
||||||
|
import com.sangdol.roomescape.schedule.mapper.toStateResponse
|
||||||
import io.github.oshai.kotlinlogging.KLogger
|
import io.github.oshai.kotlinlogging.KLogger
|
||||||
import io.github.oshai.kotlinlogging.KotlinLogging
|
import io.github.oshai.kotlinlogging.KotlinLogging
|
||||||
import org.springframework.data.repository.findByIdOrNull
|
|
||||||
import org.springframework.stereotype.Service
|
import org.springframework.stereotype.Service
|
||||||
import org.springframework.transaction.annotation.Transactional
|
import org.springframework.transaction.annotation.Transactional
|
||||||
import java.time.LocalDate
|
import java.time.LocalDate
|
||||||
@ -55,7 +44,7 @@ class ScheduleService(
|
|||||||
scheduleRepository.findStoreSchedulesWithThemeByDate(storeId, date)
|
scheduleRepository.findStoreSchedulesWithThemeByDate(storeId, date)
|
||||||
.filter { it.date.isAfter(currentDate) || it.time.isAfter(currentTime) }
|
.filter { it.date.isAfter(currentDate) || it.time.isAfter(currentTime) }
|
||||||
|
|
||||||
return schedules.toResponse()
|
return schedules.toResponseWithTheme()
|
||||||
.also {
|
.also {
|
||||||
log.info { "[getStoreScheduleByDate] storeId=${storeId}, date=$date 인 ${it.schedules.size}개 일정 조회 완료" }
|
log.info { "[getStoreScheduleByDate] storeId=${storeId}, date=$date 인 ${it.schedules.size}개 일정 조회 완료" }
|
||||||
}
|
}
|
||||||
@ -79,7 +68,7 @@ class ScheduleService(
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Transactional(readOnly = true)
|
@Transactional(readOnly = true)
|
||||||
fun findSummaryWithLock(id: Long): ScheduleSummaryResponse {
|
fun findStateWithLock(id: Long): ScheduleStateResponse {
|
||||||
log.info { "[findDateTimeById] 일정 개요 조회 시작 : id=$id" }
|
log.info { "[findDateTimeById] 일정 개요 조회 시작 : id=$id" }
|
||||||
|
|
||||||
val schedule: ScheduleEntity = scheduleRepository.findByIdForUpdate(id)
|
val schedule: ScheduleEntity = scheduleRepository.findByIdForUpdate(id)
|
||||||
@ -88,20 +77,20 @@ class ScheduleService(
|
|||||||
throw ScheduleException(ScheduleErrorCode.SCHEDULE_NOT_FOUND)
|
throw ScheduleException(ScheduleErrorCode.SCHEDULE_NOT_FOUND)
|
||||||
}
|
}
|
||||||
|
|
||||||
return schedule.toSummaryResponse()
|
return schedule.toStateResponse()
|
||||||
.also {
|
.also {
|
||||||
log.info { "[findDateTimeById] 일정 개요 조회 완료: id=$id" }
|
log.info { "[findDateTimeById] 일정 개요 조회 완료: id=$id" }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional(readOnly = true)
|
@Transactional(readOnly = true)
|
||||||
fun findScheduleOverviewById(id: Long): ScheduleOverviewResponse {
|
fun findWithThemeAndStore(id: Long): ScheduleWithThemeAndStoreResponse {
|
||||||
val overview: ScheduleOverview = scheduleRepository.findOverviewByIdOrNull(id) ?: run {
|
val overview: ScheduleOverview = scheduleRepository.findOverviewByIdOrNull(id) ?: run {
|
||||||
log.warn { "[findScheduleOverview] 일정 개요 조회 실패: id=$id" }
|
log.warn { "[findScheduleOverview] 일정 개요 조회 실패: id=$id" }
|
||||||
throw ScheduleException(ScheduleErrorCode.SCHEDULE_NOT_FOUND)
|
throw ScheduleException(ScheduleErrorCode.SCHEDULE_NOT_FOUND)
|
||||||
}
|
}
|
||||||
|
|
||||||
return overview.toOverviewResponse()
|
return overview.toResponseWithThemeAndStore()
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
|
|||||||
@ -1,40 +1,47 @@
|
|||||||
package com.sangdol.roomescape.schedule.dto
|
package com.sangdol.roomescape.schedule.dto
|
||||||
|
|
||||||
import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleStatus
|
import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleStatus
|
||||||
import com.sangdol.roomescape.theme.infrastructure.persistence.Difficulty
|
|
||||||
import java.time.Instant
|
import java.time.Instant
|
||||||
import java.time.LocalDate
|
import java.time.LocalDate
|
||||||
import java.time.LocalTime
|
import java.time.LocalTime
|
||||||
|
|
||||||
data class ScheduleWithThemeResponse(
|
data class ScheduleResponse(
|
||||||
val id: Long,
|
val id: Long,
|
||||||
|
val date: LocalDate,
|
||||||
val startFrom: LocalTime,
|
val startFrom: LocalTime,
|
||||||
val endAt: LocalTime,
|
val endAt: LocalTime,
|
||||||
val themeId: Long,
|
val status: ScheduleStatus,
|
||||||
val themeName: String,
|
|
||||||
val themeDifficulty: Difficulty,
|
|
||||||
val status: ScheduleStatus
|
|
||||||
)
|
)
|
||||||
|
|
||||||
data class ScheduleWithThemeListResponse(
|
data class ScheduleStateResponse(
|
||||||
val schedules: List<ScheduleWithThemeResponse>
|
|
||||||
)
|
|
||||||
|
|
||||||
data class ScheduleSummaryResponse(
|
|
||||||
val date: LocalDate,
|
val date: LocalDate,
|
||||||
val time: LocalTime,
|
val startFrom: LocalTime,
|
||||||
val themeId: Long,
|
val themeId: Long,
|
||||||
val status: ScheduleStatus,
|
val status: ScheduleStatus,
|
||||||
val holdExpiredAt: Instant? = null
|
val holdExpiredAt: Instant? = null
|
||||||
)
|
)
|
||||||
|
|
||||||
data class ScheduleOverviewResponse(
|
data class ScheduleThemeInfo(
|
||||||
val id: Long,
|
val id: Long,
|
||||||
val storeId: Long,
|
val name: String
|
||||||
val storeName: String,
|
)
|
||||||
val date: LocalDate,
|
|
||||||
val startFrom: LocalTime,
|
data class ScheduleStoreInfo(
|
||||||
val endAt: LocalTime,
|
val id: Long,
|
||||||
val themeId: Long,
|
val name: String
|
||||||
val themeName: String,
|
)
|
||||||
|
|
||||||
|
data class ScheduleWithThemeResponse(
|
||||||
|
val schedule: ScheduleResponse,
|
||||||
|
val theme: ScheduleThemeInfo,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class ScheduleWithThemeAndStoreResponse(
|
||||||
|
val schedule: ScheduleResponse,
|
||||||
|
val theme: ScheduleThemeInfo,
|
||||||
|
val store: ScheduleStoreInfo
|
||||||
|
)
|
||||||
|
|
||||||
|
data class ScheduleWithThemeListResponse(
|
||||||
|
val schedules: List<ScheduleWithThemeResponse>
|
||||||
)
|
)
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
package com.sangdol.roomescape.schedule.mapper
|
package com.sangdol.roomescape.schedule.mapper
|
||||||
|
|
||||||
import com.sangdol.roomescape.schedule.business.domain.ScheduleOverview
|
import com.sangdol.roomescape.schedule.business.domain.ScheduleOverview
|
||||||
|
import com.sangdol.roomescape.schedule.dto.AdminScheduleSummaryListResponse
|
||||||
import com.sangdol.roomescape.schedule.dto.AdminScheduleSummaryResponse
|
import com.sangdol.roomescape.schedule.dto.AdminScheduleSummaryResponse
|
||||||
|
|
||||||
fun ScheduleOverview.toAdminSummaryResponse() = AdminScheduleSummaryResponse(
|
fun ScheduleOverview.toAdminSummaryResponse() = AdminScheduleSummaryResponse(
|
||||||
@ -10,3 +11,7 @@ fun ScheduleOverview.toAdminSummaryResponse() = AdminScheduleSummaryResponse(
|
|||||||
endAt = this.getEndAt(),
|
endAt = this.getEndAt(),
|
||||||
status = this.status
|
status = this.status
|
||||||
)
|
)
|
||||||
|
|
||||||
|
fun List<ScheduleOverview>.toAdminSummaryResponse() = AdminScheduleSummaryListResponse(
|
||||||
|
this.map { it.toAdminSummaryResponse() }
|
||||||
|
)
|
||||||
|
|||||||
@ -4,39 +4,25 @@ import com.sangdol.roomescape.schedule.business.domain.ScheduleOverview
|
|||||||
import com.sangdol.roomescape.schedule.dto.*
|
import com.sangdol.roomescape.schedule.dto.*
|
||||||
import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleEntity
|
import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleEntity
|
||||||
|
|
||||||
fun ScheduleOverview.toOverviewResponse() = ScheduleOverviewResponse(
|
fun ScheduleEntity.toStateResponse() = ScheduleStateResponse(
|
||||||
id = this.id,
|
|
||||||
storeId = this.storeId,
|
|
||||||
storeName = this.storeName,
|
|
||||||
date = this.date,
|
date = this.date,
|
||||||
startFrom = this.time,
|
startFrom = this.time,
|
||||||
endAt = this.getEndAt(),
|
|
||||||
themeId = this.themeId,
|
|
||||||
themeName = this.themeName,
|
|
||||||
)
|
|
||||||
|
|
||||||
fun ScheduleEntity.toSummaryResponse() = ScheduleSummaryResponse(
|
|
||||||
date = this.date,
|
|
||||||
time = this.time,
|
|
||||||
themeId = this.themeId,
|
themeId = this.themeId,
|
||||||
status = this.status,
|
status = this.status,
|
||||||
holdExpiredAt = this.holdExpiredAt
|
holdExpiredAt = this.holdExpiredAt
|
||||||
)
|
)
|
||||||
|
|
||||||
fun ScheduleOverview.toResponse() = ScheduleWithThemeResponse(
|
fun ScheduleOverview.toResponseWithThemeAndStore() = ScheduleWithThemeAndStoreResponse(
|
||||||
id = this.id,
|
schedule = ScheduleResponse(this.id, this.date, this.time, this.getEndAt(), this.status),
|
||||||
startFrom = this.time,
|
theme = ScheduleThemeInfo(this.themeId, this.themeName),
|
||||||
endAt = this.getEndAt(),
|
store = ScheduleStoreInfo(this.storeId, this.storeName),
|
||||||
themeId = this.themeId,
|
|
||||||
themeName = this.themeName,
|
|
||||||
themeDifficulty = this.themeDifficulty,
|
|
||||||
status = this.status
|
|
||||||
)
|
)
|
||||||
|
|
||||||
fun List<ScheduleOverview>.toAdminSummaryListResponse() = AdminScheduleSummaryListResponse(
|
fun ScheduleOverview.toResponseWithTheme() = ScheduleWithThemeResponse(
|
||||||
this.map { it.toAdminSummaryResponse() }
|
schedule = ScheduleResponse(this.id, this.date, this.time, this.getEndAt(), this.status),
|
||||||
|
theme = ScheduleThemeInfo(this.themeId, this.themeName),
|
||||||
)
|
)
|
||||||
|
|
||||||
fun List<ScheduleOverview>.toResponse() = ScheduleWithThemeListResponse(
|
fun List<ScheduleOverview>.toResponseWithTheme() = ScheduleWithThemeListResponse(
|
||||||
this.map { it.toResponse() }
|
this.map { it.toResponseWithTheme() }
|
||||||
)
|
)
|
||||||
|
|||||||
@ -58,16 +58,30 @@ class ScheduleApiTest(
|
|||||||
body("data.schedules.size()", equalTo(size))
|
body("data.schedules.size()", equalTo(size))
|
||||||
assertProperties(
|
assertProperties(
|
||||||
props = setOf(
|
props = setOf(
|
||||||
"id",
|
"schedule",
|
||||||
"startFrom",
|
"theme"
|
||||||
"endAt",
|
|
||||||
"themeId",
|
|
||||||
"themeName",
|
|
||||||
"themeDifficulty",
|
|
||||||
"status"
|
|
||||||
),
|
),
|
||||||
propsNameIfList = "schedules"
|
propsNameIfList = "schedules"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
assertProperties(
|
||||||
|
props = setOf(
|
||||||
|
"id",
|
||||||
|
"date",
|
||||||
|
"startFrom",
|
||||||
|
"endAt",
|
||||||
|
"status"
|
||||||
|
),
|
||||||
|
propsNameIfList = "schedules.schedule"
|
||||||
|
)
|
||||||
|
|
||||||
|
assertProperties(
|
||||||
|
props = setOf(
|
||||||
|
"id",
|
||||||
|
"name",
|
||||||
|
),
|
||||||
|
propsNameIfList = "schedules.theme"
|
||||||
|
)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
package com.sangdol.roomescape.schedule
|
package com.sangdol.roomescape.schedule
|
||||||
|
|
||||||
import com.sangdol.common.utils.MdcPrincipalIdUtil
|
import com.sangdol.common.utils.MdcPrincipalIdUtil
|
||||||
|
import com.sangdol.roomescape.schedule.business.AdminScheduleService
|
||||||
import com.sangdol.roomescape.schedule.business.ScheduleService
|
import com.sangdol.roomescape.schedule.business.ScheduleService
|
||||||
import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleRepository
|
import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleRepository
|
||||||
import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleStatus
|
import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleStatus
|
||||||
@ -19,6 +20,7 @@ import java.time.LocalDate
|
|||||||
import java.time.LocalTime
|
import java.time.LocalTime
|
||||||
|
|
||||||
class ScheduleServiceTest(
|
class ScheduleServiceTest(
|
||||||
|
private val adminScheduleService: AdminScheduleService,
|
||||||
private val scheduleService: ScheduleService,
|
private val scheduleService: ScheduleService,
|
||||||
private val scheduleRepository: ScheduleRepository
|
private val scheduleRepository: ScheduleRepository
|
||||||
) : FunSpecSpringbootTest() {
|
) : FunSpecSpringbootTest() {
|
||||||
@ -37,7 +39,7 @@ class ScheduleServiceTest(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
scheduleService.updateSchedule(
|
adminScheduleService.updateSchedule(
|
||||||
createdScheduleId,
|
createdScheduleId,
|
||||||
ScheduleUpdateRequest(status = ScheduleStatus.RESERVED)
|
ScheduleUpdateRequest(status = ScheduleStatus.RESERVED)
|
||||||
)
|
)
|
||||||
@ -107,7 +109,7 @@ class ScheduleServiceTest(
|
|||||||
store.id to theme.id
|
store.id to theme.id
|
||||||
}
|
}
|
||||||
|
|
||||||
return scheduleService.createSchedule(
|
return adminScheduleService.createSchedule(
|
||||||
storeId = storeId,
|
storeId = storeId,
|
||||||
request = ScheduleCreateRequest(
|
request = ScheduleCreateRequest(
|
||||||
date = LocalDate.now().plusDays(1),
|
date = LocalDate.now().plusDays(1),
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user