팔로잉 채널 전체보기 API 추가
This commit is contained in:
parent
ba3444fd26
commit
777f4755be
|
@ -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
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue