From 22a79c0be41ba34900609032bd02410efa119d4d Mon Sep 17 00:00:00 2001 From: Klaus Date: Tue, 26 Sep 2023 11:54:51 +0900 Subject: [PATCH] =?UTF-8?q?=EC=BD=98=ED=85=90=EC=B8=A0=20=ED=81=90?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=85=98=20=EC=A0=84=EC=B2=B4=EB=B3=B4?= =?UTF-8?q?=EA=B8=B0=20API=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/main/AudioContentMainService.kt | 1 + .../AudioContentCurationController.kt | 26 ++++++++++ .../AudioContentCurationQueryRepository.kt | 52 +++++++++++++++++++ .../curation/AudioContentCurationService.kt | 30 +++++++++++ .../GetAudioContentCurationResponse.kt | 1 + 5 files changed, 110 insertions(+) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/content/main/curation/AudioContentCurationController.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/content/main/curation/AudioContentCurationQueryRepository.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/content/main/curation/AudioContentCurationService.kt 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