From b46019bbc6fbabe18407b29c37d08cce17a043d3 Mon Sep 17 00:00:00 2001 From: Ethan Date: Mon, 15 Jul 2024 11:39:54 +0900 Subject: [PATCH] =?UTF-8?q?=EC=95=8C=EB=A6=BC=ED=86=A1=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C=20=ED=9B=84=20=EC=8A=AC=EB=9E=99=20=EC=95=8C=EB=A6=BC?= =?UTF-8?q?=20=ED=85=9C=ED=94=8C=EB=A6=BF=20=EB=B3=80=EA=B2=BD=20(#137)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor: 알림 템플릿 변경 * refactor: 예상 비용 확인 기능 추가 --- .../itracker/alarm/service/AlarmService.kt | 7 +-- .../SuccessReservationOfNotificationEvent.kt | 3 +- .../event/MessageReservationSuccessEvent.kt | 6 +++ .../notification/solapi/NotificationClient.kt | 44 ++++++++++++++----- .../NotificationSchedulerService.kt | 7 ++- .../notification/NotificationSender.kt | 4 +- 6 files changed, 53 insertions(+), 18 deletions(-) diff --git a/src/main/kotlin/backend/itracker/alarm/service/AlarmService.kt b/src/main/kotlin/backend/itracker/alarm/service/AlarmService.kt index d16fe8b..cf48e49 100644 --- a/src/main/kotlin/backend/itracker/alarm/service/AlarmService.kt +++ b/src/main/kotlin/backend/itracker/alarm/service/AlarmService.kt @@ -56,9 +56,10 @@ class AlarmService ( Color.GREEN, listOf( """ - |*전송한 메세지 수* : ${event.successMessageCount()} - |*남은 포인트* : ${event.point()} - |*잔액* : ${event.balance()} + *전송한 메세지 수* : ${event.successMessageCount()} + *남은 포인트* : ${event.point()} + *잔액* : ${event.balance()} + *예상 차감 금액(VAT 별도)* : -${event.cost()} """.trimIndent() ) ) diff --git a/src/main/kotlin/backend/itracker/alarm/service/event/SuccessReservationOfNotificationEvent.kt b/src/main/kotlin/backend/itracker/alarm/service/event/SuccessReservationOfNotificationEvent.kt index c34bb68..c2e8fdc 100644 --- a/src/main/kotlin/backend/itracker/alarm/service/event/SuccessReservationOfNotificationEvent.kt +++ b/src/main/kotlin/backend/itracker/alarm/service/event/SuccessReservationOfNotificationEvent.kt @@ -2,7 +2,6 @@ package backend.itracker.alarm.service.event import java.time.LocalDateTime - interface SuccessReservationOfNotificationEvent { fun reservationTime(): LocalDateTime @@ -12,4 +11,6 @@ interface SuccessReservationOfNotificationEvent { fun point(): Float fun balance(): Float + + fun cost(): Long } diff --git a/src/main/kotlin/backend/itracker/schedule/infra/notification/event/MessageReservationSuccessEvent.kt b/src/main/kotlin/backend/itracker/schedule/infra/notification/event/MessageReservationSuccessEvent.kt index 5494fe1..52811db 100644 --- a/src/main/kotlin/backend/itracker/schedule/infra/notification/event/MessageReservationSuccessEvent.kt +++ b/src/main/kotlin/backend/itracker/schedule/infra/notification/event/MessageReservationSuccessEvent.kt @@ -3,6 +3,8 @@ package backend.itracker.schedule.infra.notification.event import backend.itracker.alarm.service.event.SuccessReservationOfNotificationEvent import java.time.LocalDateTime +private const val SOLAPI_KAKAO_ALARAM_COST = 9L + data class MessageReservationSuccessEvent( val reservationTime: LocalDateTime, val successMessageCount: Int, @@ -25,4 +27,8 @@ data class MessageReservationSuccessEvent( override fun balance(): Float { return balance } + + override fun cost(): Long { + return successMessageCount * SOLAPI_KAKAO_ALARAM_COST + } } diff --git a/src/main/kotlin/backend/itracker/schedule/infra/notification/solapi/NotificationClient.kt b/src/main/kotlin/backend/itracker/schedule/infra/notification/solapi/NotificationClient.kt index 28a2823..ae8d02f 100644 --- a/src/main/kotlin/backend/itracker/schedule/infra/notification/solapi/NotificationClient.kt +++ b/src/main/kotlin/backend/itracker/schedule/infra/notification/solapi/NotificationClient.kt @@ -20,6 +20,8 @@ import java.time.ZoneOffset val logger = KotlinLogging.logger {} +private const val RESERVE_FAIlED = 0 + @Profile("!test") @Component class NotificationClient( @@ -31,7 +33,7 @@ class NotificationClient( override fun reserveNotificationOfPriceChange( priceChangeTemplate: PriceChangeNotificationInfo, receiverPhoneNumbers: List, - ) { + ): Int { val option = KakaoOption( pfId = nurigoKakaoChannelConfig.pfId, templateId = nurigoKakaoChannelConfig.priceChangeNotificationTemplateId, @@ -47,20 +49,11 @@ class NotificationClient( ) } - val reservationTime = LocalDateTime.of(LocalDate.now(), LocalTime.of(nurigoKakaoChannelConfig.sendingHour, 0)) - val scheduledDateTime = reservationTime.toInstant(ZoneOffset.of("+9"))!! + val scheduledDateTime = getReservationTime().toInstant(ZoneOffset.of("+9"))!! try { messageService.send(messages, scheduledDateTime) - val balance = messageService.getBalance() - eventPublisher.publishEvent( - MessageReservationSuccessEvent( - reservationTime = reservationTime!!, - point = balance.point!!, - balance = balance.balance!!, - successMessageCount = messages.size - ) - ) + return messages.size } catch (exception: NurigoMessageNotReceivedException) { logger.error { """ @@ -76,6 +69,33 @@ class NotificationClient( exception.message ) ) + + return RESERVE_FAIlED } } + + override fun checkBalance(reservationCount: Int) { + try { + val balance = messageService.getBalance() + eventPublisher.publishEvent( + MessageReservationSuccessEvent( + reservationTime = getReservationTime(), + point = balance.point!!, + balance = balance.balance!!, + successMessageCount = reservationCount + ) + ) + } catch (exception: NurigoMessageNotReceivedException) { + logger.error { "잔액 확인 실패 cause : $exception" } + } + } + + private fun getReservationTime(): LocalDateTime { + return LocalDateTime.of( + LocalDate.now(), LocalTime.of( + nurigoKakaoChannelConfig.sendingHour, + 0 + ) + ) + } } diff --git a/src/main/kotlin/backend/itracker/schedule/service/notification/NotificationSchedulerService.kt b/src/main/kotlin/backend/itracker/schedule/service/notification/NotificationSchedulerService.kt index f24c4f7..159f5f6 100644 --- a/src/main/kotlin/backend/itracker/schedule/service/notification/NotificationSchedulerService.kt +++ b/src/main/kotlin/backend/itracker/schedule/service/notification/NotificationSchedulerService.kt @@ -21,10 +21,15 @@ class NotificationSchedulerService( .groupBy { it.product} .mapValues { entry -> entry.value.map { it.member } } + var reservationCount = 0 productCategoryMap.forEach { (product, members) -> val priceChangeNotificationInfo = notificationComposite.getPriceChangeNotificationInfo(product) val receiverPhoneNumbers = members.mapNotNull { it.phoneNumber } - notificationSender.reserveNotificationOfPriceChange(priceChangeNotificationInfo, receiverPhoneNumbers) + reservationCount += notificationSender.reserveNotificationOfPriceChange(priceChangeNotificationInfo, receiverPhoneNumbers) + } + + if (reservationCount > 0) { + notificationSender.checkBalance(reservationCount) } } } diff --git a/src/main/kotlin/backend/itracker/schedule/service/notification/NotificationSender.kt b/src/main/kotlin/backend/itracker/schedule/service/notification/NotificationSender.kt index 0526104..1b91517 100644 --- a/src/main/kotlin/backend/itracker/schedule/service/notification/NotificationSender.kt +++ b/src/main/kotlin/backend/itracker/schedule/service/notification/NotificationSender.kt @@ -7,5 +7,7 @@ interface NotificationSender { fun reserveNotificationOfPriceChange( priceChangeTemplate: PriceChangeNotificationInfo, receiverPhoneNumbers: List, - ) + ): Int + + fun checkBalance(reservationCount: Int) }