[#48] Tosspay mocking 서버 구현을 위한 멀티모듈 전환 #49

Merged
pricelees merged 39 commits from feat/#48 into main 2025-09-30 00:39:14 +00:00
29 changed files with 1041 additions and 1044 deletions
Showing only changes of commit 7c52460ac6 - Show all commits

View File

@ -1,17 +1,16 @@
package com.sangdol.roomescape.admin.business package com.sangdol.roomescape.admin.business
import com.sangdol.common.types.audit.Auditor
import com.sangdol.roomescape.admin.exception.AdminErrorCode
import com.sangdol.roomescape.admin.exception.AdminException
import com.sangdol.roomescape.admin.infrastructure.persistence.AdminRepository
import com.sangdol.roomescape.common.dto.AdminLoginCredentials
import com.sangdol.roomescape.common.dto.toCredentials
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
import org.springframework.stereotype.Service import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional import org.springframework.transaction.annotation.Transactional
import com.sangdol.roomescape.admin.exception.AdminErrorCode
import com.sangdol.roomescape.admin.exception.AdminException
import com.sangdol.roomescape.admin.infrastructure.persistence.AdminRepository
import com.sangdol.roomescape.common.dto.AdminLoginCredentials
import com.sangdol.roomescape.common.dto.AuditConstant
import com.sangdol.roomescape.common.dto.OperatorInfo
import com.sangdol.roomescape.common.dto.toCredentials
private val log: KLogger = KotlinLogging.logger {} private val log: KLogger = KotlinLogging.logger {}
@ -35,16 +34,16 @@ class AdminService(
} }
@Transactional(readOnly = true) @Transactional(readOnly = true)
fun findOperatorOrUnknown(id: Long): OperatorInfo { fun findOperatorOrUnknown(id: Long): Auditor {
log.info { "[AdminService.findOperatorById] 작업자 정보 조회 시작: id=${id}" } log.info { "[AdminService.findOperatorById] 작업자 정보 조회 시작: id=${id}" }
return adminRepository.findByIdOrNull(id)?.let { admin -> return adminRepository.findByIdOrNull(id)?.let { admin ->
OperatorInfo(admin.id, admin.name).also { Auditor(admin.id, admin.name).also {
log.info { "[AdminService.findOperatorById] 작업자 정보 조회 완료: id=${admin.id}, name=${admin.name}" } log.info { "[AdminService.findOperatorById] 작업자 정보 조회 완료: id=${admin.id}, name=${admin.name}" }
} }
} ?: run { } ?: run {
log.warn { "[AdminService.findOperatorById] 작업자 정보 조회 실패. id=${id}" } log.warn { "[AdminService.findOperatorById] 작업자 정보 조회 실패. id=${id}" }
AuditConstant.UNKNOWN_OPERATOR Auditor.UNKNOWN
} }
} }
} }

View File

