diff --git a/service/src/main/kotlin/com/sangdol/roomescape/reservation/business/ReservationValidator.kt b/service/src/main/kotlin/com/sangdol/roomescape/reservation/business/ReservationValidator.kt index 2232613e..2574408f 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/reservation/business/ReservationValidator.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/reservation/business/ReservationValidator.kt @@ -6,7 +6,7 @@ import com.sangdol.roomescape.reservation.exception.ReservationErrorCode import com.sangdol.roomescape.reservation.exception.ReservationException import com.sangdol.roomescape.reservation.web.PendingReservationCreateRequest 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 io.github.oshai.kotlinlogging.KLogger import io.github.oshai.kotlinlogging.KotlinLogging diff --git a/service/src/main/kotlin/com/sangdol/roomescape/schedule/business/ScheduleService.kt b/service/src/main/kotlin/com/sangdol/roomescape/schedule/business/ScheduleService.kt index 2dbade7b..9acf630c 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/schedule/business/ScheduleService.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/schedule/business/ScheduleService.kt @@ -7,13 +7,23 @@ 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.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.ScheduleException 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.ScheduleStatus -import com.sangdol.roomescape.schedule.web.* import io.github.oshai.kotlinlogging.KLogger import io.github.oshai.kotlinlogging.KotlinLogging import org.springframework.data.repository.findByIdOrNull diff --git a/service/src/main/kotlin/com/sangdol/roomescape/schedule/business/ScheduleValidator.kt b/service/src/main/kotlin/com/sangdol/roomescape/schedule/business/ScheduleValidator.kt index 5e0f5e1d..75deaa46 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/schedule/business/ScheduleValidator.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/schedule/business/ScheduleValidator.kt @@ -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.ScheduleRepository import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleStatus -import com.sangdol.roomescape.schedule.web.ScheduleCreateRequest -import com.sangdol.roomescape.schedule.web.ScheduleUpdateRequest +import com.sangdol.roomescape.schedule.dto.ScheduleCreateRequest +import com.sangdol.roomescape.schedule.dto.ScheduleUpdateRequest import io.github.oshai.kotlinlogging.KLogger import io.github.oshai.kotlinlogging.KotlinLogging import org.springframework.stereotype.Component diff --git a/service/src/main/kotlin/com/sangdol/roomescape/schedule/docs/ScheduleAPI.kt b/service/src/main/kotlin/com/sangdol/roomescape/schedule/docs/ScheduleAPI.kt index dfbd397e..215f3486 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/schedule/docs/ScheduleAPI.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/schedule/docs/ScheduleAPI.kt @@ -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.UserOnly 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.responses.ApiResponse import io.swagger.v3.oas.annotations.responses.ApiResponses diff --git a/service/src/main/kotlin/com/sangdol/roomescape/schedule/dto/AdminScheduleFindDTO.kt b/service/src/main/kotlin/com/sangdol/roomescape/schedule/dto/AdminScheduleFindDTO.kt new file mode 100644 index 00000000..afe598cb --- /dev/null +++ b/service/src/main/kotlin/com/sangdol/roomescape/schedule/dto/AdminScheduleFindDTO.kt @@ -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 +) \ No newline at end of file diff --git a/service/src/main/kotlin/com/sangdol/roomescape/schedule/dto/AdminScheduleWriteDTO.kt b/service/src/main/kotlin/com/sangdol/roomescape/schedule/dto/AdminScheduleWriteDTO.kt new file mode 100644 index 00000000..27701a8b --- /dev/null +++ b/service/src/main/kotlin/com/sangdol/roomescape/schedule/dto/AdminScheduleWriteDTO.kt @@ -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 + } +} diff --git a/service/src/main/kotlin/com/sangdol/roomescape/schedule/dto/ScheduleFindDTO.kt b/service/src/main/kotlin/com/sangdol/roomescape/schedule/dto/ScheduleFindDTO.kt new file mode 100644 index 00000000..652a90c3 --- /dev/null +++ b/service/src/main/kotlin/com/sangdol/roomescape/schedule/dto/ScheduleFindDTO.kt @@ -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 +) + +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, +) diff --git a/service/src/main/kotlin/com/sangdol/roomescape/schedule/mapper/AdminScheduleMappingExtensions.kt b/service/src/main/kotlin/com/sangdol/roomescape/schedule/mapper/AdminScheduleMappingExtensions.kt new file mode 100644 index 00000000..4e0b6e50 --- /dev/null +++ b/service/src/main/kotlin/com/sangdol/roomescape/schedule/mapper/AdminScheduleMappingExtensions.kt @@ -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 +) \ No newline at end of file diff --git a/service/src/main/kotlin/com/sangdol/roomescape/schedule/mapper/ScheduleMappingExtensions.kt b/service/src/main/kotlin/com/sangdol/roomescape/schedule/mapper/ScheduleMappingExtensions.kt new file mode 100644 index 00000000..2482631c --- /dev/null +++ b/service/src/main/kotlin/com/sangdol/roomescape/schedule/mapper/ScheduleMappingExtensions.kt @@ -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.toAdminSummaryListResponse() = AdminScheduleSummaryListResponse( + this.map { it.toAdminSummaryResponse() } +) + +fun List.toResponse() = ScheduleWithThemeListResponse( + this.map { it.toResponse() } +) diff --git a/service/src/main/kotlin/com/sangdol/roomescape/schedule/web/AdminScheduleController.kt b/service/src/main/kotlin/com/sangdol/roomescape/schedule/web/AdminScheduleController.kt index 54a38e6c..444bea51 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/schedule/web/AdminScheduleController.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/schedule/web/AdminScheduleController.kt @@ -4,6 +4,10 @@ import com.sangdol.common.types.web.CommonApiResponse import com.sangdol.roomescape.common.types.AuditingInfo import com.sangdol.roomescape.schedule.business.ScheduleService 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 org.springframework.format.annotation.DateTimeFormat import org.springframework.http.ResponseEntity diff --git a/service/src/main/kotlin/com/sangdol/roomescape/schedule/web/AdminScheduleDto.kt b/service/src/main/kotlin/com/sangdol/roomescape/schedule/web/AdminScheduleDto.kt deleted file mode 100644 index fec62160..00000000 --- a/service/src/main/kotlin/com/sangdol/roomescape/schedule/web/AdminScheduleDto.kt +++ /dev/null @@ -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 -) - -fun List.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 - } -} diff --git a/service/src/main/kotlin/com/sangdol/roomescape/schedule/web/ScheduleController.kt b/service/src/main/kotlin/com/sangdol/roomescape/schedule/web/ScheduleController.kt index 1c5d8c2b..9de0dca5 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/schedule/web/ScheduleController.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/schedule/web/ScheduleController.kt @@ -4,6 +4,7 @@ import com.sangdol.common.types.web.CommonApiResponse import com.sangdol.roomescape.schedule.business.ScheduleService import com.sangdol.roomescape.schedule.docs.PublicScheduleAPI import com.sangdol.roomescape.schedule.docs.UserScheduleAPI +import com.sangdol.roomescape.schedule.dto.ScheduleWithThemeListResponse import org.springframework.format.annotation.DateTimeFormat import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.* diff --git a/service/src/main/kotlin/com/sangdol/roomescape/schedule/web/ScheduleDto.kt b/service/src/main/kotlin/com/sangdol/roomescape/schedule/web/ScheduleDto.kt deleted file mode 100644 index 17da9b83..00000000 --- a/service/src/main/kotlin/com/sangdol/roomescape/schedule/web/ScheduleDto.kt +++ /dev/null @@ -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 -) - -fun List.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, -) diff --git a/service/src/test/kotlin/com/sangdol/roomescape/schedule/AdminScheduleApiTest.kt b/service/src/test/kotlin/com/sangdol/roomescape/schedule/AdminScheduleApiTest.kt index a47cca77..d10924c9 100644 --- a/service/src/test/kotlin/com/sangdol/roomescape/schedule/AdminScheduleApiTest.kt +++ b/service/src/test/kotlin/com/sangdol/roomescape/schedule/AdminScheduleApiTest.kt @@ -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.ScheduleRepository import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleStatus -import com.sangdol.roomescape.schedule.web.AdminScheduleSummaryResponse -import com.sangdol.roomescape.schedule.web.ScheduleUpdateRequest +import com.sangdol.roomescape.schedule.dto.AdminScheduleSummaryResponse +import com.sangdol.roomescape.schedule.dto.ScheduleUpdateRequest import com.sangdol.roomescape.store.infrastructure.persistence.StoreEntity import com.sangdol.roomescape.supports.* import io.kotest.assertions.assertSoftly diff --git a/service/src/test/kotlin/com/sangdol/roomescape/schedule/ScheduleServiceTest.kt b/service/src/test/kotlin/com/sangdol/roomescape/schedule/ScheduleServiceTest.kt index 1440e7fb..ae2da5b7 100644 --- a/service/src/test/kotlin/com/sangdol/roomescape/schedule/ScheduleServiceTest.kt +++ b/service/src/test/kotlin/com/sangdol/roomescape/schedule/ScheduleServiceTest.kt @@ -4,8 +4,8 @@ import com.sangdol.common.utils.MdcPrincipalIdUtil import com.sangdol.roomescape.schedule.business.ScheduleService import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleRepository import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleStatus -import com.sangdol.roomescape.schedule.web.ScheduleCreateRequest -import com.sangdol.roomescape.schedule.web.ScheduleUpdateRequest +import com.sangdol.roomescape.schedule.dto.ScheduleCreateRequest +import com.sangdol.roomescape.schedule.dto.ScheduleUpdateRequest import com.sangdol.roomescape.supports.FunSpecSpringbootTest import com.sangdol.roomescape.supports.IDGenerator import com.sangdol.roomescape.supports.initialize diff --git a/service/src/test/kotlin/com/sangdol/roomescape/supports/DummyInitializer.kt b/service/src/test/kotlin/com/sangdol/roomescape/supports/DummyInitializer.kt index 04119355..2e82214f 100644 --- a/service/src/test/kotlin/com/sangdol/roomescape/supports/DummyInitializer.kt +++ b/service/src/test/kotlin/com/sangdol/roomescape/supports/DummyInitializer.kt @@ -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.ScheduleRepository 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.StoreRepository import com.sangdol.roomescape.store.infrastructure.persistence.StoreStatus diff --git a/service/src/test/kotlin/com/sangdol/roomescape/supports/Fixtures.kt b/service/src/test/kotlin/com/sangdol/roomescape/supports/Fixtures.kt index 48fcf989..e79bcea7 100644 --- a/service/src/test/kotlin/com/sangdol/roomescape/supports/Fixtures.kt +++ b/service/src/test/kotlin/com/sangdol/roomescape/supports/Fixtures.kt @@ -13,7 +13,7 @@ import com.sangdol.roomescape.payment.web.PaymentConfirmRequest import com.sangdol.roomescape.reservation.web.PendingReservationCreateRequest import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleEntity 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.StoreStatus import com.sangdol.roomescape.store.dto.StoreRegisterRequest