Merge pull request 'test' (#18) from test into main

Reviewed-on: #18
This commit is contained in:
klaus 2023-08-27 12:28:42 +00:00
commit 1e0b79bf62
7 changed files with 118 additions and 14 deletions

View File

@ -85,7 +85,12 @@ class ChargeService(
charge.payment?.status = PaymentStatus.COMPLETE charge.payment?.status = PaymentStatus.COMPLETE
member.charge(charge.chargeCan, charge.rewardCan, "pg") member.charge(charge.chargeCan, charge.rewardCan, "pg")
applicationEventPublisher.publishEvent(ChargeSpringEvent(chargeId = charge.id!!, member = member)) applicationEventPublisher.publishEvent(
ChargeSpringEvent(
chargeId = charge.id!!,
memberId = member.id!!
)
)
} else { } else {
throw SodaException("결제정보에 오류가 있습니다.") throw SodaException("결제정보에 오류가 있습니다.")
} }
@ -134,7 +139,12 @@ class ChargeService(
charge.payment?.status = PaymentStatus.COMPLETE charge.payment?.status = PaymentStatus.COMPLETE
member.charge(charge.chargeCan, charge.rewardCan, "ios") member.charge(charge.chargeCan, charge.rewardCan, "ios")
applicationEventPublisher.publishEvent(ChargeSpringEvent(chargeId = charge.id!!, member = member)) applicationEventPublisher.publishEvent(
ChargeSpringEvent(
chargeId = charge.id!!,
memberId = member.id!!
)
)
} else { } else {
throw SodaException("결제정보에 오류가 있습니다.") throw SodaException("결제정보에 오류가 있습니다.")
} }

View File

@ -10,6 +10,7 @@ import kr.co.vividnext.sodalive.common.SodaException
import kr.co.vividnext.sodalive.fcm.FcmEvent import kr.co.vividnext.sodalive.fcm.FcmEvent
import kr.co.vividnext.sodalive.fcm.FcmEventType import kr.co.vividnext.sodalive.fcm.FcmEventType
import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.member.Member
import kr.co.vividnext.sodalive.member.MemberRepository
import kr.co.vividnext.sodalive.member.auth.AuthRepository import kr.co.vividnext.sodalive.member.auth.AuthRepository
import org.springframework.context.ApplicationEventPublisher import org.springframework.context.ApplicationEventPublisher
import org.springframework.data.repository.findByIdOrNull import org.springframework.data.repository.findByIdOrNull
@ -22,25 +23,29 @@ import kotlin.math.round
class ChargeEventService( class ChargeEventService(
private val repository: ChargeEventRepository, private val repository: ChargeEventRepository,
private val authRepository: AuthRepository, private val authRepository: AuthRepository,
private val memberRepository: MemberRepository,
private val chargeRepository: ChargeRepository, private val chargeRepository: ChargeRepository,
private val chargeEventRepository: ChargeEventRepository, private val chargeEventRepository: ChargeEventRepository,
private val applicationEventPublisher: ApplicationEventPublisher private val applicationEventPublisher: ApplicationEventPublisher
) { ) {
@Transactional @Transactional
fun applyChargeEvent(chargeId: Long, member: Member) { fun applyChargeEvent(chargeId: Long, memberId: Long) {
val charge = chargeRepository.findByIdOrNull(chargeId) val charge = chargeRepository.findByIdOrNull(chargeId)
?: throw SodaException("이벤트가 적용되지 않았습니다.") ?: throw SodaException("이벤트가 적용되지 않았습니다.\n고객센터에 문의해 주세요.")
val member = memberRepository.findByIdOrNull(memberId)
?: throw SodaException("이벤트가 적용되지 않았습니다.\n고객센터에 문의해 주세요.")
if (member.auth != null) { if (member.auth != null) {
val authDate = authRepository.getOldestCreatedAtByDi(member.auth!!.di) val authDate = authRepository.getOldestCreatedAtByDi(member.auth!!.di)
val memberIds = authRepository.getMemberIdsByDi(member.auth!!.di) val memberIds = authRepository.getMemberIdsByDi(member.auth!!.di)
var chargeCount = 0 var chargeCount = 0
for (memberId in memberIds) { for (id in memberIds) {
chargeCount += chargeRepository.getChargeCountAfterDate(memberId = memberId, authDate) chargeCount += chargeRepository.getChargeCountAfterDate(memberId = id, authDate)
} }
if (chargeCount > 0) { if (chargeCount > 1) {
applyOtherEvent(charge, member) applyOtherEvent(charge, member)
} else { } else {
applyFirstChargeEvent(charge, member) applyFirstChargeEvent(charge, member)

View File

@ -1,13 +1,12 @@
package kr.co.vividnext.sodalive.can.charge.event package kr.co.vividnext.sodalive.can.charge.event
import kr.co.vividnext.sodalive.member.Member
import org.springframework.context.event.EventListener
import org.springframework.scheduling.annotation.Async import org.springframework.scheduling.annotation.Async
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
import org.springframework.transaction.event.TransactionalEventListener
class ChargeSpringEvent( class ChargeSpringEvent(
val chargeId: Long, val chargeId: Long,
val member: Member val memberId: Long
) )
@Component @Component
@ -15,8 +14,8 @@ class ChargeSpringEventListener(
private val chargeEventService: ChargeEventService private val chargeEventService: ChargeEventService
) { ) {
@Async @Async
@EventListener @TransactionalEventListener
fun applyChargeEvent(event: ChargeSpringEvent) { fun applyChargeEvent(event: ChargeSpringEvent) {
chargeEventService.applyChargeEvent(event.chargeId, event.member) chargeEventService.applyChargeEvent(event.chargeId, event.memberId)
} }
} }

View File

@ -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.CreatorCheersRepository
import kr.co.vividnext.sodalive.explorer.profile.PostWriteCheersRequest import kr.co.vividnext.sodalive.explorer.profile.PostWriteCheersRequest
import kr.co.vividnext.sodalive.explorer.profile.PutWriteCheersRequest 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.live.room.detail.GetRoomDetailUser
import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.member.Member
import kr.co.vividnext.sodalive.member.MemberRole import kr.co.vividnext.sodalive.member.MemberRole
import kr.co.vividnext.sodalive.member.MemberService import kr.co.vividnext.sodalive.member.MemberService
import org.springframework.beans.factory.annotation.Value import org.springframework.beans.factory.annotation.Value
import org.springframework.context.ApplicationEventPublisher
import org.springframework.data.domain.Pageable import org.springframework.data.domain.Pageable
import org.springframework.stereotype.Service import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional import org.springframework.transaction.annotation.Transactional
@ -28,6 +31,7 @@ class ExplorerService(
private val queryRepository: ExplorerQueryRepository, private val queryRepository: ExplorerQueryRepository,
private val cheersRepository: CreatorCheersRepository, private val cheersRepository: CreatorCheersRepository,
private val noticeRepository: ChannelNoticeRepository, private val noticeRepository: ChannelNoticeRepository,
private val applicationEventPublisher: ApplicationEventPublisher,
@Value("\${cloud.aws.cloud-front.host}") @Value("\${cloud.aws.cloud-front.host}")
private val cloudFrontHost: String private val cloudFrontHost: String
@ -318,5 +322,14 @@ class ExplorerService(
} else { } else {
channelNotice.notice = notice channelNotice.notice = notice
} }
applicationEventPublisher.publishEvent(
FcmEvent(
type = FcmEventType.CHANGE_NOTICE,
title = member.nickname,
message = "공지를 등록했습니다.",
creatorId = member.id!!
)
)
} }
} }

View File

@ -6,7 +6,7 @@ import org.springframework.scheduling.annotation.Async
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
enum class FcmEventType { 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( class FcmEvent(
@ -156,6 +156,39 @@ class FcmSendListener(
messageId = fcmEvent.messageId 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
)
}
}
}
}
} }
} }
} }

