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

Merged
pricelees merged 45 commits from refactor/#56 into main 2025-10-09 09:33:29 +00:00
13 changed files with 115 additions and 87 deletions
Showing only changes of commit 8bb22a6a84 - Show all commits

View File

@ -4,12 +4,20 @@ import com.sangdol.common.persistence.IDGenerator
import com.sangdol.roomescape.admin.business.AdminService
import com.sangdol.roomescape.common.types.AuditingInfo
import com.sangdol.roomescape.region.business.RegionService
import com.sangdol.roomescape.store.dto.DetailStoreResponse
import com.sangdol.roomescape.store.dto.StoreNameListResponse
import com.sangdol.roomescape.store.dto.StoreInfoResponse
import com.sangdol.roomescape.store.dto.StoreRegisterRequest
import com.sangdol.roomescape.store.dto.StoreRegisterResponse
import com.sangdol.roomescape.store.dto.StoreUpdateRequest
import com.sangdol.roomescape.store.exception.StoreErrorCode
import com.sangdol.roomescape.store.exception.StoreException
import com.sangdol.roomescape.store.infrastructure.persistence.StoreEntity
import com.sangdol.roomescape.store.infrastructure.persistence.StoreRepository
import com.sangdol.roomescape.store.infrastructure.persistence.StoreStatus
import com.sangdol.roomescape.store.web.*
import com.sangdol.roomescape.store.mapper.toDetailResponse
import com.sangdol.roomescape.store.mapper.toInfoResponse
import com.sangdol.roomescape.store.mapper.toSimpleListResponse
import io.github.oshai.kotlinlogging.KLogger
import io.github.oshai.kotlinlogging.KotlinLogging
import org.springframework.stereotype.Service
@ -85,7 +93,7 @@ class StoreService(
}
@Transactional(readOnly = true)
fun getAllActiveStores(sidoCode: String?, sigunguCode: String?): SimpleStoreListResponse {
fun getAllActiveStores(sidoCode: String?, sigunguCode: String?): StoreNameListResponse {
log.info { "[getAllActiveStores] 전체 매장 조회 시작" }
val regionCode: String? = when {

View File

@ -3,8 +3,8 @@ package com.sangdol.roomescape.store.business
import com.sangdol.roomescape.store.exception.StoreErrorCode
import com.sangdol.roomescape.store.exception.StoreException
import com.sangdol.roomescape.store.infrastructure.persistence.StoreRepository
import com.sangdol.roomescape.store.web.StoreRegisterRequest
import com.sangdol.roomescape.store.web.StoreUpdateRequest
import com.sangdol.roomescape.store.dto.StoreRegisterRequest
import com.sangdol.roomescape.store.dto.StoreUpdateRequest
import io.github.oshai.kotlinlogging.KLogger
import io.github.oshai.kotlinlogging.KotlinLogging
import org.springframework.stereotype.Component

View File

@ -5,7 +5,12 @@ import com.sangdol.roomescape.admin.infrastructure.persistence.AdminType
import com.sangdol.roomescape.admin.infrastructure.persistence.Privilege
import com.sangdol.roomescape.auth.web.support.AdminOnly
import com.sangdol.roomescape.auth.web.support.Public
import com.sangdol.roomescape.store.web.*
import com.sangdol.roomescape.store.dto.DetailStoreResponse
import com.sangdol.roomescape.store.dto.StoreNameListResponse
import com.sangdol.roomescape.store.dto.StoreInfoResponse
import com.sangdol.roomescape.store.dto.StoreRegisterRequest
import com.sangdol.roomescape.store.dto.StoreRegisterResponse
import com.sangdol.roomescape.store.dto.StoreUpdateRequest
import io.swagger.v3.oas.annotations.Operation
import io.swagger.v3.oas.annotations.responses.ApiResponse
import io.swagger.v3.oas.annotations.responses.ApiResponses
@ -53,7 +58,7 @@ interface PublicStoreAPI {
fun getStores(
@RequestParam(value = "sido", required = false) sidoCode: String?,
@RequestParam(value = "sigungu", required = false) sigunguCode: String?
): ResponseEntity<CommonApiResponse<SimpleStoreListResponse>>
): ResponseEntity<CommonApiResponse<StoreNameListResponse>>
@Public
@Operation(summary = "특정 매장의 정보 조회")

View File

@ -0,0 +1,22 @@
package com.sangdol.roomescape.store.dto
import com.sangdol.roomescape.common.types.AuditingInfo
import com.sangdol.roomescape.region.web.RegionInfoResponse
data class StoreRegisterRequest(
val name: String,
val address: String,
val contact: String,
val businessRegNum: String,
val regionCode: String
)
data class StoreRegisterResponse(
val id: Long
)
data class StoreUpdateRequest(
val name: String? = null,
val address: String? = null,
val contact: String? = null,
)

View File

@ -0,0 +1,31 @@
package com.sangdol.roomescape.store.dto
import com.sangdol.roomescape.common.types.AuditingInfo
import com.sangdol.roomescape.region.web.RegionInfoResponse
data class StoreNameResponse(
val id: Long,
val name: String
)
data class StoreNameListResponse(
val stores: List<StoreNameResponse>
)
data class StoreInfoResponse(
val id: Long,
val name: String,
val address: String,
val contact: String,
val businessRegNum: String
)
data class DetailStoreResponse(
val id: Long,
val name: String,
val address: String,
val contact: String,
val businessRegNum: String,
val region: RegionInfoResponse,
val audit: AuditingInfo
)

View File

@ -0,0 +1,34 @@
package com.sangdol.roomescape.store.mapper
import com.sangdol.roomescape.common.types.AuditingInfo
import com.sangdol.roomescape.region.web.RegionInfoResponse
import com.sangdol.roomescape.store.dto.DetailStoreResponse
import com.sangdol.roomescape.store.dto.StoreInfoResponse
import com.sangdol.roomescape.store.dto.StoreNameListResponse
import com.sangdol.roomescape.store.dto.StoreNameResponse
import com.sangdol.roomescape.store.infrastructure.persistence.StoreEntity
fun StoreEntity.toInfoResponse() = StoreInfoResponse(
id = this.id,
name = this.name,
address = this.address,
contact = this.contact,
businessRegNum = this.businessRegNum
)
fun StoreEntity.toDetailResponse(
region: RegionInfoResponse,
audit: AuditingInfo
) = DetailStoreResponse(
id = this.id,
name = this.name,
address = this.address,
contact = this.contact,
businessRegNum = this.businessRegNum,
region = region,
audit = audit,
)
fun List<StoreEntity>.toSimpleListResponse() = StoreNameListResponse(
stores = this.map { StoreNameResponse(id = it.id, name = it.name) }
)

View File

@ -3,6 +3,10 @@ package com.sangdol.roomescape.store.web
import com.sangdol.common.types.web.CommonApiResponse
import com.sangdol.roomescape.store.business.StoreService
import com.sangdol.roomescape.store.docs.AdminStoreAPI
import com.sangdol.roomescape.store.dto.DetailStoreResponse
import com.sangdol.roomescape.store.dto.StoreRegisterRequest
import com.sangdol.roomescape.store.dto.StoreRegisterResponse
import com.sangdol.roomescape.store.dto.StoreUpdateRequest
import jakarta.validation.Valid
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.*

View File

@ -1,46 +0,0 @@
package com.sangdol.roomescape.store.web
import com.sangdol.roomescape.common.types.AuditingInfo
import com.sangdol.roomescape.region.web.RegionInfoResponse
import com.sangdol.roomescape.store.infrastructure.persistence.StoreEntity
data class StoreRegisterRequest(
val name: String,
val address: String,
val contact: String,
val businessRegNum: String,
val regionCode: String
)
data class StoreRegisterResponse(
val id: Long
)
data class StoreUpdateRequest(
val name: String? = null,
val address: String? = null,
val contact: String? = null,
)
data class DetailStoreResponse(
val id: Long,
val name: String,
val address: String,
val contact: String,
val businessRegNum: String,
val region: RegionInfoResponse,
val audit: AuditingInfo
)
fun StoreEntity.toDetailResponse(
region: RegionInfoResponse,
audit: AuditingInfo
) = DetailStoreResponse(
id = this.id,
name = this.name,
address = this.address,
contact = this.contact,
businessRegNum = this.businessRegNum,
region = region,
audit = audit,
)

View File

@ -3,6 +3,8 @@ package com.sangdol.roomescape.store.web
import com.sangdol.common.types.web.CommonApiResponse
import com.sangdol.roomescape.store.business.StoreService
import com.sangdol.roomescape.store.docs.PublicStoreAPI
import com.sangdol.roomescape.store.dto.StoreNameListResponse
import com.sangdol.roomescape.store.dto.StoreInfoResponse
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PathVariable
@ -18,7 +20,7 @@ class StoreController(
override fun getStores(
@RequestParam(value = "sido", required = false) sidoCode: String?,
@RequestParam(value = "sigungu", required = false) sigunguCode: String?
): ResponseEntity<CommonApiResponse<SimpleStoreListResponse>> {
): ResponseEntity<CommonApiResponse<StoreNameListResponse>> {
val response = storeService.getAllActiveStores(sidoCode, sigunguCode)
return ResponseEntity.ok(CommonApiResponse(response))

View File

@ -1,32 +0,0 @@
package com.sangdol.roomescape.store.web
import com.sangdol.roomescape.store.infrastructure.persistence.StoreEntity
data class SimpleStoreResponse(
val id: Long,
val name: String
)
data class SimpleStoreListResponse(
val stores: List<SimpleStoreResponse>
)
fun List<StoreEntity>.toSimpleListResponse() = SimpleStoreListResponse(
stores = this.map { SimpleStoreResponse(id = it.id, name = it.name) }
)
data class StoreInfoResponse(
val id: Long,
val name: String,
val address: String,
val contact: String,
val businessRegNum: String
)
fun StoreEntity.toInfoResponse() = StoreInfoResponse(
id = this.id,
name = this.name,
address = this.address,
contact = this.contact,
businessRegNum = this.businessRegNum
)

View File

@ -9,7 +9,7 @@ import com.sangdol.roomescape.store.exception.StoreErrorCode
import com.sangdol.roomescape.store.infrastructure.persistence.StoreEntity
import com.sangdol.roomescape.store.infrastructure.persistence.StoreRepository
import com.sangdol.roomescape.store.infrastructure.persistence.StoreStatus
import com.sangdol.roomescape.store.web.StoreUpdateRequest
import com.sangdol.roomescape.store.dto.StoreUpdateRequest
import com.sangdol.roomescape.supports.*
import io.kotest.assertions.assertSoftly
import io.kotest.matchers.date.shouldBeAfter

View File

@ -16,7 +16,7 @@ import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleEntity
import com.sangdol.roomescape.schedule.web.ScheduleCreateRequest
import com.sangdol.roomescape.store.infrastructure.persistence.StoreEntity
import com.sangdol.roomescape.store.infrastructure.persistence.StoreStatus
import com.sangdol.roomescape.store.web.StoreRegisterRequest
import com.sangdol.roomescape.store.dto.StoreRegisterRequest
import com.sangdol.roomescape.theme.infrastructure.persistence.Difficulty
import com.sangdol.roomescape.theme.infrastructure.persistence.ThemeEntity
import com.sangdol.roomescape.theme.dto.ThemeCreateRequest