팔로잉 채널 전체보기 API 추가

This commit is contained in:
Klaus 2023-08-09 07:48:43 +09:00
parent ba3444fd26
commit 777f4755be
4 changed files with 96 additions and 0 deletions

View File

@ -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
)

View File

@ -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))
}
}

View File

@ -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<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()
}
}

View File

@ -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
)
}
}