Compare commits
2 Commits
705bf0b6b2
...
ba3444fd26
Author | SHA1 | Date |
---|---|---|
|
ba3444fd26 | |
|
e9723d37ba |
|
@ -5,11 +5,13 @@ 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("/live/recommend")
|
@GetMapping
|
||||||
fun getRecommendLive(
|
fun getRecommendLive(
|
||||||
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
|
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
|
||||||
) = run {
|
) = run {
|
||||||
|
@ -18,7 +20,7 @@ class LiveRecommendController(private val service: LiveRecommendService) {
|
||||||
ApiResponse.ok(service.getRecommendLive(member))
|
ApiResponse.ok(service.getRecommendLive(member))
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/live/recommend/channel")
|
@GetMapping("/channel")
|
||||||
fun getRecommendChannelList(
|
fun getRecommendChannelList(
|
||||||
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
|
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
|
||||||
) = run {
|
) = run {
|
||||||
|
@ -26,4 +28,13 @@ 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))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,7 @@ 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
|
||||||
|
@ -44,6 +45,7 @@ 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)
|
||||||
|
@ -75,12 +77,16 @@ 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)
|
||||||
|
@ -101,4 +107,79 @@ 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()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,14 @@
|
||||||
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(private val repository: LiveRecommendRepository) {
|
class LiveRecommendService(
|
||||||
|
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(
|
||||||
|
@ -14,7 +18,11 @@ class LiveRecommendService(private val repository: LiveRecommendRepository) {
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getRecommendChannelList(member: Member): List<GetRecommendChannelResponse> {
|
fun getRecommendChannelList(member: Member): List<GetRecommendChannelResponse> {
|
||||||
val onAirChannelList = repository.getOnAirRecommendChannelList(member.id!!, isAdult = member.auth != null)
|
val onAirChannelList = repository.getOnAirRecommendChannelList(
|
||||||
|
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
|
||||||
|
@ -27,9 +35,35 @@ class LiveRecommendService(private val repository: LiveRecommendRepository) {
|
||||||
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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -115,9 +115,13 @@ 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))
|
||||||
|
@ -138,13 +142,17 @@ 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 = listOf(),
|
tags = it.tags
|
||||||
|
.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 = false,
|
isReservation = reservations.isNotEmpty(),
|
||||||
isPrivateRoom = it.type == LiveRoomType.PRIVATE
|
isPrivateRoom = it.type == LiveRoomType.PRIVATE
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -742,7 +750,7 @@ class LiveRoomService(
|
||||||
isSpeaker = isSpeaker,
|
isSpeaker = isSpeaker,
|
||||||
isManager = isManager,
|
isManager = isManager,
|
||||||
isFollowing = isFollowing,
|
isFollowing = isFollowing,
|
||||||
isBlock = false
|
isBlock = blockMemberRepository.isBlocked(blockedMemberId = userResponse.id, memberId = memberResponse.id)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue