푸시메시지 기능 추가 - 전체, 개별, 라이브 생성, 라이브 시작, 메시지 전송, 콘텐츠 업로드

This commit is contained in:
2023-08-08 16:46:30 +09:00
parent 771dbeced0
commit 705bf0b6b2
13 changed files with 511 additions and 1 deletions

View File

@@ -1,7 +1,14 @@
package kr.co.vividnext.sodalive.member
import com.querydsl.jpa.impl.JPAQueryFactory
import kr.co.vividnext.sodalive.fcm.GetMessageRecipientPushTokenResponse
import kr.co.vividnext.sodalive.fcm.QGetMessageRecipientPushTokenResponse
import kr.co.vividnext.sodalive.member.QMember.member
import kr.co.vividnext.sodalive.member.auth.QAuth.auth
import kr.co.vividnext.sodalive.member.block.BlockMemberRepository
import kr.co.vividnext.sodalive.member.following.QCreatorFollowing.creatorFollowing
import kr.co.vividnext.sodalive.member.notification.QMemberNotification.memberNotification
import kr.co.vividnext.sodalive.message.QMessage.message
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.stereotype.Repository
@@ -15,10 +22,28 @@ interface MemberQueryRepository {
fun findByPushToken(pushToken: String): List<Member>
fun findByNicknameAndOtherCondition(nickname: String, memberId: Long): List<Member>
fun findCreatorByIdOrNull(memberId: Long): Member?
fun getAllRecipientPushTokens(isAuth: Boolean, container: String): List<List<String>>
fun getCreateLiveRoomNotificationRecipientPushTokens(
creatorId: Long,
isAuth: Boolean,
container: String
): List<List<String>>
fun getUploadContentNotificationRecipientPushTokens(
creatorId: Long,
isAuth: Boolean,
container: String
): List<List<String>>
fun getMessageRecipientPushToken(messageId: Long): GetMessageRecipientPushTokenResponse
fun getIndividualRecipientPushTokens(recipients: List<Long>, isAuth: Boolean): Map<String, List<List<String>>>
}
@Repository
class MemberQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : MemberQueryRepository {
class MemberQueryRepositoryImpl(
private val queryFactory: JPAQueryFactory,
private val blockMemberRepository: BlockMemberRepository
) : MemberQueryRepository {
override fun findByPushToken(pushToken: String): List<Member> {
return queryFactory
.selectFrom(member)
@@ -47,4 +72,141 @@ class MemberQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : Mem
)
.fetchFirst()
}
override fun getAllRecipientPushTokens(isAuth: Boolean, container: String): List<List<String>> {
var where = member.isActive.isTrue
.and(member.email.notIn("admin@sodalive.net"))
.and(member.container.eq(container))
if (isAuth) {
where = where.and(member.auth.isNotNull)
}
return queryFactory
.select(member.pushToken)
.from(member)
.leftJoin(member.auth, auth)
.where(where)
.fetch()
.toSet()
.chunked(500)
}
override fun getCreateLiveRoomNotificationRecipientPushTokens(
creatorId: Long,
isAuth: Boolean,
container: String
): List<List<String>> {
val member = QMember.member
val creator = QMember.member
var where = creatorFollowing.isActive.isTrue
.and(creator.id.eq(creatorId))
.and(member.email.notIn("admin@sodalive.net"))
.and(member.container.eq(container))
.and(memberNotification.live.isTrue)
.and(
member.id.notIn(
blockMemberRepository.getBlockedMemberList(creatorId)
)
)
if (isAuth) {
where = where.and(member.auth.isNotNull)
}
return queryFactory
.select(member.pushToken)
.from(creatorFollowing)
.innerJoin(creatorFollowing.creator, creator)
.innerJoin(creatorFollowing.member, member)
.innerJoin(member.notification, memberNotification)
.leftJoin(member.auth, auth)
.where(where)
.fetch()
.toSet()
.chunked(500)
}
override fun getUploadContentNotificationRecipientPushTokens(
creatorId: Long,
isAuth: Boolean,
container: String
): List<List<String>> {
val member = QMember.member
val creator = QMember.member
var where = creatorFollowing.isActive.isTrue
.and(creator.id.eq(creatorId))
.and(member.email.notIn("admin@sodalive.net"))
.and(member.container.eq(container))
.and(memberNotification.uploadContent.isTrue)
.and(
member.id.notIn(
blockMemberRepository.getBlockedMemberList(creatorId)
)
)
if (isAuth) {
where = where.and(member.auth.isNotNull)
}
return queryFactory
.select(member.pushToken)
.from(creatorFollowing)
.innerJoin(creatorFollowing.creator, creator)
.innerJoin(creatorFollowing.member, member)
.innerJoin(member.notification, memberNotification)
.leftJoin(member.auth, auth)
.where(where)
.fetch()
.toSet()
.chunked(500)
}
override fun getMessageRecipientPushToken(messageId: Long): GetMessageRecipientPushTokenResponse {
return queryFactory
.select(
QGetMessageRecipientPushTokenResponse(
member.pushToken,
member.container
)
)
.from(message)
.innerJoin(message.recipient, member)
.where(message.id.eq(messageId))
.fetchFirst()
}
override fun getIndividualRecipientPushTokens(
recipients: List<Long>,
isAuth: Boolean
): Map<String, List<List<String>>> {
var where = member.isActive.isTrue
.and(member.email.notIn("admin@sodalive.net"))
if (isAuth) {
where = where.and(member.auth.isNotNull)
}
val aosPushTokens = queryFactory
.select(member.pushToken)
.from(member)
.leftJoin(member.auth, auth)
.where(where.and(member.container.eq("aos")))
.fetch()
.toSet()
.chunked(500)
val iosPushTokens = queryFactory
.select(member.pushToken)
.from(member)
.leftJoin(member.auth, auth)
.where(where.and(member.container.eq("ios")))
.fetch()
.toSet()
.chunked(500)
return mapOf("aos" to aosPushTokens, "ios" to iosPushTokens)
}
}

View File

@@ -11,6 +11,7 @@ interface BlockMemberRepository : JpaRepository<BlockMember, Long>, BlockMemberQ
interface BlockMemberQueryRepository {
fun getBlockAccount(blockedMemberId: Long, memberId: Long): BlockMember?
fun isBlocked(blockedMemberId: Long, memberId: Long): Boolean
fun getBlockedMemberList(creatorId: Long): List<Long>
}
@Repository
@@ -39,4 +40,15 @@ class BlockMemberQueryRepositoryImpl(private val queryFactory: JPAQueryFactory)
return blockedAccount != null
}
override fun getBlockedMemberList(creatorId: Long): List<Long> {
return queryFactory
.select(blockMember.blockedMemberId)
.from(blockMember)
.where(
blockMember.memberId.eq(creatorId)
.and(blockMember.isActive.isTrue)
)
.fetch()
}
}