[#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.admin.business.AdminService
import com.sangdol.roomescape.common.types.AuditingInfo import com.sangdol.roomescape.common.types.AuditingInfo
import com.sangdol.roomescape.region.business.RegionService 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.StoreErrorCode
import com.sangdol.roomescape.store.exception.StoreException import com.sangdol.roomescape.store.exception.StoreException
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
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.KLogger
import io.github.oshai.kotlinlogging.KotlinLogging import io.github.oshai.kotlinlogging.KotlinLogging
import org.springframework.stereotype.Service import org.springframework.stereotype.Service
@ -85,7 +93,7 @@ class StoreService(
} }
@Transactional(readOnly = true) @Transactional(readOnly = true)
fun getAllActiveStores(sidoCode: String?, sigunguCode: String?): SimpleStoreListResponse { fun getAllActiveStores(sidoCode: String?, sigunguCode: String?): StoreNameListResponse {
log.info { "[getAllActiveStores] 전체 매장 조회 시작" } log.info { "[getAllActiveStores] 전체 매장 조회 시작" }
val regionCode: String? = when { 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.StoreErrorCode
import com.sangdol.roomescape.store.exception.StoreException import com.sangdol.roomescape.store.exception.StoreException
import com.sangdol.roomescape.store.infrastructure.persistence.StoreRepository import com.sangdol.roomescape.store.infrastructure.persistence.StoreRepository
import com.sangdol.roomescape.store.web.StoreRegisterRequest import com.sangdol.roomescape.store.dto.StoreRegisterRequest
import com.sangdol.roomescape.store.web.StoreUpdateRequest import com.sangdol.roomescape.store.dto.StoreUpdateRequest
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

@ -5,7 +5,12 @@ import com.sangdol.roomescape.admin.infrastructure.persistence.AdminType
import com.sangdol.roomescape.admin.infrastructure.persistence.Privilege import com.sangdol.roomescape.admin.infrastructure.persistence.Privilege
import com.sangdol.roomescape.auth.web.support.AdminOnly 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.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.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
@ -53,7 +58,7 @@ interface PublicStoreAPI {
fun getStores( fun getStores(
@RequestParam(value = "sido", required = false) sidoCode: String?, @RequestParam(value = "sido", required = false) sidoCode: String?,
@RequestParam(value = "sigungu", required = false) sigunguCode: String? @RequestParam(value = "sigungu", required = false) sigunguCode: String?
): ResponseEntity<CommonApiResponse<SimpleStoreListResponse>> ): ResponseEntity<CommonApiResponse<StoreNameListResponse>>
@Public @Public
@Operation(summary = "특정 매장의 정보 조회") @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.common.types.web.CommonApiResponse
import com.sangdol.roomescape.store.business.StoreService import com.sangdol.roomescape.store.business.StoreService
import com.sangdol.roomescape.store.docs.AdminStoreAPI 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 jakarta.validation.Valid
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,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.common.types.web.CommonApiResponse
import com.sangdol.roomescape.store.business.StoreService import com.sangdol.roomescape.store.business.StoreService
import com.sangdol.roomescape.store.docs.PublicStoreAPI 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.http.ResponseEntity
import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PathVariable import org.springframework.web.bind.annotation.PathVariable
@ -18,7 +20,7 @@ class StoreController(
override fun getStores( override fun getStores(
@RequestParam(value = "sido", required = false) sidoCode: String?, @RequestParam(value = "sido", required = false) sidoCode: String?,
@RequestParam(value = "sigungu", required = false) sigunguCode: String? @RequestParam(value = "sigungu", required = false) sigunguCode: String?
): ResponseEntity<CommonApiResponse<SimpleStoreListResponse>> { ): ResponseEntity<CommonApiResponse<StoreNameListResponse>> {
val response = storeService.getAllActiveStores(sidoCode, sigunguCode) val response = storeService.getAllActiveStores(sidoCode, sigunguCode)
return ResponseEntity.ok(CommonApiResponse(response)) 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.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
import com.sangdol.roomescape.store.web.StoreUpdateRequest import com.sangdol.roomescape.store.dto.StoreUpdateRequest
import com.sangdol.roomescape.supports.* import com.sangdol.roomescape.supports.*
import io.kotest.assertions.assertSoftly import io.kotest.assertions.assertSoftly
import io.kotest.matchers.date.shouldBeAfter 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.schedule.web.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.web.StoreRegisterRequest import com.sangdol.roomescape.store.dto.StoreRegisterRequest
import com.sangdol.roomescape.theme.infrastructure.persistence.Difficulty import com.sangdol.roomescape.theme.infrastructure.persistence.Difficulty
import com.sangdol.roomescape.theme.infrastructure.persistence.ThemeEntity import com.sangdol.roomescape.theme.infrastructure.persistence.ThemeEntity
import com.sangdol.roomescape.theme.dto.ThemeCreateRequest import com.sangdol.roomescape.theme.dto.ThemeCreateRequest