View File

@ -19,7 +19,8 @@ class FcmService {
container: String, container: String,
roomId: Long? = null, roomId: Long? = null,
messageId: Long? = null, messageId: Long? = null,
contentId: Long? = null contentId: Long? = null,
creatorId: Long? = null
) { ) {
if (tokens.isNotEmpty()) { if (tokens.isNotEmpty()) {
logger.info("os: $container") logger.info("os: $container")
@ -52,6 +53,10 @@ class FcmService {
multicastMessage.putData("content_id", contentId.toString()) multicastMessage.putData("content_id", contentId.toString())
} }
if (creatorId != null) {
multicastMessage.putData("channel_id", creatorId.toString())
}
val response = FirebaseMessaging.getInstance().sendEachForMulticast(multicastMessage.build()) val response = FirebaseMessaging.getInstance().sendEachForMulticast(multicastMessage.build())
logger.info("보내기 성공: ${response.successCount}") logger.info("보내기 성공: ${response.successCount}")
logger.info("보내기 실패: ${response.failureCount}") logger.info("보내기 실패: ${response.failureCount}")

View File

@ -40,6 +40,8 @@ interface MemberQueryRepository {
fun getIndividualRecipientPushTokens(recipients: List<Long>, isAuth: Boolean): Map<String, List<List<String>>> fun getIndividualRecipientPushTokens(recipients: List<Long>, isAuth: Boolean): Map<String, List<List<String>>>
fun getChangeNicknamePrice(memberId: Long): GetChangeNicknamePriceResponse fun getChangeNicknamePrice(memberId: Long): GetChangeNicknamePriceResponse
fun getMemberByEmail(email: String): Member? fun getMemberByEmail(email: String): Member?
fun getChangeNoticeRecipientPushTokens(creatorId: Long): Map<String, List<List<String>>>
} }
@Repository @Repository
@ -244,4 +246,41 @@ class MemberQueryRepositoryImpl(
.where(member.email.eq(email)) .where(member.email.eq(email))
.fetchOne() .fetchOne()
} }
override fun getChangeNoticeRecipientPushTokens(creatorId: Long): Map<String, List<List<String>>> {
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)
}
} }