From 41a6e05034f95bcbe2d3a52412885836080218bc Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 25 Aug 2023 22:42:23 +0900 Subject: [PATCH 01/15] =?UTF-8?q?=ED=81=AC=EB=A6=AC=EC=97=90=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EC=B1=84=EB=84=90=20=EA=B3=B5=EC=A7=80=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EB=B3=80=EA=B2=BD=20=EC=8B=9C=20=ED=91=B8=EC=8B=9C?= =?UTF-8?q?=20=EB=B0=9C=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) + } } From d1ea7b870443d52a35416511b4765a4089bf1680 Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 25 Aug 2023 23:25:38 +0900 Subject: [PATCH 02/15] =?UTF-8?q?=ED=81=AC=EB=A6=AC=EC=97=90=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EC=B1=84=EB=84=90=20=EA=B3=B5=EC=A7=80=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EB=B3=80=EA=B2=BD=20=ED=91=B8=EC=8B=9C=20-=20?= =?UTF-8?q?=EB=82=B4=EC=9A=A9=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kotlin/kr/co/vividnext/sodalive/explorer/ExplorerService.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 1fed28f..f436dd2 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/explorer/ExplorerService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/explorer/ExplorerService.kt @@ -327,7 +327,7 @@ class ExplorerService( FcmEvent( type = FcmEventType.CHANGE_NOTICE, title = member.nickname, - message = "공지사항이 변경되었습니다 - ${notice.substring(0, 10)}", + message = "공지를 등록했습니다.", creatorId = member.id!! ) ) From 72adae3f54e390a005c829381a2726023d77a51d Mon Sep 17 00:00:00 2001 From: Klaus Date: Sun, 27 Aug 2023 18:43:22 +0900 Subject: [PATCH 03/15] =?UTF-8?q?=EC=B6=A9=EC=A0=84=EC=9D=B4=EB=B2=A4?= =?UTF-8?q?=ED=8A=B8=EA=B0=80=20=EC=A0=81=EC=9A=A9=EB=90=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EB=8A=94=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/can/charge/event/ChargeEventService.kt | 13 +++++++++---- .../sodalive/can/charge/event/ChargeSpringEvent.kt | 2 +- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeEventService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeEventService.kt index 632b623..add2181 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeEventService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeEventService.kt @@ -10,6 +10,7 @@ import kr.co.vividnext.sodalive.common.SodaException import kr.co.vividnext.sodalive.fcm.FcmEvent import kr.co.vividnext.sodalive.fcm.FcmEventType import kr.co.vividnext.sodalive.member.Member +import kr.co.vividnext.sodalive.member.MemberRepository import kr.co.vividnext.sodalive.member.auth.AuthRepository import org.springframework.context.ApplicationEventPublisher import org.springframework.data.repository.findByIdOrNull @@ -22,22 +23,26 @@ import kotlin.math.round class ChargeEventService( private val repository: ChargeEventRepository, private val authRepository: AuthRepository, + private val memberRepository: MemberRepository, private val chargeRepository: ChargeRepository, private val chargeEventRepository: ChargeEventRepository, private val applicationEventPublisher: ApplicationEventPublisher ) { @Transactional - fun applyChargeEvent(chargeId: Long, member: Member) { + fun applyChargeEvent(chargeId: Long, memberId: Long) { val charge = chargeRepository.findByIdOrNull(chargeId) - ?: throw SodaException("이벤트가 적용되지 않았습니다.") + ?: throw SodaException("이벤트가 적용되지 않았습니다.\n고객센터에 문의해 주세요.") + + val member = memberRepository.findByIdOrNull(memberId) + ?: throw SodaException("이벤트가 적용되지 않았습니다.\n고객센터에 문의해 주세요.") if (member.auth != null) { val authDate = authRepository.getOldestCreatedAtByDi(member.auth!!.di) val memberIds = authRepository.getMemberIdsByDi(member.auth!!.di) var chargeCount = 0 - for (memberId in memberIds) { - chargeCount += chargeRepository.getChargeCountAfterDate(memberId = memberId, authDate) + for (id in memberIds) { + chargeCount += chargeRepository.getChargeCountAfterDate(memberId = id, authDate) } if (chargeCount > 0) { diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt index 2716f51..2f667d0 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt @@ -17,6 +17,6 @@ class ChargeSpringEventListener( @Async @EventListener fun applyChargeEvent(event: ChargeSpringEvent) { - chargeEventService.applyChargeEvent(event.chargeId, event.member) + chargeEventService.applyChargeEvent(event.chargeId, event.member.id!!) } } From 3b9d8a4fcb6cf9d2259f8a04241f49faca2af243 Mon Sep 17 00:00:00 2001 From: Klaus Date: Sun, 27 Aug 2023 19:02:03 +0900 Subject: [PATCH 04/15] =?UTF-8?q?=EC=B6=A9=EC=A0=84=EC=9D=B4=EB=B2=A4?= =?UTF-8?q?=ED=8A=B8=EA=B0=80=20=EC=A0=81=EC=9A=A9=EB=90=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EB=8A=94=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt index 2f667d0..d12036f 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt @@ -4,6 +4,8 @@ import kr.co.vividnext.sodalive.member.Member import org.springframework.context.event.EventListener import org.springframework.scheduling.annotation.Async import org.springframework.stereotype.Component +import org.springframework.transaction.annotation.Propagation +import org.springframework.transaction.annotation.Transactional class ChargeSpringEvent( val chargeId: Long, @@ -16,6 +18,7 @@ class ChargeSpringEventListener( ) { @Async @EventListener + @Transactional(propagation = Propagation.REQUIRES_NEW) fun applyChargeEvent(event: ChargeSpringEvent) { chargeEventService.applyChargeEvent(event.chargeId, event.member.id!!) } From 0d56b61b2e03ed3a83b7a1ad870433790e7264be Mon Sep 17 00:00:00 2001 From: Klaus Date: Sun, 27 Aug 2023 19:13:22 +0900 Subject: [PATCH 05/15] =?UTF-8?q?=EC=B6=A9=EC=A0=84=EC=9D=B4=EB=B2=A4?= =?UTF-8?q?=ED=8A=B8=EA=B0=80=20=EC=A0=81=EC=9A=A9=EB=90=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EB=8A=94=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/can/charge/event/ChargeEventService.kt | 13 ++++--------- .../sodalive/can/charge/event/ChargeSpringEvent.kt | 6 +++--- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeEventService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeEventService.kt index add2181..632b623 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeEventService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeEventService.kt @@ -10,7 +10,6 @@ import kr.co.vividnext.sodalive.common.SodaException import kr.co.vividnext.sodalive.fcm.FcmEvent import kr.co.vividnext.sodalive.fcm.FcmEventType import kr.co.vividnext.sodalive.member.Member -import kr.co.vividnext.sodalive.member.MemberRepository import kr.co.vividnext.sodalive.member.auth.AuthRepository import org.springframework.context.ApplicationEventPublisher import org.springframework.data.repository.findByIdOrNull @@ -23,26 +22,22 @@ import kotlin.math.round class ChargeEventService( private val repository: ChargeEventRepository, private val authRepository: AuthRepository, - private val memberRepository: MemberRepository, private val chargeRepository: ChargeRepository, private val chargeEventRepository: ChargeEventRepository, private val applicationEventPublisher: ApplicationEventPublisher ) { @Transactional - fun applyChargeEvent(chargeId: Long, memberId: Long) { + fun applyChargeEvent(chargeId: Long, member: Member) { val charge = chargeRepository.findByIdOrNull(chargeId) - ?: throw SodaException("이벤트가 적용되지 않았습니다.\n고객센터에 문의해 주세요.") - - val member = memberRepository.findByIdOrNull(memberId) - ?: throw SodaException("이벤트가 적용되지 않았습니다.\n고객센터에 문의해 주세요.") + ?: throw SodaException("이벤트가 적용되지 않았습니다.") if (member.auth != null) { val authDate = authRepository.getOldestCreatedAtByDi(member.auth!!.di) val memberIds = authRepository.getMemberIdsByDi(member.auth!!.di) var chargeCount = 0 - for (id in memberIds) { - chargeCount += chargeRepository.getChargeCountAfterDate(memberId = id, authDate) + for (memberId in memberIds) { + chargeCount += chargeRepository.getChargeCountAfterDate(memberId = memberId, authDate) } if (chargeCount > 0) { diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt index d12036f..928eee4 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt @@ -1,11 +1,11 @@ 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.stereotype.Component import org.springframework.transaction.annotation.Propagation import org.springframework.transaction.annotation.Transactional +import org.springframework.transaction.event.TransactionalEventListener class ChargeSpringEvent( val chargeId: Long, @@ -17,9 +17,9 @@ class ChargeSpringEventListener( private val chargeEventService: ChargeEventService ) { @Async - @EventListener + @TransactionalEventListener @Transactional(propagation = Propagation.REQUIRES_NEW) fun applyChargeEvent(event: ChargeSpringEvent) { - chargeEventService.applyChargeEvent(event.chargeId, event.member.id!!) + chargeEventService.applyChargeEvent(event.chargeId, event.member) } } From 586f4d21d422cc24b8db812c83737bbf6f0613e1 Mon Sep 17 00:00:00 2001 From: Klaus Date: Sun, 27 Aug 2023 19:24:58 +0900 Subject: [PATCH 06/15] =?UTF-8?q?=EC=B6=A9=EC=A0=84=EC=9D=B4=EB=B2=A4?= =?UTF-8?q?=ED=8A=B8=EA=B0=80=20=EC=A0=81=EC=9A=A9=EB=90=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EB=8A=94=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/can/charge/event/ChargeEventService.kt | 13 +++++++++---- .../sodalive/can/charge/event/ChargeSpringEvent.kt | 2 +- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeEventService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeEventService.kt index 632b623..add2181 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeEventService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeEventService.kt @@ -10,6 +10,7 @@ import kr.co.vividnext.sodalive.common.SodaException import kr.co.vividnext.sodalive.fcm.FcmEvent import kr.co.vividnext.sodalive.fcm.FcmEventType import kr.co.vividnext.sodalive.member.Member +import kr.co.vividnext.sodalive.member.MemberRepository import kr.co.vividnext.sodalive.member.auth.AuthRepository import org.springframework.context.ApplicationEventPublisher import org.springframework.data.repository.findByIdOrNull @@ -22,22 +23,26 @@ import kotlin.math.round class ChargeEventService( private val repository: ChargeEventRepository, private val authRepository: AuthRepository, + private val memberRepository: MemberRepository, private val chargeRepository: ChargeRepository, private val chargeEventRepository: ChargeEventRepository, private val applicationEventPublisher: ApplicationEventPublisher ) { @Transactional - fun applyChargeEvent(chargeId: Long, member: Member) { + fun applyChargeEvent(chargeId: Long, memberId: Long) { val charge = chargeRepository.findByIdOrNull(chargeId) - ?: throw SodaException("이벤트가 적용되지 않았습니다.") + ?: throw SodaException("이벤트가 적용되지 않았습니다.\n고객센터에 문의해 주세요.") + + val member = memberRepository.findByIdOrNull(memberId) + ?: throw SodaException("이벤트가 적용되지 않았습니다.\n고객센터에 문의해 주세요.") if (member.auth != null) { val authDate = authRepository.getOldestCreatedAtByDi(member.auth!!.di) val memberIds = authRepository.getMemberIdsByDi(member.auth!!.di) var chargeCount = 0 - for (memberId in memberIds) { - chargeCount += chargeRepository.getChargeCountAfterDate(memberId = memberId, authDate) + for (id in memberIds) { + chargeCount += chargeRepository.getChargeCountAfterDate(memberId = id, authDate) } if (chargeCount > 0) { diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt index 928eee4..c2d2888 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt @@ -20,6 +20,6 @@ class ChargeSpringEventListener( @TransactionalEventListener @Transactional(propagation = Propagation.REQUIRES_NEW) fun applyChargeEvent(event: ChargeSpringEvent) { - chargeEventService.applyChargeEvent(event.chargeId, event.member) + chargeEventService.applyChargeEvent(event.chargeId, event.member.id!!) } } From c5fd55a6f8d86e05b0f14555ceb08eb13f167511 Mon Sep 17 00:00:00 2001 From: Klaus Date: Sun, 27 Aug 2023 19:35:04 +0900 Subject: [PATCH 07/15] =?UTF-8?q?=EC=B6=A9=EC=A0=84=EC=9D=B4=EB=B2=A4?= =?UTF-8?q?=ED=8A=B8=EA=B0=80=20=EC=A0=81=EC=9A=A9=EB=90=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EB=8A=94=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt index c2d2888..d12036f 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt @@ -1,11 +1,11 @@ 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.stereotype.Component import org.springframework.transaction.annotation.Propagation import org.springframework.transaction.annotation.Transactional -import org.springframework.transaction.event.TransactionalEventListener class ChargeSpringEvent( val chargeId: Long, @@ -17,7 +17,7 @@ class ChargeSpringEventListener( private val chargeEventService: ChargeEventService ) { @Async - @TransactionalEventListener + @EventListener @Transactional(propagation = Propagation.REQUIRES_NEW) fun applyChargeEvent(event: ChargeSpringEvent) { chargeEventService.applyChargeEvent(event.chargeId, event.member.id!!) From 53bc8ed05af8c22be6580087fa688b4feae3a23b Mon Sep 17 00:00:00 2001 From: Klaus Date: Sun, 27 Aug 2023 19:43:54 +0900 Subject: [PATCH 08/15] =?UTF-8?q?=EC=B6=A9=EC=A0=84=EC=9D=B4=EB=B2=A4?= =?UTF-8?q?=ED=8A=B8=EA=B0=80=20=EC=A0=81=EC=9A=A9=EB=90=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EB=8A=94=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/can/charge/event/ChargeEventService.kt | 3 ++- .../sodalive/can/charge/event/ChargeSpringEvent.kt | 7 ++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeEventService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeEventService.kt index add2181..c2b9e04 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeEventService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeEventService.kt @@ -15,6 +15,7 @@ import kr.co.vividnext.sodalive.member.auth.AuthRepository import org.springframework.context.ApplicationEventPublisher import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Propagation import org.springframework.transaction.annotation.Transactional import kotlin.math.ceil import kotlin.math.round @@ -28,7 +29,7 @@ class ChargeEventService( private val chargeEventRepository: ChargeEventRepository, private val applicationEventPublisher: ApplicationEventPublisher ) { - @Transactional + @Transactional(propagation = Propagation.REQUIRES_NEW) fun applyChargeEvent(chargeId: Long, memberId: Long) { val charge = chargeRepository.findByIdOrNull(chargeId) ?: throw SodaException("이벤트가 적용되지 않았습니다.\n고객센터에 문의해 주세요.") diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt index d12036f..b0a6d88 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt @@ -1,11 +1,9 @@ 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.stereotype.Component -import org.springframework.transaction.annotation.Propagation -import org.springframework.transaction.annotation.Transactional +import org.springframework.transaction.event.TransactionalEventListener class ChargeSpringEvent( val chargeId: Long, @@ -17,8 +15,7 @@ class ChargeSpringEventListener( private val chargeEventService: ChargeEventService ) { @Async - @EventListener - @Transactional(propagation = Propagation.REQUIRES_NEW) + @TransactionalEventListener fun applyChargeEvent(event: ChargeSpringEvent) { chargeEventService.applyChargeEvent(event.chargeId, event.member.id!!) } From f2ecf3a676f0f9af7fb07108d6f7e826998d5054 Mon Sep 17 00:00:00 2001 From: Klaus Date: Sun, 27 Aug 2023 20:10:23 +0900 Subject: [PATCH 09/15] =?UTF-8?q?=EC=B6=A9=EC=A0=84=EC=9D=B4=EB=B2=A4?= =?UTF-8?q?=ED=8A=B8=EA=B0=80=20=EC=A0=81=EC=9A=A9=EB=90=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EB=8A=94=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/can/charge/event/ChargeEventService.kt | 3 --- .../sodalive/can/charge/event/ChargeSpringEvent.kt | 6 +++++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeEventService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeEventService.kt index c2b9e04..8ec871a 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeEventService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeEventService.kt @@ -15,8 +15,6 @@ import kr.co.vividnext.sodalive.member.auth.AuthRepository import org.springframework.context.ApplicationEventPublisher import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service -import org.springframework.transaction.annotation.Propagation -import org.springframework.transaction.annotation.Transactional import kotlin.math.ceil import kotlin.math.round @@ -29,7 +27,6 @@ class ChargeEventService( private val chargeEventRepository: ChargeEventRepository, private val applicationEventPublisher: ApplicationEventPublisher ) { - @Transactional(propagation = Propagation.REQUIRES_NEW) fun applyChargeEvent(chargeId: Long, memberId: Long) { val charge = chargeRepository.findByIdOrNull(chargeId) ?: throw SodaException("이벤트가 적용되지 않았습니다.\n고객센터에 문의해 주세요.") diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt index b0a6d88..2bf349d 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt @@ -3,6 +3,9 @@ package kr.co.vividnext.sodalive.can.charge.event import kr.co.vividnext.sodalive.member.Member import org.springframework.scheduling.annotation.Async import org.springframework.stereotype.Component +import org.springframework.transaction.annotation.Propagation +import org.springframework.transaction.annotation.Transactional +import org.springframework.transaction.event.TransactionPhase import org.springframework.transaction.event.TransactionalEventListener class ChargeSpringEvent( @@ -15,7 +18,8 @@ class ChargeSpringEventListener( private val chargeEventService: ChargeEventService ) { @Async - @TransactionalEventListener + @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) + @Transactional(propagation = Propagation.REQUIRES_NEW) fun applyChargeEvent(event: ChargeSpringEvent) { chargeEventService.applyChargeEvent(event.chargeId, event.member.id!!) } From 2e249db5f5b74463bad86a9a79b5e6e58b622188 Mon Sep 17 00:00:00 2001 From: Klaus Date: Sun, 27 Aug 2023 20:25:14 +0900 Subject: [PATCH 10/15] =?UTF-8?q?=EC=B6=A9=EC=A0=84=EC=9D=B4=EB=B2=A4?= =?UTF-8?q?=ED=8A=B8=EA=B0=80=20=EC=A0=81=EC=9A=A9=EB=90=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EB=8A=94=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/can/charge/event/ChargeEventService.kt | 2 ++ .../sodalive/can/charge/event/ChargeSpringEvent.kt | 8 ++------ 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeEventService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeEventService.kt index 8ec871a..add2181 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeEventService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeEventService.kt @@ -15,6 +15,7 @@ import kr.co.vividnext.sodalive.member.auth.AuthRepository import org.springframework.context.ApplicationEventPublisher import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional import kotlin.math.ceil import kotlin.math.round @@ -27,6 +28,7 @@ class ChargeEventService( private val chargeEventRepository: ChargeEventRepository, private val applicationEventPublisher: ApplicationEventPublisher ) { + @Transactional fun applyChargeEvent(chargeId: Long, memberId: Long) { val charge = chargeRepository.findByIdOrNull(chargeId) ?: throw SodaException("이벤트가 적용되지 않았습니다.\n고객센터에 문의해 주세요.") diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt index 2bf349d..2f667d0 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt @@ -1,12 +1,9 @@ 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.stereotype.Component -import org.springframework.transaction.annotation.Propagation -import org.springframework.transaction.annotation.Transactional -import org.springframework.transaction.event.TransactionPhase -import org.springframework.transaction.event.TransactionalEventListener class ChargeSpringEvent( val chargeId: Long, @@ -18,8 +15,7 @@ class ChargeSpringEventListener( private val chargeEventService: ChargeEventService ) { @Async - @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) - @Transactional(propagation = Propagation.REQUIRES_NEW) + @EventListener fun applyChargeEvent(event: ChargeSpringEvent) { chargeEventService.applyChargeEvent(event.chargeId, event.member.id!!) } From a9d3427b6fd70eb9aff97c13ad0030beb9820b0b Mon Sep 17 00:00:00 2001 From: Klaus Date: Sun, 27 Aug 2023 20:32:30 +0900 Subject: [PATCH 11/15] =?UTF-8?q?=EC=B6=A9=EC=A0=84=EC=9D=B4=EB=B2=A4?= =?UTF-8?q?=ED=8A=B8=EA=B0=80=20=EC=A0=81=EC=9A=A9=EB=90=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EB=8A=94=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vividnext/sodalive/can/charge/ChargeService.kt | 14 ++++++++++++-- .../sodalive/can/charge/event/ChargeSpringEvent.kt | 9 ++++----- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/ChargeService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/ChargeService.kt index 493346c..a8756b5 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/ChargeService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/ChargeService.kt @@ -85,7 +85,12 @@ class ChargeService( charge.payment?.status = PaymentStatus.COMPLETE 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 { throw SodaException("결제정보에 오류가 있습니다.") } @@ -134,7 +139,12 @@ class ChargeService( charge.payment?.status = PaymentStatus.COMPLETE 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 { throw SodaException("결제정보에 오류가 있습니다.") } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt index 2f667d0..5a6b014 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt @@ -1,13 +1,12 @@ 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.stereotype.Component +import org.springframework.transaction.event.TransactionalEventListener class ChargeSpringEvent( val chargeId: Long, - val member: Member + val memberId: Long ) @Component @@ -15,8 +14,8 @@ class ChargeSpringEventListener( private val chargeEventService: ChargeEventService ) { @Async - @EventListener + @TransactionalEventListener fun applyChargeEvent(event: ChargeSpringEvent) { - chargeEventService.applyChargeEvent(event.chargeId, event.member.id!!) + chargeEventService.applyChargeEvent(event.chargeId, event.memberId) } } From 9046c10d1004fee270d0f2f159f0564a3c59934f Mon Sep 17 00:00:00 2001 From: Klaus Date: Sun, 27 Aug 2023 20:50:18 +0900 Subject: [PATCH 12/15] =?UTF-8?q?=EC=B6=A9=EC=A0=84=EC=9D=B4=EB=B2=A4?= =?UTF-8?q?=ED=8A=B8=EA=B0=80=20=EC=A0=81=EC=9A=A9=EB=90=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EB=8A=94=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/can/charge/ChargeService.kt | 21 +++++++------------ .../can/charge/event/ChargeEventService.kt | 6 ++---- .../can/charge/event/ChargeSpringEvent.kt | 21 ------------------- 3 files changed, 10 insertions(+), 38 deletions(-) delete mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/ChargeService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/ChargeService.kt index a8756b5..8f33f47 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/ChargeService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/ChargeService.kt @@ -3,7 +3,7 @@ package kr.co.vividnext.sodalive.can.charge import com.fasterxml.jackson.databind.ObjectMapper import kr.co.bootpay.Bootpay import kr.co.vividnext.sodalive.can.CanRepository -import kr.co.vividnext.sodalive.can.charge.event.ChargeSpringEvent +import kr.co.vividnext.sodalive.can.charge.event.ChargeEventService import kr.co.vividnext.sodalive.can.payment.Payment import kr.co.vividnext.sodalive.can.payment.PaymentGateway import kr.co.vividnext.sodalive.can.payment.PaymentStatus @@ -16,7 +16,6 @@ import okhttp3.Request import okhttp3.RequestBody.Companion.toRequestBody import org.json.JSONObject import org.springframework.beans.factory.annotation.Value -import org.springframework.context.ApplicationEventPublisher import org.springframework.data.repository.findByIdOrNull import org.springframework.http.HttpHeaders import org.springframework.security.core.userdetails.User @@ -31,7 +30,7 @@ class ChargeService( private val memberRepository: MemberRepository, private val objectMapper: ObjectMapper, private val okHttpClient: OkHttpClient, - private val applicationEventPublisher: ApplicationEventPublisher, + private val chargeEventService: ChargeEventService, @Value("\${bootpay.application-id}") private val bootpayApplicationId: String, @@ -85,11 +84,9 @@ class ChargeService( charge.payment?.status = PaymentStatus.COMPLETE member.charge(charge.chargeCan, charge.rewardCan, "pg") - applicationEventPublisher.publishEvent( - ChargeSpringEvent( - chargeId = charge.id!!, - memberId = member.id!! - ) + chargeEventService.applyChargeEvent( + chargeId = charge.id!!, + memberId = member.id!! ) } else { throw SodaException("결제정보에 오류가 있습니다.") @@ -139,11 +136,9 @@ class ChargeService( charge.payment?.status = PaymentStatus.COMPLETE member.charge(charge.chargeCan, charge.rewardCan, "ios") - applicationEventPublisher.publishEvent( - ChargeSpringEvent( - chargeId = charge.id!!, - memberId = member.id!! - ) + chargeEventService.applyChargeEvent( + chargeId = charge.id!!, + memberId = member.id!! ) } else { throw SodaException("결제정보에 오류가 있습니다.") diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeEventService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeEventService.kt index add2181..96dcd1c 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeEventService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeEventService.kt @@ -15,7 +15,6 @@ import kr.co.vividnext.sodalive.member.auth.AuthRepository import org.springframework.context.ApplicationEventPublisher import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service -import org.springframework.transaction.annotation.Transactional import kotlin.math.ceil import kotlin.math.round @@ -28,13 +27,12 @@ class ChargeEventService( private val chargeEventRepository: ChargeEventRepository, private val applicationEventPublisher: ApplicationEventPublisher ) { - @Transactional fun applyChargeEvent(chargeId: Long, memberId: Long) { val charge = chargeRepository.findByIdOrNull(chargeId) - ?: throw SodaException("이벤트가 적용되지 않았습니다.\n고객센터에 문의해 주세요.") + ?: throw SodaException("결제정보에 오류가 있습니다.") val member = memberRepository.findByIdOrNull(memberId) - ?: throw SodaException("이벤트가 적용되지 않았습니다.\n고객센터에 문의해 주세요.") + ?: throw SodaException("결제정보에 오류가 있습니다.") if (member.auth != null) { val authDate = authRepository.getOldestCreatedAtByDi(member.auth!!.di) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt deleted file mode 100644 index 5a6b014..0000000 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt +++ /dev/null @@ -1,21 +0,0 @@ -package kr.co.vividnext.sodalive.can.charge.event - -import org.springframework.scheduling.annotation.Async -import org.springframework.stereotype.Component -import org.springframework.transaction.event.TransactionalEventListener - -class ChargeSpringEvent( - val chargeId: Long, - val memberId: Long -) - -@Component -class ChargeSpringEventListener( - private val chargeEventService: ChargeEventService -) { - @Async - @TransactionalEventListener - fun applyChargeEvent(event: ChargeSpringEvent) { - chargeEventService.applyChargeEvent(event.chargeId, event.memberId) - } -} From 2abfb8ce58fdab585946a9e69532afd767a36556 Mon Sep 17 00:00:00 2001 From: Klaus Date: Sun, 27 Aug 2023 20:58:03 +0900 Subject: [PATCH 13/15] =?UTF-8?q?=EC=B6=A9=EC=A0=84=EC=9D=B4=EB=B2=A4?= =?UTF-8?q?=ED=8A=B8=EA=B0=80=20=EC=A0=81=EC=9A=A9=EB=90=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EB=8A=94=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vividnext/sodalive/can/charge/event/ChargeEventService.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeEventService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeEventService.kt index 96dcd1c..43ef7f0 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeEventService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeEventService.kt @@ -15,6 +15,7 @@ import kr.co.vividnext.sodalive.member.auth.AuthRepository import org.springframework.context.ApplicationEventPublisher import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional import kotlin.math.ceil import kotlin.math.round @@ -27,6 +28,7 @@ class ChargeEventService( private val chargeEventRepository: ChargeEventRepository, private val applicationEventPublisher: ApplicationEventPublisher ) { + @Transactional fun applyChargeEvent(chargeId: Long, memberId: Long) { val charge = chargeRepository.findByIdOrNull(chargeId) ?: throw SodaException("결제정보에 오류가 있습니다.") From 779c3f824e5c10f78eff6e282586d4adc322e566 Mon Sep 17 00:00:00 2001 From: Klaus Date: Sun, 27 Aug 2023 21:09:57 +0900 Subject: [PATCH 14/15] =?UTF-8?q?=EC=B6=A9=EC=A0=84=EC=9D=B4=EB=B2=A4?= =?UTF-8?q?=ED=8A=B8=EA=B0=80=20=EC=A0=81=EC=9A=A9=EB=90=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EB=8A=94=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/can/charge/event/ChargeEventService.kt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeEventService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeEventService.kt index 43ef7f0..01fc7c3 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeEventService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeEventService.kt @@ -12,6 +12,7 @@ import kr.co.vividnext.sodalive.fcm.FcmEventType import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.member.MemberRepository import kr.co.vividnext.sodalive.member.auth.AuthRepository +import org.slf4j.LoggerFactory import org.springframework.context.ApplicationEventPublisher import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service @@ -28,8 +29,12 @@ class ChargeEventService( private val chargeEventRepository: ChargeEventRepository, private val applicationEventPublisher: ApplicationEventPublisher ) { + + private val logger = LoggerFactory.getLogger(this::class.java) + @Transactional fun applyChargeEvent(chargeId: Long, memberId: Long) { + logger.info("충전 이벤트 시작") val charge = chargeRepository.findByIdOrNull(chargeId) ?: throw SodaException("결제정보에 오류가 있습니다.") @@ -37,6 +42,7 @@ class ChargeEventService( ?: throw SodaException("결제정보에 오류가 있습니다.") if (member.auth != null) { + logger.info("본인인증 있음") val authDate = authRepository.getOldestCreatedAtByDi(member.auth!!.di) val memberIds = authRepository.getMemberIdsByDi(member.auth!!.di) @@ -45,12 +51,14 @@ class ChargeEventService( chargeCount += chargeRepository.getChargeCountAfterDate(memberId = id, authDate) } + logger.info("충전횟수 : $chargeCount") if (chargeCount > 0) { applyOtherEvent(charge, member) } else { applyFirstChargeEvent(charge, member) } } else { + logger.info("본인인증 없음") applyOtherEvent(charge, member) } } From fb8309c7b46ccce700240bea4f9b9ce52ce63f4c Mon Sep 17 00:00:00 2001 From: Klaus Date: Sun, 27 Aug 2023 21:22:42 +0900 Subject: [PATCH 15/15] =?UTF-8?q?=EC=B6=A9=EC=A0=84=EC=9D=B4=EB=B2=A4?= =?UTF-8?q?=ED=8A=B8=EA=B0=80=20=EC=A0=81=EC=9A=A9=EB=90=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EB=8A=94=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/can/charge/ChargeService.kt | 21 ++++++++++++------- .../can/charge/event/ChargeEventService.kt | 14 +++---------- .../can/charge/event/ChargeSpringEvent.kt | 21 +++++++++++++++++++ 3 files changed, 37 insertions(+), 19 deletions(-) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/ChargeService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/ChargeService.kt index 8f33f47..a8756b5 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/ChargeService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/ChargeService.kt @@ -3,7 +3,7 @@ package kr.co.vividnext.sodalive.can.charge import com.fasterxml.jackson.databind.ObjectMapper import kr.co.bootpay.Bootpay import kr.co.vividnext.sodalive.can.CanRepository -import kr.co.vividnext.sodalive.can.charge.event.ChargeEventService +import kr.co.vividnext.sodalive.can.charge.event.ChargeSpringEvent import kr.co.vividnext.sodalive.can.payment.Payment import kr.co.vividnext.sodalive.can.payment.PaymentGateway import kr.co.vividnext.sodalive.can.payment.PaymentStatus @@ -16,6 +16,7 @@ import okhttp3.Request import okhttp3.RequestBody.Companion.toRequestBody import org.json.JSONObject import org.springframework.beans.factory.annotation.Value +import org.springframework.context.ApplicationEventPublisher import org.springframework.data.repository.findByIdOrNull import org.springframework.http.HttpHeaders import org.springframework.security.core.userdetails.User @@ -30,7 +31,7 @@ class ChargeService( private val memberRepository: MemberRepository, private val objectMapper: ObjectMapper, private val okHttpClient: OkHttpClient, - private val chargeEventService: ChargeEventService, + private val applicationEventPublisher: ApplicationEventPublisher, @Value("\${bootpay.application-id}") private val bootpayApplicationId: String, @@ -84,9 +85,11 @@ class ChargeService( charge.payment?.status = PaymentStatus.COMPLETE member.charge(charge.chargeCan, charge.rewardCan, "pg") - chargeEventService.applyChargeEvent( - chargeId = charge.id!!, - memberId = member.id!! + applicationEventPublisher.publishEvent( + ChargeSpringEvent( + chargeId = charge.id!!, + memberId = member.id!! + ) ) } else { throw SodaException("결제정보에 오류가 있습니다.") @@ -136,9 +139,11 @@ class ChargeService( charge.payment?.status = PaymentStatus.COMPLETE member.charge(charge.chargeCan, charge.rewardCan, "ios") - chargeEventService.applyChargeEvent( - chargeId = charge.id!!, - memberId = member.id!! + applicationEventPublisher.publishEvent( + ChargeSpringEvent( + chargeId = charge.id!!, + memberId = member.id!! + ) ) } else { throw SodaException("결제정보에 오류가 있습니다.") diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeEventService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeEventService.kt index 01fc7c3..7a8ff3e 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeEventService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeEventService.kt @@ -12,7 +12,6 @@ import kr.co.vividnext.sodalive.fcm.FcmEventType import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.member.MemberRepository import kr.co.vividnext.sodalive.member.auth.AuthRepository -import org.slf4j.LoggerFactory import org.springframework.context.ApplicationEventPublisher import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service @@ -29,20 +28,15 @@ class ChargeEventService( private val chargeEventRepository: ChargeEventRepository, private val applicationEventPublisher: ApplicationEventPublisher ) { - - private val logger = LoggerFactory.getLogger(this::class.java) - @Transactional fun applyChargeEvent(chargeId: Long, memberId: Long) { - logger.info("충전 이벤트 시작") val charge = chargeRepository.findByIdOrNull(chargeId) - ?: throw SodaException("결제정보에 오류가 있습니다.") + ?: throw SodaException("이벤트가 적용되지 않았습니다.\n고객센터에 문의해 주세요.") val member = memberRepository.findByIdOrNull(memberId) - ?: throw SodaException("결제정보에 오류가 있습니다.") + ?: throw SodaException("이벤트가 적용되지 않았습니다.\n고객센터에 문의해 주세요.") if (member.auth != null) { - logger.info("본인인증 있음") val authDate = authRepository.getOldestCreatedAtByDi(member.auth!!.di) val memberIds = authRepository.getMemberIdsByDi(member.auth!!.di) @@ -51,14 +45,12 @@ class ChargeEventService( chargeCount += chargeRepository.getChargeCountAfterDate(memberId = id, authDate) } - logger.info("충전횟수 : $chargeCount") - if (chargeCount > 0) { + if (chargeCount > 1) { applyOtherEvent(charge, member) } else { applyFirstChargeEvent(charge, member) } } else { - logger.info("본인인증 없음") applyOtherEvent(charge, member) } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt new file mode 100644 index 0000000..5a6b014 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/event/ChargeSpringEvent.kt @@ -0,0 +1,21 @@ +package kr.co.vividnext.sodalive.can.charge.event + +import org.springframework.scheduling.annotation.Async +import org.springframework.stereotype.Component +import org.springframework.transaction.event.TransactionalEventListener + +class ChargeSpringEvent( + val chargeId: Long, + val memberId: Long +) + +@Component +class ChargeSpringEventListener( + private val chargeEventService: ChargeEventService +) { + @Async + @TransactionalEventListener + fun applyChargeEvent(event: ChargeSpringEvent) { + chargeEventService.applyChargeEvent(event.chargeId, event.memberId) + } +}