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

Merged
pricelees merged 73 commits from refactor/#34 into main 2025-09-13 10:13:45 +00:00
5 changed files with 61 additions and 1 deletions
Showing only changes of commit 6eecd145cc - Show all commits

View File

@ -9,6 +9,7 @@ import org.springframework.transaction.annotation.Transactional
import roomescape.common.config.next
import roomescape.common.dto.CurrentUserContext
import roomescape.common.dto.PrincipalType
import roomescape.common.util.DateUtils
import roomescape.member.business.UserService
import roomescape.member.web.UserContactRetrieveResponse
import roomescape.payment.business.PaymentService
@ -23,6 +24,7 @@ import roomescape.schedule.web.ScheduleSummaryResponse
import roomescape.schedule.web.ScheduleUpdateRequest
import roomescape.theme.business.ThemeService
import roomescape.theme.web.ThemeInfoRetrieveResponse
import java.time.LocalDate
import java.time.LocalDateTime
private val log: KLogger = KotlinLogging.logger {}
@ -126,6 +128,23 @@ class ReservationService(
}
}
@Transactional(readOnly = true)
fun findMostReservedThemeIds(count: Int): MostReservedThemeIdListResponse {
log.info { "[ReservationService.findMostReservedThemeIds] 인기 테마 조회 시작: count=$count" }
val previousWeekSunday = DateUtils.getSundayOfPreviousWeek(LocalDate.now())
val previousWeekSaturday = previousWeekSunday.plusDays(6)
val themeIds: List<Long> = reservationRepository.findMostReservedThemeIds(
dateFrom = previousWeekSunday,
dateTo = previousWeekSaturday,
count = count
)
return MostReservedThemeIdListResponse(themeIds = themeIds).also {
log.info { "[ReservationService.findMostReservedThemeIds] 인기 테마 조회 완료: count=${it.themeIds.size}" }
}
}
private fun findOrThrow(id: Long): ReservationEntity {
log.info { "[ReservationService.findOrThrow] 예약 조회 시작: reservationId=${id}" }

View File

@ -7,8 +7,10 @@ import jakarta.validation.Valid
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestParam
import roomescape.auth.web.support.Authenticated
import roomescape.auth.web.support.CurrentUser
import roomescape.auth.web.support.Public
import roomescape.auth.web.support.UserOnly
import roomescape.common.dto.CurrentUserContext
import roomescape.common.dto.response.CommonApiResponse
@ -16,6 +18,13 @@ import roomescape.reservation.web.*
interface ReservationAPI {
@Public
@Operation(summary = "결제 대기 예약 저장", tags = ["로그인이 필요한 API"])
@ApiResponses(ApiResponse(responseCode = "200", description = "성공", useReturnTypeSchema = true))
fun findMostReservedThemeIds(
@RequestParam count: Int
): ResponseEntity<CommonApiResponse<MostReservedThemeIdListResponse>>
@UserOnly
@Operation(summary = "결제 대기 예약 저장", tags = ["로그인이 필요한 API"])
@ApiResponses(ApiResponse(responseCode = "200", description = "성공", useReturnTypeSchema = true))

View File

@ -1,8 +1,27 @@
package roomescape.reservation.infrastructure.persistence
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.data.jpa.repository.Query
import org.springframework.data.repository.query.Param
import java.time.LocalDate
interface ReservationRepository : JpaRepository<ReservationEntity, Long> {
fun findAllByUserId(userId: Long): List<ReservationEntity>
@Query("""
SELECT s.themeId
FROM ReservationEntity r
JOIN ScheduleEntity s ON s._id = r.scheduleId
WHERE r.status = roomescape.reservation.infrastructure.persistence.ReservationStatus.CONFIRMED
AND s.date BETWEEN :dateFrom AND :dateTo
GROUP BY s.themeId
ORDER BY count(r) DESC
LIMIT :count
""")
fun findMostReservedThemeIds(
@Param("dateFrom") dateFrom: LocalDate,
@Param("dateTo") dateTo: LocalDate,
@Param("count") count: Int
): List<Long>
}

View File

@ -14,6 +14,15 @@ class ReservationController(
private val reservationService: ReservationService
) : ReservationAPI {
@GetMapping("/reservations/popular-themes")
override fun findMostReservedThemeIds(
@RequestParam count: Int
): ResponseEntity<CommonApiResponse<MostReservedThemeIdListResponse>> {
val response = reservationService.findMostReservedThemeIds(count)
return ResponseEntity.ok(CommonApiResponse(response))
}
@PostMapping("/reservations/pending")
override fun createPendingReservation(
@CurrentUser user: CurrentUserContext,

View File

@ -67,4 +67,8 @@ fun ReservationEntity.toReservationDetailRetrieveResponse(
data class ReservationCancelRequest(
val cancelReason: String
)
)
data class MostReservedThemeIdListResponse(
val themeIds: List<Long>
)