From 13088f53a6bd801dbae5dd01b9b158efc656f869 Mon Sep 17 00:00:00 2001 From: Klaus Date: Sun, 10 Dec 2023 19:07:51 +0900 Subject: [PATCH] =?UTF-8?q?=EC=BD=98=ED=85=90=EC=B8=A0=20=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20-=20=EB=A9=94=EC=9D=B8=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20=EC=84=B9=EC=85=98=EB=B3=84=20API=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/AudioContentRepository.kt | 18 ++++++ .../main/AudioContentMainController.kt | 61 +++++++++++++++++++ .../content/main/AudioContentMainService.kt | 30 +++++++++ 3 files changed, 109 insertions(+) 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 94c9ffc..f609302 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt @@ -94,6 +94,8 @@ interface AudioContentQueryRepository { limit: Long = 12, sortType: String = "매출" ): List + + fun getAudioContentCurationList(isAdult: Boolean, offset: Long, limit: Long): List } @Repository @@ -544,4 +546,20 @@ class AudioContentQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) .limit(limit) .fetch() } + + override fun getAudioContentCurationList(isAdult: Boolean, offset: Long, limit: Long): List { + var where = audioContentCuration.isActive.isTrue + + if (!isAdult) { + where = where.and(audioContentCuration.isAdult.isFalse) + } + + return queryFactory + .selectFrom(audioContentCuration) + .where(where) + .offset(offset) + .limit(limit) + .orderBy(audioContentCuration.orders.asc()) + .fetch() + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainController.kt index 9c51e43..4a6ea13 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainController.kt @@ -2,6 +2,7 @@ package kr.co.vividnext.sodalive.content.main import kr.co.vividnext.sodalive.common.ApiResponse import kr.co.vividnext.sodalive.common.SodaException +import kr.co.vividnext.sodalive.content.order.OrderService import kr.co.vividnext.sodalive.member.Member import org.springframework.data.domain.Pageable import org.springframework.security.core.annotation.AuthenticationPrincipal @@ -14,6 +15,7 @@ import org.springframework.web.bind.annotation.RestController @RequestMapping("/audio-content/main") class AudioContentMainController( private val service: AudioContentMainService, + private val orderService: OrderService, private val manageService: AudioContentMainManageService ) { @@ -26,6 +28,48 @@ class AudioContentMainController( ApiResponse.ok(manageService.getMain(member)) } + @GetMapping("/new-content-upload-creator") + fun newContentUploadCreatorList( + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + + ApiResponse.ok( + service.getNewContentUploadCreatorList( + memberId = member.id!!, + isAdult = member.auth != null + ) + ) + } + + @GetMapping("/banner-list") + fun getMainBannerList( + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + + ApiResponse.ok( + service.getAudioContentMainBannerList( + memberId = member.id!!, + isAdult = member.auth != null + ) + ) + } + + @GetMapping("/order-list") + fun getMainOrderList( + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + + ApiResponse.ok( + orderService.getAudioContentMainOrderList( + memberId = member.id!!, + limit = 20 + ) + ) + } + @GetMapping("/new") fun getNewContentByTheme( @RequestParam("theme") theme: String, @@ -56,4 +100,21 @@ class AudioContentMainController( ApiResponse.ok(service.getNewContentFor2WeeksByTheme(theme, member, pageable)) } + + @GetMapping("/curation-list") + fun getCurationList( + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?, + pageable: Pageable + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + + ApiResponse.ok( + service.getAudioContentCurationListWithPaging( + memberId = member.id!!, + isAdult = member.auth != null, + offset = pageable.offset, + limit = pageable.pageSize.toLong() + ) + ) + } } 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 50ca1ff..96d4b75 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 @@ -29,6 +29,7 @@ class AudioContentMainService( return audioContentThemeRepository.getActiveThemeOfContent(isAdult = isAdult) } + @Transactional(readOnly = true) fun getNewContentByTheme(theme: String, member: Member, pageable: Pageable): List { return repository.findByTheme( cloudfrontHost = imageHost, @@ -42,6 +43,7 @@ class AudioContentMainService( .toList() } + @Transactional(readOnly = true) fun getNewContentFor2WeeksByTheme(theme: String, member: Member, pageable: Pageable): GetNewContentAllResponse { val totalCount = repository.totalCountNewContentFor2Weeks(theme, isAdult = member.auth != null) val items = repository.findByThemeFor2Weeks( @@ -141,4 +143,32 @@ class AudioContentMainService( } .filter { it.contents.isNotEmpty() } .toList() + + @Transactional(readOnly = true) + @Cacheable( + cacheNames = ["default"], + key = "'getAudioContentCurationListWithPaging:' + #memberId + ':' + #isAdult + ':' + #offset + ':' + #limit" + ) + fun getAudioContentCurationListWithPaging(memberId: Long, isAdult: Boolean, offset: Long, limit: Long) = + repository.getAudioContentCurationList(isAdult = isAdult, offset = offset, limit = limit) + .asSequence() + .map { + GetAudioContentCurationResponse( + curationId = it.id!!, + title = it.title, + description = it.description, + contents = repository.findAudioContentByCurationId( + curationId = it.id!!, + cloudfrontHost = imageHost, + isAdult = isAdult + ) + .asSequence() + .filter { content -> + !blockMemberRepository.isBlocked(blockedMemberId = memberId, memberId = content.creatorId) + } + .toList() + ) + } + .filter { it.contents.isNotEmpty() } + .toList() }