Merge pull request '메시지 보내기 유저 검색' (#91) from test into main

Reviewed-on: #91
This commit is contained in:
klaus 2023-11-20 05:41:57 +00:00
commit 9e2c1474db
6 changed files with 40 additions and 28 deletions

View File

@ -240,6 +240,6 @@ class LiveRoomController(
) = run { ) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.") if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
ApiResponse.ok(visitService.getRecentVisitRoomUsers(member.id!!)) ApiResponse.ok(visitService.getRecentVisitRoomUsers(member))
} }
} }

View File

@ -5,6 +5,7 @@ import kr.co.vividnext.sodalive.live.room.QLiveRoom.liveRoom
import kr.co.vividnext.sodalive.live.room.visit.QLiveRoomVisit.liveRoomVisit import kr.co.vividnext.sodalive.live.room.visit.QLiveRoomVisit.liveRoomVisit
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.MemberRole
import kr.co.vividnext.sodalive.member.QMember
import kr.co.vividnext.sodalive.member.QMember.member import kr.co.vividnext.sodalive.member.QMember.member
import org.springframework.data.jpa.repository.JpaRepository import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.stereotype.Repository import org.springframework.stereotype.Repository
@ -15,7 +16,7 @@ interface LiveRoomVisitRepository : JpaRepository<LiveRoomVisit, Long>, LiveRoom
interface LiveRoomVisitQueryRepository { interface LiveRoomVisitQueryRepository {
fun findByRoomIdAndMemberId(roomId: Long, memberId: Long): LiveRoomVisit? fun findByRoomIdAndMemberId(roomId: Long, memberId: Long): LiveRoomVisit?
fun findFirstByMemberIdOrderByUpdatedAtDesc(memberId: Long): LiveRoomVisit? fun findFirstByMemberIdOrderByUpdatedAtDesc(memberId: Long): LiveRoomVisit?
fun getRecentVisitRoomUsers(roomId: Long, memberId: Long): List<Member> fun getRecentVisitRoomUsers(roomId: Long, member: Member): List<Member>
} }
@Repository @Repository
@ -43,19 +44,25 @@ class LiveRoomVisitQueryRepositoryImpl(private val queryFactory: JPAQueryFactory
.fetchFirst() .fetchFirst()
} }
override fun getRecentVisitRoomUsers(roomId: Long, memberId: Long): List<Member> { override fun getRecentVisitRoomUsers(roomId: Long, member: Member): List<Member> {
var where = liveRoomVisit.room.id.eq(roomId)
.and(liveRoomVisit.member.isActive.isTrue)
.and(liveRoomVisit.member.id.ne(member.id))
.and(liveRoomVisit.member.role.ne(MemberRole.ADMIN))
.and(liveRoomVisit.member.role.ne(MemberRole.AGENT))
.and(liveRoomVisit.member.role.ne(MemberRole.BOT))
if (member.role == MemberRole.USER) {
where = where
.and(liveRoomVisit.member.role.ne(MemberRole.USER))
}
return queryFactory return queryFactory
.select(member) .select(QMember.member)
.from(liveRoomVisit) .from(liveRoomVisit)
.innerJoin(liveRoomVisit.member, member) .innerJoin(liveRoomVisit.member, QMember.member)
.innerJoin(liveRoomVisit.room, liveRoom) .innerJoin(liveRoomVisit.room, liveRoom)
.where( .where(where)
liveRoomVisit.room.id.eq(roomId)
.and(liveRoomVisit.member.isActive.isTrue)
.and(liveRoomVisit.member.id.ne(memberId))
.and(liveRoomVisit.member.role.ne(MemberRole.ADMIN))
.and(liveRoomVisit.member.role.ne(MemberRole.AGENT))
)
.fetch() .fetch()
} }
} }

View File

