From 777f4755bed4b7861ff3dac2c928b1225d815790 Mon Sep 17 00:00:00 2001 From: Klaus Date: Wed, 9 Aug 2023 07:48:43 +0900 Subject: [PATCH] =?UTF-8?q?=ED=8C=94=EB=A1=9C=EC=9E=89=20=EC=B1=84?= =?UTF-8?q?=EB=84=90=20=EC=A0=84=EC=B2=B4=EB=B3=B4=EA=B8=B0=20API=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GetCreatorFollowingAllListResponse.kt | 13 +++++ .../live/recommend/LiveRecommendController.kt | 11 ++++ .../live/recommend/LiveRecommendRepository.kt | 52 +++++++++++++++++++ .../live/recommend/LiveRecommendService.kt | 20 +++++++ 4 files changed, 96 insertions(+) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/GetCreatorFollowingAllListResponse.kt diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/GetCreatorFollowingAllListResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/GetCreatorFollowingAllListResponse.kt new file mode 100644 index 0000000..2ae3bc4 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/GetCreatorFollowingAllListResponse.kt @@ -0,0 +1,13 @@ +package kr.co.vividnext.sodalive.live.recommend + +data class GetCreatorFollowingAllListResponse( + val totalCount: Int, + val items: List +) + +data class GetCreatorFollowingAllListItem( + val creatorId: Long, + val nickname: String, + val profileImageUrl: String, + val isFollow: Boolean +) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendController.kt index 5400225..a7c005c 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendController.kt @@ -3,6 +3,7 @@ package kr.co.vividnext.sodalive.live.recommend 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 @@ -37,4 +38,14 @@ class LiveRecommendController(private val service: LiveRecommendService) { ApiResponse.ok(service.getFollowingChannelList(member)) } + + @GetMapping("/following/channel/all/list") + fun getFollowingAllChannelList( + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?, + pageable: Pageable + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + + ApiResponse.ok(service.getFollowingAllChannelList(member, pageable)) + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendRepository.kt index 5a7c1c5..3287f3e 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendRepository.kt @@ -182,4 +182,56 @@ class LiveRecommendRepository( .limit(limit) .fetch() } + + fun getCreatorFollowingAllListTotalCount(memberId: Long, isBlocked: (Long) -> Boolean): Int { + val where = member.role.eq(MemberRole.CREATOR) + .and(member.isActive.isTrue) + .and(creatorFollowing.isActive.isTrue) + .and(creatorFollowing.member.id.eq(memberId)) + + return queryFactory + .select(creatorFollowing.creator.id) + .from(creatorFollowing) + .innerJoin(creatorFollowing.creator, member) + .where(where) + .groupBy(member.id) + .fetch() + .asSequence() + .filter { !isBlocked(it) } + .toList() + .size + } + + fun getCreatorFollowingAllList( + memberId: Long, + offset: Long, + limit: Long, + isBlocked: (Long) -> Boolean + ): List { + val where = member.role.eq(MemberRole.CREATOR) + .and(member.isActive.isTrue) + .and(creatorFollowing.isActive.isTrue) + .and(creatorFollowing.member.id.eq(memberId)) + + return queryFactory + .select( + Projections.constructor( + GetCreatorFollowingAllListItem::class.java, + member.id, + member.nickname, + member.profileImage.prepend("/").prepend(cloudFrontHost), + Expressions.asBoolean(true) + ) + ) + .from(creatorFollowing) + .innerJoin(creatorFollowing.creator, member) + .where(where) + .groupBy(member.id) + .offset(offset) + .limit(limit) + .fetch() + .asSequence() + .filter { !isBlocked(it.creatorId) } + .toList() + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendService.kt index 279718e..a842415 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendService.kt @@ -2,6 +2,7 @@ package kr.co.vividnext.sodalive.live.recommend 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 @@ -66,4 +67,23 @@ class LiveRecommendService( return onAirFollowingChannelList + notOnAirFollowingChannelList } + + fun getFollowingAllChannelList(member: Member, pageable: Pageable): GetCreatorFollowingAllListResponse { + val totalCount = repository.getCreatorFollowingAllListTotalCount( + memberId = member.id!!, + isBlocked = { blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it) } + ) + + val items = repository.getCreatorFollowingAllList( + memberId = member.id!!, + offset = pageable.offset, + limit = pageable.pageSize.toLong(), + isBlocked = { blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it) } + ) + + return GetCreatorFollowingAllListResponse( + totalCount = totalCount, + items = items + ) + } }