From 34452525d48ea4976c89eafbe320f3555a0b1a47 Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 14 Feb 2025 22:00:13 +0900 Subject: [PATCH] =?UTF-8?q?=EB=AA=A8=EB=8B=9D=EC=BD=9C=20=EC=83=88?= =?UTF-8?q?=EB=A1=9C=EC=9A=B4=20=EC=BD=98=ED=85=90=EC=B8=A0=20=EC=A0=84?= =?UTF-8?q?=EC=B2=B4=EB=B3=B4=EA=B8=B0=20-=20API=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/AudioContentRepository.kt | 62 +++++++++++++++++++ .../AudioContentMainTabAlarmController.kt | 20 ++++++ .../alarm/AudioContentMainTabAlarmService.kt | 31 ++++++++-- 3 files changed, 109 insertions(+), 4 deletions(-) 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 + ) + } }