From 41a6e05034f95bcbe2d3a52412885836080218bc Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 25 Aug 2023 22:42:23 +0900 Subject: [PATCH] =?UTF-8?q?=ED=81=AC=EB=A6=AC=EC=97=90=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=20=EC=B1=84=EB=84=90=20=EA=B3=B5=EC=A7=80=EC=82=AC=ED=95=AD=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20=EC=8B=9C=20=ED=91=B8=EC=8B=9C=20=EB=B0=9C?= =?UTF-8?q?=EC=86=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/explorer/ExplorerService.kt | 13 +++++++ .../kr/co/vividnext/sodalive/fcm/FcmEvent.kt | 35 ++++++++++++++++- .../co/vividnext/sodalive/fcm/FcmService.kt | 7 +++- .../sodalive/member/MemberRepository.kt | 39 +++++++++++++++++++ 4 files changed, 92 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/explorer/ExplorerService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/explorer/ExplorerService.kt index 57b4036..1fed28f 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/explorer/ExplorerService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/explorer/ExplorerService.kt @@ -11,11 +11,14 @@ import kr.co.vividnext.sodalive.explorer.profile.CreatorCheers import kr.co.vividnext.sodalive.explorer.profile.CreatorCheersRepository import kr.co.vividnext.sodalive.explorer.profile.PostWriteCheersRequest import kr.co.vividnext.sodalive.explorer.profile.PutWriteCheersRequest +import kr.co.vividnext.sodalive.fcm.FcmEvent +import kr.co.vividnext.sodalive.fcm.FcmEventType import kr.co.vividnext.sodalive.live.room.detail.GetRoomDetailUser import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.member.MemberRole import kr.co.vividnext.sodalive.member.MemberService import org.springframework.beans.factory.annotation.Value +import org.springframework.context.ApplicationEventPublisher import org.springframework.data.domain.Pageable import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional @@ -28,6 +31,7 @@ class ExplorerService( private val queryRepository: ExplorerQueryRepository, private val cheersRepository: CreatorCheersRepository, private val noticeRepository: ChannelNoticeRepository, + private val applicationEventPublisher: ApplicationEventPublisher, @Value("\${cloud.aws.cloud-front.host}") private val cloudFrontHost: String @@ -318,5 +322,14 @@ class ExplorerService( } else { channelNotice.notice = notice } + + applicationEventPublisher.publishEvent( + FcmEvent( + type = FcmEventType.CHANGE_NOTICE, + title = member.nickname, + message = "공지사항이 변경되었습니다 - ${notice.substring(0, 10)}", + creatorId = member.id!! + ) + ) } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/fcm/FcmEvent.kt b/src/main/kotlin/kr/co/vividnext/sodalive/fcm/FcmEvent.kt index 17ace1f..3f71cf0 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/fcm/FcmEvent.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/fcm/FcmEvent.kt @@ -6,7 +6,7 @@ import org.springframework.scheduling.annotation.Async import org.springframework.stereotype.Component enum class FcmEventType { - ALL, INDIVIDUAL, CREATE_LIVE, START_LIVE, UPLOAD_CONTENT, SEND_MESSAGE + ALL, INDIVIDUAL, CREATE_LIVE, START_LIVE, UPLOAD_CONTENT, SEND_MESSAGE, CHANGE_NOTICE } class FcmEvent( @@ -156,6 +156,39 @@ class FcmSendListener( messageId = fcmEvent.messageId ) } + + FcmEventType.CHANGE_NOTICE -> { + if (fcmEvent.creatorId != null) { + val pushTokenList = memberRepository.getChangeNoticeRecipientPushTokens(fcmEvent.creatorId) + + val iosPushTokens = pushTokenList["ios"] + val aosPushToken = pushTokenList["aos"] + + if (iosPushTokens != null) { + for (tokens in iosPushTokens) { + pushService.send( + tokens = tokens, + title = fcmEvent.title, + message = fcmEvent.message, + container = "ios", + creatorId = fcmEvent.creatorId + ) + } + } + + if (aosPushToken != null) { + for (tokens in aosPushToken) { + pushService.send( + tokens = tokens, + title = fcmEvent.title, + message = fcmEvent.message, + container = "aos", + creatorId = fcmEvent.creatorId + ) + } + } + } + } } } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/fcm/FcmService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/fcm/FcmService.kt index 1383185..1b08b35 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/fcm/FcmService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/fcm/FcmService.kt @@ -19,7 +19,8 @@ class FcmService { container: String, roomId: Long? = null, messageId: Long? = null, - contentId: Long? = null + contentId: Long? = null, + creatorId: Long? = null ) { if (tokens.isNotEmpty()) { logger.info("os: $container") @@ -52,6 +53,10 @@ class FcmService { multicastMessage.putData("content_id", contentId.toString()) } + if (creatorId != null) { + multicastMessage.putData("channel_id", creatorId.toString()) + } + val response = FirebaseMessaging.getInstance().sendEachForMulticast(multicastMessage.build()) logger.info("보내기 성공: ${response.successCount}") logger.info("보내기 실패: ${response.failureCount}") diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberRepository.kt index 45fa78e..b846bac 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberRepository.kt @@ -40,6 +40,8 @@ interface MemberQueryRepository { fun getIndividualRecipientPushTokens(recipients: List, isAuth: Boolean): Map>> fun getChangeNicknamePrice(memberId: Long): GetChangeNicknamePriceResponse fun getMemberByEmail(email: String): Member? + + fun getChangeNoticeRecipientPushTokens(creatorId: Long): Map>> } @Repository @@ -244,4 +246,41 @@ class MemberQueryRepositoryImpl( .where(member.email.eq(email)) .fetchOne() } + + override fun getChangeNoticeRecipientPushTokens(creatorId: Long): Map>> { + val member = QMember.member + val creator = QMember.member + + val where = creatorFollowing.isActive.isTrue + .and(creatorFollowing.creator.id.eq(creatorId)) + .and(creatorFollowing.member.email.notIn("admin@sodalive.net")) + .and( + creatorFollowing.member.id.notIn( + blockMemberRepository.getBlockedMemberList(creatorId) + ) + ) + .and(creatorFollowing.member.pushToken.isNotNull) + + val aosPushTokens = queryFactory + .select(creatorFollowing.member.pushToken) + .from(creatorFollowing) + .innerJoin(creatorFollowing.creator, creator) + .innerJoin(creatorFollowing.member, member) + .where(where.and(member.container.eq("aos"))) + .fetch() + .toSet() + .chunked(500) + + val iosPushTokens = queryFactory + .select(creatorFollowing.member.pushToken) + .from(creatorFollowing) + .innerJoin(creatorFollowing.creator, creator) + .innerJoin(creatorFollowing.member, member) + .where(where.and(member.container.eq("ios"))) + .fetch() + .toSet() + .chunked(500) + + return mapOf("aos" to aosPushTokens, "ios" to iosPushTokens) + } }