[#56] 예약 & 결제 프로세스 및 패키지 구조 재정의 #57

Merged
pricelees merged 45 commits from refactor/#56 into main 2025-10-09 09:33:29 +00:00
2 changed files with 32 additions and 3 deletions
Showing only changes of commit 7bda14984e - Show all commits

View File

@ -32,10 +32,9 @@ interface ThemeRepository : JpaRepository<ThemeEntity, Long> {
AND (s.date BETWEEN :startFrom AND :endAt) AND (s.date BETWEEN :startFrom AND :endAt)
GROUP BY GROUP BY
s.theme_id s.theme_id
ORDER BY
reservation_count desc
LIMIT :count LIMIT :count
) ranked_themes ON t.id = ranked_themes.theme_id ) ranked_themes ON t.id = ranked_themes.theme_id
ORDER BY ranked_themes.reservation_count DESC, t.id ASC
""", """,
nativeQuery = true nativeQuery = true
) )

View File

@ -4,14 +4,15 @@ import com.sangdol.common.types.web.HttpStatus
import com.sangdol.common.utils.KoreaDate import com.sangdol.common.utils.KoreaDate
import com.sangdol.roomescape.supports.* import com.sangdol.roomescape.supports.*
import com.sangdol.roomescape.theme.business.DateUtils import com.sangdol.roomescape.theme.business.DateUtils
import com.sangdol.roomescape.theme.dto.ThemeInfoResponse
import com.sangdol.roomescape.theme.exception.ThemeErrorCode import com.sangdol.roomescape.theme.exception.ThemeErrorCode
import com.sangdol.roomescape.theme.infrastructure.persistence.ThemeEntity import com.sangdol.roomescape.theme.infrastructure.persistence.ThemeEntity
import com.sangdol.roomescape.theme.infrastructure.persistence.ThemeRepository import com.sangdol.roomescape.theme.infrastructure.persistence.ThemeRepository
import com.sangdol.roomescape.theme.dto.ThemeInfoResponse
import com.sangdol.roomescape.theme.mapper.toEntity import com.sangdol.roomescape.theme.mapper.toEntity
import com.sangdol.roomescape.user.infrastructure.persistence.UserEntity import com.sangdol.roomescape.user.infrastructure.persistence.UserEntity
import io.kotest.matchers.collections.shouldContainInOrder import io.kotest.matchers.collections.shouldContainInOrder
import io.kotest.matchers.collections.shouldHaveSize import io.kotest.matchers.collections.shouldHaveSize
import io.kotest.matchers.comparables.shouldBeLessThan
import org.hamcrest.CoreMatchers.equalTo import org.hamcrest.CoreMatchers.equalTo
import org.springframework.http.HttpMethod import org.springframework.http.HttpMethod
import java.time.LocalDate import java.time.LocalDate
@ -72,6 +73,35 @@ class ThemeApiTest(
response.map { it.id }.shouldContainInOrder(expectedResult) response.map { it.id }.shouldContainInOrder(expectedResult)
} }
} }
test("예약 수가 동일한 경우 ID 오름차순으로 정렬한다.") {
val expectedSize = initialize("두 개의 테마에 각각 1개의 확정 예약 생성") {
val user = testAuthUtil.defaultUserLogin()
(1..2).map { _ ->
dummyInitializer.createConfirmReservation(
user.first,
scheduleRequest = ScheduleFixture.createRequest.copy(
date = DateUtils.getSundayOfPreviousWeek(KoreaDate.today())
)
)
}
}.size
runTest(
on = {
get("/themes/most-reserved?count=10")
},
expect = {
statusCode(HttpStatus.OK.value())
}
).also { res ->
val response: List<ThemeInfoResponse> =
ResponseParser.parseListResponse(res.extract().path("data.themes"))
response shouldHaveSize expectedSize
response[0].id shouldBeLessThan response[1].id
}
}
} }
} }