Compare commits

..

No commits in common. "ba3444fd26de0b983a474d7cc727118f43edd6a8" and "705bf0b6b24dd8c342959f3129ee88ab81286971" have entirely different histories.

4 changed files with 9 additions and 143 deletions

View File

@ -5,13 +5,11 @@ import kr.co.vividnext.sodalive.common.SodaException
import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.member.Member
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.RestController import org.springframework.web.bind.annotation.RestController
@RestController @RestController
@RequestMapping("/live/recommend")
class LiveRecommendController(private val service: LiveRecommendService) { class LiveRecommendController(private val service: LiveRecommendService) {
@GetMapping @GetMapping("/live/recommend")
fun getRecommendLive( fun getRecommendLive(
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run { ) = run {
@ -20,7 +18,7 @@ class LiveRecommendController(private val service: LiveRecommendService) {
ApiResponse.ok(service.getRecommendLive(member)) ApiResponse.ok(service.getRecommendLive(member))
} }
@GetMapping("/channel") @GetMapping("/live/recommend/channel")
fun getRecommendChannelList( fun getRecommendChannelList(
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run { ) = run {
@ -28,13 +26,4 @@ class LiveRecommendController(private val service: LiveRecommendService) {
ApiResponse.ok(service.getRecommendChannelList(member)) ApiResponse.ok(service.getRecommendChannelList(member))
} }
@GetMapping("/following/channel/list")
fun getFollowingChannelList(
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
ApiResponse.ok(service.getFollowingChannelList(member))
}
} }

View File

@ -7,7 +7,6 @@ import kr.co.vividnext.sodalive.live.recommend.QRecommendLiveCreatorBanner.recom
import kr.co.vividnext.sodalive.live.room.QLiveRoom.liveRoom import kr.co.vividnext.sodalive.live.room.QLiveRoom.liveRoom
import kr.co.vividnext.sodalive.member.MemberRole import kr.co.vividnext.sodalive.member.MemberRole
import kr.co.vividnext.sodalive.member.QMember.member import kr.co.vividnext.sodalive.member.QMember.member
import kr.co.vividnext.sodalive.member.following.QCreatorFollowing.creatorFollowing
import org.springframework.beans.factory.annotation.Value import org.springframework.beans.factory.annotation.Value
import org.springframework.stereotype.Repository import org.springframework.stereotype.Repository
import java.time.LocalDateTime import java.time.LocalDateTime
@ -45,7 +44,6 @@ class LiveRecommendRepository(
fun getOnAirRecommendChannelList( fun getOnAirRecommendChannelList(
memberId: Long, memberId: Long,
isBlocked: (Long) -> Boolean,
isAdult: Boolean isAdult: Boolean
): List<GetRecommendChannelResponse> { ): List<GetRecommendChannelResponse> {
var where = member.role.eq(MemberRole.CREATOR) var where = member.role.eq(MemberRole.CREATOR)
@ -77,16 +75,12 @@ class LiveRecommendRepository(
.orderBy(Expressions.numberTemplate(Double::class.java, "function('rand')").asc()) .orderBy(Expressions.numberTemplate(Double::class.java, "function('rand')").asc())
.limit(20) .limit(20)
.fetch() .fetch()
.asSequence()
.filter { !isBlocked(it.creatorId) }
.toList()
} }
fun getRecommendChannelList( fun getRecommendChannelList(
memberId: Long, memberId: Long,
withOutCreatorList: List<Long>, withOutCreatorList: List<Long>,
limit: Long, limit: Long
isBlocked: (Long) -> Boolean
): List<GetRecommendChannelResponse> { ): List<GetRecommendChannelResponse> {
val where = member.role.eq(MemberRole.CREATOR) val where = member.role.eq(MemberRole.CREATOR)
.and(member.isActive.isTrue) .and(member.isActive.isTrue)
@ -107,79 +101,4 @@ class LiveRecommendRepository(
.limit(limit) .limit(limit)
.fetch() .fetch()
} }
fun getOnAirFollowingChannelList(
memberId: Long,
isBlocked: (Long) -> Boolean,
isAdult: Boolean
): List<GetRecommendChannelResponse> {
var where = member.role.eq(MemberRole.CREATOR)
.and(member.isActive.isTrue)
if (!isAdult) {
where = where.and(liveRoom.isAdult.isFalse)
}
return queryFactory
.select(
Projections.constructor(
GetRecommendChannelResponse::class.java,
member.id,
member.nickname,
member.profileImage.prepend("/").prepend(cloudFrontHost),
Expressions.asBoolean(true)
)
)
.from(liveRoom, creatorFollowing)
.rightJoin(liveRoom.member, member)
.innerJoin(creatorFollowing.creator, member)
.where(
where
.and(liveRoom.member.id.eq(creatorFollowing.creator.id))
.and(creatorFollowing.isActive.isTrue)
.and(creatorFollowing.member.id.eq(memberId))
.and(liveRoom.isActive.isTrue)
.and(liveRoom.channelName.isNotNull)
.and(liveRoom.channelName.isNotEmpty)
)
.groupBy(member.id)
.orderBy(Expressions.numberTemplate(Double::class.java, "function('rand')").asc())
.limit(20)
.fetch()
.asSequence()
.filter { !isBlocked(it.creatorId) }
.toList()
}
fun getFollowingChannelList(
memberId: Long,
withOutCreatorList: List<Long>,
limit: Long,
isBlocked: (Long) -> Boolean
): List<GetRecommendChannelResponse> {
val where = member.role.eq(MemberRole.CREATOR)
.and(member.isActive.isTrue)
return queryFactory
.select(
Projections.constructor(
GetRecommendChannelResponse::class.java,
member.id,
member.nickname,
member.profileImage.prepend("/").prepend(cloudFrontHost),
Expressions.asBoolean(false)
)
)
.from(creatorFollowing)
.innerJoin(creatorFollowing.creator, member)
.where(
where
.and(member.id.notIn(withOutCreatorList))
.and(creatorFollowing.isActive.isTrue)
.and(creatorFollowing.member.id.eq(memberId))
)
.orderBy(Expressions.numberTemplate(Double::class.java, "function('rand')").asc())
.limit(limit)
.fetch()
}
} }

View File

@ -1,14 +1,10 @@
package kr.co.vividnext.sodalive.live.recommend 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 org.springframework.stereotype.Service import org.springframework.stereotype.Service
@Service @Service
class LiveRecommendService( class LiveRecommendService(private val repository: LiveRecommendRepository) {
private val repository: LiveRecommendRepository,
private val blockMemberRepository: BlockMemberRepository
) {
fun getRecommendLive(member: Member): List<GetRecommendLiveResponse> { fun getRecommendLive(member: Member): List<GetRecommendLiveResponse> {
return repository.getRecommendLive( return repository.getRecommendLive(
@ -18,11 +14,7 @@ class LiveRecommendService(
} }
fun getRecommendChannelList(member: Member): List<GetRecommendChannelResponse> { fun getRecommendChannelList(member: Member): List<GetRecommendChannelResponse> {
val onAirChannelList = repository.getOnAirRecommendChannelList( val onAirChannelList = repository.getOnAirRecommendChannelList(member.id!!, isAdult = member.auth != null)
member.id!!,
isBlocked = { blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it) },
isAdult = member.auth != null
)
if (onAirChannelList.size >= 20) { if (onAirChannelList.size >= 20) {
return onAirChannelList return onAirChannelList
@ -35,35 +27,9 @@ class LiveRecommendService(
val notOnAirCreatorList = repository.getRecommendChannelList( val notOnAirCreatorList = repository.getRecommendChannelList(
member.id!!, member.id!!,
withOutCreatorList = onAirCreatorIdList, withOutCreatorList = onAirCreatorIdList,
limit = (20 - onAirChannelList.size).toLong(), limit = (20 - onAirChannelList.size).toLong()
isBlocked = { blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it) }
) )
return onAirChannelList + notOnAirCreatorList return onAirChannelList + notOnAirCreatorList
} }
fun getFollowingChannelList(member: Member): List<GetRecommendChannelResponse> {
val onAirFollowingChannelList = repository.getOnAirFollowingChannelList(
memberId = member.id!!,
isBlocked = { blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it) },
isAdult = member.auth != null
)
if (onAirFollowingChannelList.size >= 20) {
return onAirFollowingChannelList
}
val onAirCreatorIdList = onAirFollowingChannelList.asSequence()
.map { it.creatorId }
.toList()
val notOnAirFollowingChannelList = repository.getFollowingChannelList(
memberId = member.id!!,
withOutCreatorList = onAirCreatorIdList,
limit = (20 - onAirCreatorIdList.size).toLong(),
isBlocked = { blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it) }
)
return onAirFollowingChannelList + notOnAirFollowingChannelList
}
} }

View File

@ -115,13 +115,9 @@ class LiveRoomService(
isAdult = member.auth != null isAdult = member.auth != null
) )
.asSequence() .asSequence()
.filter { !blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it.member!!.id!!) }
.map { .map {
val roomInfo = roomInfoRepository.findByIdOrNull(it.id!!) val roomInfo = roomInfoRepository.findByIdOrNull(it.id!!)
val reservations = it.reservations
.filter { reservation -> reservation.member!!.id!! == member.id!! && reservation.isActive }
val beginDateTime = it.beginDateTime val beginDateTime = it.beginDateTime
.atZone(ZoneId.of("UTC")) .atZone(ZoneId.of("UTC"))
.withZoneSameInstant(ZoneId.of(timezone)) .withZoneSameInstant(ZoneId.of(timezone))
@ -142,17 +138,13 @@ class LiveRoomService(
channelName = it.channelName, channelName = it.channelName,
managerNickname = it.member!!.nickname, managerNickname = it.member!!.nickname,
managerId = it.member!!.id!!, managerId = it.member!!.id!!,
tags = it.tags tags = listOf(),
.asSequence()
.filter { tag -> tag.tag.isActive }
.map { tag -> tag.tag.tag }
.toList(),
coverImageUrl = if (it.coverImage!!.startsWith("https://")) { coverImageUrl = if (it.coverImage!!.startsWith("https://")) {
it.coverImage!! it.coverImage!!
} else { } else {
"$cloudFrontHost/${it.coverImage!!}" "$cloudFrontHost/${it.coverImage!!}"
}, },
isReservation = reservations.isNotEmpty(), isReservation = false,
isPrivateRoom = it.type == LiveRoomType.PRIVATE isPrivateRoom = it.type == LiveRoomType.PRIVATE
) )
} }
@ -750,7 +742,7 @@ class LiveRoomService(
isSpeaker = isSpeaker, isSpeaker = isSpeaker,
isManager = isManager, isManager = isManager,
isFollowing = isFollowing, isFollowing = isFollowing,
isBlock = blockMemberRepository.isBlocked(blockedMemberId = userResponse.id, memberId = memberResponse.id) isBlock = false
) )
} }