generated from pricelees/issue-pr-template
[#34] 회원 / 인증 도메인 재정의 #43
@ -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}" }
|
||||
|
||||
|
||||
@ -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))
|
||||
|
||||
@ -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>
|
||||
}
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -67,4 +67,8 @@ fun ReservationEntity.toReservationDetailRetrieveResponse(
|
||||
|
||||
data class ReservationCancelRequest(
|
||||
val cancelReason: String
|
||||
)
|
||||
)
|
||||
|
||||
data class MostReservedThemeIdListResponse(
|
||||
val themeIds: List<Long>
|
||||
)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user