diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainService.kt index 8c01c2a..0dc954e 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainService.kt @@ -104,6 +104,7 @@ class AudioContentMainService( .asSequence() .map { GetAudioContentCurationResponse( + curationId = it.id!!, title = it.title, description = it.description, contents = repository.findAudioContentByCurationId( diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/curation/AudioContentCurationController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/curation/AudioContentCurationController.kt new file mode 100644 index 0000000..3906fe8 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/curation/AudioContentCurationController.kt @@ -0,0 +1,26 @@ +package kr.co.vividnext.sodalive.content.main.curation + +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.PathVariable +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController + +@RestController +@RequestMapping("/audio-content/curation") +class AudioContentCurationController(private val service: AudioContentCurationService) { + @GetMapping("/{id}") + fun getCurationContent( + @PathVariable id: Long, + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?, + pageable: Pageable + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + + ApiResponse.ok(service.getCurationContent(id, member, pageable)) + } +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/curation/AudioContentCurationQueryRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/curation/AudioContentCurationQueryRepository.kt new file mode 100644 index 0000000..67c8cbf --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/curation/AudioContentCurationQueryRepository.kt @@ -0,0 +1,52 @@ +package kr.co.vividnext.sodalive.content.main.curation + +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.member.QMember.member +import org.springframework.beans.factory.annotation.Value +import org.springframework.stereotype.Repository + +@Repository +class AudioContentCurationQueryRepository( + private val queryFactory: JPAQueryFactory, + + @Value("\${cloud.aws.cloud-front.host}") + private val cloudFrontHost: String +) { + fun findByCurationId(curationId: Long, offset: Long, limit: Long, isAdult: Boolean): List { + var where = audioContent.isActive.isTrue + .and(audioContent.member.isNotNull) + .and(audioContent.duration.isNotNull) + .and(audioContent.member.isActive.isTrue) + .and(audioContent.curation.id.eq(curationId)) + + if (!isAdult) { + where = where.and(audioContent.isAdult.isFalse) + } + + return queryFactory + .select( + QGetAudioContentMainItem( + audioContent.id, + audioContent.coverImage.prepend("/").prepend(cloudFrontHost), + audioContent.title, + audioContent.isAdult, + member.id, + member.profileImage + .prepend("/") + .prepend(cloudFrontHost), + member.nickname + ) + ) + .from(audioContent) + .innerJoin(audioContent.member, member) + .leftJoin(audioContent.curation, QAudioContentCuration.audioContentCuration) + .where(where) + .offset(offset) + .limit(limit) + .orderBy(audioContent.id.desc()) + .fetch() + } +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/curation/AudioContentCurationService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/curation/AudioContentCurationService.kt new file mode 100644 index 0000000..0b6dffd --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/curation/AudioContentCurationService.kt @@ -0,0 +1,30 @@ +package kr.co.vividnext.sodalive.content.main.curation + +import kr.co.vividnext.sodalive.content.main.GetAudioContentMainItem +import kr.co.vividnext.sodalive.member.Member +import kr.co.vividnext.sodalive.member.block.BlockMemberRepository +import org.springframework.data.domain.Pageable +import org.springframework.stereotype.Service + +@Service +class AudioContentCurationService( + private val repository: AudioContentCurationQueryRepository, + private val blockMemberRepository: BlockMemberRepository +) { + fun getCurationContent(curationId: Long, member: Member, pageable: Pageable): List { + return repository.findByCurationId( + curationId = curationId, + offset = pageable.offset, + limit = pageable.pageSize.toLong(), + isAdult = member.auth != null + ) + .asSequence() + .filter { content -> + !blockMemberRepository.isBlocked( + blockedMemberId = member.id!!, + memberId = content.creatorId + ) + } + .toList() + } +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/curation/GetAudioContentCurationResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/curation/GetAudioContentCurationResponse.kt index 802e9e4..6a57546 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/curation/GetAudioContentCurationResponse.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/curation/GetAudioContentCurationResponse.kt @@ -3,6 +3,7 @@ package kr.co.vividnext.sodalive.content.main.curation import kr.co.vividnext.sodalive.content.main.GetAudioContentMainItem data class GetAudioContentCurationResponse( + val curationId: Long, val title: String, val description: String, val contents: List