| @@ -195,6 +195,7 @@ class LiveRecommendRepository( | |||||||
|                     .and(member.id.notIn(withOutCreatorList)) |                     .and(member.id.notIn(withOutCreatorList)) | ||||||
|                     .and(creatorFollowing.isActive.isTrue) |                     .and(creatorFollowing.isActive.isTrue) | ||||||
|                     .and(creatorFollowing.member.id.eq(memberId)) |                     .and(creatorFollowing.member.id.eq(memberId)) | ||||||
|  |                     .and(creatorFollowing.member.isActive.isTrue) | ||||||
|             ) |             ) | ||||||
|             .orderBy(Expressions.numberTemplate(Double::class.java, "function('rand')").asc()) |             .orderBy(Expressions.numberTemplate(Double::class.java, "function('rand')").asc()) | ||||||
|             .limit(limit) |             .limit(limit) | ||||||
| @@ -209,6 +210,7 @@ class LiveRecommendRepository( | |||||||
|             .and(member.isActive.isTrue) |             .and(member.isActive.isTrue) | ||||||
|             .and(creatorFollowing.isActive.isTrue) |             .and(creatorFollowing.isActive.isTrue) | ||||||
|             .and(creatorFollowing.member.id.eq(memberId)) |             .and(creatorFollowing.member.id.eq(memberId)) | ||||||
|  |             .and(creatorFollowing.member.isActive.isTrue) | ||||||
|  |  | ||||||
|         return queryFactory |         return queryFactory | ||||||
|             .select(creatorFollowing.creator.id) |             .select(creatorFollowing.creator.id) | ||||||
| @@ -233,6 +235,7 @@ class LiveRecommendRepository( | |||||||
|             .and(member.isActive.isTrue) |             .and(member.isActive.isTrue) | ||||||
|             .and(creatorFollowing.isActive.isTrue) |             .and(creatorFollowing.isActive.isTrue) | ||||||
|             .and(creatorFollowing.member.id.eq(memberId)) |             .and(creatorFollowing.member.id.eq(memberId)) | ||||||
|  |             .and(creatorFollowing.member.isActive.isTrue) | ||||||
|  |  | ||||||
|         return queryFactory |         return queryFactory | ||||||
|             .select( |             .select( | ||||||
|   | |||||||
| @@ -6,6 +6,7 @@ import kr.co.vividnext.sodalive.member.block.MemberBlockRequest | |||||||
| import kr.co.vividnext.sodalive.member.following.CreatorFollowRequest | import kr.co.vividnext.sodalive.member.following.CreatorFollowRequest | ||||||
| import kr.co.vividnext.sodalive.member.login.LoginRequest | import kr.co.vividnext.sodalive.member.login.LoginRequest | ||||||
| import kr.co.vividnext.sodalive.member.notification.UpdateNotificationSettingRequest | import kr.co.vividnext.sodalive.member.notification.UpdateNotificationSettingRequest | ||||||
|  | import org.springframework.data.domain.Pageable | ||||||
| import org.springframework.security.core.annotation.AuthenticationPrincipal | import org.springframework.security.core.annotation.AuthenticationPrincipal | ||||||
| import org.springframework.security.core.userdetails.User | import org.springframework.security.core.userdetails.User | ||||||
| import org.springframework.web.bind.annotation.GetMapping | import org.springframework.web.bind.annotation.GetMapping | ||||||
| @@ -153,6 +154,32 @@ class MemberController(private val service: MemberService) { | |||||||
|         ApiResponse.ok(service.creatorUnFollow(creatorId = request.creatorId, memberId = member.id!!)) |         ApiResponse.ok(service.creatorUnFollow(creatorId = request.creatorId, memberId = member.id!!)) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     @GetMapping("/block/id") | ||||||
|  |     fun getBlockedMemberIdList( | ||||||
|  |         @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?, | ||||||
|  |         pageable: Pageable | ||||||
|  |     ) = run { | ||||||
|  |         if (member == null) throw SodaException("로그인 정보를 확인해주세요.") | ||||||
|  |  | ||||||
|  |         ApiResponse.ok(service.getBlockedMemberIdList(member.id!!)) | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @GetMapping("/block") | ||||||
|  |     fun getBlockedMemberList( | ||||||
|  |         @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?, | ||||||
|  |         pageable: Pageable | ||||||
|  |     ) = run { | ||||||
|  |         if (member == null) throw SodaException("로그인 정보를 확인해주세요.") | ||||||
|  |  | ||||||
|  |         ApiResponse.ok( | ||||||
|  |             service.getBlockedMemberList( | ||||||
|  |                 member.id!!, | ||||||
|  |                 offset = pageable.offset, | ||||||
|  |                 limit = pageable.pageSize.toLong() | ||||||
|  |             ) | ||||||
|  |         ) | ||||||
|  |     } | ||||||
|  |  | ||||||
|     @PostMapping("/block") |     @PostMapping("/block") | ||||||
|     fun memberBlock( |     fun memberBlock( | ||||||
|         @RequestBody request: MemberBlockRequest, |         @RequestBody request: MemberBlockRequest, | ||||||
|   | |||||||
| @@ -135,7 +135,7 @@ class MemberQueryRepositoryImpl( | |||||||
|             .and(creatorFollowing.member.email.notIn("admin@sodalive.net")) |             .and(creatorFollowing.member.email.notIn("admin@sodalive.net")) | ||||||
|             .and( |             .and( | ||||||
|                 creatorFollowing.member.id.notIn( |                 creatorFollowing.member.id.notIn( | ||||||
|                     blockMemberRepository.getBlockedMemberList(creatorId) |                     blockMemberRepository.getBlockedMemberIdList(creatorId) | ||||||
|                 ) |                 ) | ||||||
|             ) |             ) | ||||||
|             .and(creatorFollowing.member.pushToken.isNotNull) |             .and(creatorFollowing.member.pushToken.isNotNull) | ||||||
| @@ -179,7 +179,7 @@ class MemberQueryRepositoryImpl( | |||||||
|             .and(creatorFollowing.member.email.notIn("admin@sodalive.net")) |             .and(creatorFollowing.member.email.notIn("admin@sodalive.net")) | ||||||
|             .and( |             .and( | ||||||
|                 creatorFollowing.member.id.notIn( |                 creatorFollowing.member.id.notIn( | ||||||
|                     blockMemberRepository.getBlockedMemberList(creatorId) |                     blockMemberRepository.getBlockedMemberIdList(creatorId) | ||||||
|                 ) |                 ) | ||||||
|             ) |             ) | ||||||
|             .and(creatorFollowing.member.pushToken.isNotNull) |             .and(creatorFollowing.member.pushToken.isNotNull) | ||||||
| @@ -211,7 +211,7 @@ class MemberQueryRepositoryImpl( | |||||||
|             .and(liveReservation.room.id.eq(roomId)) |             .and(liveReservation.room.id.eq(roomId)) | ||||||
|             .and( |             .and( | ||||||
|                 liveReservation.member.id.notIn( |                 liveReservation.member.id.notIn( | ||||||
|                     blockMemberRepository.getBlockedMemberList(creatorId) |                     blockMemberRepository.getBlockedMemberIdList(creatorId) | ||||||
|                 ) |                 ) | ||||||
|             ) |             ) | ||||||
|  |  | ||||||
| @@ -248,7 +248,7 @@ class MemberQueryRepositoryImpl( | |||||||
|             .and(creatorFollowing.member.notification.uploadContent.isTrue) |             .and(creatorFollowing.member.notification.uploadContent.isTrue) | ||||||
|             .and( |             .and( | ||||||
|                 creatorFollowing.member.id.notIn( |                 creatorFollowing.member.id.notIn( | ||||||
|                     blockMemberRepository.getBlockedMemberList(creatorId) |                     blockMemberRepository.getBlockedMemberIdList(creatorId) | ||||||
|                 ) |                 ) | ||||||
|             ) |             ) | ||||||
|             .and(creatorFollowing.member.pushToken.isNotNull) |             .and(creatorFollowing.member.pushToken.isNotNull) | ||||||
| @@ -361,7 +361,7 @@ class MemberQueryRepositoryImpl( | |||||||
|             .and(creatorFollowing.member.email.notIn("admin@sodalive.net")) |             .and(creatorFollowing.member.email.notIn("admin@sodalive.net")) | ||||||
|             .and( |             .and( | ||||||
|                 creatorFollowing.member.id.notIn( |                 creatorFollowing.member.id.notIn( | ||||||
|                     blockMemberRepository.getBlockedMemberList(creatorId) |                     blockMemberRepository.getBlockedMemberIdList(creatorId) | ||||||
|                 ) |                 ) | ||||||
|             ) |             ) | ||||||
|             .and(creatorFollowing.member.pushToken.isNotNull) |             .and(creatorFollowing.member.pushToken.isNotNull) | ||||||
|   | |||||||
| @@ -14,6 +14,7 @@ import kr.co.vividnext.sodalive.live.reservation.LiveReservationRepository | |||||||
| import kr.co.vividnext.sodalive.live.room.detail.GetRoomDetailUser | import kr.co.vividnext.sodalive.live.room.detail.GetRoomDetailUser | ||||||
| import kr.co.vividnext.sodalive.member.block.BlockMember | import kr.co.vividnext.sodalive.member.block.BlockMember | ||||||
| import kr.co.vividnext.sodalive.member.block.BlockMemberRepository | import kr.co.vividnext.sodalive.member.block.BlockMemberRepository | ||||||
|  | import kr.co.vividnext.sodalive.member.block.GetBlockedMemberListResponse | ||||||
| import kr.co.vividnext.sodalive.member.block.MemberBlockRequest | import kr.co.vividnext.sodalive.member.block.MemberBlockRequest | ||||||
| import kr.co.vividnext.sodalive.member.following.CreatorFollowing | import kr.co.vividnext.sodalive.member.following.CreatorFollowing | ||||||
| import kr.co.vividnext.sodalive.member.following.CreatorFollowingRepository | import kr.co.vividnext.sodalive.member.following.CreatorFollowingRepository | ||||||
| @@ -357,6 +358,17 @@ class MemberService( | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     fun getBlockedMemberIdList(memberId: Long): List<Long> { | ||||||
|  |         return blockMemberRepository.getBlockedMemberIdList(memberId) | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     fun getBlockedMemberList(memberId: Long, offset: Long, limit: Long): GetBlockedMemberListResponse { | ||||||
|  |         val totalCount = blockMemberRepository.getBlockedMemberTotalCount(memberId) | ||||||
|  |         val items = blockMemberRepository.getBlockedMemberList(offset = offset, limit = limit, memberId = memberId) | ||||||
|  |  | ||||||
|  |         return GetBlockedMemberListResponse(totalCount = totalCount, items = items) | ||||||
|  |     } | ||||||
|  |  | ||||||
|     @Transactional |     @Transactional | ||||||
|     fun memberBlock(request: MemberBlockRequest, memberId: Long) { |     fun memberBlock(request: MemberBlockRequest, memberId: Long) { | ||||||
|         var blockMember = blockMemberRepository.getBlockAccount( |         var blockMember = blockMemberRepository.getBlockAccount( | ||||||
| @@ -365,10 +377,15 @@ class MemberService( | |||||||
|         ) |         ) | ||||||
|  |  | ||||||
|         if (blockMember == null) { |         if (blockMember == null) { | ||||||
|             blockMember = BlockMember( |             val blockedMember = repository.findByIdOrNull(id = request.blockMemberId) | ||||||
|                 blockedMemberId = request.blockMemberId, |                 ?: throw SodaException("잘못된 요청입니다.") | ||||||
|                 memberId = memberId |  | ||||||
|             ) |             val member = repository.findByIdOrNull(id = memberId) | ||||||
|  |                 ?: throw SodaException("잘못된 요청입니다.") | ||||||
|  |  | ||||||
|  |             blockMember = BlockMember() | ||||||
|  |             blockMember.member = member | ||||||
|  |             blockMember.blockedMember = blockedMember | ||||||
|  |  | ||||||
|             blockMemberRepository.save(blockMember) |             blockMemberRepository.save(blockMember) | ||||||
|         } else { |         } else { | ||||||
|   | |||||||
| @@ -1,12 +1,21 @@ | |||||||
| package kr.co.vividnext.sodalive.member.block | package kr.co.vividnext.sodalive.member.block | ||||||
|  |  | ||||||
| import kr.co.vividnext.sodalive.common.BaseEntity | import kr.co.vividnext.sodalive.common.BaseEntity | ||||||
|  | import kr.co.vividnext.sodalive.member.Member | ||||||
| import javax.persistence.Entity | import javax.persistence.Entity | ||||||
|  | import javax.persistence.FetchType | ||||||
|  | import javax.persistence.JoinColumn | ||||||
|  | import javax.persistence.ManyToOne | ||||||
|  |  | ||||||
| @Entity | @Entity | ||||||
| data class BlockMember( | data class BlockMember( | ||||||
|     val blockedMemberId: Long, |  | ||||||
|     val memberId: Long |  | ||||||
| ) : BaseEntity() { |  | ||||||
|     var isActive: Boolean = true |     var isActive: Boolean = true | ||||||
|  | ) : BaseEntity() { | ||||||
|  |     @ManyToOne(fetch = FetchType.LAZY) | ||||||
|  |     @JoinColumn(name = "blocked_member_id", nullable = false) | ||||||
|  |     var blockedMember: Member? = null | ||||||
|  |  | ||||||
|  |     @ManyToOne(fetch = FetchType.LAZY) | ||||||
|  |     @JoinColumn(name = "member_id", nullable = false) | ||||||
|  |     var member: Member? = null | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,7 +1,9 @@ | |||||||
| package kr.co.vividnext.sodalive.member.block | package kr.co.vividnext.sodalive.member.block | ||||||
|  |  | ||||||
| import com.querydsl.jpa.impl.JPAQueryFactory | import com.querydsl.jpa.impl.JPAQueryFactory | ||||||
|  | import kr.co.vividnext.sodalive.member.QMember.member | ||||||
| import kr.co.vividnext.sodalive.member.block.QBlockMember.blockMember | 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.data.jpa.repository.JpaRepository | ||||||
| import org.springframework.stereotype.Repository | import org.springframework.stereotype.Repository | ||||||
|  |  | ||||||
| @@ -11,17 +13,24 @@ interface BlockMemberRepository : JpaRepository<BlockMember, Long>, BlockMemberQ | |||||||
| interface BlockMemberQueryRepository { | interface BlockMemberQueryRepository { | ||||||
|     fun getBlockAccount(blockedMemberId: Long, memberId: Long): BlockMember? |     fun getBlockAccount(blockedMemberId: Long, memberId: Long): BlockMember? | ||||||
|     fun isBlocked(blockedMemberId: Long, memberId: Long): Boolean |     fun isBlocked(blockedMemberId: Long, memberId: Long): Boolean | ||||||
|     fun getBlockedMemberList(creatorId: Long): List<Long> |     fun getBlockedMemberIdList(memberId: Long): List<Long> | ||||||
|  |     fun getBlockedMemberList(offset: Long, limit: Long, memberId: Long): List<GetBlockedMemberListItem> | ||||||
|  |     fun getBlockedMemberTotalCount(memberId: Long): Int | ||||||
| } | } | ||||||
|  |  | ||||||
| @Repository | @Repository | ||||||
| class BlockMemberQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : BlockMemberQueryRepository { | class BlockMemberQueryRepositoryImpl( | ||||||
|  |     private val queryFactory: JPAQueryFactory, | ||||||
|  |  | ||||||
|  |     @Value("\${cloud.aws.cloud-front.host}") | ||||||
|  |     private val cloudFrontHost: String | ||||||
|  | ) : BlockMemberQueryRepository { | ||||||
|     override fun getBlockAccount(blockedMemberId: Long, memberId: Long): BlockMember? { |     override fun getBlockAccount(blockedMemberId: Long, memberId: Long): BlockMember? { | ||||||
|         return queryFactory |         return queryFactory | ||||||
|             .selectFrom(blockMember) |             .selectFrom(blockMember) | ||||||
|             .where( |             .where( | ||||||
|                 blockMember.blockedMemberId.eq(blockedMemberId) |                 blockMember.blockedMember.id.eq(blockedMemberId) | ||||||
|                     .and(blockMember.memberId.eq(memberId)) |                     .and(blockMember.member.id.eq(memberId)) | ||||||
|             ) |             ) | ||||||
|             .orderBy(blockMember.id.desc()) |             .orderBy(blockMember.id.desc()) | ||||||
|             .fetchFirst() |             .fetchFirst() | ||||||
| @@ -32,8 +41,8 @@ class BlockMemberQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) | |||||||
|             .select(blockMember.id) |             .select(blockMember.id) | ||||||
|             .from(blockMember) |             .from(blockMember) | ||||||
|             .where( |             .where( | ||||||
|                 blockMember.memberId.eq(memberId) |                 blockMember.member.id.eq(memberId) | ||||||
|                     .and(blockMember.blockedMemberId.eq(blockedMemberId)) |                     .and(blockMember.blockedMember.id.eq(blockedMemberId)) | ||||||
|                     .and(blockMember.isActive.isTrue) |                     .and(blockMember.isActive.isTrue) | ||||||
|             ) |             ) | ||||||
|             .fetchOne() |             .fetchOne() | ||||||
| @@ -41,14 +50,49 @@ class BlockMemberQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) | |||||||
|         return blockedAccount != null |         return blockedAccount != null | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     override fun getBlockedMemberList(creatorId: Long): List<Long> { |     override fun getBlockedMemberIdList(memberId: Long): List<Long> { | ||||||
|         return queryFactory |         return queryFactory | ||||||
|             .select(blockMember.blockedMemberId) |             .select(blockMember.blockedMember.id) | ||||||
|             .from(blockMember) |             .from(blockMember) | ||||||
|             .where( |             .where( | ||||||
|                 blockMember.memberId.eq(creatorId) |                 blockMember.member.id.eq(memberId) | ||||||
|                     .and(blockMember.isActive.isTrue) |                     .and(blockMember.isActive.isTrue) | ||||||
|             ) |             ) | ||||||
|             .fetch() |             .fetch() | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     override fun getBlockedMemberList(offset: Long, limit: Long, memberId: Long): List<GetBlockedMemberListItem> { | ||||||
|  |         return queryFactory | ||||||
|  |             .select( | ||||||
|  |                 QGetBlockedMemberListItem( | ||||||
|  |                     blockMember.blockedMember.id, | ||||||
|  |                     blockMember.blockedMember.nickname, | ||||||
|  |                     blockMember.blockedMember.profileImage.prepend("/").prepend(cloudFrontHost), | ||||||
|  |                     blockMember.isActive | ||||||
|  |                 ) | ||||||
|  |             ) | ||||||
|  |             .from(blockMember) | ||||||
|  |             .innerJoin(blockMember.blockedMember, member) | ||||||
|  |             .where( | ||||||
|  |                 blockMember.member.id.eq(memberId) | ||||||
|  |                     .and(blockMember.isActive.isTrue) | ||||||
|  |                     .and(blockMember.blockedMember.isActive.isTrue) | ||||||
|  |             ) | ||||||
|  |             .offset(offset) | ||||||
|  |             .limit(limit) | ||||||
|  |             .fetch() | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     override fun getBlockedMemberTotalCount(memberId: Long): Int { | ||||||
|  |         return queryFactory | ||||||
|  |             .select(blockMember.id) | ||||||
|  |             .from(blockMember) | ||||||
|  |             .where( | ||||||
|  |                 blockMember.member.id.eq(memberId) | ||||||
|  |                     .and(blockMember.isActive.isTrue) | ||||||
|  |                     .and(blockMember.blockedMember.isActive.isTrue) | ||||||
|  |             ) | ||||||
|  |             .fetch() | ||||||
|  |             .size | ||||||
|  |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | package kr.co.vividnext.sodalive.member.block | ||||||
|  |  | ||||||
|  | import com.querydsl.core.annotations.QueryProjection | ||||||
|  |  | ||||||
|  | data class GetBlockedMemberListResponse( | ||||||
|  |     val totalCount: Int, | ||||||
|  |     val items: List<GetBlockedMemberListItem> | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | data class GetBlockedMemberListItem @QueryProjection constructor( | ||||||
|  |     val memberId: Long, | ||||||
|  |     val nickname: String, | ||||||
|  |     val profileImageUrl: String, | ||||||
|  |     val isBlocked: Boolean | ||||||
|  | ) | ||||||
		Reference in New Issue
	
	Block a user