package kr.co.vividnext.sodalive.search import kr.co.vividnext.sodalive.common.ApiResponse import kr.co.vividnext.sodalive.common.SodaException import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.member.contentpreference.MemberContentPreferenceService import org.springframework.data.domain.Pageable import org.springframework.security.core.annotation.AuthenticationPrincipal import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RequestParam import org.springframework.web.bind.annotation.RestController @RestController @RequestMapping("/search") class SearchController( private val service: SearchService, private val memberContentPreferenceService: MemberContentPreferenceService ) { @GetMapping fun searchUnified( @RequestParam keyword: String, @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? ) = run { if (member == null) throw SodaException(messageKey = "common.error.bad_credentials") val preference = resolvePreference(member) ApiResponse.ok( service.searchUnified( keyword, isAdult = preference.isAdult, contentType = preference.contentType, member = member ) ) } @GetMapping("/creators") fun searchCreatorList( @RequestParam keyword: String, @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?, pageable: Pageable ) = run { if (member == null) throw SodaException(messageKey = "common.error.bad_credentials") ApiResponse.ok( service.searchCreatorList( keyword, member = member, offset = pageable.offset, limit = pageable.pageSize.toLong() ) ) } @GetMapping("/contents") fun searchContentList( @RequestParam keyword: String, @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?, pageable: Pageable ) = run { if (member == null) throw SodaException(messageKey = "common.error.bad_credentials") val preference = resolvePreference(member) ApiResponse.ok( service.searchContentList( keyword, isAdult = preference.isAdult, contentType = preference.contentType, member = member, offset = pageable.offset, limit = pageable.pageSize.toLong() ) ) } @GetMapping("/series") fun searchSeriesList( @RequestParam keyword: String, @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?, pageable: Pageable ) = run { if (member == null) throw SodaException(messageKey = "common.error.bad_credentials") val preference = resolvePreference(member) ApiResponse.ok( service.searchSeriesList( keyword, isAdult = preference.isAdult, contentType = preference.contentType, member = member, offset = pageable.offset, limit = pageable.pageSize.toLong() ) ) } private fun resolvePreference(member: Member) = memberContentPreferenceService.resolveForQuery(member = member) }