라이브룸 성별 제한 추가
라이브룸 생성/수정 요청에 genderRestriction 필드 추가 라이브룸 상세 응답에 genderRestriction 필드 추가
This commit is contained in:
@@ -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
|
||||
)
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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<LiveRoom>
|
||||
|
||||
fun getLiveRoomListReservationWithDate(
|
||||
@@ -41,14 +44,16 @@ interface LiveRoomQueryRepository {
|
||||
limit: Long,
|
||||
memberId: Long?,
|
||||
isCreator: Boolean,
|
||||
isAdult: Boolean
|
||||
isAdult: Boolean,
|
||||
effectiveGender: Gender?
|
||||
): List<LiveRoom>
|
||||
|
||||
fun getLiveRoomListReservationWithoutDate(
|
||||
timezone: String,
|
||||
memberId: Long?,
|
||||
isCreator: Boolean,
|
||||
isAdult: Boolean
|
||||
isAdult: Boolean,
|
||||
effectiveGender: Gender?
|
||||
): List<LiveRoom>
|
||||
|
||||
fun getLiveRoom(id: Long): LiveRoom?
|
||||
@@ -76,7 +81,8 @@ class LiveRoomQueryRepositoryImpl(
|
||||
timezone: String,
|
||||
memberId: Long?,
|
||||
isCreator: Boolean,
|
||||
isAdult: Boolean
|
||||
isAdult: Boolean,
|
||||
effectiveGender: Gender?
|
||||
): List<LiveRoom> {
|
||||
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<LiveRoom> {
|
||||
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<LiveRoom> {
|
||||
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()
|
||||
|
||||
@@ -193,13 +193,21 @@ class LiveRoomService(
|
||||
member: Member?,
|
||||
timezone: String
|
||||
): List<GetRoomListResponse> {
|
||||
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<LiveRoom> {
|
||||
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<LiveRoom> {
|
||||
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<LiveRoom> {
|
||||
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) {
|
||||
|
||||
@@ -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<String>,
|
||||
val channelName: String?,
|
||||
|
||||
Reference in New Issue
Block a user