diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/explorer/ExplorerQueryRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/explorer/ExplorerQueryRepository.kt index b718247..afb8628 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/explorer/ExplorerQueryRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/explorer/ExplorerQueryRepository.kt @@ -351,6 +351,10 @@ class ExplorerQueryRepository( where = where.and(liveRoom.isAdult.isFalse) } + if (userMember.role == MemberRole.CREATOR) { + where = where.and(liveRoom.isAvailableJoinCreator.isTrue) + } + val result = mutableListOf() if (offset == 0L) { diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/fcm/FcmEvent.kt b/src/main/kotlin/kr/co/vividnext/sodalive/fcm/FcmEvent.kt index 833a825..8330a24 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/fcm/FcmEvent.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/fcm/FcmEvent.kt @@ -26,7 +26,8 @@ class FcmEvent( val messageId: Long? = null, val creatorId: Long? = null, val commentParentId: Long? = null, - val myMemberId: Long? = null + val myMemberId: Long? = null, + val isAvailableJoinCreator: Boolean? = null ) @Component @@ -99,6 +100,7 @@ class FcmSendListener( val pushTokens = memberRepository.getCreateLiveRoomNotificationRecipientPushTokens( creatorId = fcmEvent.creatorId!!, isAuth = fcmEvent.isAuth ?: false, + isAvailableJoinCreator = fcmEvent.isAvailableJoinCreator ?: false, container = fcmEvent.container ) @@ -120,6 +122,7 @@ class FcmSendListener( creatorId = fcmEvent.creatorId!!, roomId = fcmEvent.roomId!!, isAuth = fcmEvent.isAuth ?: false, + isAvailableJoinCreator = fcmEvent.isAvailableJoinCreator ?: false, container = fcmEvent.container ) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendRepository.kt index e6ece32..6cb0357 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendRepository.kt @@ -53,6 +53,7 @@ class LiveRecommendRepository( fun getOnAirRecommendChannelList( memberId: Long, isBlocked: (Long) -> Boolean, + isCreator: Boolean, isAdult: Boolean ): List { var where = member.role.eq(MemberRole.CREATOR) @@ -62,6 +63,10 @@ class LiveRecommendRepository( where = where.and(liveRoom.isAdult.isFalse) } + if (isCreator) { + where = where.and(liveRoom.isAvailableJoinCreator.isTrue) + } + return queryFactory .select( Projections.constructor( @@ -113,14 +118,13 @@ class LiveRecommendRepository( .orderBy(Expressions.numberTemplate(Double::class.java, "function('rand')").asc()) .limit(limit) .fetch() - .asSequence() .filter { !isBlocked(it.creatorId) } - .toList() } fun getOnAirFollowingChannelList( memberId: Long, isBlocked: (Long) -> Boolean, + isCreator: Boolean, isAdult: Boolean ): List { var where = member.role.eq(MemberRole.CREATOR) @@ -130,6 +134,10 @@ class LiveRecommendRepository( where = where.and(liveRoom.isAdult.isFalse) } + if (isCreator) { + where = where.and(liveRoom.isAvailableJoinCreator.isTrue) + } + return queryFactory .select( Projections.constructor( diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendService.kt index 1c6e486..5ec9478 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendService.kt @@ -1,6 +1,7 @@ package kr.co.vividnext.sodalive.live.recommend import kr.co.vividnext.sodalive.member.Member +import kr.co.vividnext.sodalive.member.MemberRole import kr.co.vividnext.sodalive.member.block.BlockMemberRepository import org.springframework.data.domain.Pageable import org.springframework.stereotype.Service @@ -23,6 +24,7 @@ class LiveRecommendService( val onAirChannelList = repository.getOnAirRecommendChannelList( member.id!!, isBlocked = { blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it) }, + isCreator = member.role == MemberRole.CREATOR, isAdult = member.auth != null ) @@ -30,9 +32,7 @@ class LiveRecommendService( return onAirChannelList } - val onAirCreatorIdList = onAirChannelList.asSequence() - .map { it.creatorId } - .toList() + val onAirCreatorIdList = onAirChannelList.map { it.creatorId } val notOnAirCreatorList = repository.getRecommendChannelList( member.id!!, @@ -48,6 +48,7 @@ class LiveRecommendService( val onAirFollowingChannelList = repository.getOnAirFollowingChannelList( memberId = member.id!!, isBlocked = { blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it) }, + isCreator = member.role == MemberRole.CREATOR, isAdult = member.auth != null ) @@ -55,9 +56,7 @@ class LiveRecommendService( return onAirFollowingChannelList } - val onAirCreatorIdList = onAirFollowingChannelList.asSequence() - .map { it.creatorId } - .toList() + val onAirCreatorIdList = onAirFollowingChannelList.map { it.creatorId } val notOnAirFollowingChannelList = repository.getFollowingChannelList( memberId = member.id!!, diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/CreateLiveRoomRequest.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/CreateLiveRoomRequest.kt index 9a50a39..08e1387 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/CreateLiveRoomRequest.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/CreateLiveRoomRequest.kt @@ -14,5 +14,6 @@ data class CreateLiveRoomRequest( val password: String? = null, val menuPanId: Long = 0, val menuPan: String = "", - val isActiveMenuPan: Boolean = false + val isActiveMenuPan: Boolean = false, + val isAvailableJoinCreator: Boolean = true ) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoom.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoom.kt index 3c95441..b65b6d0 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoom.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoom.kt @@ -28,6 +28,7 @@ data class LiveRoom( var bgImage: String? = null, var isAdult: Boolean, val price: Int = 0, + val isAvailableJoinCreator: Boolean = true, @Enumerated(value = EnumType.STRING) val type: LiveRoomType = LiveRoomType.OPEN, @Column(nullable = true) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomRepository.kt index e70f705..9b19673 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomRepository.kt @@ -20,16 +20,30 @@ import java.time.ZoneId interface LiveRoomRepository : JpaRepository, LiveRoomQueryRepository interface LiveRoomQueryRepository { - fun getLiveRoomListNow(offset: Long, limit: Long, timezone: String, isAdult: Boolean): List + fun getLiveRoomListNow( + offset: Long, + limit: Long, + timezone: String, + memberId: Long, + isCreator: Boolean, + isAdult: Boolean + ): List fun getLiveRoomListReservationWithDate( date: LocalDateTime, offset: Long, limit: Long, + memberId: Long, + isCreator: Boolean, isAdult: Boolean ): List - fun getLiveRoomListReservationWithoutDate(timezone: String, memberId: Long, isAdult: Boolean): List + fun getLiveRoomListReservationWithoutDate( + timezone: String, + memberId: Long, + isCreator: Boolean, + isAdult: Boolean + ): List fun getLiveRoom(id: Long): LiveRoom? fun getLiveRoomAndAccountId(roomId: Long, memberId: Long): LiveRoom? @@ -40,7 +54,14 @@ interface LiveRoomQueryRepository { } class LiveRoomQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : LiveRoomQueryRepository { - override fun getLiveRoomListNow(offset: Long, limit: Long, timezone: String, isAdult: Boolean): List { + override fun getLiveRoomListNow( + offset: Long, + limit: Long, + timezone: String, + memberId: Long, + isCreator: Boolean, + isAdult: Boolean + ): List { var where = liveRoom.channelName.isNotNull .and(liveRoom.channelName.isNotEmpty) .and(liveRoom.isActive.isTrue) @@ -50,6 +71,13 @@ class LiveRoomQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : L where = where.and(liveRoom.isAdult.isFalse) } + if (isCreator) { + where = where.and( + liveRoom.isAvailableJoinCreator.isTrue + .or(liveRoom.member.id.eq(memberId)) + ) + } + return queryFactory .selectFrom(liveRoom) .innerJoin(liveRoom.member, member) @@ -70,6 +98,8 @@ class LiveRoomQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : L date: LocalDateTime, offset: Long, limit: Long, + memberId: Long, + isCreator: Boolean, isAdult: Boolean ): List { var where = liveRoom.beginDateTime.goe(date) @@ -85,6 +115,13 @@ class LiveRoomQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : L where = where.and(liveRoom.isAdult.isFalse) } + if (isCreator) { + where = where.and( + liveRoom.isAvailableJoinCreator.isTrue + .or(liveRoom.member.id.eq(memberId)) + ) + } + return queryFactory .selectFrom(liveRoom) .innerJoin(liveRoom.member, member) @@ -98,6 +135,7 @@ class LiveRoomQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : L override fun getLiveRoomListReservationWithoutDate( timezone: String, memberId: Long, + isCreator: Boolean, isAdult: Boolean ): List { var where = liveRoom.beginDateTime.gt( @@ -117,6 +155,13 @@ class LiveRoomQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : L where = where.and(liveRoom.isAdult.isFalse) } + if (isCreator) { + where = where.and( + liveRoom.isAvailableJoinCreator.isTrue + .or(liveRoom.member.id.eq(memberId)) + ) + } + return queryFactory .selectFrom(liveRoom) .innerJoin(liveRoom.member, member) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomService.kt index 4f9edfe..3bb8df2 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomService.kt @@ -118,17 +118,26 @@ class LiveRoomService( timezone: String ): List { 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) { getLiveRoomListReservationWithDate( dateString, pageable, timezone, + memberId = member.id!!, + isCreator = member.role == MemberRole.CREATOR, isAdult = member.auth != null ) } else { getLiveRoomListReservationWithoutDate( timezone, + isCreator = member.role == MemberRole.CREATOR, memberId = member.id!!, isAdult = member.auth != null ) @@ -186,11 +195,19 @@ class LiveRoomService( } } - private fun getLiveRoomListNow(pageable: Pageable, timezone: String, isAdult: Boolean): List { + private fun getLiveRoomListNow( + pageable: Pageable, + timezone: String, + memberId: Long, + isCreator: Boolean, + isAdult: Boolean + ): List { return repository.getLiveRoomListNow( offset = pageable.offset, limit = pageable.pageSize.toLong(), timezone = timezone, + memberId = memberId, + isCreator = isCreator, isAdult = isAdult ) } @@ -199,6 +216,8 @@ class LiveRoomService( dateString: String, pageable: Pageable, timezone: String, + memberId: Long, + isCreator: Boolean, isAdult: Boolean ): List { val dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") @@ -211,6 +230,8 @@ class LiveRoomService( date = date, offset = pageable.offset, limit = pageable.pageSize.toLong(), + memberId = memberId, + isCreator = isCreator, isAdult = isAdult ) } @@ -218,9 +239,10 @@ class LiveRoomService( private fun getLiveRoomListReservationWithoutDate( timezone: String, memberId: Long, + isCreator: Boolean, isAdult: Boolean ): List { - return repository.getLiveRoomListReservationWithoutDate(timezone, memberId, isAdult) + return repository.getLiveRoomListReservationWithoutDate(timezone, memberId, isCreator, isAdult) } @Transactional @@ -277,7 +299,8 @@ class LiveRoomService( request.price }, type = request.type, - password = request.password + password = request.password, + isAvailableJoinCreator = request.isAvailableJoinCreator ) room.member = member @@ -353,6 +376,7 @@ class LiveRoomService( "라이브를 예약했습니다. - ${createdRoom.title}" }, isAuth = createdRoom.isAdult, + isAvailableJoinCreator = createdRoom.isAvailableJoinCreator, roomId = createdRoom.id, creatorId = createdRoom.member!!.id, container = "ios" @@ -369,6 +393,7 @@ class LiveRoomService( "라이브를 예약했습니다. - ${createdRoom.title}" }, isAuth = createdRoom.isAdult, + isAvailableJoinCreator = createdRoom.isAvailableJoinCreator, roomId = createdRoom.id, creatorId = createdRoom.member!!.id, container = "aos" @@ -511,6 +536,7 @@ class LiveRoomService( title = room.member!!.nickname, message = "라이브를 시작했습니다 - ${room.title}", isAuth = room.isAdult, + isAvailableJoinCreator = room.isAvailableJoinCreator, roomId = room.id, creatorId = room.member!!.id, container = "ios" @@ -523,6 +549,7 @@ class LiveRoomService( title = room.member!!.nickname, message = "라이브를 시작했습니다 - ${room.title}", isAuth = room.isAdult, + isAvailableJoinCreator = room.isAvailableJoinCreator, roomId = room.id, creatorId = room.member!!.id, container = "aos" diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberRepository.kt index 9839c64..364f2e4 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberRepository.kt @@ -29,6 +29,7 @@ interface MemberQueryRepository { fun getCreateLiveRoomNotificationRecipientPushTokens( creatorId: Long, isAuth: Boolean, + isAvailableJoinCreator: Boolean, container: String ): List> @@ -36,6 +37,7 @@ interface MemberQueryRepository { creatorId: Long, roomId: Long, isAuth: Boolean, + isAvailableJoinCreator: Boolean, container: String ): List> @@ -120,6 +122,7 @@ class MemberQueryRepositoryImpl( override fun getCreateLiveRoomNotificationRecipientPushTokens( creatorId: Long, isAuth: Boolean, + isAvailableJoinCreator: Boolean, container: String ): List> { val member = QMember.member @@ -142,6 +145,10 @@ class MemberQueryRepositoryImpl( where = where.and(auth.isNotNull) } + if (!isAvailableJoinCreator) { + where = where.and(creatorFollowing.member.role.ne(MemberRole.CREATOR)) + } + return queryFactory .select(creatorFollowing.member.pushToken) .from(creatorFollowing) @@ -159,6 +166,7 @@ class MemberQueryRepositoryImpl( creatorId: Long, roomId: Long, isAuth: Boolean, + isAvailableJoinCreator: Boolean, container: String ): List> { val member = QMember.member @@ -181,6 +189,10 @@ class MemberQueryRepositoryImpl( where = where.and(auth.isNotNull) } + if (!isAvailableJoinCreator) { + where = where.and(creatorFollowing.member.role.ne(MemberRole.CREATOR)) + } + val followingMemberPushToken = queryFactory .select(creatorFollowing.member.pushToken) .from(creatorFollowing)