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 d054ed3e..bbf0b7f2 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/fcm/FcmEvent.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/fcm/FcmEvent.kt @@ -3,6 +3,7 @@ package kr.co.vividnext.sodalive.fcm import kr.co.vividnext.sodalive.content.comment.AudioContentCommentRepository import kr.co.vividnext.sodalive.i18n.Lang import kr.co.vividnext.sodalive.i18n.SodaMessageSource +import kr.co.vividnext.sodalive.live.room.GenderRestriction import kr.co.vividnext.sodalive.member.MemberRepository import org.springframework.scheduling.annotation.Async import org.springframework.stereotype.Component @@ -33,7 +34,8 @@ class FcmEvent( val auditionId: Long? = null, val commentParentId: Long? = null, val myMemberId: Long? = null, - val isAvailableJoinCreator: Boolean? = null + val isAvailableJoinCreator: Boolean? = null, + val genderRestriction: GenderRestriction? = null ) @Component @@ -69,7 +71,8 @@ class FcmSendListener( val pushTokens = memberRepository.getCreateLiveRoomNotificationRecipientPushTokens( creatorId = fcmEvent.creatorId!!, isAuth = fcmEvent.isAuth ?: false, - isAvailableJoinCreator = fcmEvent.isAvailableJoinCreator ?: false + isAvailableJoinCreator = fcmEvent.isAvailableJoinCreator ?: false, + genderRestriction = fcmEvent.genderRestriction ) sendPush(pushTokens, fcmEvent, roomId = fcmEvent.roomId) } @@ -79,7 +82,8 @@ class FcmSendListener( creatorId = fcmEvent.creatorId!!, roomId = fcmEvent.roomId!!, isAuth = fcmEvent.isAuth ?: false, - isAvailableJoinCreator = fcmEvent.isAvailableJoinCreator ?: false + isAvailableJoinCreator = fcmEvent.isAvailableJoinCreator ?: false, + genderRestriction = fcmEvent.genderRestriction ) sendPush(pushTokens, fcmEvent, roomId = fcmEvent.roomId) } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/i18n/SodaMessageSource.kt b/src/main/kotlin/kr/co/vividnext/sodalive/i18n/SodaMessageSource.kt index a95615d7..7f8e3c5e 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/i18n/SodaMessageSource.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/i18n/SodaMessageSource.kt @@ -1448,6 +1448,11 @@ class SodaMessageSource { ) private val liveRoomMessages = mapOf( + "live.room.gender_restricted" to mapOf( + Lang.KO to "입장 가능한 성별이 아닙니다.", + Lang.EN to "Your gender is not allowed to enter this room.", + Lang.JA to "入場可能な性別ではありません。" + ), "live.room.max_reservations" to mapOf( Lang.KO to "예약 라이브는 최대 3개까지 가능합니다.", Lang.EN to "You can reserve up to 3 live sessions.", 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 08e1387a..3d8f56c8 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 @@ -15,5 +15,6 @@ data class CreateLiveRoomRequest( val menuPanId: Long = 0, val menuPan: String = "", val isActiveMenuPan: Boolean = false, - val isAvailableJoinCreator: Boolean = true + val isAvailableJoinCreator: Boolean = true, + val genderRestriction: GenderRestriction = GenderRestriction.ALL ) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/EditLiveRoomInfoRequest.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/EditLiveRoomInfoRequest.kt index b6de7ad5..bf880b4d 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/EditLiveRoomInfoRequest.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/EditLiveRoomInfoRequest.kt @@ -9,5 +9,6 @@ data class EditLiveRoomInfoRequest( val menuPanId: Long = 0, val menuPan: String = "", val isActiveMenuPan: Boolean? = null, - val isAdult: Boolean? = null + val isAdult: Boolean? = null, + val genderRestriction: GenderRestriction? = null ) 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 b65b6d00..2ca56c9c 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 @@ -32,7 +32,9 @@ data class LiveRoom( @Enumerated(value = EnumType.STRING) val type: LiveRoomType = LiveRoomType.OPEN, @Column(nullable = true) - var password: String? = null + var password: String? = null, + @Enumerated(value = EnumType.STRING) + var genderRestriction: GenderRestriction = GenderRestriction.ALL ) : BaseEntity() { @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id", nullable = false) @@ -67,3 +69,7 @@ enum class LiveRoomType { enum class LiveRoomStatus { NOW, RESERVATION } + +enum class GenderRestriction { + ALL, MALE_ONLY, FEMALE_ONLY +} 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 da71f490..435e568e 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 @@ -14,8 +14,10 @@ import kr.co.vividnext.sodalive.live.room.donation.GetLiveRoomDonationItem import kr.co.vividnext.sodalive.live.room.donation.QGetLiveRoomDonationItem import kr.co.vividnext.sodalive.live.room.like.GetLiveRoomHeartListItem import kr.co.vividnext.sodalive.live.room.like.QGetLiveRoomHeartListItem +import kr.co.vividnext.sodalive.member.Gender import kr.co.vividnext.sodalive.member.MemberRole import kr.co.vividnext.sodalive.member.QMember.member +import kr.co.vividnext.sodalive.member.block.QBlockMember.blockMember import org.springframework.beans.factory.annotation.Value import org.springframework.data.jpa.repository.JpaRepository import org.springframework.stereotype.Repository @@ -32,7 +34,8 @@ interface LiveRoomQueryRepository { timezone: String, memberId: Long?, isCreator: Boolean, - isAdult: Boolean + isAdult: Boolean, + effectiveGender: Gender? ): List fun getLiveRoomListReservationWithDate( @@ -41,14 +44,16 @@ interface LiveRoomQueryRepository { limit: Long, memberId: Long?, isCreator: Boolean, - isAdult: Boolean + isAdult: Boolean, + effectiveGender: Gender? ): List fun getLiveRoomListReservationWithoutDate( timezone: String, memberId: Long?, isCreator: Boolean, - isAdult: Boolean + isAdult: Boolean, + effectiveGender: Gender? ): List fun getLiveRoom(id: Long): LiveRoom? @@ -76,7 +81,8 @@ class LiveRoomQueryRepositoryImpl( timezone: String, memberId: Long?, isCreator: Boolean, - isAdult: Boolean + isAdult: Boolean, + effectiveGender: Gender? ): List { var where = liveRoom.channelName.isNotNull .and(liveRoom.channelName.isNotEmpty) @@ -94,10 +100,33 @@ class LiveRoomQueryRepositoryImpl( ) } - return queryFactory + if (effectiveGender != null && effectiveGender != Gender.NONE) { + where = when (effectiveGender) { + Gender.MALE -> where.and( + liveRoom.genderRestriction.`in`(GenderRestriction.ALL, GenderRestriction.MALE_ONLY) + ) + Gender.FEMALE -> where.and( + liveRoom.genderRestriction.`in`(GenderRestriction.ALL, GenderRestriction.FEMALE_ONLY) + ) + Gender.NONE -> where + } + } + + var select = queryFactory .selectFrom(liveRoom) .innerJoin(liveRoom.member, member) .leftJoin(quarterLiveRankings).on(liveRoom.id.eq(quarterLiveRankings.roomId)) + + if (memberId != null) { + val blockMemberCondition = blockMember.member.id.eq(member.id) + .and(blockMember.blockedMember.id.eq(memberId)) + .and(blockMember.isActive.isTrue) + + select = select.leftJoin(blockMember).on(blockMemberCondition) + where = where.and(blockMember.id.isNull) + } + + return select .where(where) .offset(offset) .limit(limit) @@ -116,7 +145,8 @@ class LiveRoomQueryRepositoryImpl( limit: Long, memberId: Long?, isCreator: Boolean, - isAdult: Boolean + isAdult: Boolean, + effectiveGender: Gender? ): List { var where = liveRoom.beginDateTime.goe(date) .and(liveRoom.beginDateTime.lt(date.plusDays(1))) @@ -138,9 +168,32 @@ class LiveRoomQueryRepositoryImpl( ) } - return queryFactory + if (effectiveGender != null && effectiveGender != Gender.NONE) { + where = when (effectiveGender) { + Gender.MALE -> where.and( + liveRoom.genderRestriction.`in`(GenderRestriction.ALL, GenderRestriction.MALE_ONLY) + ) + Gender.FEMALE -> where.and( + liveRoom.genderRestriction.`in`(GenderRestriction.ALL, GenderRestriction.FEMALE_ONLY) + ) + Gender.NONE -> where + } + } + + var select = queryFactory .selectFrom(liveRoom) .innerJoin(liveRoom.member, member) + + if (memberId != null) { + val blockMemberCondition = blockMember.member.id.eq(member.id) + .and(blockMember.blockedMember.id.eq(memberId)) + .and(blockMember.isActive.isTrue) + + select = select.leftJoin(blockMember).on(blockMemberCondition) + where = where.and(blockMember.id.isNull) + } + + return select .where(where) .offset(offset) .limit(limit) @@ -152,7 +205,8 @@ class LiveRoomQueryRepositoryImpl( timezone: String, memberId: Long?, isCreator: Boolean, - isAdult: Boolean + isAdult: Boolean, + effectiveGender: Gender? ): List { var where = liveRoom.beginDateTime.gt( LocalDateTime.now() @@ -178,6 +232,18 @@ class LiveRoomQueryRepositoryImpl( ) } + if (effectiveGender != null && effectiveGender != Gender.NONE) { + where = when (effectiveGender) { + Gender.MALE -> where.and( + liveRoom.genderRestriction.`in`(GenderRestriction.ALL, GenderRestriction.MALE_ONLY) + ) + Gender.FEMALE -> where.and( + liveRoom.genderRestriction.`in`(GenderRestriction.ALL, GenderRestriction.FEMALE_ONLY) + ) + Gender.NONE -> where + } + } + val orderBy = if (memberId != null) { listOf( CaseBuilder() @@ -190,10 +256,21 @@ class LiveRoomQueryRepositoryImpl( listOf(liveRoom.beginDateTime.asc()) } - return queryFactory + var select = queryFactory .selectFrom(liveRoom) .innerJoin(liveRoom.member, member) .limit(10) + + if (memberId != null) { + val blockMemberCondition = blockMember.member.id.eq(member.id) + .and(blockMember.blockedMember.id.eq(memberId)) + .and(blockMember.isActive.isTrue) + + select = select.leftJoin(blockMember).on(blockMemberCondition) + where = where.and(blockMember.id.isNull) + } + + return select .where(where) .orderBy(*orderBy.toTypedArray()) .fetch() 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 d7178263..6938f1e4 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 @@ -193,13 +193,21 @@ class LiveRoomService( member: Member?, timezone: String ): List { + val effectiveGender = member?.let { + if (it.auth != null) { + if (it.auth!!.gender == 1) Gender.MALE else Gender.FEMALE + } else { + it.gender + } + } val roomList = if (status == LiveRoomStatus.NOW) { getLiveRoomListNow( pageable, timezone, memberId = member?.id, isCreator = member?.role == MemberRole.CREATOR, - isAdult = member?.auth != null && isAdultContentVisible + isAdult = member?.auth != null && isAdultContentVisible, + effectiveGender = effectiveGender ) } else if (dateString != null) { getLiveRoomListReservationWithDate( @@ -208,14 +216,16 @@ class LiveRoomService( timezone, memberId = member?.id, isCreator = member?.role == MemberRole.CREATOR, - isAdult = member?.auth != null && isAdultContentVisible + isAdult = member?.auth != null && isAdultContentVisible, + effectiveGender = effectiveGender ) } else { getLiveRoomListReservationWithoutDate( timezone, isCreator = member?.role == MemberRole.CREATOR, memberId = member?.id, - isAdult = member?.auth != null && isAdultContentVisible + isAdult = member?.auth != null && isAdultContentVisible, + effectiveGender = effectiveGender ) } @@ -223,13 +233,6 @@ class LiveRoomService( val languageTagByMemberId = buildLanguageTagMap(creatorIds) return roomList - .filter { - if (member?.id != null) { - !blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it.member!!.id!!) - } else { - true - } - } .map { val roomInfo = roomInfoRepository.findByIdOrNull(it.id!!) @@ -296,7 +299,8 @@ class LiveRoomService( timezone: String, memberId: Long?, isCreator: Boolean, - isAdult: Boolean + isAdult: Boolean, + effectiveGender: Gender? ): List { return repository.getLiveRoomListNow( offset = pageable.offset, @@ -304,7 +308,8 @@ class LiveRoomService( timezone = timezone, memberId = memberId, isCreator = isCreator, - isAdult = isAdult + isAdult = isAdult, + effectiveGender = effectiveGender ) } @@ -314,7 +319,8 @@ class LiveRoomService( timezone: String, memberId: Long?, isCreator: Boolean, - isAdult: Boolean + isAdult: Boolean, + effectiveGender: Gender? ): List { val dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") val date = LocalDate.parse(dateString, dateTimeFormatter).atStartOfDay() @@ -328,7 +334,8 @@ class LiveRoomService( limit = pageable.pageSize.toLong(), memberId = memberId, isCreator = isCreator, - isAdult = isAdult + isAdult = isAdult, + effectiveGender = effectiveGender ) } @@ -336,9 +343,10 @@ class LiveRoomService( timezone: String, memberId: Long?, isCreator: Boolean, - isAdult: Boolean + isAdult: Boolean, + effectiveGender: Gender? ): List { - return repository.getLiveRoomListReservationWithoutDate(timezone, memberId, isCreator, isAdult) + return repository.getLiveRoomListReservationWithoutDate(timezone, memberId, isCreator, isAdult, effectiveGender) } @Transactional @@ -400,7 +408,8 @@ class LiveRoomService( }, type = request.type, password = request.password, - isAvailableJoinCreator = request.isAvailableJoinCreator + isAvailableJoinCreator = request.isAvailableJoinCreator, + genderRestriction = request.genderRestriction ) room.member = member @@ -479,7 +488,8 @@ class LiveRoomService( isAuth = createdRoom.isAdult, isAvailableJoinCreator = createdRoom.isAvailableJoinCreator, roomId = createdRoom.id, - creatorId = createdRoom.member!!.id + creatorId = createdRoom.member!!.id, + genderRestriction = createdRoom.genderRestriction ) ) @@ -494,6 +504,10 @@ class LiveRoomService( throw SodaException(messageKey = "live.room.adult_verification_required") } + if (!member.canEnter(room.genderRestriction) && room.member!!.id!! != member.id!!) { + throw SodaException(messageKey = "live.room.gender_restricted") + } + val beginDateTime = room.beginDateTime .atZone(ZoneId.of("UTC")) .withZoneSameInstant(ZoneId.of(timezone)) @@ -521,6 +535,7 @@ class LiveRoomService( isPaid = false, isAdult = room.isAdult, isPrivateRoom = room.type == LiveRoomType.PRIVATE, + genderRestriction = room.genderRestriction, password = room.password ) response.manager = GetRoomDetailManager(room.member!!, cloudFrontHost = cloudFrontHost) @@ -640,7 +655,8 @@ class LiveRoomService( isAuth = room.isAdult, isAvailableJoinCreator = room.isAvailableJoinCreator, roomId = room.id, - creatorId = room.member!!.id + creatorId = room.member!!.id, + genderRestriction = room.genderRestriction ) ) } @@ -739,6 +755,10 @@ class LiveRoomService( ) } + if (room.member!!.id!! != member.id!! && !member.canEnter(room.genderRestriction)) { + throw SodaException(messageKey = "live.room.gender_restricted") + } + val lock = getOrCreateLock(memberId = member.id!!) lock.write { var roomInfo = roomInfoRepository.findByIdOrNull(request.roomId) @@ -853,6 +873,10 @@ class LiveRoomService( room.isAdult = request.isAdult } + if (request.genderRestriction != null) { + room.genderRestriction = request.genderRestriction + } + if (request.isActiveMenuPan != null) { if (request.isActiveMenuPan) { if (request.menuPanId > 0) { diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/detail/GetRoomDetailResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/detail/GetRoomDetailResponse.kt index 1ca4ba46..a97b0460 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/detail/GetRoomDetailResponse.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/detail/GetRoomDetailResponse.kt @@ -1,5 +1,6 @@ package kr.co.vividnext.sodalive.live.room.detail +import kr.co.vividnext.sodalive.live.room.GenderRestriction import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.member.MemberRole @@ -11,6 +12,7 @@ data class GetRoomDetailResponse( var isPaid: Boolean, val isAdult: Boolean, val isPrivateRoom: Boolean, + val genderRestriction: GenderRestriction, val password: String?, val tags: List, val channelName: String?, diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/Member.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/Member.kt index 0a588b94..2eaa42f3 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/Member.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/Member.kt @@ -2,6 +2,7 @@ package kr.co.vividnext.sodalive.member import kr.co.vividnext.sodalive.common.BaseEntity import kr.co.vividnext.sodalive.explorer.GetExplorerSectionCreatorResponse +import kr.co.vividnext.sodalive.live.room.GenderRestriction import kr.co.vividnext.sodalive.member.auth.Auth import kr.co.vividnext.sodalive.member.following.CreatorFollowing import kr.co.vividnext.sodalive.member.notification.MemberNotification @@ -148,6 +149,22 @@ data class Member( follow = follow ) } + + fun canEnter(restriction: GenderRestriction): Boolean { + val effectiveGender = if (auth != null) { + if (auth!!.gender == 1) Gender.MALE else Gender.FEMALE + } else { + gender + } + + if (effectiveGender == Gender.NONE) return true + + return when (restriction) { + GenderRestriction.ALL -> true + GenderRestriction.MALE_ONLY -> effectiveGender == Gender.MALE + GenderRestriction.FEMALE_ONLY -> effectiveGender == Gender.FEMALE + } + } } enum class Gender { 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 7b09a29e..a83afc6e 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberRepository.kt @@ -5,6 +5,7 @@ import kr.co.vividnext.sodalive.fcm.PushTokenInfo import kr.co.vividnext.sodalive.fcm.QPushToken.pushToken import kr.co.vividnext.sodalive.fcm.QPushTokenInfo import kr.co.vividnext.sodalive.live.reservation.QLiveReservation.liveReservation +import kr.co.vividnext.sodalive.live.room.GenderRestriction import kr.co.vividnext.sodalive.live.room.QLiveRoom.liveRoom import kr.co.vividnext.sodalive.member.QMember.member import kr.co.vividnext.sodalive.member.auth.QAuth.auth @@ -35,14 +36,16 @@ interface MemberQueryRepository { fun getCreateLiveRoomNotificationRecipientPushTokens( creatorId: Long, isAuth: Boolean, - isAvailableJoinCreator: Boolean + isAvailableJoinCreator: Boolean, + genderRestriction: GenderRestriction? = null ): List fun getStartLiveRoomNotificationRecipientPushTokens( creatorId: Long, roomId: Long, isAuth: Boolean, - isAvailableJoinCreator: Boolean + isAvailableJoinCreator: Boolean, + genderRestriction: GenderRestriction? = null ): List fun getUploadContentNotificationRecipientPushTokens( @@ -132,7 +135,8 @@ class MemberQueryRepositoryImpl( override fun getCreateLiveRoomNotificationRecipientPushTokens( creatorId: Long, isAuth: Boolean, - isAvailableJoinCreator: Boolean + isAvailableJoinCreator: Boolean, + genderRestriction: GenderRestriction? ): List { val member = QMember.member val creator = QMember.member @@ -158,6 +162,10 @@ class MemberQueryRepositoryImpl( where = where.and(creatorFollowing.member.role.ne(MemberRole.CREATOR)) } + if (genderRestriction != null && genderRestriction != GenderRestriction.ALL) { + where = where.and(getGenderCondition(genderRestriction)) + } + return queryFactory .select( QPushTokenInfo( @@ -180,7 +188,8 @@ class MemberQueryRepositoryImpl( creatorId: Long, roomId: Long, isAuth: Boolean, - isAvailableJoinCreator: Boolean + isAvailableJoinCreator: Boolean, + genderRestriction: GenderRestriction? ): List { val member = QMember.member val creator = QMember.member @@ -206,6 +215,10 @@ class MemberQueryRepositoryImpl( where = where.and(creatorFollowing.member.role.ne(MemberRole.CREATOR)) } + if (genderRestriction != null && genderRestriction != GenderRestriction.ALL) { + where = where.and(getGenderCondition(genderRestriction)) + } + val followingMemberPushToken = queryFactory .select( QPushTokenInfo( @@ -237,6 +250,10 @@ class MemberQueryRepositoryImpl( where = where.and(auth.isNotNull) } + if (genderRestriction != null && genderRestriction != GenderRestriction.ALL) { + where = where.and(getGenderCondition(genderRestriction, liveReservation.member)) + } + val reservationMemberPushToken = queryFactory .select( QPushTokenInfo( @@ -256,6 +273,33 @@ class MemberQueryRepositoryImpl( return (followingMemberPushToken + reservationMemberPushToken).distinctBy { it.token } } + private fun getGenderCondition( + genderRestriction: GenderRestriction, + qMember: QMember = member + ) = when (genderRestriction) { + GenderRestriction.MALE_ONLY -> { + auth.isNotNull.and(auth.gender.eq(1)) + .or( + auth.isNull.and( + qMember.gender.eq(Gender.MALE) + .or(qMember.gender.eq(Gender.NONE)) + ) + ) + } + + GenderRestriction.FEMALE_ONLY -> { + auth.isNotNull.and(auth.gender.eq(0)) + .or( + auth.isNull.and( + qMember.gender.eq(Gender.FEMALE) + .or(qMember.gender.eq(Gender.NONE)) + ) + ) + } + + else -> null + } + override fun getUploadContentNotificationRecipientPushTokens( creatorId: Long, isAuth: Boolean