라이브 방 - 아고라 설정 및 라이브 방 관련 API

This commit is contained in:
2023-08-01 04:56:47 +09:00
parent f393c7630e
commit 58a7f87ffd
37 changed files with 1823 additions and 6 deletions

View File

@@ -2,6 +2,8 @@ package kr.co.vividnext.sodalive.member
import kr.co.vividnext.sodalive.common.ApiResponse
import kr.co.vividnext.sodalive.common.SodaException
import kr.co.vividnext.sodalive.member.block.MemberBlockRequest
import kr.co.vividnext.sodalive.member.following.CreatorFollowRequest
import kr.co.vividnext.sodalive.member.login.LoginRequest
import kr.co.vividnext.sodalive.member.notification.UpdateNotificationSettingRequest
import org.springframework.security.core.annotation.AuthenticationPrincipal
@@ -72,4 +74,44 @@ class MemberController(private val service: MemberService) {
ApiResponse.ok(service.getMyPage(member, container))
}
@PostMapping("/creator/follow")
fun creatorFollow(
@RequestBody request: CreatorFollowRequest,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
ApiResponse.ok(service.creatorFollow(creatorId = request.creatorId, memberId = member.id!!))
}
@PostMapping("/creator/unfollow")
fun creatorUnFollow(
@RequestBody request: CreatorFollowRequest,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
ApiResponse.ok(service.creatorUnFollow(creatorId = request.creatorId, memberId = member.id!!))
}
@PostMapping("/block")
fun memberBlock(
@RequestBody request: MemberBlockRequest,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
ApiResponse.ok(service.memberBlock(request = request, memberId = member.id!!))
}
@PostMapping("/unblock")
fun memberUnBlock(
@RequestBody request: MemberBlockRequest,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
ApiResponse.ok(service.memberUnBlock(request = request, memberId = member.id!!))
}
}

View File

@@ -6,6 +6,11 @@ import kr.co.vividnext.sodalive.aws.s3.S3Uploader
import kr.co.vividnext.sodalive.common.ApiResponse
import kr.co.vividnext.sodalive.common.SodaException
import kr.co.vividnext.sodalive.jwt.TokenProvider
import kr.co.vividnext.sodalive.member.block.BlockMember
import kr.co.vividnext.sodalive.member.block.BlockMemberRepository
import kr.co.vividnext.sodalive.member.block.MemberBlockRequest
import kr.co.vividnext.sodalive.member.following.CreatorFollowing
import kr.co.vividnext.sodalive.member.following.CreatorFollowingRepository
import kr.co.vividnext.sodalive.member.info.GetMemberInfoResponse
import kr.co.vividnext.sodalive.member.login.LoginRequest
import kr.co.vividnext.sodalive.member.login.LoginResponse
@@ -39,6 +44,8 @@ class MemberService(
private val repository: MemberRepository,
private val stipulationRepository: StipulationRepository,
private val stipulationAgreeRepository: StipulationAgreeRepository,
private val creatorFollowingRepository: CreatorFollowingRepository,
private val blockMemberRepository: BlockMemberRepository,
private val memberNotificationService: MemberNotificationService,
@@ -264,4 +271,61 @@ class MemberService(
return MemberAdapter(member)
}
@Transactional
fun creatorFollow(creatorId: Long, memberId: Long) {
val creatorFollowing = creatorFollowingRepository.findByCreatorIdAndMemberId(
creatorId = creatorId,
memberId = memberId
)
if (creatorFollowing == null) {
val creator = repository.findByIdOrNull(creatorId) ?: throw SodaException("크리에이터 정보를 확인해주세요.")
val member = repository.findByIdOrNull(memberId) ?: throw SodaException("로그인 정보를 확인해주세요.")
creatorFollowingRepository.save(CreatorFollowing(creator = creator, member = member))
} else {
creatorFollowing.isActive = true
}
}
@Transactional
fun creatorUnFollow(creatorId: Long, memberId: Long) {
val creatorFollowing = creatorFollowingRepository.findByCreatorIdAndMemberId(
creatorId = creatorId,
memberId = memberId
)
if (creatorFollowing != null) {
creatorFollowing.isActive = false
}
}
fun memberBlock(request: MemberBlockRequest, memberId: Long) {
var blockMember = blockMemberRepository.getBlockAccount(
blockedMemberId = request.blockMemberId,
memberId = memberId
)
if (blockMember == null) {
blockMember = BlockMember(
blockedMemberId = request.blockMemberId,
memberId = memberId
)
blockMemberRepository.save(blockMember)
} else {
blockMember.isActive = true
}
}
fun memberUnBlock(request: MemberBlockRequest, memberId: Long) {
val blockMember = blockMemberRepository.getBlockAccount(
blockedMemberId = request.blockMemberId,
memberId = memberId
)
if (blockMember != null) {
blockMember.isActive = true
}
}
}

