팔로잉 채널 전체보기 API 추가
This commit is contained in:
		| @@ -0,0 +1,13 @@ | |||||||
|  | package kr.co.vividnext.sodalive.live.recommend | ||||||
|  |  | ||||||
|  | data class GetCreatorFollowingAllListResponse( | ||||||
|  |     val totalCount: Int, | ||||||
|  |     val items: List<GetCreatorFollowingAllListItem> | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | data class GetCreatorFollowingAllListItem( | ||||||
|  |     val creatorId: Long, | ||||||
|  |     val nickname: String, | ||||||
|  |     val profileImageUrl: String, | ||||||
|  |     val isFollow: Boolean | ||||||
|  | ) | ||||||
| @@ -3,6 +3,7 @@ package kr.co.vividnext.sodalive.live.recommend | |||||||
| import kr.co.vividnext.sodalive.common.ApiResponse | import kr.co.vividnext.sodalive.common.ApiResponse | ||||||
| import kr.co.vividnext.sodalive.common.SodaException | import kr.co.vividnext.sodalive.common.SodaException | ||||||
| import kr.co.vividnext.sodalive.member.Member | import kr.co.vividnext.sodalive.member.Member | ||||||
|  | import org.springframework.data.domain.Pageable | ||||||
| import org.springframework.security.core.annotation.AuthenticationPrincipal | import org.springframework.security.core.annotation.AuthenticationPrincipal | ||||||
| import org.springframework.web.bind.annotation.GetMapping | import org.springframework.web.bind.annotation.GetMapping | ||||||
| import org.springframework.web.bind.annotation.RequestMapping | import org.springframework.web.bind.annotation.RequestMapping | ||||||
| @@ -37,4 +38,14 @@ class LiveRecommendController(private val service: LiveRecommendService) { | |||||||
|  |  | ||||||
|         ApiResponse.ok(service.getFollowingChannelList(member)) |         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)) | ||||||
|  |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -182,4 +182,56 @@ class LiveRecommendRepository( | |||||||
|             .limit(limit) |             .limit(limit) | ||||||
|             .fetch() |             .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<GetCreatorFollowingAllListItem> { | ||||||
|  |         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() | ||||||
|  |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -2,6 +2,7 @@ package kr.co.vividnext.sodalive.live.recommend | |||||||
|  |  | ||||||
| import kr.co.vividnext.sodalive.member.Member | import kr.co.vividnext.sodalive.member.Member | ||||||
| import kr.co.vividnext.sodalive.member.block.BlockMemberRepository | import kr.co.vividnext.sodalive.member.block.BlockMemberRepository | ||||||
|  | import org.springframework.data.domain.Pageable | ||||||
| import org.springframework.stereotype.Service | import org.springframework.stereotype.Service | ||||||
|  |  | ||||||
| @Service | @Service | ||||||
| @@ -66,4 +67,23 @@ class LiveRecommendService( | |||||||
|  |  | ||||||
|         return onAirFollowingChannelList + notOnAirFollowingChannelList |         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 | ||||||
|  |         ) | ||||||
|  |     } | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user