@ -30,11 +30,11 @@ class LiveRoomVisitService(
repository.save(roomVisit) repository.save(roomVisit)
} }
fun getRecentVisitRoomUsers(memberId: Long): List<GetRoomDetailUser> { fun getRecentVisitRoomUsers(member: Member): List<GetRoomDetailUser> {
val roomVisit = repository.findFirstByMemberIdOrderByUpdatedAtDesc(memberId) val roomVisit = repository.findFirstByMemberIdOrderByUpdatedAtDesc(member.id!!)
?: return emptyList() ?: return emptyList()
return repository.getRecentVisitRoomUsers(roomVisit.room!!.id!!, memberId) return repository.getRecentVisitRoomUsers(roomVisit.room!!.id!!, member)
.asSequence() .asSequence()
.map { GetRoomDetailUser(it, cloudFrontHost) } .map { GetRoomDetailUser(it, cloudFrontHost) }
.toList() .toList()

View File

@ -165,7 +165,7 @@ class MemberController(private val service: MemberService) {
) = run { ) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.") if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
ApiResponse.ok(service.searchMember(nickname = nickname, memberId = member.id!!)) ApiResponse.ok(service.searchMember(nickname = nickname, member = member))
} }
@PostMapping("/sign_out") @PostMapping("/sign_out")

View File

@ -23,7 +23,7 @@ interface MemberRepository : JpaRepository<Member, Long>, MemberQueryRepository
interface MemberQueryRepository { interface MemberQueryRepository {
fun findByPushToken(pushToken: String): List<Member> fun findByPushToken(pushToken: String): List<Member>
fun findByNicknameAndOtherCondition(nickname: String, memberId: Long): List<Member> fun findByNicknameAndOtherCondition(nickname: String, member: Member): List<Member>
fun findCreatorByIdOrNull(memberId: Long): Member? fun findCreatorByIdOrNull(memberId: Long): Member?
fun getAllRecipientPushTokens(isAuth: Boolean, container: String): List<List<String>> fun getAllRecipientPushTokens(isAuth: Boolean, container: String): List<List<String>>
fun getCreateLiveRoomNotificationRecipientPushTokens( fun getCreateLiveRoomNotificationRecipientPushTokens(
@ -66,15 +66,20 @@ class MemberQueryRepositoryImpl(
.fetch() .fetch()
} }
override fun findByNicknameAndOtherCondition(nickname: String, memberId: Long): List<Member> { override fun findByNicknameAndOtherCondition(nickname: String, member: Member): List<Member> {
var where = QMember.member.nickname.containsIgnoreCase(nickname)
.and(QMember.member.id.ne(member.id))
.and(QMember.member.role.ne(MemberRole.ADMIN))
.and(QMember.member.role.ne(MemberRole.AGENT))
.and(QMember.member.role.ne(MemberRole.BOT))
if (member.role == MemberRole.USER) {
where = where.and(QMember.member.role.ne(MemberRole.USER))
}
return queryFactory return queryFactory
.selectFrom(member) .selectFrom(QMember.member)
.where( .where(where)
member.nickname.containsIgnoreCase(nickname)
.and(member.id.ne(memberId))
.and(member.role.ne(MemberRole.ADMIN))
.and(member.role.ne(MemberRole.AGENT))
)
.fetch() .fetch()
} }

View File

@ -382,14 +382,14 @@ class MemberService(
fun isBlocked(blockedMemberId: Long, memberId: Long) = blockMemberRepository.isBlocked(blockedMemberId, memberId) fun isBlocked(blockedMemberId: Long, memberId: Long) = blockMemberRepository.isBlocked(blockedMemberId, memberId)
fun searchMember(nickname: String, memberId: Long): List<GetRoomDetailUser> { fun searchMember(nickname: String, member: Member): List<GetRoomDetailUser> {
if (nickname.length < 2) { if (nickname.length < 2) {
throw SodaException("두 글자 이상 입력 하셔야 합니다.") throw SodaException("두 글자 이상 입력 하셔야 합니다.")
} }
return repository.findByNicknameAndOtherCondition(nickname, memberId) return repository.findByNicknameAndOtherCondition(nickname, member)
.asSequence() .asSequence()
.filter { !blockMemberRepository.isBlocked(blockedMemberId = memberId, memberId = it.id!!) } .filter { !blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it.id!!) }
.map { .map {
GetRoomDetailUser(it, cloudFrontHost) GetRoomDetailUser(it, cloudFrontHost)
} }