@ -1,5 +1,11 @@
package com.sangdol.roomescape.auth.docs package com.sangdol.roomescape.auth.docs
import com.sangdol.common.types.web.CommonApiResponse
import com.sangdol.roomescape.auth.web.LoginRequest
import com.sangdol.roomescape.auth.web.LoginSuccessResponse
import com.sangdol.roomescape.auth.web.support.Public
import com.sangdol.roomescape.auth.web.support.User
import com.sangdol.roomescape.common.dto.CurrentUserContext
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
@ -8,12 +14,6 @@ import jakarta.servlet.http.HttpServletResponse
import jakarta.validation.Valid import jakarta.validation.Valid
import org.springframework.http.ResponseEntity import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestBody
import com.sangdol.roomescape.auth.web.LoginRequest
import com.sangdol.roomescape.auth.web.LoginSuccessResponse
import com.sangdol.roomescape.auth.web.support.Public
import com.sangdol.roomescape.auth.web.support.User
import com.sangdol.roomescape.common.dto.CurrentUserContext
import com.sangdol.roomescape.common.dto.response.CommonApiResponse
interface AuthAPI { interface AuthAPI {

View File

@ -1,16 +1,16 @@
package com.sangdol.roomescape.auth.web package com.sangdol.roomescape.auth.web
import com.sangdol.common.types.web.CommonApiResponse
import com.sangdol.roomescape.auth.business.AuthService
import com.sangdol.roomescape.auth.docs.AuthAPI
import com.sangdol.roomescape.auth.web.support.User
import com.sangdol.roomescape.common.dto.CurrentUserContext
import jakarta.servlet.http.HttpServletRequest import jakarta.servlet.http.HttpServletRequest
import jakarta.servlet.http.HttpServletResponse import jakarta.servlet.http.HttpServletResponse
import org.springframework.http.ResponseEntity import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController import org.springframework.web.bind.annotation.RestController
import com.sangdol.roomescape.auth.business.AuthService
import com.sangdol.roomescape.auth.docs.AuthAPI
import com.sangdol.roomescape.auth.web.support.User
import com.sangdol.roomescape.common.dto.CurrentUserContext
import com.sangdol.roomescape.common.dto.response.CommonApiResponse
@RestController @RestController
@RequestMapping("/auth") @RequestMapping("/auth")

View File

@ -8,7 +8,6 @@ import com.sangdol.roomescape.auth.web.LoginSuccessResponse
import com.sangdol.roomescape.auth.web.UserLoginSuccessResponse import com.sangdol.roomescape.auth.web.UserLoginSuccessResponse
import com.sangdol.roomescape.user.infrastructure.persistence.UserEntity import com.sangdol.roomescape.user.infrastructure.persistence.UserEntity
abstract class LoginCredentials { abstract class LoginCredentials {
abstract val id: Long abstract val id: Long
abstract val password: String abstract val password: String

View File

@ -3,9 +3,9 @@ package com.sangdol.roomescape.common.exception
import com.sangdol.common.types.exception.CommonErrorCode import com.sangdol.common.types.exception.CommonErrorCode
import com.sangdol.common.types.exception.ErrorCode import com.sangdol.common.types.exception.ErrorCode
import com.sangdol.common.types.exception.RoomescapeException import com.sangdol.common.types.exception.RoomescapeException
import com.sangdol.common.types.web.CommonErrorResponse
import com.sangdol.common.types.web.HttpStatus import com.sangdol.common.types.web.HttpStatus
import com.sangdol.roomescape.auth.exception.AuthException import com.sangdol.roomescape.auth.exception.AuthException
import com.sangdol.roomescape.common.dto.response.CommonErrorResponse
import com.sangdol.roomescape.common.log.ApiLogMessageConverter import com.sangdol.roomescape.common.log.ApiLogMessageConverter
import com.sangdol.roomescape.common.log.ConvertResponseMessageRequest import com.sangdol.roomescape.common.log.ConvertResponseMessageRequest
import com.sangdol.roomescape.common.log.LogType import com.sangdol.roomescape.common.log.LogType

View File

@ -1,5 +1,12 @@
package com.sangdol.roomescape.payment.docs package com.sangdol.roomescape.payment.docs
import com.sangdol.common.types.web.CommonApiResponse
import com.sangdol.roomescape.auth.web.support.User
import com.sangdol.roomescape.auth.web.support.UserOnly
import com.sangdol.roomescape.common.dto.CurrentUserContext
import com.sangdol.roomescape.payment.web.PaymentCancelRequest
import com.sangdol.roomescape.payment.web.PaymentConfirmRequest
import com.sangdol.roomescape.payment.web.PaymentCreateResponse
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
@ -7,13 +14,6 @@ import jakarta.validation.Valid
import org.springframework.http.ResponseEntity import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestParam import org.springframework.web.bind.annotation.RequestParam
import com.sangdol.roomescape.auth.web.support.User
import com.sangdol.roomescape.auth.web.support.UserOnly
import com.sangdol.roomescape.common.dto.CurrentUserContext
import com.sangdol.roomescape.common.dto.response.CommonApiResponse
import com.sangdol.roomescape.payment.web.PaymentCancelRequest
import com.sangdol.roomescape.payment.web.PaymentConfirmRequest
import com.sangdol.roomescape.payment.web.PaymentCreateResponse
interface PaymentAPI { interface PaymentAPI {

View File

@ -1,13 +1,13 @@
package com.sangdol.roomescape.payment.web package com.sangdol.roomescape.payment.web
import com.sangdol.common.types.web.CommonApiResponse
import com.sangdol.roomescape.auth.web.support.User
import com.sangdol.roomescape.common.dto.CurrentUserContext
import com.sangdol.roomescape.payment.business.PaymentService
import com.sangdol.roomescape.payment.docs.PaymentAPI
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.*
import com.sangdol.roomescape.auth.web.support.User
import com.sangdol.roomescape.common.dto.CurrentUserContext
import com.sangdol.roomescape.common.dto.response.CommonApiResponse
import com.sangdol.roomescape.payment.business.PaymentService
import com.sangdol.roomescape.payment.docs.PaymentAPI
@RestController @RestController
@RequestMapping("/payments") @RequestMapping("/payments")

View File

@ -1,15 +1,15 @@
package com.sangdol.roomescape.region.docs package com.sangdol.roomescape.region.docs
import com.sangdol.common.types.web.CommonApiResponse
import com.sangdol.roomescape.auth.web.support.Public
import com.sangdol.roomescape.region.web.RegionCodeResponse
import com.sangdol.roomescape.region.web.SidoListResponse
import com.sangdol.roomescape.region.web.SigunguListResponse
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
import org.springframework.http.ResponseEntity import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.RequestParam import org.springframework.web.bind.annotation.RequestParam
import com.sangdol.roomescape.auth.web.support.Public
import com.sangdol.roomescape.common.dto.response.CommonApiResponse
import com.sangdol.roomescape.region.web.RegionCodeResponse
import com.sangdol.roomescape.region.web.SidoListResponse
import com.sangdol.roomescape.region.web.SigunguListResponse
interface RegionAPI { interface RegionAPI {

View File

@ -1,13 +1,13 @@
package com.sangdol.roomescape.region.web package com.sangdol.roomescape.region.web
import com.sangdol.common.types.web.CommonApiResponse
import com.sangdol.roomescape.region.business.RegionService
import com.sangdol.roomescape.region.docs.RegionAPI
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.RequestMapping import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RequestParam import org.springframework.web.bind.annotation.RequestParam
import org.springframework.web.bind.annotation.RestController import org.springframework.web.bind.annotation.RestController
import com.sangdol.roomescape.common.dto.response.CommonApiResponse
import com.sangdol.roomescape.region.business.RegionService
import com.sangdol.roomescape.region.docs.RegionAPI
@RestController @RestController
@RequestMapping("/regions") @RequestMapping("/regions")

View File

@ -1,5 +1,10 @@
package com.sangdol.roomescape.reservation.docs package com.sangdol.roomescape.reservation.docs
import com.sangdol.common.types.web.CommonApiResponse
import com.sangdol.roomescape.auth.web.support.User
import com.sangdol.roomescape.auth.web.support.UserOnly
import com.sangdol.roomescape.common.dto.CurrentUserContext
import com.sangdol.roomescape.reservation.web.*
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
@ -7,11 +12,6 @@ import jakarta.validation.Valid
import org.springframework.http.ResponseEntity import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.PathVariable import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestBody
import com.sangdol.roomescape.auth.web.support.User
import com.sangdol.roomescape.auth.web.support.UserOnly
import com.sangdol.roomescape.common.dto.CurrentUserContext
import com.sangdol.roomescape.common.dto.response.CommonApiResponse
import com.sangdol.roomescape.reservation.web.*
interface ReservationAPI { interface ReservationAPI {
@Operation(summary = "결제 전 임시 예약 저장") @Operation(summary = "결제 전 임시 예약 저장")

View File

@ -1,13 +1,13 @@
package com.sangdol.roomescape.reservation.web package com.sangdol.roomescape.reservation.web
import com.sangdol.common.types.web.CommonApiResponse
import com.sangdol.roomescape.auth.web.support.User
import com.sangdol.roomescape.common.dto.CurrentUserContext
import com.sangdol.roomescape.reservation.business.ReservationService
import com.sangdol.roomescape.reservation.docs.ReservationAPI
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.*
import com.sangdol.roomescape.auth.web.support.User
import com.sangdol.roomescape.common.dto.CurrentUserContext
import com.sangdol.roomescape.common.dto.response.CommonApiResponse
import com.sangdol.roomescape.reservation.business.ReservationService
import com.sangdol.roomescape.reservation.docs.ReservationAPI
@RestController @RestController
@RequestMapping("/reservations") @RequestMapping("/reservations")

View File

@ -2,9 +2,9 @@ package com.sangdol.roomescape.schedule.business
import ScheduleException import ScheduleException
import com.sangdol.common.persistence.IDGenerator import com.sangdol.common.persistence.IDGenerator
import com.sangdol.common.types.audit.AuditingInfo
import com.sangdol.common.types.audit.Auditor
import com.sangdol.roomescape.admin.business.AdminService import com.sangdol.roomescape.admin.business.AdminService
import com.sangdol.roomescape.common.dto.AuditInfo
import com.sangdol.roomescape.common.dto.OperatorInfo
import com.sangdol.roomescape.schedule.business.domain.ScheduleOverview import com.sangdol.roomescape.schedule.business.domain.ScheduleOverview
import com.sangdol.roomescape.schedule.exception.ScheduleErrorCode import com.sangdol.roomescape.schedule.exception.ScheduleErrorCode
import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleEntity import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleEntity
@ -89,15 +89,15 @@ class ScheduleService(
} }
@Transactional(readOnly = true) @Transactional(readOnly = true)
fun findScheduleAudit(id: Long): AuditInfo { fun findScheduleAudit(id: Long): AuditingInfo {
log.info { "[ScheduleService.findDetail] 일정 감사 정보 조회 시작: id=$id" } log.info { "[ScheduleService.findDetail] 일정 감사 정보 조회 시작: id=$id" }
val schedule: ScheduleEntity = findOrThrow(id) val schedule: ScheduleEntity = findOrThrow(id)
val createdBy: OperatorInfo = adminService.findOperatorOrUnknown(schedule.createdBy) val createdBy: Auditor = adminService.findOperatorOrUnknown(schedule.createdBy)
val updatedBy: OperatorInfo = adminService.findOperatorOrUnknown(schedule.updatedBy) val updatedBy: Auditor = adminService.findOperatorOrUnknown(schedule.updatedBy)
return AuditInfo(schedule.createdAt, createdBy, schedule.updatedAt, updatedBy) return AuditingInfo(schedule.createdAt, createdBy, schedule.updatedAt, updatedBy)
.also { log.info { "[ScheduleService.findDetail] 일정 감사 정보 조회 완료: id=$id" } } .also { log.info { "[ScheduleService.findDetail] 일정 감사 정보 조회 완료: id=$id" } }
} }

View File

@ -1,5 +1,13 @@
package com.sangdol.roomescape.schedule.docs package com.sangdol.roomescape.schedule.docs
import com.sangdol.common.types.audit.AuditingInfo
import com.sangdol.common.types.web.CommonApiResponse
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.auth.web.support.UserOnly
import com.sangdol.roomescape.schedule.web.*
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
@ -9,14 +17,6 @@ import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.PathVariable import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestParam import org.springframework.web.bind.annotation.RequestParam
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.auth.web.support.UserOnly
import com.sangdol.roomescape.common.dto.AuditInfo
import com.sangdol.roomescape.common.dto.response.CommonApiResponse
import com.sangdol.roomescape.schedule.web.*
import java.time.LocalDate import java.time.LocalDate
interface AdminScheduleAPI { interface AdminScheduleAPI {
@ -35,7 +35,7 @@ interface AdminScheduleAPI {
@ApiResponses(ApiResponse(responseCode = "200", useReturnTypeSchema = true)) @ApiResponses(ApiResponse(responseCode = "200", useReturnTypeSchema = true))
fun findScheduleAudit( fun findScheduleAudit(
@PathVariable("id") id: Long @PathVariable("id") id: Long
): ResponseEntity<CommonApiResponse<AuditInfo>> ): ResponseEntity<CommonApiResponse<AuditingInfo>>
@AdminOnly(type = AdminType.STORE, privilege = Privilege.CREATE) @AdminOnly(type = AdminType.STORE, privilege = Privilege.CREATE)
@Operation(summary = "일정 생성") @Operation(summary = "일정 생성")

View File

@ -1,13 +1,13 @@
package com.sangdol.roomescape.schedule.web package com.sangdol.roomescape.schedule.web
import com.sangdol.common.types.audit.AuditingInfo
import com.sangdol.common.types.web.CommonApiResponse
import com.sangdol.roomescape.schedule.business.ScheduleService
import com.sangdol.roomescape.schedule.docs.AdminScheduleAPI
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
import org.springframework.web.bind.annotation.* import org.springframework.web.bind.annotation.*
import com.sangdol.roomescape.common.dto.AuditInfo
import com.sangdol.roomescape.common.dto.response.CommonApiResponse
import com.sangdol.roomescape.schedule.business.ScheduleService
import com.sangdol.roomescape.schedule.docs.AdminScheduleAPI
import java.time.LocalDate import java.time.LocalDate
@RestController @RestController
@ -29,7 +29,7 @@ class AdminScheduleController(
@GetMapping("/schedules/{id}/audits") @GetMapping("/schedules/{id}/audits")
override fun findScheduleAudit( override fun findScheduleAudit(
@PathVariable("id") id: Long @PathVariable("id") id: Long
): ResponseEntity<CommonApiResponse<AuditInfo>> { ): ResponseEntity<CommonApiResponse<AuditingInfo>> {
val response = scheduleService.findScheduleAudit(id) val response = scheduleService.findScheduleAudit(id)
return ResponseEntity.ok(CommonApiResponse(response)) return ResponseEntity.ok(CommonApiResponse(response))

View File

@ -1,12 +1,12 @@
package com.sangdol.roomescape.schedule.web package com.sangdol.roomescape.schedule.web
import org.springframework.format.annotation.DateTimeFormat import com.sangdol.common.types.web.CommonApiResponse
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.*
import com.sangdol.roomescape.common.dto.response.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 org.springframework.format.annotation.DateTimeFormat
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.*
import java.time.LocalDate import java.time.LocalDate
@RestController @RestController

View File

@ -1,8 +1,8 @@
package com.sangdol.roomescape.store.business package com.sangdol.roomescape.store.business
import com.sangdol.common.persistence.IDGenerator import com.sangdol.common.persistence.IDGenerator
import com.sangdol.common.types.audit.AuditingInfo
import com.sangdol.roomescape.admin.business.AdminService import com.sangdol.roomescape.admin.business.AdminService
import com.sangdol.roomescape.common.dto.AuditInfo
import com.sangdol.roomescape.region.business.RegionService import com.sangdol.roomescape.region.business.RegionService
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
@ -108,12 +108,12 @@ class StoreService(
.also { log.info { "[StoreService.findStoreInfo] 매장 정보 조회 완료: id=${id}" } } .also { log.info { "[StoreService.findStoreInfo] 매장 정보 조회 완료: id=${id}" } }
} }
private fun getAuditInfo(store: StoreEntity): AuditInfo { private fun getAuditInfo(store: StoreEntity): AuditingInfo {
log.info { "[StoreService.getAuditInfo] 감사 정보 조회 시작: storeId=${store.id}" } log.info { "[StoreService.getAuditInfo] 감사 정보 조회 시작: storeId=${store.id}" }
val createdBy = adminService.findOperatorOrUnknown(store.createdBy) val createdBy = adminService.findOperatorOrUnknown(store.createdBy)
val updatedBy = adminService.findOperatorOrUnknown(store.updatedBy) val updatedBy = adminService.findOperatorOrUnknown(store.updatedBy)
return AuditInfo( return AuditingInfo(
createdAt = store.createdAt, createdAt = store.createdAt,
createdBy = createdBy, createdBy = createdBy,
updatedAt = store.updatedAt, updatedAt = store.updatedAt,

View File

@ -1,5 +1,11 @@
package com.sangdol.roomescape.store.docs package com.sangdol.roomescape.store.docs
import com.sangdol.common.types.web.CommonApiResponse
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 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
@ -8,12 +14,6 @@ import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.PathVariable import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestParam import org.springframework.web.bind.annotation.RequestParam
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.common.dto.response.CommonApiResponse
import com.sangdol.roomescape.store.web.*
interface AdminStoreAPI { interface AdminStoreAPI {
@AdminOnly(type = AdminType.HQ, privilege = Privilege.READ_DETAIL) @AdminOnly(type = AdminType.HQ, privilege = Privilege.READ_DETAIL)

View File

@ -1,11 +1,11 @@
package com.sangdol.roomescape.store.web 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 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.*
import com.sangdol.roomescape.common.dto.response.CommonApiResponse
import com.sangdol.roomescape.store.business.StoreService
import com.sangdol.roomescape.store.docs.AdminStoreAPI
@RestController @RestController
@RequestMapping("/admin/stores") @RequestMapping("/admin/stores")

View File

@ -1,6 +1,6 @@
package com.sangdol.roomescape.store.web package com.sangdol.roomescape.store.web
import com.sangdol.roomescape.common.dto.AuditInfo import com.sangdol.common.types.audit.AuditingInfo
import com.sangdol.roomescape.region.web.RegionInfoResponse import com.sangdol.roomescape.region.web.RegionInfoResponse
import com.sangdol.roomescape.store.infrastructure.persistence.StoreEntity import com.sangdol.roomescape.store.infrastructure.persistence.StoreEntity
@ -29,12 +29,12 @@ data class DetailStoreResponse(
val contact: String, val contact: String,
val businessRegNum: String, val businessRegNum: String,
val region: RegionInfoResponse, val region: RegionInfoResponse,
val audit: AuditInfo val audit: AuditingInfo
) )
fun StoreEntity.toDetailResponse( fun StoreEntity.toDetailResponse(
region: RegionInfoResponse, region: RegionInfoResponse,
audit: AuditInfo audit: AuditingInfo
) = DetailStoreResponse( ) = DetailStoreResponse(
id = this.id, id = this.id,
name = this.name, name = this.name,

View File

@ -1,13 +1,13 @@
package com.sangdol.roomescape.store.web 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 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
import org.springframework.web.bind.annotation.RequestParam import org.springframework.web.bind.annotation.RequestParam
import org.springframework.web.bind.annotation.RestController import org.springframework.web.bind.annotation.RestController
import com.sangdol.roomescape.common.dto.response.CommonApiResponse
import com.sangdol.roomescape.store.business.StoreService
import com.sangdol.roomescape.store.docs.PublicStoreAPI
@RestController @RestController
class StoreController( class StoreController(

View File

@ -1,8 +1,8 @@
package com.sangdol.roomescape.theme.business package com.sangdol.roomescape.theme.business
import com.sangdol.common.persistence.IDGenerator import com.sangdol.common.persistence.IDGenerator
import com.sangdol.common.types.audit.AuditingInfo
import com.sangdol.roomescape.admin.business.AdminService import com.sangdol.roomescape.admin.business.AdminService
import com.sangdol.roomescape.common.dto.AuditInfo
import com.sangdol.roomescape.common.util.DateUtils import com.sangdol.roomescape.common.util.DateUtils
import com.sangdol.roomescape.theme.exception.ThemeErrorCode import com.sangdol.roomescape.theme.exception.ThemeErrorCode
import com.sangdol.roomescape.theme.exception.ThemeException import com.sangdol.roomescape.theme.exception.ThemeException
@ -78,7 +78,7 @@ class ThemeService(
val createdBy = adminService.findOperatorOrUnknown(theme.createdBy) val createdBy = adminService.findOperatorOrUnknown(theme.createdBy)
val updatedBy = adminService.findOperatorOrUnknown(theme.updatedBy) val updatedBy = adminService.findOperatorOrUnknown(theme.updatedBy)
val audit = AuditInfo(theme.createdAt, createdBy, theme.updatedAt, updatedBy) val audit = AuditingInfo(theme.createdAt, createdBy, theme.updatedAt, updatedBy)
return theme.toAdminThemeDetailResponse(audit) return theme.toAdminThemeDetailResponse(audit)
.also { log.info { "[ThemeService.findAdminThemeDetail] 테마 상세 조회 완료: id=$id, name=${theme.name}" } } .also { log.info { "[ThemeService.findAdminThemeDetail] 테마 상세 조회 완료: id=$id, name=${theme.name}" } }

View File

@ -1,5 +1,11 @@
package com.sangdol.roomescape.theme.docs package com.sangdol.roomescape.theme.docs
import com.sangdol.common.types.web.CommonApiResponse
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.theme.web.*
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
@ -9,12 +15,6 @@ import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PathVariable import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestParam import org.springframework.web.bind.annotation.RequestParam
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.common.dto.response.CommonApiResponse
import com.sangdol.roomescape.theme.web.*
interface AdminThemeAPI { interface AdminThemeAPI {
@AdminOnly(type = AdminType.HQ, privilege = Privilege.READ_SUMMARY) @AdminOnly(type = AdminType.HQ, privilege = Privilege.READ_SUMMARY)

View File

@ -1,11 +1,11 @@
package com.sangdol.roomescape.theme.web package com.sangdol.roomescape.theme.web
import com.sangdol.common.types.web.CommonApiResponse
import com.sangdol.roomescape.theme.business.ThemeService
import com.sangdol.roomescape.theme.docs.AdminThemeAPI
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.*
import com.sangdol.roomescape.common.dto.response.CommonApiResponse
import com.sangdol.roomescape.theme.business.ThemeService
import com.sangdol.roomescape.theme.docs.AdminThemeAPI
import java.net.URI import java.net.URI
@RestController @RestController

View File

@ -1,6 +1,6 @@
package com.sangdol.roomescape.theme.web package com.sangdol.roomescape.theme.web
import com.sangdol.roomescape.common.dto.AuditInfo import com.sangdol.common.types.audit.AuditingInfo
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
@ -95,10 +95,10 @@ fun List<ThemeEntity>.toAdminThemeSummaryListResponse() = AdminThemeSummaryListR
data class AdminThemeDetailResponse( data class AdminThemeDetailResponse(
val theme: ThemeInfoResponse, val theme: ThemeInfoResponse,
val isActive: Boolean, val isActive: Boolean,
val audit: AuditInfo val audit: AuditingInfo
) )
fun ThemeEntity.toAdminThemeDetailResponse(audit: AuditInfo) = fun ThemeEntity.toAdminThemeDetailResponse(audit: AuditingInfo) =
AdminThemeDetailResponse( AdminThemeDetailResponse(
theme = this.toInfoResponse(), theme = this.toInfoResponse(),
isActive = this.isActive, isActive = this.isActive,

View File

@ -1,10 +1,10 @@
package com.sangdol.roomescape.theme.web package com.sangdol.roomescape.theme.web
import org.springframework.http.ResponseEntity import com.sangdol.common.types.web.CommonApiResponse
import org.springframework.web.bind.annotation.*
import com.sangdol.roomescape.common.dto.response.CommonApiResponse
import com.sangdol.roomescape.theme.business.ThemeService import com.sangdol.roomescape.theme.business.ThemeService
import com.sangdol.roomescape.theme.docs.PublicThemeAPI import com.sangdol.roomescape.theme.docs.PublicThemeAPI
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.*
@RestController @RestController
@RequestMapping("/themes") @RequestMapping("/themes")

View File

@ -1,18 +1,18 @@
package com.sangdol.roomescape.user.docs package com.sangdol.roomescape.user.docs
import com.sangdol.common.types.web.CommonApiResponse
import com.sangdol.roomescape.auth.web.support.Public
import com.sangdol.roomescape.auth.web.support.User
import com.sangdol.roomescape.common.dto.CurrentUserContext
import com.sangdol.roomescape.user.web.UserContactResponse
import com.sangdol.roomescape.user.web.UserCreateRequest
import com.sangdol.roomescape.user.web.UserCreateResponse
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
import jakarta.validation.Valid import jakarta.validation.Valid
import org.springframework.http.ResponseEntity import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestBody
import com.sangdol.roomescape.auth.web.support.Public
import com.sangdol.roomescape.auth.web.support.User
import com.sangdol.roomescape.common.dto.CurrentUserContext
import com.sangdol.roomescape.common.dto.response.CommonApiResponse
import com.sangdol.roomescape.user.web.UserContactResponse
import com.sangdol.roomescape.user.web.UserCreateRequest
import com.sangdol.roomescape.user.web.UserCreateResponse
interface UserAPI { interface UserAPI {

View File

@ -1,13 +1,13 @@
package com.sangdol.roomescape.user.web package com.sangdol.roomescape.user.web
import com.sangdol.common.types.web.CommonApiResponse
import com.sangdol.roomescape.auth.web.support.User
import com.sangdol.roomescape.common.dto.CurrentUserContext
import com.sangdol.roomescape.user.business.UserService
import com.sangdol.roomescape.user.docs.UserAPI
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.*
import com.sangdol.roomescape.auth.web.support.User
import com.sangdol.roomescape.common.dto.CurrentUserContext
import com.sangdol.roomescape.common.dto.response.CommonApiResponse
import com.sangdol.roomescape.user.business.UserService
import com.sangdol.roomescape.user.docs.UserAPI
@RestController @RestController
@RequestMapping("/users") @RequestMapping("/users")

View File

@ -1,18 +1,10 @@
package com.sangdol.roomescape.schedule package com.sangdol.roomescape.schedule
import io.kotest.assertions.assertSoftly import com.sangdol.common.types.audit.Auditor
import io.kotest.matchers.date.shouldBeBefore
import io.kotest.matchers.shouldBe
import io.kotest.matchers.shouldNotBe
import org.hamcrest.CoreMatchers.equalTo
import org.springframework.data.repository.findByIdOrNull
import org.springframework.http.HttpMethod
import com.sangdol.common.types.web.HttpStatus import com.sangdol.common.types.web.HttpStatus
import com.sangdol.roomescape.admin.infrastructure.persistence.AdminPermissionLevel import com.sangdol.roomescape.admin.infrastructure.persistence.AdminPermissionLevel
import com.sangdol.roomescape.admin.infrastructure.persistence.AdminType import com.sangdol.roomescape.admin.infrastructure.persistence.AdminType
import com.sangdol.roomescape.auth.exception.AuthErrorCode import com.sangdol.roomescape.auth.exception.AuthErrorCode
import com.sangdol.roomescape.common.dto.AuditConstant
import com.sangdol.roomescape.common.dto.OperatorInfo
import com.sangdol.roomescape.schedule.exception.ScheduleErrorCode 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
@ -21,6 +13,13 @@ import com.sangdol.roomescape.schedule.web.AdminScheduleSummaryResponse
import com.sangdol.roomescape.schedule.web.ScheduleUpdateRequest import com.sangdol.roomescape.schedule.web.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.matchers.date.shouldBeBefore
import io.kotest.matchers.shouldBe
import io.kotest.matchers.shouldNotBe
import org.hamcrest.CoreMatchers.equalTo
import org.springframework.data.repository.findByIdOrNull
import org.springframework.http.HttpMethod
import java.time.LocalDate import java.time.LocalDate
import java.time.LocalTime import java.time.LocalTime
@ -267,7 +266,7 @@ class AdminScheduleApiTest(
val schedule: ScheduleEntity = initialize("감사 이력을 남기지 않기 위해, 로그인 없이 일정을 생성한다.") { val schedule: ScheduleEntity = initialize("감사 이력을 남기지 않기 위해, 로그인 없이 일정을 생성한다.") {
dummyInitializer.createSchedule(storeId = store.id, request = ScheduleFixture.createRequest) dummyInitializer.createSchedule(storeId = store.id, request = ScheduleFixture.createRequest)
} }
val unknownOperator: OperatorInfo = AuditConstant.UNKNOWN_OPERATOR val unknownOperator: Auditor = Auditor.UNKNOWN
runTest( runTest(
token = testAuthUtil.defaultHqAdminLogin().second, token = testAuthUtil.defaultHqAdminLogin().second,