메시지 API

This commit is contained in:
2023-08-02 14:04:31 +09:00
parent c25b105d4d
commit b3d72ead1f
12 changed files with 685 additions and 2 deletions

View File

@@ -5,6 +5,7 @@ import kr.co.vividnext.sodalive.common.SodaException
import kr.co.vividnext.sodalive.live.room.cancel.CancelLiveRequest
import kr.co.vividnext.sodalive.live.room.donation.DeleteLiveRoomDonationMessage
import kr.co.vividnext.sodalive.live.room.donation.LiveRoomDonationRequest
import kr.co.vividnext.sodalive.live.room.visit.LiveRoomVisitService
import kr.co.vividnext.sodalive.member.Member
import org.springframework.data.domain.Pageable
import org.springframework.security.core.annotation.AuthenticationPrincipal
@@ -22,7 +23,10 @@ import org.springframework.web.multipart.MultipartFile
@RestController
@RequestMapping("/live/room")
class LiveRoomController(private val service: LiveRoomService) {
class LiveRoomController(
private val service: LiveRoomService,
private val visitService: LiveRoomVisitService
) {
@GetMapping
fun getRoomList(
@@ -229,4 +233,13 @@ class LiveRoomController(private val service: LiveRoomService) {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
ApiResponse.ok(service.quitRoom(roomId, member))
}
@GetMapping("/recent_visit_room/users")
fun recentVisitRoomUsers(
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
ApiResponse.ok(visitService.getRecentVisitRoomUsers(member.id!!))
}
}

View File

@@ -3,6 +3,8 @@ package kr.co.vividnext.sodalive.live.room.visit
import com.querydsl.jpa.impl.JPAQueryFactory
import kr.co.vividnext.sodalive.live.room.QLiveRoom.liveRoom
import kr.co.vividnext.sodalive.live.room.visit.QLiveRoomVisit.liveRoomVisit
import kr.co.vividnext.sodalive.member.Member
import kr.co.vividnext.sodalive.member.MemberRole
import kr.co.vividnext.sodalive.member.QMember.member
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.stereotype.Repository
@@ -13,6 +15,7 @@ interface LiveRoomVisitRepository : JpaRepository<LiveRoomVisit, Long>, LiveRoom
interface LiveRoomVisitQueryRepository {
fun findByRoomIdAndMemberId(roomId: Long, memberId: Long): LiveRoomVisit?
fun findFirstByMemberIdOrderByUpdatedAtDesc(memberId: Long): LiveRoomVisit?
fun getRecentVisitRoomUsers(roomId: Long, memberId: Long): List<Member>
}
@Repository
@@ -38,4 +41,17 @@ class LiveRoomVisitQueryRepositoryImpl(private val queryFactory: JPAQueryFactory
.orderBy(liveRoomVisit.updatedAt.desc())
.fetchFirst()
}
override fun getRecentVisitRoomUsers(roomId: Long, memberId: Long): List<Member> {
return queryFactory
.selectFrom(member)
.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()
}
}

View File

@@ -1,14 +1,21 @@
package kr.co.vividnext.sodalive.live.room.visit
import kr.co.vividnext.sodalive.live.room.LiveRoom
import kr.co.vividnext.sodalive.live.room.detail.GetRoomDetailUser
import kr.co.vividnext.sodalive.member.Member
import org.springframework.beans.factory.annotation.Value
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional
import java.time.LocalDateTime
@Service
@Transactional(readOnly = true)
class LiveRoomVisitService(private val repository: LiveRoomVisitRepository) {
class LiveRoomVisitService(
private val repository: LiveRoomVisitRepository,
@Value("\${cloud.aws.cloud-front.host}")
private val cloudFrontHost: String
) {
@Transactional
fun roomVisit(room: LiveRoom, member: Member) {
var roomVisit = repository.findByRoomIdAndMemberId(room.id!!, member.id!!)
@@ -22,4 +29,14 @@ class LiveRoomVisitService(private val repository: LiveRoomVisitRepository) {
repository.save(roomVisit)
}
fun getRecentVisitRoomUsers(memberId: Long): List<GetRoomDetailUser> {
val roomVisit = repository.findFirstByMemberIdOrderByUpdatedAtDesc(memberId)
?: return emptyList()
return repository.getRecentVisitRoomUsers(roomVisit.room!!.id!!, memberId)
.asSequence()
.map { GetRoomDetailUser(it, cloudFrontHost) }
.toList()
}
}