Merge pull request '라이브 방 - 크리에이터 입장 가능 설정 추가' (#179) from test into main

Reviewed-on: #179
This commit is contained in:
klaus 2024-05-14 12:09:53 +00:00
commit ef917ecc25
9 changed files with 117 additions and 17 deletions

View File

@ -351,6 +351,10 @@ class ExplorerQueryRepository(
where = where.and(liveRoom.isAdult.isFalse) where = where.and(liveRoom.isAdult.isFalse)
} }
if (userMember.role == MemberRole.CREATOR) {
where = where.and(liveRoom.isAvailableJoinCreator.isTrue)
}
val result = mutableListOf<LiveRoom>() val result = mutableListOf<LiveRoom>()
if (offset == 0L) { if (offset == 0L) {

View File

@ -26,7 +26,8 @@ class FcmEvent(
val messageId: Long? = null, val messageId: Long? = null,
val creatorId: Long? = null, val creatorId: Long? = null,
val commentParentId: Long? = null, val commentParentId: Long? = null,
val myMemberId: Long? = null val myMemberId: Long? = null,
val isAvailableJoinCreator: Boolean? = null
) )
@Component @Component
@ -99,6 +100,7 @@ class FcmSendListener(
val pushTokens = memberRepository.getCreateLiveRoomNotificationRecipientPushTokens( val pushTokens = memberRepository.getCreateLiveRoomNotificationRecipientPushTokens(
creatorId = fcmEvent.creatorId!!, creatorId = fcmEvent.creatorId!!,
isAuth = fcmEvent.isAuth ?: false, isAuth = fcmEvent.isAuth ?: false,
isAvailableJoinCreator = fcmEvent.isAvailableJoinCreator ?: false,
container = fcmEvent.container container = fcmEvent.container
) )
@ -120,6 +122,7 @@ class FcmSendListener(
creatorId = fcmEvent.creatorId!!, creatorId = fcmEvent.creatorId!!,
roomId = fcmEvent.roomId!!, roomId = fcmEvent.roomId!!,
isAuth = fcmEvent.isAuth ?: false, isAuth = fcmEvent.isAuth ?: false,
isAvailableJoinCreator = fcmEvent.isAvailableJoinCreator ?: false,
container = fcmEvent.container container = fcmEvent.container
) )

View File

@ -53,6 +53,7 @@ class LiveRecommendRepository(
fun getOnAirRecommendChannelList( fun getOnAirRecommendChannelList(
memberId: Long, memberId: Long,
isBlocked: (Long) -> Boolean, isBlocked: (Long) -> Boolean,
isCreator: Boolean,
isAdult: Boolean isAdult: Boolean
): List<GetRecommendChannelResponse> { ): List<GetRecommendChannelResponse> {
var where = member.role.eq(MemberRole.CREATOR) var where = member.role.eq(MemberRole.CREATOR)
@ -62,6 +63,10 @@ class LiveRecommendRepository(
where = where.and(liveRoom.isAdult.isFalse) where = where.and(liveRoom.isAdult.isFalse)
} }
if (isCreator) {
where = where.and(liveRoom.isAvailableJoinCreator.isTrue)
}
return queryFactory return queryFactory
.select( .select(
Projections.constructor( Projections.constructor(
@ -113,14 +118,13 @@ class LiveRecommendRepository(
.orderBy(Expressions.numberTemplate(Double::class.java, "function('rand')").asc()) .orderBy(Expressions.numberTemplate(Double::class.java, "function('rand')").asc())
.limit(limit) .limit(limit)
.fetch() .fetch()
.asSequence()
.filter { !isBlocked(it.creatorId) } .filter { !isBlocked(it.creatorId) }
.toList()
} }
fun getOnAirFollowingChannelList( fun getOnAirFollowingChannelList(
memberId: Long, memberId: Long,
isBlocked: (Long) -> Boolean, isBlocked: (Long) -> Boolean,
isCreator: Boolean,
isAdult: Boolean isAdult: Boolean
): List<GetRecommendChannelResponse> { ): List<GetRecommendChannelResponse> {
var where = member.role.eq(MemberRole.CREATOR) var where = member.role.eq(MemberRole.CREATOR)
@ -130,6 +134,10 @@ class LiveRecommendRepository(
where = where.and(liveRoom.isAdult.isFalse) where = where.and(liveRoom.isAdult.isFalse)
} }
if (isCreator) {
where = where.and(liveRoom.isAvailableJoinCreator.isTrue)
}
return queryFactory return queryFactory
.select( .select(
Projections.constructor( Projections.constructor(

View File

@ -1,6 +1,7 @@
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.MemberRole
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.data.domain.Pageable
import org.springframework.stereotype.Service import org.springframework.stereotype.Service
@ -23,6 +24,7 @@ class LiveRecommendService(
val onAirChannelList = repository.getOnAirRecommendChannelList( val onAirChannelList = repository.getOnAirRecommendChannelList(
member.id!!, member.id!!,
isBlocked = { blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it) }, isBlocked = { blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it) },
isCreator = member.role == MemberRole.CREATOR,
isAdult = member.auth != null isAdult = member.auth != null
) )
@ -30,9 +32,7 @@ class LiveRecommendService(
return onAirChannelList return onAirChannelList
} }
val onAirCreatorIdList = onAirChannelList.asSequence() val onAirCreatorIdList = onAirChannelList.map { it.creatorId }
.map { it.creatorId }
.toList()
val notOnAirCreatorList = repository.getRecommendChannelList( val notOnAirCreatorList = repository.getRecommendChannelList(
member.id!!, member.id!!,
@ -48,6 +48,7 @@ class LiveRecommendService(
val onAirFollowingChannelList = repository.getOnAirFollowingChannelList( val onAirFollowingChannelList = repository.getOnAirFollowingChannelList(
memberId = member.id!!, memberId = member.id!!,
isBlocked = { blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it) }, isBlocked = { blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it) },
isCreator = member.role == MemberRole.CREATOR,
isAdult = member.auth != null isAdult = member.auth != null
) )
@ -55,9 +56,7 @@ class LiveRecommendService(
return onAirFollowingChannelList return onAirFollowingChannelList
} }
val onAirCreatorIdList = onAirFollowingChannelList.asSequence() val onAirCreatorIdList = onAirFollowingChannelList.map { it.creatorId }
.map { it.creatorId }
.toList()
val notOnAirFollowingChannelList = repository.getFollowingChannelList( val notOnAirFollowingChannelList = repository.getFollowingChannelList(
memberId = member.id!!, memberId = member.id!!,

View File

@ -14,5 +14,6 @@ data class CreateLiveRoomRequest(
val password: String? = null, val password: String? = null,
val menuPanId: Long = 0, val menuPanId: Long = 0,
val menuPan: String = "", val menuPan: String = "",
val isActiveMenuPan: Boolean = false val isActiveMenuPan: Boolean = false,
val isAvailableJoinCreator: Boolean = true
) )

View File

@ -28,6 +28,7 @@ data class LiveRoom(
var bgImage: String? = null, var bgImage: String? = null,
var isAdult: Boolean, var isAdult: Boolean,
val price: Int = 0, val price: Int = 0,
val isAvailableJoinCreator: Boolean = true,
@Enumerated(value = EnumType.STRING) @Enumerated(value = EnumType.STRING)
val type: LiveRoomType = LiveRoomType.OPEN, val type: LiveRoomType = LiveRoomType.OPEN,
@Column(nullable = true) @Column(nullable = true)

View File

@ -20,16 +20,30 @@ import java.time.ZoneId
interface LiveRoomRepository : JpaRepository<LiveRoom, Long>, LiveRoomQueryRepository interface LiveRoomRepository : JpaRepository<LiveRoom, Long>, LiveRoomQueryRepository
interface LiveRoomQueryRepository { interface LiveRoomQueryRepository {
fun getLiveRoomListNow(offset: Long, limit: Long, timezone: String, isAdult: Boolean): List<LiveRoom> fun getLiveRoomListNow(
offset: Long,
limit: Long,
timezone: String,
memberId: Long,
isCreator: Boolean,
isAdult: Boolean
): List<LiveRoom>
fun getLiveRoomListReservationWithDate( fun getLiveRoomListReservationWithDate(
date: LocalDateTime, date: LocalDateTime,
offset: Long, offset: Long,
limit: Long, limit: Long,
memberId: Long,
isCreator: Boolean,
isAdult: Boolean isAdult: Boolean
): List<LiveRoom> ): List<LiveRoom>
fun getLiveRoomListReservationWithoutDate(timezone: String, memberId: Long, isAdult: Boolean): List<LiveRoom> fun getLiveRoomListReservationWithoutDate(
timezone: String,
memberId: Long,
isCreator: Boolean,
isAdult: Boolean
): List<LiveRoom>
fun getLiveRoom(id: Long): LiveRoom? fun getLiveRoom(id: Long): LiveRoom?
fun getLiveRoomAndAccountId(roomId: Long, memberId: Long): LiveRoom? fun getLiveRoomAndAccountId(roomId: Long, memberId: Long): LiveRoom?
@ -40,7 +54,14 @@ interface LiveRoomQueryRepository {
} }
class LiveRoomQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : LiveRoomQueryRepository { class LiveRoomQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : LiveRoomQueryRepository {
override fun getLiveRoomListNow(offset: Long, limit: Long, timezone: String, isAdult: Boolean): List<LiveRoom> { override fun getLiveRoomListNow(
offset: Long,
limit: Long,
timezone: String,
memberId: Long,
isCreator: Boolean,
isAdult: Boolean
): List<LiveRoom> {
var where = liveRoom.channelName.isNotNull var where = liveRoom.channelName.isNotNull
.and(liveRoom.channelName.isNotEmpty) .and(liveRoom.channelName.isNotEmpty)
.and(liveRoom.isActive.isTrue) .and(liveRoom.isActive.isTrue)
@ -50,6 +71,13 @@ class LiveRoomQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : L
where = where.and(liveRoom.isAdult.isFalse) where = where.and(liveRoom.isAdult.isFalse)
} }
if (isCreator) {
where = where.and(
liveRoom.isAvailableJoinCreator.isTrue
.or(liveRoom.member.id.eq(memberId))
)
}
return queryFactory return queryFactory
.selectFrom(liveRoom) .selectFrom(liveRoom)
.innerJoin(liveRoom.member, member) .innerJoin(liveRoom.member, member)
@ -70,6 +98,8 @@ class LiveRoomQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : L
date: LocalDateTime, date: LocalDateTime,
offset: Long, offset: Long,
limit: Long, limit: Long,
memberId: Long,
isCreator: Boolean,
isAdult: Boolean isAdult: Boolean
): List<LiveRoom> { ): List<LiveRoom> {
var where = liveRoom.beginDateTime.goe(date) var where = liveRoom.beginDateTime.goe(date)
@ -85,6 +115,13 @@ class LiveRoomQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : L
where = where.and(liveRoom.isAdult.isFalse) where = where.and(liveRoom.isAdult.isFalse)
} }
if (isCreator) {
where = where.and(
liveRoom.isAvailableJoinCreator.isTrue
.or(liveRoom.member.id.eq(memberId))
)
}
return queryFactory return queryFactory
.selectFrom(liveRoom) .selectFrom(liveRoom)
.innerJoin(liveRoom.member, member) .innerJoin(liveRoom.member, member)
@ -98,6 +135,7 @@ class LiveRoomQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : L
override fun getLiveRoomListReservationWithoutDate( override fun getLiveRoomListReservationWithoutDate(
timezone: String, timezone: String,
memberId: Long, memberId: Long,
isCreator: Boolean,
isAdult: Boolean isAdult: Boolean
): List<LiveRoom> { ): List<LiveRoom> {
var where = liveRoom.beginDateTime.gt( var where = liveRoom.beginDateTime.gt(
@ -117,6 +155,13 @@ class LiveRoomQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : L
where = where.and(liveRoom.isAdult.isFalse) where = where.and(liveRoom.isAdult.isFalse)
} }
if (isCreator) {
where = where.and(
liveRoom.isAvailableJoinCreator.isTrue
.or(liveRoom.member.id.eq(memberId))
)
}
return queryFactory return queryFactory
.selectFrom(liveRoom) .selectFrom(liveRoom)
.innerJoin(liveRoom.member, member) .innerJoin(liveRoom.member, member)

View File

@ -118,17 +118,26 @@ class LiveRoomService(
timezone: String timezone: String
): List<GetRoomListResponse> { ): List<GetRoomListResponse> {
val roomList = if (status == LiveRoomStatus.NOW) { val roomList = if (status == LiveRoomStatus.NOW) {
getLiveRoomListNow(pageable, timezone, isAdult = member.auth != null) getLiveRoomListNow(
pageable,
timezone,
memberId = member.id!!,
isCreator = member.role == MemberRole.CREATOR,
isAdult = member.auth != null
)
} else if (dateString != null) { } else if (dateString != null) {
getLiveRoomListReservationWithDate( getLiveRoomListReservationWithDate(
dateString, dateString,
pageable, pageable,
timezone, timezone,
memberId = member.id!!,
isCreator = member.role == MemberRole.CREATOR,
isAdult = member.auth != null isAdult = member.auth != null
) )
} else { } else {
getLiveRoomListReservationWithoutDate( getLiveRoomListReservationWithoutDate(
timezone, timezone,
isCreator = member.role == MemberRole.CREATOR,
memberId = member.id!!, memberId = member.id!!,
isAdult = member.auth != null isAdult = member.auth != null
) )
@ -186,11 +195,19 @@ class LiveRoomService(
} }
} }
private fun getLiveRoomListNow(pageable: Pageable, timezone: String, isAdult: Boolean): List<LiveRoom> { private fun getLiveRoomListNow(
pageable: Pageable,
timezone: String,
memberId: Long,
isCreator: Boolean,
isAdult: Boolean
): List<LiveRoom> {
return repository.getLiveRoomListNow( return repository.getLiveRoomListNow(
offset = pageable.offset, offset = pageable.offset,
limit = pageable.pageSize.toLong(), limit = pageable.pageSize.toLong(),
timezone = timezone, timezone = timezone,
memberId = memberId,
isCreator = isCreator,
isAdult = isAdult isAdult = isAdult
) )
} }
@ -199,6 +216,8 @@ class LiveRoomService(
dateString: String, dateString: String,
pageable: Pageable, pageable: Pageable,
timezone: String, timezone: String,
memberId: Long,
isCreator: Boolean,
isAdult: Boolean isAdult: Boolean
): List<LiveRoom> { ): List<LiveRoom> {
val dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") val dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd")
@ -211,6 +230,8 @@ class LiveRoomService(
date = date, date = date,
offset = pageable.offset, offset = pageable.offset,
limit = pageable.pageSize.toLong(), limit = pageable.pageSize.toLong(),
memberId = memberId,
isCreator = isCreator,
isAdult = isAdult isAdult = isAdult
) )
} }
@ -218,9 +239,10 @@ class LiveRoomService(
private fun getLiveRoomListReservationWithoutDate( private fun getLiveRoomListReservationWithoutDate(
timezone: String, timezone: String,
memberId: Long, memberId: Long,
isCreator: Boolean,
isAdult: Boolean isAdult: Boolean
): List<LiveRoom> { ): List<LiveRoom> {
return repository.getLiveRoomListReservationWithoutDate(timezone, memberId, isAdult) return repository.getLiveRoomListReservationWithoutDate(timezone, memberId, isCreator, isAdult)
} }
@Transactional @Transactional
@ -277,7 +299,8 @@ class LiveRoomService(
request.price request.price
}, },
type = request.type, type = request.type,
password = request.password password = request.password,
isAvailableJoinCreator = request.isAvailableJoinCreator
) )
room.member = member room.member = member
@ -353,6 +376,7 @@ class LiveRoomService(
"라이브를 예약했습니다. - ${createdRoom.title}" "라이브를 예약했습니다. - ${createdRoom.title}"
}, },
isAuth = createdRoom.isAdult, isAuth = createdRoom.isAdult,
isAvailableJoinCreator = createdRoom.isAvailableJoinCreator,
roomId = createdRoom.id, roomId = createdRoom.id,
creatorId = createdRoom.member!!.id, creatorId = createdRoom.member!!.id,
container = "ios" container = "ios"
@ -369,6 +393,7 @@ class LiveRoomService(
"라이브를 예약했습니다. - ${createdRoom.title}" "라이브를 예약했습니다. - ${createdRoom.title}"
}, },
isAuth = createdRoom.isAdult, isAuth = createdRoom.isAdult,
isAvailableJoinCreator = createdRoom.isAvailableJoinCreator,
roomId = createdRoom.id, roomId = createdRoom.id,
creatorId = createdRoom.member!!.id, creatorId = createdRoom.member!!.id,
container = "aos" container = "aos"
@ -511,6 +536,7 @@ class LiveRoomService(
title = room.member!!.nickname, title = room.member!!.nickname,
message = "라이브를 시작했습니다 - ${room.title}", message = "라이브를 시작했습니다 - ${room.title}",
isAuth = room.isAdult, isAuth = room.isAdult,
isAvailableJoinCreator = room.isAvailableJoinCreator,
roomId = room.id, roomId = room.id,
creatorId = room.member!!.id, creatorId = room.member!!.id,
container = "ios" container = "ios"
@ -523,6 +549,7 @@ class LiveRoomService(
title = room.member!!.nickname, title = room.member!!.nickname,
message = "라이브를 시작했습니다 - ${room.title}", message = "라이브를 시작했습니다 - ${room.title}",
isAuth = room.isAdult, isAuth = room.isAdult,
isAvailableJoinCreator = room.isAvailableJoinCreator,
roomId = room.id, roomId = room.id,
creatorId = room.member!!.id, creatorId = room.member!!.id,
container = "aos" container = "aos"

View File

@ -29,6 +29,7 @@ interface MemberQueryRepository {
fun getCreateLiveRoomNotificationRecipientPushTokens( fun getCreateLiveRoomNotificationRecipientPushTokens(
creatorId: Long, creatorId: Long,
isAuth: Boolean, isAuth: Boolean,
isAvailableJoinCreator: Boolean,
container: String container: String
): List<List<String>> ): List<List<String>>
@ -36,6 +37,7 @@ interface MemberQueryRepository {
creatorId: Long, creatorId: Long,
roomId: Long, roomId: Long,
isAuth: Boolean, isAuth: Boolean,
isAvailableJoinCreator: Boolean,
container: String container: String
): List<List<String>> ): List<List<String>>
@ -120,6 +122,7 @@ class MemberQueryRepositoryImpl(
override fun getCreateLiveRoomNotificationRecipientPushTokens( override fun getCreateLiveRoomNotificationRecipientPushTokens(
creatorId: Long, creatorId: Long,
isAuth: Boolean, isAuth: Boolean,
isAvailableJoinCreator: Boolean,
container: String container: String
): List<List<String>> { ): List<List<String>> {
val member = QMember.member val member = QMember.member
@ -142,6 +145,10 @@ class MemberQueryRepositoryImpl(
where = where.and(auth.isNotNull) where = where.and(auth.isNotNull)
} }
if (!isAvailableJoinCreator) {
where = where.and(creatorFollowing.member.role.ne(MemberRole.CREATOR))
}
return queryFactory return queryFactory
.select(creatorFollowing.member.pushToken) .select(creatorFollowing.member.pushToken)
.from(creatorFollowing) .from(creatorFollowing)
@ -159,6 +166,7 @@ class MemberQueryRepositoryImpl(
creatorId: Long, creatorId: Long,
roomId: Long, roomId: Long,
isAuth: Boolean, isAuth: Boolean,
isAvailableJoinCreator: Boolean,
container: String container: String
): List<List<String>> { ): List<List<String>> {
val member = QMember.member val member = QMember.member
@ -181,6 +189,10 @@ class MemberQueryRepositoryImpl(
where = where.and(auth.isNotNull) where = where.and(auth.isNotNull)
} }
if (!isAvailableJoinCreator) {
where = where.and(creatorFollowing.member.role.ne(MemberRole.CREATOR))
}
val followingMemberPushToken = queryFactory val followingMemberPushToken = queryFactory
.select(creatorFollowing.member.pushToken) .select(creatorFollowing.member.pushToken)
.from(creatorFollowing) .from(creatorFollowing)