diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomController.kt index 4f7fd58..994a7cb 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomController.kt @@ -223,10 +223,9 @@ class LiveRoomController(private val service: LiveRoomService) { @PostMapping("/quit") fun quitRoom( - @RequestParam("id") roomId: Long, @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? ) = run { if (member == null) throw SodaException("로그인 정보를 확인해주세요.") - ApiResponse.ok(service.quitRoom(roomId, member)) + ApiResponse.ok(service.quitRoom(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 62e6967..9761c77 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 @@ -843,19 +843,24 @@ class LiveRoomService( ) } - fun quitRoom(roomId: Long, member: Member) { - val room = repository.getLiveRoom(roomId) - val roomInfo = roomInfoRepository.findByIdOrNull(roomId) - if (roomInfo != null) { - if (room?.member != null && room.member!! == member) { - room.isActive = false - kickOutService.deleteKickOutData(roomId = room.id!!) - roomInfoRepository.deleteById(roomInfo.roomId) - } else { - roomInfo.removeSpeaker(member) - roomInfo.removeListener(member) - roomInfo.removeManager(member) - roomInfoRepository.save(roomInfo) + fun quitRoom(member: Member) { + val roomVisit = roomVisitService.getLatestRoomVisit(member.id!!) + + val roomId = roomVisit?.room?.id + if (roomId != null) { + val roomInfo = roomInfoRepository.findByIdOrNull(roomId) + if (roomInfo != null) { + val room = repository.getLiveRoom(roomId) ?: return + if (room.member != null && room.member!! == member) { + room.isActive = false + kickOutService.deleteKickOutData(roomId = room.id!!) + roomInfoRepository.deleteById(roomInfo.roomId) + } else { + roomInfo.removeSpeaker(member) + roomInfo.removeListener(member) + roomInfo.removeManager(member) + roomInfoRepository.save(roomInfo) + } } } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/visit/LiveRoomVisitRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/visit/LiveRoomVisitRepository.kt index b90ce96..2eed38f 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/visit/LiveRoomVisitRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/visit/LiveRoomVisitRepository.kt @@ -13,6 +13,7 @@ interface LiveRoomVisitRepository : JpaRepository, LiveRoom interface LiveRoomVisitQueryRepository { fun findByRoomIdAndMemberId(roomId: Long, memberId: Long): LiveRoomVisit? fun findFirstByMemberIdOrderByUpdatedAtDesc(memberId: Long): LiveRoomVisit? + fun getLatestRoomVisit(memberId: Long): LiveRoomVisit? } @Repository @@ -38,4 +39,13 @@ class LiveRoomVisitQueryRepositoryImpl(private val queryFactory: JPAQueryFactory .orderBy(liveRoomVisit.updatedAt.desc()) .fetchFirst() } + + override fun getLatestRoomVisit(memberId: Long): LiveRoomVisit? { + return queryFactory + .selectFrom(liveRoomVisit) + .innerJoin(liveRoomVisit.member, member) + .where(member.id.eq(memberId)) + .orderBy(liveRoomVisit.updatedAt.desc()) + .fetchFirst() + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/visit/LiveRoomVisitService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/visit/LiveRoomVisitService.kt index df18ba1..a0cda13 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/visit/LiveRoomVisitService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/visit/LiveRoomVisitService.kt @@ -22,4 +22,8 @@ class LiveRoomVisitService(private val repository: LiveRoomVisitRepository) { repository.save(roomVisit) } + + fun getLatestRoomVisit(memberId: Long): LiveRoomVisit? { + return repository.getLatestRoomVisit(memberId) + } }