[#34] 회원 / 인증 도메인 재정의 #43

Merged
pricelees merged 73 commits from refactor/#34 into main 2025-09-13 10:13:45 +00:00
21 changed files with 92 additions and 92 deletions
Showing only changes of commit 436418a12f - Show all commits

View File

@ -66,14 +66,14 @@ class PaymentService(
} }
@Transactional(readOnly = true) @Transactional(readOnly = true)
fun findDetailByReservationId(reservationId: Long): PaymentRetrieveResponse? { fun findDetailByReservationId(reservationId: Long): PaymentWithDetailResponse? {
log.info { "[PaymentService.findDetailByReservationId] 예약 결제 정보 조회 시작: reservationId=$reservationId" } log.info { "[PaymentService.findDetailByReservationId] 예약 결제 정보 조회 시작: reservationId=$reservationId" }
val payment: PaymentEntity? = findByReservationIdOrNull(reservationId) val payment: PaymentEntity? = findByReservationIdOrNull(reservationId)
val paymentDetail: PaymentDetailEntity? = payment?.let { findDetailByPaymentIdOrNull(it.id) } val paymentDetail: PaymentDetailEntity? = payment?.let { findDetailByPaymentIdOrNull(it.id) }
val cancelDetail: CanceledPaymentEntity? = payment?.let { findCancelByPaymentIdOrNull(it.id) } val cancelDetail: CanceledPaymentEntity? = payment?.let { findCancelByPaymentIdOrNull(it.id) }
return payment?.toRetrieveResponse( return payment?.toDetailResponse(
detail = paymentDetail?.toPaymentDetailResponse(), detail = paymentDetail?.toPaymentDetailResponse(),
cancel = cancelDetail?.toCancelDetailResponse() cancel = cancelDetail?.toCancelDetailResponse()
) )

View File

@ -27,7 +27,7 @@ data class PaymentCancelRequest(
val requestedAt: LocalDateTime = LocalDateTime.now() val requestedAt: LocalDateTime = LocalDateTime.now()
) )
data class PaymentRetrieveResponse( data class PaymentWithDetailResponse(
val orderId: String, val orderId: String,
val totalAmount: Int, val totalAmount: Int,
val method: String, val method: String,
@ -38,11 +38,11 @@ data class PaymentRetrieveResponse(
val cancel: PaymentCancelDetailResponse?, val cancel: PaymentCancelDetailResponse?,
) )
fun PaymentEntity.toRetrieveResponse( fun PaymentEntity.toDetailResponse(
detail: PaymentDetailResponse?, detail: PaymentDetailResponse?,
cancel: PaymentCancelDetailResponse? cancel: PaymentCancelDetailResponse?
): PaymentRetrieveResponse { ): PaymentWithDetailResponse {
return PaymentRetrieveResponse( return PaymentWithDetailResponse(
orderId = this.orderId, orderId = this.orderId,
totalAmount = this.totalAmount, totalAmount = this.totalAmount,
method = this.method.koreanName, method = this.method.koreanName,

View File

@ -11,9 +11,9 @@ import roomescape.common.dto.CurrentUserContext
import roomescape.common.dto.PrincipalType import roomescape.common.dto.PrincipalType
import roomescape.common.util.DateUtils import roomescape.common.util.DateUtils
import roomescape.user.business.UserService import roomescape.user.business.UserService
import roomescape.user.web.UserContactRetrieveResponse import roomescape.user.web.UserContactResponse
import roomescape.payment.business.PaymentService import roomescape.payment.business.PaymentService
import roomescape.payment.web.PaymentRetrieveResponse import roomescape.payment.web.PaymentWithDetailResponse
import roomescape.reservation.exception.ReservationErrorCode import roomescape.reservation.exception.ReservationErrorCode
import roomescape.reservation.exception.ReservationException import roomescape.reservation.exception.ReservationException
import roomescape.reservation.infrastructure.persistence.* import roomescape.reservation.infrastructure.persistence.*
@ -23,7 +23,7 @@ import roomescape.schedule.infrastructure.persistence.ScheduleStatus
import roomescape.schedule.web.ScheduleSummaryResponse import roomescape.schedule.web.ScheduleSummaryResponse
import roomescape.schedule.web.ScheduleUpdateRequest import roomescape.schedule.web.ScheduleUpdateRequest
import roomescape.theme.business.ThemeService import roomescape.theme.business.ThemeService
import roomescape.theme.web.ThemeInfoRetrieveResponse import roomescape.theme.web.ThemeInfoResponse
import java.time.LocalDate import java.time.LocalDate
import java.time.LocalDateTime import java.time.LocalDateTime
@ -91,7 +91,7 @@ class ReservationService(
} }
@Transactional(readOnly = true) @Transactional(readOnly = true)
fun findUserSummaryReservation(user: CurrentUserContext): ReservationSummaryRetrieveListResponse { fun findUserSummaryReservation(user: CurrentUserContext): ReservationSummaryListResponse {
log.info { "[ReservationService.findSummaryByMemberId] 예약 조회 시작: userId=${user.id}" } log.info { "[ReservationService.findSummaryByMemberId] 예약 조회 시작: userId=${user.id}" }
val reservations: List<ReservationEntity> = reservationRepository.findAllByUserIdAndStatusIsIn( val reservations: List<ReservationEntity> = reservationRepository.findAllByUserIdAndStatusIsIn(
@ -99,11 +99,11 @@ class ReservationService(
statuses = listOf(ReservationStatus.CONFIRMED, ReservationStatus.CANCELED) statuses = listOf(ReservationStatus.CONFIRMED, ReservationStatus.CANCELED)
) )
return ReservationSummaryRetrieveListResponse(reservations.map { return ReservationSummaryListResponse(reservations.map {
val schedule: ScheduleSummaryResponse = scheduleService.findSummaryById(it.scheduleId) val schedule: ScheduleSummaryResponse = scheduleService.findSummaryById(it.scheduleId)
val theme: ThemeInfoRetrieveResponse = themeService.findSummaryById(schedule.themeId) val theme: ThemeInfoResponse = themeService.findSummaryById(schedule.themeId)
ReservationSummaryRetrieveResponse( ReservationSummaryResponse(
id = it.id, id = it.id,
themeName = theme.name, themeName = theme.name,
date = schedule.date, date = schedule.date,
@ -116,12 +116,12 @@ class ReservationService(
} }
@Transactional(readOnly = true) @Transactional(readOnly = true)
fun findDetailById(id: Long): ReservationDetailRetrieveResponse { fun findDetailById(id: Long): ReservationDetailResponse {
log.info { "[ReservationService.findDetailById] 예약 상세 조회 시작: reservationId=${id}" } log.info { "[ReservationService.findDetailById] 예약 상세 조회 시작: reservationId=${id}" }
val reservation: ReservationEntity = findOrThrow(id) val reservation: ReservationEntity = findOrThrow(id)
val user: UserContactRetrieveResponse = userService.findContactById(reservation.userId) val user: UserContactResponse = userService.findContactById(reservation.userId)
val paymentDetail: PaymentRetrieveResponse? = paymentService.findDetailByReservationId(id) val paymentDetail: PaymentWithDetailResponse? = paymentService.findDetailByReservationId(id)
return reservation.toReservationDetailRetrieveResponse( return reservation.toReservationDetailRetrieveResponse(
user = user, user = user,

View File

@ -8,7 +8,7 @@ import roomescape.reservation.exception.ReservationException
import roomescape.reservation.web.PendingReservationCreateRequest import roomescape.reservation.web.PendingReservationCreateRequest
import roomescape.schedule.infrastructure.persistence.ScheduleStatus import roomescape.schedule.infrastructure.persistence.ScheduleStatus
import roomescape.schedule.web.ScheduleSummaryResponse import roomescape.schedule.web.ScheduleSummaryResponse
import roomescape.theme.web.ThemeInfoRetrieveResponse import roomescape.theme.web.ThemeInfoResponse
private val log: KLogger = KotlinLogging.logger {} private val log: KLogger = KotlinLogging.logger {}
@ -17,7 +17,7 @@ class ReservationValidator {
fun validateCanCreate( fun validateCanCreate(
schedule: ScheduleSummaryResponse, schedule: ScheduleSummaryResponse,
theme: ThemeInfoRetrieveResponse, theme: ThemeInfoResponse,
request: PendingReservationCreateRequest request: PendingReservationCreateRequest
) { ) {
if (schedule.status != ScheduleStatus.HOLD) { if (schedule.status != ScheduleStatus.HOLD) {

View File

@ -54,12 +54,12 @@ interface ReservationAPI {
@ApiResponses(ApiResponse(responseCode = "200", description = "성공", useReturnTypeSchema = true)) @ApiResponses(ApiResponse(responseCode = "200", description = "성공", useReturnTypeSchema = true))
fun findSummaryByMemberId( fun findSummaryByMemberId(
@CurrentUser user: CurrentUserContext, @CurrentUser user: CurrentUserContext,
): ResponseEntity<CommonApiResponse<ReservationSummaryRetrieveListResponse>> ): ResponseEntity<CommonApiResponse<ReservationSummaryListResponse>>
@UserOnly @UserOnly
@Operation(summary = "특정 예약에 대한 상세 조회", tags = ["로그인이 필요한 API"]) @Operation(summary = "특정 예약에 대한 상세 조회", tags = ["로그인이 필요한 API"])
@ApiResponses(ApiResponse(responseCode = "200", description = "성공", useReturnTypeSchema = true)) @ApiResponses(ApiResponse(responseCode = "200", description = "성공", useReturnTypeSchema = true))
fun findDetailById( fun findDetailById(
@PathVariable("id") id: Long @PathVariable("id") id: Long
): ResponseEntity<CommonApiResponse<ReservationDetailRetrieveResponse>> ): ResponseEntity<CommonApiResponse<ReservationDetailResponse>>
} }

View File

@ -56,7 +56,7 @@ class ReservationController(
@GetMapping("/reservations/summary") @GetMapping("/reservations/summary")
override fun findSummaryByMemberId( override fun findSummaryByMemberId(
@CurrentUser user: CurrentUserContext, @CurrentUser user: CurrentUserContext,
): ResponseEntity<CommonApiResponse<ReservationSummaryRetrieveListResponse>> { ): ResponseEntity<CommonApiResponse<ReservationSummaryListResponse>> {
val response = reservationService.findUserSummaryReservation(user) val response = reservationService.findUserSummaryReservation(user)
return ResponseEntity.ok(CommonApiResponse(response)) return ResponseEntity.ok(CommonApiResponse(response))
@ -65,7 +65,7 @@ class ReservationController(
@GetMapping("/reservations/{id}/detail") @GetMapping("/reservations/{id}/detail")
override fun findDetailById( override fun findDetailById(
@PathVariable("id") id: Long @PathVariable("id") id: Long
): ResponseEntity<CommonApiResponse<ReservationDetailRetrieveResponse>> { ): ResponseEntity<CommonApiResponse<ReservationDetailResponse>> {
val response = reservationService.findDetailById(id) val response = reservationService.findDetailById(id)
return ResponseEntity.ok(CommonApiResponse(response)) return ResponseEntity.ok(CommonApiResponse(response))

View File

@ -1,8 +1,8 @@
package roomescape.reservation.web package roomescape.reservation.web
import jakarta.validation.constraints.NotEmpty import jakarta.validation.constraints.NotEmpty
import roomescape.user.web.UserContactRetrieveResponse import roomescape.user.web.UserContactResponse
import roomescape.payment.web.PaymentRetrieveResponse import roomescape.payment.web.PaymentWithDetailResponse
import roomescape.reservation.infrastructure.persistence.ReservationEntity import roomescape.reservation.infrastructure.persistence.ReservationEntity
import roomescape.reservation.infrastructure.persistence.ReservationStatus import roomescape.reservation.infrastructure.persistence.ReservationStatus
import java.time.LocalDate import java.time.LocalDate
@ -34,7 +34,7 @@ data class PendingReservationCreateResponse(
val id: Long val id: Long
) )
data class ReservationSummaryRetrieveResponse( data class ReservationSummaryResponse(
val id: Long, val id: Long,
val themeName: String, val themeName: String,
val date: LocalDate, val date: LocalDate,
@ -42,22 +42,22 @@ data class ReservationSummaryRetrieveResponse(
val status: ReservationStatus val status: ReservationStatus
) )
data class ReservationSummaryRetrieveListResponse( data class ReservationSummaryListResponse(
val reservations: List<ReservationSummaryRetrieveResponse> val reservations: List<ReservationSummaryResponse>
) )
data class ReservationDetailRetrieveResponse( data class ReservationDetailResponse(
val id: Long, val id: Long,
val user: UserContactRetrieveResponse, val user: UserContactResponse,
val applicationDateTime: LocalDateTime, val applicationDateTime: LocalDateTime,
val payment: PaymentRetrieveResponse?, val payment: PaymentWithDetailResponse?,
) )
fun ReservationEntity.toReservationDetailRetrieveResponse( fun ReservationEntity.toReservationDetailRetrieveResponse(
user: UserContactRetrieveResponse, user: UserContactResponse,
payment: PaymentRetrieveResponse?, payment: PaymentWithDetailResponse?,
): ReservationDetailRetrieveResponse { ): ReservationDetailResponse {
return ReservationDetailRetrieveResponse( return ReservationDetailResponse(
id = this.id, id = this.id,
user = user, user = user,
applicationDateTime = this.createdAt, applicationDateTime = this.createdAt,

View File

@ -37,18 +37,18 @@ class ScheduleService(
} }
@Transactional(readOnly = true) @Transactional(readOnly = true)
fun findSchedules(date: LocalDate, themeId: Long): ScheduleRetrieveListResponse { fun findSchedules(date: LocalDate, themeId: Long): ScheduleListByDateResponse {
log.info { "[ScheduleService.findSchedules] 동일한 날짜와 테마인 모든 일정 조회: date=${date}, themeId=${themeId}" } log.info { "[ScheduleService.findSchedules] 동일한 날짜와 테마인 모든 일정 조회: date=${date}, themeId=${themeId}" }
return scheduleRepository.findAllByDateAndThemeId(date, themeId) return scheduleRepository.findAllByDateAndThemeId(date, themeId)
.toRetrieveListResponse() .toListResponse()
.also { .also {
log.info { "[ScheduleService.findSchedules] date=${date}, themeId=${themeId}${it.schedules.size}개 일정 조회 완료" } log.info { "[ScheduleService.findSchedules] date=${date}, themeId=${themeId}${it.schedules.size}개 일정 조회 완료" }
} }
} }
@Transactional(readOnly = true) @Transactional(readOnly = true)
fun findDetail(id: Long): ScheduleDetailRetrieveResponse { fun findDetail(id: Long): ScheduleDetailResponse {
log.info { "[ScheduleService.findDetail] 일정 상세 정보조회 시작: id=$id" } log.info { "[ScheduleService.findDetail] 일정 상세 정보조회 시작: id=$id" }
val schedule: ScheduleEntity = findOrThrow(id) val schedule: ScheduleEntity = findOrThrow(id)
@ -56,7 +56,7 @@ class ScheduleService(
val createdBy = adminService.findOperatorById(schedule.createdBy) val createdBy = adminService.findOperatorById(schedule.createdBy)
val updatedBy = adminService.findOperatorById(schedule.updatedBy) val updatedBy = adminService.findOperatorById(schedule.updatedBy)
return schedule.toDetailRetrieveResponse(createdBy, updatedBy) return schedule.toDetailResponse(createdBy, updatedBy)
.also { .also {
log.info { "[ScheduleService.findDetail] 일정 상세 조회 완료: id=$id" } log.info { "[ScheduleService.findDetail] 일정 상세 조회 완료: id=$id" }
} }

View File

@ -38,7 +38,7 @@ interface ScheduleAPI {
fun findAllTime( fun findAllTime(
@RequestParam("date") @DateTimeFormat(pattern = "yyyy-MM-dd") date: LocalDate, @RequestParam("date") @DateTimeFormat(pattern = "yyyy-MM-dd") date: LocalDate,
@RequestParam("themeId") themeId: Long @RequestParam("themeId") themeId: Long
): ResponseEntity<CommonApiResponse<ScheduleRetrieveListResponse>> ): ResponseEntity<CommonApiResponse<ScheduleListByDateResponse>>
@UserOnly @UserOnly
@Operation(summary = "일정을 Hold 상태로 변경", tags = ["로그인이 필요한 API"]) @Operation(summary = "일정을 Hold 상태로 변경", tags = ["로그인이 필요한 API"])
@ -58,7 +58,7 @@ interface ScheduleAPI {
@ApiResponses(ApiResponse(responseCode = "200", description = "감사 정보를 포함하여 일정 상세 조회", useReturnTypeSchema = true)) @ApiResponses(ApiResponse(responseCode = "200", description = "감사 정보를 포함하여 일정 상세 조회", useReturnTypeSchema = true))
fun findScheduleDetail( fun findScheduleDetail(
@PathVariable("id") id: Long @PathVariable("id") id: Long
): ResponseEntity<CommonApiResponse<ScheduleDetailRetrieveResponse>> ): ResponseEntity<CommonApiResponse<ScheduleDetailResponse>>
@AdminOnly(privilege = Privilege.CREATE) @AdminOnly(privilege = Privilege.CREATE)
@Operation(summary = "일정 생성", tags = ["관리자 로그인이 필요한 API"]) @Operation(summary = "일정 생성", tags = ["관리자 로그인이 필요한 API"])

View File

@ -26,7 +26,7 @@ class ScheduleController(
override fun findAllTime( override fun findAllTime(
@RequestParam("date") @DateTimeFormat(pattern = "yyyy-MM-dd") date: LocalDate, @RequestParam("date") @DateTimeFormat(pattern = "yyyy-MM-dd") date: LocalDate,
@RequestParam("themeId") themeId: Long @RequestParam("themeId") themeId: Long
): ResponseEntity<CommonApiResponse<ScheduleRetrieveListResponse>> { ): ResponseEntity<CommonApiResponse<ScheduleListByDateResponse>> {
val response = scheduleService.findSchedules(date, themeId) val response = scheduleService.findSchedules(date, themeId)
return ResponseEntity.ok(CommonApiResponse(response)) return ResponseEntity.ok(CommonApiResponse(response))
@ -35,7 +35,7 @@ class ScheduleController(
@GetMapping("/schedules/{id}") @GetMapping("/schedules/{id}")
override fun findScheduleDetail( override fun findScheduleDetail(
@PathVariable("id") id: Long @PathVariable("id") id: Long
): ResponseEntity<CommonApiResponse<ScheduleDetailRetrieveResponse>> { ): ResponseEntity<CommonApiResponse<ScheduleDetailResponse>> {
val response = scheduleService.findDetail(id) val response = scheduleService.findDetail(id)
return ResponseEntity.ok(CommonApiResponse(response)) return ResponseEntity.ok(CommonApiResponse(response))

View File

@ -11,18 +11,18 @@ data class AvailableThemeIdListResponse(
val themeIds: List<Long> val themeIds: List<Long>
) )
data class ScheduleRetrieveResponse( data class ScheduleByDateResponse(
val id: Long, val id: Long,
val time: LocalTime, val time: LocalTime,
val status: ScheduleStatus val status: ScheduleStatus
) )
data class ScheduleRetrieveListResponse( data class ScheduleListByDateResponse(
val schedules: List<ScheduleRetrieveResponse> val schedules: List<ScheduleByDateResponse>
) )
fun List<ScheduleEntity>.toRetrieveListResponse() = ScheduleRetrieveListResponse( fun List<ScheduleEntity>.toListResponse() = ScheduleListByDateResponse(
this.map { ScheduleRetrieveResponse(it.id, it.time, it.status) } this.map { ScheduleByDateResponse(it.id, it.time, it.status) }
) )
data class ScheduleCreateRequest( data class ScheduleCreateRequest(
@ -44,7 +44,7 @@ data class ScheduleUpdateRequest(
} }
} }
data class ScheduleDetailRetrieveResponse( data class ScheduleDetailResponse(
val id: Long, val id: Long,
val date: LocalDate, val date: LocalDate,
val time: LocalTime, val time: LocalTime,
@ -55,7 +55,7 @@ data class ScheduleDetailRetrieveResponse(
val updatedBy: OperatorInfo, val updatedBy: OperatorInfo,
) )
fun ScheduleEntity.toDetailRetrieveResponse(createdBy: OperatorInfo, updatedBy: OperatorInfo) = ScheduleDetailRetrieveResponse( fun ScheduleEntity.toDetailResponse(createdBy: OperatorInfo, updatedBy: OperatorInfo) = ScheduleDetailResponse(
id = this.id, id = this.id,
date = this.date, date = this.date,
time = this.time, time = this.time,

View File

@ -24,7 +24,7 @@ class ThemeService(
private val adminService: AdminService private val adminService: AdminService
) { ) {
@Transactional(readOnly = true) @Transactional(readOnly = true)
fun findThemesByIds(request: ThemeIdListRetrieveResponse): ThemeInfoListRetrieveResponse { fun findThemesByIds(request: ThemeIdListResponse): ThemeInfoListResponse {
log.info { "[ThemeService.findThemesByIds] 예약 페이지에서의 테마 목록 조회 시작: themeIds=${request.themeIds}" } log.info { "[ThemeService.findThemesByIds] 예약 페이지에서의 테마 목록 조회 시작: themeIds=${request.themeIds}" }
val result: MutableList<ThemeEntity> = mutableListOf() val result: MutableList<ThemeEntity> = mutableListOf()
@ -37,22 +37,22 @@ class ThemeService(
result.add(theme) result.add(theme)
} }
return result.toRetrieveListResponse().also { return result.toListResponse().also {
log.info { "[ThemeService.findThemesByIds] ${it.themes.size} / ${request.themeIds.size} 개 테마 조회 완료" } log.info { "[ThemeService.findThemesByIds] ${it.themes.size} / ${request.themeIds.size} 개 테마 조회 완료" }
} }
} }
@Transactional(readOnly = true) @Transactional(readOnly = true)
fun findThemesForReservation(): ThemeInfoListRetrieveResponse { fun findThemesForReservation(): ThemeInfoListResponse {
log.info { "[ThemeService.findThemesForReservation] 예약 페이지에서의 테마 목록 조회 시작" } log.info { "[ThemeService.findThemesForReservation] 예약 페이지에서의 테마 목록 조회 시작" }
return themeRepository.findOpenedThemes() return themeRepository.findOpenedThemes()
.toRetrieveListResponse() .toListResponse()
.also { log.info { "[ThemeService.findThemesForReservation] ${it.themes.size}개 테마 조회 완료" } } .also { log.info { "[ThemeService.findThemesForReservation] ${it.themes.size}개 테마 조회 완료" } }
} }
@Transactional(readOnly = true) @Transactional(readOnly = true)
fun findAdminThemes(): AdminThemeSummaryListRetrieveResponse { fun findAdminThemes(): AdminThemeSummaryListResponse {
log.info { "[ThemeService.findAdminThemes] 관리자 페이지에서의 테마 목록 조회 시작" } log.info { "[ThemeService.findAdminThemes] 관리자 페이지에서의 테마 목록 조회 시작" }
return themeRepository.findAll() return themeRepository.findAll()
@ -61,7 +61,7 @@ class ThemeService(
} }
@Transactional(readOnly = true) @Transactional(readOnly = true)
fun findAdminThemeDetail(id: Long): AdminThemeDetailRetrieveResponse { fun findAdminThemeDetail(id: Long): AdminThemeDetailResponse {
log.info { "[ThemeService.findAdminThemeDetail] 관리자 페이지에서의 테마 상세 정보 조회 시작: id=${id}" } log.info { "[ThemeService.findAdminThemeDetail] 관리자 페이지에서의 테마 상세 정보 조회 시작: id=${id}" }
val theme: ThemeEntity = findOrThrow(id) val theme: ThemeEntity = findOrThrow(id)
@ -74,7 +74,7 @@ class ThemeService(
} }
@Transactional(readOnly = true) @Transactional(readOnly = true)
fun findSummaryById(id: Long): ThemeInfoRetrieveResponse { fun findSummaryById(id: Long): ThemeInfoResponse {
log.info { "[ThemeService.findById] 테마 조회 시작: id=$id" } log.info { "[ThemeService.findById] 테마 조회 시작: id=$id" }
return findOrThrow(id).toSummaryResponse() return findOrThrow(id).toSummaryResponse()

View File

@ -20,12 +20,12 @@ interface ThemeAPIV2 {
@AdminOnly(privilege = Privilege.READ_SUMMARY) @AdminOnly(privilege = Privilege.READ_SUMMARY)
@Operation(summary = "모든 테마 조회", description = "관리자 페이지에서 요약된 테마 목록을 조회합니다.", tags = ["관리자 로그인이 필요한 API"]) @Operation(summary = "모든 테마 조회", description = "관리자 페이지에서 요약된 테마 목록을 조회합니다.", tags = ["관리자 로그인이 필요한 API"])
@ApiResponses(ApiResponse(responseCode = "200", description = "성공", useReturnTypeSchema = true)) @ApiResponses(ApiResponse(responseCode = "200", description = "성공", useReturnTypeSchema = true))
fun findAdminThemes(): ResponseEntity<CommonApiResponse<AdminThemeSummaryListRetrieveResponse>> fun findAdminThemes(): ResponseEntity<CommonApiResponse<AdminThemeSummaryListResponse>>
@AdminOnly(privilege = Privilege.READ_DETAIL) @AdminOnly(privilege = Privilege.READ_DETAIL)
@Operation(summary = "테마 상세 조회", description = "해당 테마의 상세 정보를 조회합니다.", tags = ["관리자 로그인이 필요한 API"]) @Operation(summary = "테마 상세 조회", description = "해당 테마의 상세 정보를 조회합니다.", tags = ["관리자 로그인이 필요한 API"])
@ApiResponses(ApiResponse(responseCode = "200", description = "성공", useReturnTypeSchema = true)) @ApiResponses(ApiResponse(responseCode = "200", description = "성공", useReturnTypeSchema = true))
fun findAdminThemeDetail(@PathVariable("id") id: Long): ResponseEntity<CommonApiResponse<AdminThemeDetailRetrieveResponse>> fun findAdminThemeDetail(@PathVariable("id") id: Long): ResponseEntity<CommonApiResponse<AdminThemeDetailResponse>>
@AdminOnly(privilege = Privilege.CREATE) @AdminOnly(privilege = Privilege.CREATE)
@Operation(summary = "테마 추가", tags = ["관리자 로그인이 필요한 API"]) @Operation(summary = "테마 추가", tags = ["관리자 로그인이 필요한 API"])
@ -48,10 +48,10 @@ interface ThemeAPIV2 {
@Public @Public
@Operation(summary = "예약 페이지에서 모든 테마 조회", description = "모든 테마를 조회합니다.") @Operation(summary = "예약 페이지에서 모든 테마 조회", description = "모든 테마를 조회합니다.")
@ApiResponses(ApiResponse(responseCode = "200", description = "성공", useReturnTypeSchema = true)) @ApiResponses(ApiResponse(responseCode = "200", description = "성공", useReturnTypeSchema = true))
fun findUserThemes(): ResponseEntity<CommonApiResponse<ThemeInfoListRetrieveResponse>> fun findUserThemes(): ResponseEntity<CommonApiResponse<ThemeInfoListResponse>>
@Public @Public
@Operation(summary = "예약 페이지에서 입력한 날짜에 가능한 테마 조회", description = "입력한 날짜에 가능한 테마를 조회합니다.") @Operation(summary = "예약 페이지에서 입력한 날짜에 가능한 테마 조회", description = "입력한 날짜에 가능한 테마를 조회합니다.")
@ApiResponses(ApiResponse(responseCode = "200", description = "성공", useReturnTypeSchema = true)) @ApiResponses(ApiResponse(responseCode = "200", description = "성공", useReturnTypeSchema = true))
fun findThemesByIds(request: ThemeIdListRetrieveResponse): ResponseEntity<CommonApiResponse<ThemeInfoListRetrieveResponse>> fun findThemesByIds(request: ThemeIdListResponse): ResponseEntity<CommonApiResponse<ThemeInfoListResponse>>
} }

View File

@ -14,29 +14,29 @@ class ThemeController(
@PostMapping("/themes/retrieve") @PostMapping("/themes/retrieve")
override fun findThemesByIds( override fun findThemesByIds(
@RequestBody request: ThemeIdListRetrieveResponse @RequestBody request: ThemeIdListResponse
): ResponseEntity<CommonApiResponse<ThemeInfoListRetrieveResponse>> { ): ResponseEntity<CommonApiResponse<ThemeInfoListResponse>> {
val response = themeService.findThemesByIds(request) val response = themeService.findThemesByIds(request)
return ResponseEntity.ok(CommonApiResponse(response)) return ResponseEntity.ok(CommonApiResponse(response))
} }
@GetMapping("/v2/themes") @GetMapping("/v2/themes")
override fun findUserThemes(): ResponseEntity<CommonApiResponse<ThemeInfoListRetrieveResponse>> { override fun findUserThemes(): ResponseEntity<CommonApiResponse<ThemeInfoListResponse>> {
val response = themeService.findThemesForReservation() val response = themeService.findThemesForReservation()
return ResponseEntity.ok(CommonApiResponse(response)) return ResponseEntity.ok(CommonApiResponse(response))
} }
@GetMapping("/admin/themes") @GetMapping("/admin/themes")
override fun findAdminThemes(): ResponseEntity<CommonApiResponse<AdminThemeSummaryListRetrieveResponse>> { override fun findAdminThemes(): ResponseEntity<CommonApiResponse<AdminThemeSummaryListResponse>> {
val response = themeService.findAdminThemes() val response = themeService.findAdminThemes()
return ResponseEntity.ok(CommonApiResponse(response)) return ResponseEntity.ok(CommonApiResponse(response))
} }
@GetMapping("/admin/themes/{id}") @GetMapping("/admin/themes/{id}")
override fun findAdminThemeDetail(@PathVariable id: Long): ResponseEntity<CommonApiResponse<AdminThemeDetailRetrieveResponse>> { override fun findAdminThemeDetail(@PathVariable id: Long): ResponseEntity<CommonApiResponse<AdminThemeDetailResponse>> {
val response = themeService.findAdminThemeDetail(id) val response = themeService.findAdminThemeDetail(id)
return ResponseEntity.ok(CommonApiResponse(response)) return ResponseEntity.ok(CommonApiResponse(response))

View File

@ -66,7 +66,7 @@ data class ThemeUpdateRequest(
} }
} }
data class AdminThemeSummaryRetrieveResponse( data class AdminThemeSummaryResponse(
val id: Long, val id: Long,
val name: String, val name: String,
val difficulty: Difficulty, val difficulty: Difficulty,
@ -74,7 +74,7 @@ data class AdminThemeSummaryRetrieveResponse(
val isOpen: Boolean val isOpen: Boolean
) )
fun ThemeEntity.toAdminThemeSummaryResponse() = AdminThemeSummaryRetrieveResponse( fun ThemeEntity.toAdminThemeSummaryResponse() = AdminThemeSummaryResponse(
id = this.id, id = this.id,
name = this.name, name = this.name,
difficulty = this.difficulty, difficulty = this.difficulty,
@ -82,15 +82,15 @@ fun ThemeEntity.toAdminThemeSummaryResponse() = AdminThemeSummaryRetrieveRespons
isOpen = this.isOpen isOpen = this.isOpen
) )
data class AdminThemeSummaryListRetrieveResponse( data class AdminThemeSummaryListResponse(
val themes: List<AdminThemeSummaryRetrieveResponse> val themes: List<AdminThemeSummaryResponse>
) )
fun List<ThemeEntity>.toAdminThemeSummaryListResponse() = AdminThemeSummaryListRetrieveResponse( fun List<ThemeEntity>.toAdminThemeSummaryListResponse() = AdminThemeSummaryListResponse(
themes = this.map { it.toAdminThemeSummaryResponse() } themes = this.map { it.toAdminThemeSummaryResponse() }
) )
data class AdminThemeDetailRetrieveResponse( data class AdminThemeDetailResponse(
val id: Long, val id: Long,
val name: String, val name: String,
val description: String, val description: String,
@ -110,7 +110,7 @@ data class AdminThemeDetailRetrieveResponse(
) )
fun ThemeEntity.toAdminThemeDetailResponse(createdBy: OperatorInfo, updatedBy: OperatorInfo) = fun ThemeEntity.toAdminThemeDetailResponse(createdBy: OperatorInfo, updatedBy: OperatorInfo) =
AdminThemeDetailRetrieveResponse( AdminThemeDetailResponse(
id = this.id, id = this.id,
name = this.name, name = this.name,
description = this.description, description = this.description,
@ -129,11 +129,11 @@ fun ThemeEntity.toAdminThemeDetailResponse(createdBy: OperatorInfo, updatedBy: O
updatedBy = updatedBy updatedBy = updatedBy
) )
data class ThemeIdListRetrieveResponse( data class ThemeIdListResponse(
val themeIds: List<Long> val themeIds: List<Long>
) )
data class ThemeInfoRetrieveResponse( data class ThemeInfoResponse(
val id: Long, val id: Long,
val name: String, val name: String,
val thumbnailUrl: String, val thumbnailUrl: String,
@ -147,7 +147,7 @@ data class ThemeInfoRetrieveResponse(
val expectedMinutesTo: Short val expectedMinutesTo: Short
) )
fun ThemeEntity.toSummaryResponse() = ThemeInfoRetrieveResponse( fun ThemeEntity.toSummaryResponse() = ThemeInfoResponse(
id = this.id, id = this.id,
name = this.name, name = this.name,
thumbnailUrl = this.thumbnailUrl, thumbnailUrl = this.thumbnailUrl,
@ -161,10 +161,10 @@ fun ThemeEntity.toSummaryResponse() = ThemeInfoRetrieveResponse(
expectedMinutesTo = this.expectedMinutesTo expectedMinutesTo = this.expectedMinutesTo
) )
data class ThemeInfoListRetrieveResponse( data class ThemeInfoListResponse(
val themes: List<ThemeInfoRetrieveResponse> val themes: List<ThemeInfoResponse>
) )
fun List<ThemeEntity>.toRetrieveListResponse() = ThemeInfoListRetrieveResponse( fun List<ThemeEntity>.toListResponse() = ThemeInfoListResponse(
themes = this.map { it.toSummaryResponse() } themes = this.map { it.toSummaryResponse() }
) )

View File

@ -13,7 +13,7 @@ import roomescape.common.dto.UserLoginCredentials
import roomescape.user.exception.UserErrorCode import roomescape.user.exception.UserErrorCode
import roomescape.user.exception.UserException import roomescape.user.exception.UserException
import roomescape.user.infrastructure.persistence.* import roomescape.user.infrastructure.persistence.*
import roomescape.user.web.UserContactRetrieveResponse import roomescape.user.web.UserContactResponse
import roomescape.user.web.UserCreateRequest import roomescape.user.web.UserCreateRequest
import roomescape.user.web.UserCreateResponse import roomescape.user.web.UserCreateResponse
import roomescape.user.web.toEntity import roomescape.user.web.toEntity
@ -56,12 +56,12 @@ class UserService(
} }
@Transactional(readOnly = true) @Transactional(readOnly = true)
fun findContactById(id: Long) : UserContactRetrieveResponse { fun findContactById(id: Long) : UserContactResponse {
log.info { "[UserService.findContactById] 회원 연락 정보 조회 시작: id=${id}" } log.info { "[UserService.findContactById] 회원 연락 정보 조회 시작: id=${id}" }
val user = findOrThrow(id) val user = findOrThrow(id)
return UserContactRetrieveResponse(user.id, user.name, user.phone) return UserContactResponse(user.id, user.name, user.phone)
.also { .also {
log.info { "[UserService.findContactById] 회원 연락 정보 조회 완료: id=${id}, name=${it.name}" } log.info { "[UserService.findContactById] 회원 연락 정보 조회 완료: id=${id}, name=${it.name}" }
} }

View File

@ -12,7 +12,7 @@ import roomescape.auth.web.support.Public
import roomescape.auth.web.support.UserOnly import roomescape.auth.web.support.UserOnly
import roomescape.common.dto.CurrentUserContext import roomescape.common.dto.CurrentUserContext
import roomescape.common.dto.response.CommonApiResponse import roomescape.common.dto.response.CommonApiResponse
import roomescape.user.web.UserContactRetrieveResponse import roomescape.user.web.UserContactResponse
import roomescape.user.web.UserCreateRequest import roomescape.user.web.UserCreateRequest
import roomescape.user.web.UserCreateResponse import roomescape.user.web.UserCreateResponse
@ -43,6 +43,6 @@ interface UserAPI {
) )
fun findContact( fun findContact(
@CurrentUser user: CurrentUserContext @CurrentUser user: CurrentUserContext
): ResponseEntity<CommonApiResponse<UserContactRetrieveResponse>> ): ResponseEntity<CommonApiResponse<UserContactResponse>>
} }

View File

@ -29,7 +29,7 @@ class UserController(
@GetMapping("/users/contact") @GetMapping("/users/contact")
override fun findContact( override fun findContact(
@CurrentUser user: CurrentUserContext @CurrentUser user: CurrentUserContext
): ResponseEntity<CommonApiResponse<UserContactRetrieveResponse>> { ): ResponseEntity<CommonApiResponse<UserContactResponse>> {
val response = userService.findContactById(user.id) val response = userService.findContactById(user.id)
return ResponseEntity.ok(CommonApiResponse(response)) return ResponseEntity.ok(CommonApiResponse(response))

View File

@ -42,7 +42,7 @@ data class UserCreateResponse(
val name: String val name: String
) )
data class UserContactRetrieveResponse( data class UserContactResponse(
val id: Long, val id: Long,
val name: String, val name: String,
val phone: String val phone: String

View File

@ -14,9 +14,9 @@ import roomescape.payment.infrastructure.persistence.CanceledPaymentEntity
import roomescape.payment.infrastructure.persistence.PaymentEntity import roomescape.payment.infrastructure.persistence.PaymentEntity
import roomescape.payment.infrastructure.persistence.PaymentRepository import roomescape.payment.infrastructure.persistence.PaymentRepository
import roomescape.payment.web.PaymentConfirmRequest import roomescape.payment.web.PaymentConfirmRequest
import roomescape.payment.web.PaymentRetrieveResponse import roomescape.payment.web.PaymentWithDetailResponse
import roomescape.payment.web.toPaymentDetailResponse import roomescape.payment.web.toPaymentDetailResponse
import roomescape.payment.web.toRetrieveResponse import roomescape.payment.web.toDetailResponse
import roomescape.reservation.infrastructure.persistence.ReservationEntity import roomescape.reservation.infrastructure.persistence.ReservationEntity
import roomescape.reservation.infrastructure.persistence.ReservationRepository import roomescape.reservation.infrastructure.persistence.ReservationRepository
import roomescape.reservation.web.PendingReservationCreateRequest import roomescape.reservation.web.PendingReservationCreateRequest
@ -171,7 +171,7 @@ class DummyInitializer(
cardDetail: CardDetail? = null, cardDetail: CardDetail? = null,
easyPayDetail: EasyPayDetail? = null, easyPayDetail: EasyPayDetail? = null,
transferDetail: TransferDetail? = null, transferDetail: TransferDetail? = null,
): PaymentRetrieveResponse { ): PaymentWithDetailResponse {
val method = if (easyPayDetail != null) { val method = if (easyPayDetail != null) {
PaymentMethod.EASY_PAY PaymentMethod.EASY_PAY
} else if (cardDetail != null) { } else if (cardDetail != null) {
@ -200,7 +200,7 @@ class DummyInitializer(
val detail = paymentWriter.createDetail(clientConfirmResponse, payment.id) val detail = paymentWriter.createDetail(clientConfirmResponse, payment.id)
return payment.toRetrieveResponse(detail = detail.toPaymentDetailResponse(), cancel = null) return payment.toDetailResponse(detail = detail.toPaymentDetailResponse(), cancel = null)
} }
fun cancelPayment( fun cancelPayment(

View File

@ -18,7 +18,7 @@ import roomescape.theme.business.MIN_PRICE
import roomescape.theme.exception.ThemeErrorCode import roomescape.theme.exception.ThemeErrorCode
import roomescape.theme.infrastructure.persistence.ThemeEntity import roomescape.theme.infrastructure.persistence.ThemeEntity
import roomescape.theme.infrastructure.persistence.ThemeRepository import roomescape.theme.infrastructure.persistence.ThemeRepository
import roomescape.theme.web.ThemeIdListRetrieveResponse import roomescape.theme.web.ThemeIdListResponse
import roomescape.theme.web.ThemeUpdateRequest import roomescape.theme.web.ThemeUpdateRequest
import roomescape.supports.* import roomescape.supports.*
import roomescape.supports.ThemeFixture.createRequest import roomescape.supports.ThemeFixture.createRequest
@ -296,7 +296,7 @@ class ThemeApiTest(
runTest( runTest(
token = authUtil.defaultUserLogin(), token = authUtil.defaultUserLogin(),
using = { using = {
body(ThemeIdListRetrieveResponse(themeIds)) body(ThemeIdListResponse(themeIds))
}, },
on = { on = {
post("/themes/retrieve") post("/themes/retrieve")
@ -322,7 +322,7 @@ class ThemeApiTest(
runTest( runTest(
token = authUtil.defaultUserLogin(), token = authUtil.defaultUserLogin(),
using = { using = {
body(ThemeIdListRetrieveResponse(themeIds)) body(ThemeIdListResponse(themeIds))
}, },
on = { on = {
post("/themes/retrieve") post("/themes/retrieve")