[#56] 예약 & 결제 프로세스 및 패키지 구조 재정의 #57

Merged
pricelees merged 45 commits from refactor/#56 into main 2025-10-09 09:33:29 +00:00
17 changed files with 164 additions and 147 deletions
Showing only changes of commit 5bd6250184 - Show all commits

View File

@ -6,7 +6,7 @@ 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.infrastructure.persistence.ScheduleStatus import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleStatus
import com.sangdol.roomescape.schedule.web.ScheduleSummaryResponse 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

View File

@ -7,13 +7,23 @@ import com.sangdol.roomescape.admin.business.AdminService
import com.sangdol.roomescape.common.types.AuditingInfo import com.sangdol.roomescape.common.types.AuditingInfo
import com.sangdol.roomescape.common.types.Auditor 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.ScheduleCreateRequest
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.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.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.web.*
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

View File

@ -6,8 +6,8 @@ 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.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.web.ScheduleCreateRequest import com.sangdol.roomescape.schedule.dto.ScheduleCreateRequest
import com.sangdol.roomescape.schedule.web.ScheduleUpdateRequest import com.sangdol.roomescape.schedule.dto.ScheduleUpdateRequest
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.stereotype.Component import org.springframework.stereotype.Component

View File

@ -7,7 +7,11 @@ import com.sangdol.roomescape.auth.web.support.AdminOnly
import com.sangdol.roomescape.auth.web.support.Public import com.sangdol.roomescape.auth.web.support.Public
import com.sangdol.roomescape.auth.web.support.UserOnly import com.sangdol.roomescape.auth.web.support.UserOnly
import com.sangdol.roomescape.common.types.AuditingInfo import com.sangdol.roomescape.common.types.AuditingInfo
import com.sangdol.roomescape.schedule.web.* import com.sangdol.roomescape.schedule.dto.AdminScheduleSummaryListResponse
import com.sangdol.roomescape.schedule.dto.ScheduleCreateRequest
import com.sangdol.roomescape.schedule.dto.ScheduleCreateResponse
import com.sangdol.roomescape.schedule.dto.ScheduleUpdateRequest
import com.sangdol.roomescape.schedule.dto.ScheduleWithThemeListResponse
import io.swagger.v3.oas.annotations.Operation import io.swagger.v3.oas.annotations.Operation
import io.swagger.v3.oas.annotations.responses.ApiResponse import io.swagger.v3.oas.annotations.responses.ApiResponse
import io.swagger.v3.oas.annotations.responses.ApiResponses import io.swagger.v3.oas.annotations.responses.ApiResponses

View File

@ -0,0 +1,16 @@
package com.sangdol.roomescape.schedule.dto
import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleStatus
import java.time.LocalTime
data class AdminScheduleSummaryResponse(
val id: Long,
val themeName: String,
val startFrom: LocalTime,
val endAt: LocalTime,
val status: ScheduleStatus,
)
data class AdminScheduleSummaryListResponse(
val schedules: List<AdminScheduleSummaryResponse>
)

View File

@ -0,0 +1,24 @@
package com.sangdol.roomescape.schedule.dto
import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleStatus
import java.time.LocalDate
import java.time.LocalTime
data class ScheduleCreateRequest(
val date: LocalDate,
val time: LocalTime,
val themeId: Long
)
data class ScheduleCreateResponse(
val id: Long
)
data class ScheduleUpdateRequest(
val time: LocalTime? = null,
val status: ScheduleStatus? = null
) {
fun isAllParamsNull(): Boolean {
return time == null && status == null
}
}

View File

@ -0,0 +1,40 @@
package com.sangdol.roomescape.schedule.dto
import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleStatus
import com.sangdol.roomescape.theme.infrastructure.persistence.Difficulty
import java.time.Instant
import java.time.LocalDate
import java.time.LocalTime
data class ScheduleWithThemeResponse(
val id: Long,
val startFrom: LocalTime,
val endAt: LocalTime,
val themeId: Long,
val themeName: String,
val themeDifficulty: Difficulty,
val status: ScheduleStatus
)
data class ScheduleWithThemeListResponse(
val schedules: List<ScheduleWithThemeResponse>
)
data class ScheduleSummaryResponse(
val date: LocalDate,
val time: LocalTime,
val themeId: Long,
val status: ScheduleStatus,
val holdExpiredAt: Instant? = null
)
data class ScheduleOverviewResponse(
val id: Long,
val storeId: Long,
val storeName: String,
val date: LocalDate,
val startFrom: LocalTime,
val endAt: LocalTime,
val themeId: Long,
val themeName: String,
)

View File

@ -0,0 +1,12 @@
package com.sangdol.roomescape.schedule.mapper
import com.sangdol.roomescape.schedule.business.domain.ScheduleOverview
import com.sangdol.roomescape.schedule.dto.AdminScheduleSummaryResponse
fun ScheduleOverview.toAdminSummaryResponse() = AdminScheduleSummaryResponse(
id = this.id,
themeName = this.themeName,
startFrom = this.time,
endAt = this.getEndAt(),
status = this.status
)

View File

@ -0,0 +1,42 @@
package com.sangdol.roomescape.schedule.mapper
import com.sangdol.roomescape.schedule.business.domain.ScheduleOverview
import com.sangdol.roomescape.schedule.dto.*
import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleEntity
fun ScheduleOverview.toOverviewResponse() = ScheduleOverviewResponse(
id = this.id,
storeId = this.storeId,
storeName = this.storeName,
date = this.date,
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,
status = this.status,
holdExpiredAt = this.holdExpiredAt
)
fun ScheduleOverview.toResponse() = ScheduleWithThemeResponse(
id = this.id,
startFrom = this.time,
endAt = this.getEndAt(),
themeId = this.themeId,
themeName = this.themeName,
themeDifficulty = this.themeDifficulty,
status = this.status
)
fun List<ScheduleOverview>.toAdminSummaryListResponse() = AdminScheduleSummaryListResponse(
this.map { it.toAdminSummaryResponse() }
)
fun List<ScheduleOverview>.toResponse() = ScheduleWithThemeListResponse(
this.map { it.toResponse() }
)

View File

@ -4,6 +4,10 @@ import com.sangdol.common.types.web.CommonApiResponse
import com.sangdol.roomescape.common.types.AuditingInfo import com.sangdol.roomescape.common.types.AuditingInfo
import com.sangdol.roomescape.schedule.business.ScheduleService import com.sangdol.roomescape.schedule.business.ScheduleService
import com.sangdol.roomescape.schedule.docs.AdminScheduleAPI import com.sangdol.roomescape.schedule.docs.AdminScheduleAPI
import com.sangdol.roomescape.schedule.dto.AdminScheduleSummaryListResponse
import com.sangdol.roomescape.schedule.dto.ScheduleCreateRequest
import com.sangdol.roomescape.schedule.dto.ScheduleCreateResponse
import com.sangdol.roomescape.schedule.dto.ScheduleUpdateRequest
import jakarta.validation.Valid import jakarta.validation.Valid
import org.springframework.format.annotation.DateTimeFormat import org.springframework.format.annotation.DateTimeFormat
import org.springframework.http.ResponseEntity import org.springframework.http.ResponseEntity

View File

@ -1,55 +0,0 @@
package com.sangdol.roomescape.schedule.web
import com.sangdol.roomescape.schedule.business.domain.ScheduleOverview
import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleStatus
import java.time.LocalDate
import java.time.LocalTime
// ========================================
// All-Admin DTO (본사 + 매장)
// ========================================
data class AdminScheduleSummaryResponse(
val id: Long,
val themeName: String,
val startFrom: LocalTime,
val endAt: LocalTime,
val status: ScheduleStatus,
)
fun ScheduleOverview.toAdminSummaryResponse() = AdminScheduleSummaryResponse(
id = this.id,
themeName = this.themeName,
startFrom = this.time,
endAt = this.getEndAt(),
status = this.status
)
data class AdminScheduleSummaryListResponse(
val schedules: List<AdminScheduleSummaryResponse>
)
fun List<ScheduleOverview>.toAdminSummaryListResponse() = AdminScheduleSummaryListResponse(
this.map { it.toAdminSummaryResponse() }
)
// ========================================
// Store Admin DTO (매장)
// ========================================
data class ScheduleCreateRequest(
val date: LocalDate,
val time: LocalTime,
val themeId: Long
)
data class ScheduleCreateResponse(
val id: Long
)
data class ScheduleUpdateRequest(
val time: LocalTime? = null,
val status: ScheduleStatus? = null
) {
fun isAllParamsNull(): Boolean {
return time == null && status == null
}
}

View File

@ -4,6 +4,7 @@ import com.sangdol.common.types.web.CommonApiResponse
import com.sangdol.roomescape.schedule.business.ScheduleService import com.sangdol.roomescape.schedule.business.ScheduleService
import com.sangdol.roomescape.schedule.docs.PublicScheduleAPI import com.sangdol.roomescape.schedule.docs.PublicScheduleAPI
import com.sangdol.roomescape.schedule.docs.UserScheduleAPI import com.sangdol.roomescape.schedule.docs.UserScheduleAPI
import com.sangdol.roomescape.schedule.dto.ScheduleWithThemeListResponse
import org.springframework.format.annotation.DateTimeFormat import org.springframework.format.annotation.DateTimeFormat
import org.springframework.http.ResponseEntity import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.* import org.springframework.web.bind.annotation.*

View File

@ -1,81 +0,0 @@
package com.sangdol.roomescape.schedule.web
import com.sangdol.roomescape.schedule.business.domain.ScheduleOverview
import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleEntity
import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleStatus
import com.sangdol.roomescape.theme.infrastructure.persistence.Difficulty
import java.time.Instant
import java.time.LocalDate
import java.time.LocalTime
// ========================================
// Public (인증 불필요)
// ========================================
data class ScheduleWithThemeResponse(
val id: Long,
val startFrom: LocalTime,
val endAt: LocalTime,
val themeId: Long,
val themeName: String,
val themeDifficulty: Difficulty,
val status: ScheduleStatus
)
fun ScheduleOverview.toResponse() = ScheduleWithThemeResponse(
id = this.id,
startFrom = this.time,
endAt = this.getEndAt(),
themeId = this.themeId,
themeName = this.themeName,
themeDifficulty = this.themeDifficulty,
status = this.status
)
data class ScheduleWithThemeListResponse(
val schedules: List<ScheduleWithThemeResponse>
)
fun List<ScheduleOverview>.toResponse() = ScheduleWithThemeListResponse(
this.map { it.toResponse() }
)
// ========================================
// Other-Service (API 없이 다른 서비스에서 호출)
// ========================================
data class ScheduleSummaryResponse(
val date: LocalDate,
val time: LocalTime,
val themeId: Long,
val status: ScheduleStatus,
val holdExpiredAt: Instant? = null
)
fun ScheduleEntity.toSummaryResponse() = ScheduleSummaryResponse(
date = this.date,
time = this.time,
themeId = this.themeId,
status = this.status,
holdExpiredAt = this.holdExpiredAt
)
data class ScheduleOverviewResponse(
val id: Long,
val storeId: Long,
val storeName: String,
val date: LocalDate,
val startFrom: LocalTime,
val endAt: LocalTime,
val themeId: Long,
val themeName: String,
)
fun ScheduleOverview.toOverviewResponse() = ScheduleOverviewResponse(
id = this.id,
storeId = this.storeId,
storeName = this.storeName,
date = this.date,
startFrom = this.time,
endAt = this.getEndAt(),
themeId = this.themeId,
themeName = this.themeName,
)

View File

@ -12,8 +12,8 @@ import com.sangdol.roomescape.schedule.exception.ScheduleErrorCode
import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleEntity import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleEntity
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.web.AdminScheduleSummaryResponse import com.sangdol.roomescape.schedule.dto.AdminScheduleSummaryResponse
import com.sangdol.roomescape.schedule.web.ScheduleUpdateRequest import com.sangdol.roomescape.schedule.dto.ScheduleUpdateRequest
import com.sangdol.roomescape.store.infrastructure.persistence.StoreEntity import com.sangdol.roomescape.store.infrastructure.persistence.StoreEntity
import com.sangdol.roomescape.supports.* import com.sangdol.roomescape.supports.*
import io.kotest.assertions.assertSoftly import io.kotest.assertions.assertSoftly

View File

@ -4,8 +4,8 @@ import com.sangdol.common.utils.MdcPrincipalIdUtil
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
import com.sangdol.roomescape.schedule.web.ScheduleCreateRequest import com.sangdol.roomescape.schedule.dto.ScheduleCreateRequest
import com.sangdol.roomescape.schedule.web.ScheduleUpdateRequest import com.sangdol.roomescape.schedule.dto.ScheduleUpdateRequest
import com.sangdol.roomescape.supports.FunSpecSpringbootTest import com.sangdol.roomescape.supports.FunSpecSpringbootTest
import com.sangdol.roomescape.supports.IDGenerator import com.sangdol.roomescape.supports.IDGenerator
import com.sangdol.roomescape.supports.initialize import com.sangdol.roomescape.supports.initialize

View File

@ -20,7 +20,7 @@ import com.sangdol.roomescape.reservation.web.toEntity
import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleEntity import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleEntity
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.web.ScheduleCreateRequest import com.sangdol.roomescape.schedule.dto.ScheduleCreateRequest
import com.sangdol.roomescape.store.infrastructure.persistence.StoreEntity import com.sangdol.roomescape.store.infrastructure.persistence.StoreEntity
import com.sangdol.roomescape.store.infrastructure.persistence.StoreRepository import com.sangdol.roomescape.store.infrastructure.persistence.StoreRepository
import com.sangdol.roomescape.store.infrastructure.persistence.StoreStatus import com.sangdol.roomescape.store.infrastructure.persistence.StoreStatus

View File

@ -13,7 +13,7 @@ import com.sangdol.roomescape.payment.web.PaymentConfirmRequest
import com.sangdol.roomescape.reservation.web.PendingReservationCreateRequest import com.sangdol.roomescape.reservation.web.PendingReservationCreateRequest
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.web.ScheduleCreateRequest import com.sangdol.roomescape.schedule.dto.ScheduleCreateRequest
import com.sangdol.roomescape.store.infrastructure.persistence.StoreEntity import com.sangdol.roomescape.store.infrastructure.persistence.StoreEntity
import com.sangdol.roomescape.store.infrastructure.persistence.StoreStatus import com.sangdol.roomescape.store.infrastructure.persistence.StoreStatus
import com.sangdol.roomescape.store.dto.StoreRegisterRequest import com.sangdol.roomescape.store.dto.StoreRegisterRequest