diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/content/AudioContentMainTabContentController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/content/AudioContentMainTabContentController.kt index f50efb8..3ecb4fa 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/content/AudioContentMainTabContentController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/content/AudioContentMainTabContentController.kt @@ -82,4 +82,15 @@ class AudioContentMainTabContentController(private val service: AudioContentMain ) ) } + + @GetMapping("/recommend-content-by-tag") + fun getRecommendedContentByTag( + @RequestParam tag: String, + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + ApiResponse.ok( + service.getRecommendedContentByTag(memberId = member.id!!, tag = tag) + ) + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/content/AudioContentMainTabContentService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/content/AudioContentMainTabContentService.kt index c38ad2c..c968f8e 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/content/AudioContentMainTabContentService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/content/AudioContentMainTabContentService.kt @@ -21,6 +21,7 @@ class AudioContentMainTabContentService( private val audioContentThemeRepository: AudioContentThemeQueryRepository, private val rankingService: RankingService, private val eventService: EventService, + private val tagCurationService: ContentMainTabTagCurationService, private val curationRepository: AudioContentCurationQueryRepository ) { fun fetchData( @@ -87,6 +88,18 @@ class AudioContentMainTabContentService( emptyList() } + val tagList = if (isAdult) { + tagCurationService.getTagList(isAdult = isAdult) + } else { + emptyList() + } + + val tagCurationContentList = if (tagList.isNotEmpty()) { + tagCurationService.getTagCurationContentList(memberId = memberId, tag = tagList[0]) + } else { + emptyList() + } + val curationList = curationRepository.findByContentMainTabId(tabId = tabId, isAdult = isAdult) .map { GetContentCurationResponse( @@ -108,6 +121,8 @@ class AudioContentMainTabContentService( contentRankCreatorList = contentRankCreatorList, salesCountRankContentList = salesCountRankContentList, eventBannerList = eventBannerList, + tagList = tagList, + tagCurationContentList = tagCurationContentList, curationList = curationList ) } @@ -156,4 +171,8 @@ class AudioContentMainTabContentService( isAdult = isAdult ) } + + fun getRecommendedContentByTag(memberId: Long, tag: String): List { + return tagCurationService.getTagCurationContentList(memberId = memberId, tag = tag) + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/content/ContentMainTabTagCurationRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/content/ContentMainTabTagCurationRepository.kt new file mode 100644 index 0000000..4adc07e --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/content/ContentMainTabTagCurationRepository.kt @@ -0,0 +1,70 @@ +package kr.co.vividnext.sodalive.content.main.tab.content + +import com.querydsl.jpa.impl.JPAQueryFactory +import kr.co.vividnext.sodalive.content.QAudioContent.audioContent +import kr.co.vividnext.sodalive.content.main.GetAudioContentMainItem +import kr.co.vividnext.sodalive.content.main.QGetAudioContentMainItem +import kr.co.vividnext.sodalive.content.main.curation.tag.QContentHashTagCuration.contentHashTagCuration +import kr.co.vividnext.sodalive.content.main.curation.tag.QContentHashTagCurationItem.contentHashTagCurationItem +import kr.co.vividnext.sodalive.member.QMember.member +import kr.co.vividnext.sodalive.member.block.QBlockMember.blockMember +import org.springframework.beans.factory.annotation.Value +import org.springframework.stereotype.Repository + +@Repository +class ContentMainTabTagCurationRepository( + private val queryFactory: JPAQueryFactory, + + @Value("\${cloud.aws.cloud-front.host}") + private val imageHost: String +) { + fun getTagList(isAdult: Boolean): List { + var where = contentHashTagCuration.isActive.isTrue + + if (!isAdult) { + where = where.and(contentHashTagCuration.isAdult.isFalse) + } + + return queryFactory + .select(contentHashTagCuration.tag) + .from(contentHashTagCuration) + .where(where) + .orderBy(contentHashTagCuration.orders.asc()) + .fetch() + } + + fun getTagCurationContentList(memberId: Long, tag: String): List { + val blockMemberCondition = blockMember.member.id.eq(member.id) + .and(blockMember.isActive.isTrue) + .and(blockMember.blockedMember.id.eq(memberId)) + + val where = audioContent.isActive.isTrue + .and(audioContent.duration.isNotNull) + .and(audioContent.limited.isNull) + .and(blockMember.id.isNull) + .and(contentHashTagCurationItem.isActive.isTrue) + .and(contentHashTagCuration.tag.eq(tag)) + + return queryFactory + .select( + QGetAudioContentMainItem( + audioContent.id, + audioContent.coverImage.prepend("/").prepend(imageHost), + audioContent.title, + member.id, + member.profileImage.prepend("/").prepend(imageHost), + member.nickname, + audioContent.price, + audioContent.duration + ) + ) + .from(contentHashTagCurationItem) + .innerJoin(contentHashTagCurationItem.curation, contentHashTagCuration) + .innerJoin(contentHashTagCurationItem.content, audioContent) + .innerJoin(audioContent.member, member) + .leftJoin(blockMember).on(blockMemberCondition) + .where(where) + .orderBy(contentHashTagCurationItem.orders.asc()) + .fetch() + } +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/content/ContentMainTabTagCurationService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/content/ContentMainTabTagCurationService.kt new file mode 100644 index 0000000..f95134d --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/content/ContentMainTabTagCurationService.kt @@ -0,0 +1,15 @@ +package kr.co.vividnext.sodalive.content.main.tab.content + +import kr.co.vividnext.sodalive.content.main.GetAudioContentMainItem +import org.springframework.stereotype.Service + +@Service +class ContentMainTabTagCurationService(private val repository: ContentMainTabTagCurationRepository) { + fun getTagList(isAdult: Boolean): List { + return repository.getTagList(isAdult = isAdult) + } + + fun getTagCurationContentList(memberId: Long, tag: String): List { + return repository.getTagCurationContentList(memberId = memberId, tag = tag) + } +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/content/GetContentMainTabContentResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/content/GetContentMainTabContentResponse.kt index 7451491..da16051 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/content/GetContentMainTabContentResponse.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/content/GetContentMainTabContentResponse.kt @@ -17,5 +17,7 @@ data class GetContentMainTabContentResponse( val contentRankCreatorList: List, val salesCountRankContentList: List, val eventBannerList: GetEventResponse, + val tagList: List, + val tagCurationContentList: List, val curationList: List )