diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt index eacea2a..d0e30dc 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt @@ -73,6 +73,14 @@ interface AudioContentQueryRepository { isFree: Boolean = false ): List + fun findAlarmContentByTheme( + memberId: Long, + theme: List, + isAdult: Boolean = false, + offset: Long = 0, + limit: Long = 20 + ): List + fun totalCountByTheme( memberId: Long, theme: String = "", @@ -424,6 +432,60 @@ class AudioContentQueryRepositoryImpl( .fetch() } + override fun findAlarmContentByTheme( + memberId: Long, + theme: List, + isAdult: Boolean, + offset: Long, + limit: Long + ): List { + val blockMemberCondition = blockMember.member.id.eq(member.id) + .and(blockMember.isActive.isTrue) + .and(blockMember.blockedMember.id.eq(memberId)) + + val orderBy = listOf(audioContent.releaseDate.desc(), audioContent.id.desc()) + + var where = audioContent.isActive.isTrue + .and(audioContent.duration.isNotNull) + .and( + audioContent.releaseDate.isNull + .or(audioContent.releaseDate.loe(LocalDateTime.now())) + .or(audioContent.member.id.eq(memberId)) + ) + .and(blockMember.id.isNull) + + if (!isAdult) { + where = where.and(audioContent.isAdult.isFalse) + } + + if (theme.isNotEmpty()) { + where = where.and(audioContentTheme.theme.`in`(theme)) + } + + 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(audioContent) + .innerJoin(audioContent.member, member) + .innerJoin(audioContent.theme, audioContentTheme) + .leftJoin(blockMember).on(blockMemberCondition) + .where(where) + .offset(offset) + .limit(limit) + .orderBy(*orderBy.toTypedArray()) + .fetch() + } + override fun totalCountByTheme(memberId: Long, theme: String, isAdult: Boolean, contentType: ContentType): Int { var where = audioContent.isActive.isTrue .and(audioContent.duration.isNotNull) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/alarm/AudioContentMainTabAlarmController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/alarm/AudioContentMainTabAlarmController.kt index 68bae3c..23b03bd 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/alarm/AudioContentMainTabAlarmController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/alarm/AudioContentMainTabAlarmController.kt @@ -3,9 +3,11 @@ package kr.co.vividnext.sodalive.content.main.tab.alarm import kr.co.vividnext.sodalive.common.ApiResponse import kr.co.vividnext.sodalive.common.SodaException import kr.co.vividnext.sodalive.member.Member +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 @@ -19,4 +21,22 @@ class AudioContentMainTabAlarmController(private val service: AudioContentMainTa ApiResponse.ok(service.fetchData(member)) } + + @GetMapping("/all") + fun fetchAlarmContentByTheme( + @RequestParam("theme") theme: String, + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?, + pageable: Pageable + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + + ApiResponse.ok( + service.fetchAlarmContentByTheme( + theme, + member, + offset = pageable.offset, + limit = pageable.pageSize.toLong() + ) + ) + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/alarm/AudioContentMainTabAlarmService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/alarm/AudioContentMainTabAlarmService.kt index a2bf598..bac8749 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/alarm/AudioContentMainTabAlarmService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/alarm/AudioContentMainTabAlarmService.kt @@ -1,7 +1,7 @@ package kr.co.vividnext.sodalive.content.main.tab.alarm import kr.co.vividnext.sodalive.content.AudioContentRepository -import kr.co.vividnext.sodalive.content.ContentType +import kr.co.vividnext.sodalive.content.main.GetAudioContentMainItem import kr.co.vividnext.sodalive.content.main.banner.AudioContentBannerService import kr.co.vividnext.sodalive.content.main.curation.AudioContentCurationQueryRepository import kr.co.vividnext.sodalive.content.main.tab.GetContentCurationResponse @@ -32,11 +32,10 @@ class AudioContentMainTabAlarmService( ) val alarmThemeList = listOf("모닝콜", "슬립콜", "알람") - val newAlarmContentList = contentRepository.findByTheme( + val newAlarmContentList = contentRepository.findAlarmContentByTheme( memberId = memberId, - theme = alarmThemeList[0], + theme = alarmThemeList, isAdult = isAdult, - contentType = ContentType.ALL, limit = 10 ) @@ -81,4 +80,28 @@ class AudioContentMainTabAlarmService( curationList = curationList ) } + + fun fetchAlarmContentByTheme( + theme: String, + member: Member, + offset: Long, + limit: Long + ): List { + val alarmThemeList = if (theme.isNotBlank()) { + listOf(theme) + } else { + listOf("모닝콜", "슬립콜", "알람") + } + + val memberId = member.id!! + val isAdult = member.auth != null + + return contentRepository.findAlarmContentByTheme( + memberId = memberId, + theme = alarmThemeList, + isAdult = isAdult, + offset = offset, + limit = limit + ) + } }