View File

@@ -0,0 +1,12 @@
package kr.co.vividnext.sodalive.member.block
import kr.co.vividnext.sodalive.common.BaseEntity
import javax.persistence.Entity
@Entity
data class BlockMember(
val blockedMemberId: Long,
val memberId: Long
) : BaseEntity() {
var isActive: Boolean = true
}

View File

@@ -0,0 +1,27 @@
package kr.co.vividnext.sodalive.member.block
import com.querydsl.jpa.impl.JPAQueryFactory
import kr.co.vividnext.sodalive.member.block.QBlockMember.blockMember
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.stereotype.Repository
@Repository
interface BlockMemberRepository : JpaRepository<BlockMember, Long>, BlockMemberQueryRepository
interface BlockMemberQueryRepository {
fun getBlockAccount(blockedMemberId: Long, memberId: Long): BlockMember?
}
@Repository
class BlockMemberQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : BlockMemberQueryRepository {
override fun getBlockAccount(blockedMemberId: Long, memberId: Long): BlockMember? {
return queryFactory
.selectFrom(blockMember)
.where(
blockMember.blockedMemberId.eq(blockedMemberId)
.and(blockMember.memberId.eq(memberId))
)
.orderBy(blockMember.id.desc())
.fetchFirst()
}
}

View File

@@ -0,0 +1,3 @@
package kr.co.vividnext.sodalive.member.block
data class MemberBlockRequest(val blockMemberId: Long)

View File

@@ -0,0 +1,3 @@
package kr.co.vividnext.sodalive.member.following
data class CreatorFollowRequest(val creatorId: Long)

View File

@@ -0,0 +1,23 @@
package kr.co.vividnext.sodalive.member.following
import kr.co.vividnext.sodalive.common.BaseEntity
import kr.co.vividnext.sodalive.member.Member
import javax.persistence.Entity
import javax.persistence.FetchType
import javax.persistence.JoinColumn
import javax.persistence.ManyToOne
@Entity
class CreatorFollowing(
// 유저가 알림받기 한 크리에이터
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "creator_id", nullable = false)
var creator: Member,
// 크리에이터를 알림받기 한 유저
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id", nullable = false)
var member: Member,
var isActive: Boolean = true
) : BaseEntity()

View File

@@ -0,0 +1,28 @@
package kr.co.vividnext.sodalive.member.following
import com.querydsl.jpa.impl.JPAQueryFactory
import kr.co.vividnext.sodalive.member.following.QCreatorFollowing.creatorFollowing
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.stereotype.Repository
@Repository
interface CreatorFollowingRepository : JpaRepository<CreatorFollowing, Long>, CreatorFollowingQueryRepository
interface CreatorFollowingQueryRepository {
fun findByCreatorIdAndMemberId(creatorId: Long, memberId: Long): CreatorFollowing?
}
@Repository
class CreatorFollowingQueryRepositoryImpl(
private val queryFactory: JPAQueryFactory
) : CreatorFollowingQueryRepository {
override fun findByCreatorIdAndMemberId(creatorId: Long, memberId: Long): CreatorFollowing? {
return queryFactory
.selectFrom(creatorFollowing)
.where(
creatorFollowing.creator.id.eq(creatorId)
.and(creatorFollowing.member.id.eq(memberId))
)
.fetchFirst()
}
}