Skip to content

Commit 376ed62

Browse files
authored
v0.1.5
v0.1.5
2 parents 761c667 + 54f8595 commit 376ed62

File tree

30 files changed

+223
-58
lines changed

30 files changed

+223
-58
lines changed

gradle/libs.versions.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,9 @@ spring_cloud_openfeign = "4.2.0"
6464
openfeign_hc5 = "13.1"
6565
openfeign_micrometer = "13.1"
6666

67+
# Spring Retry
68+
spring_retry = "2.0.11"
69+
6770
micrometer = "1.5.1"
6871
micrometer-registry-prometheus = "1.15.1"
6972

@@ -192,6 +195,9 @@ spring_cloud_openfeign = { module = "org.springframework.cloud:spring-cloud-star
192195
openfeign_hc5 = { module = "io.github.openfeign:feign-hc5", version.ref = "openfeign_hc5" }
193196
openfeign_micrometer = { module = "io.github.openfeign:feign-micrometer", version.ref = "openfeign_micrometer" }
194197

198+
# Spring Retry Libraries
199+
spring_retry = { module = "org.springframework.retry:spring-retry", version.ref = "spring_retry" }
200+
195201
# Sentry
196202
sentry_logback = { module = "io.sentry:sentry-logback", version.ref = "sentry_logback"}
197203

sseudam-admin/src/main/kotlin/com/sseudam/admin/application/AdminFacade.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ package com.sseudam.admin.application
33
import com.sseudam.admin.domain.AdminToken
44
import com.sseudam.admin.domain.AdminUserProfile
55
import com.sseudam.auth.AuthenticationService
6-
import com.sseudam.notification.FcmSender
7-
import com.sseudam.notification.NewFirebaseCloudMessage
86
import com.sseudam.notification.NotificationService
97
import com.sseudam.notification.NotificationStored
108
import com.sseudam.notification.ReadStatus
9+
import com.sseudam.notification.fcm.FcmSender
10+
import com.sseudam.notification.fcm.NewFirebaseCloudMessage
1111
import com.sseudam.pet.PetPointAction
1212
import com.sseudam.pet.event.PetEventPublisher
1313
import com.sseudam.report.ReportFacade

sseudam-admin/src/main/kotlin/com/sseudam/admin/presentation/response/suggestion/SpotSuggestionAdminResponse.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ data class SpotSuggestionAdminResponse(
1515
val id: Long,
1616
@Schema(description = "제보 위치")
1717
val point: GeoJson,
18+
@Schema(description = "제보 장소 이름")
19+
val spotName: String,
1820
@Schema(description = "제보 지역")
1921
val region: Region,
2022
@Schema(description = "제보 주소")
@@ -33,6 +35,7 @@ data class SpotSuggestionAdminResponse(
3335
SpotSuggestionAdminResponse(
3436
id = suggestion.id,
3537
point = suggestion.point,
38+
spotName = suggestion.spotName,
3639
region = suggestion.region,
3740
address = suggestion.address,
3841
trashType = suggestion.trashType,

sseudam-batch/src/main/kotlin/com/sseudam/notification/NotificationScheduler.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.sseudam.notification
22

3+
import com.sseudam.notification.fcm.FcmSender
34
import org.springframework.scheduling.annotation.Scheduled
45
import org.springframework.stereotype.Component
56

sseudam-batch/src/main/kotlin/com/sseudam/pet/PetScheduler.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package com.sseudam.pet
22

3-
import com.sseudam.notification.FcmSender
4-
import com.sseudam.notification.NewFirebaseCloudMessage
53
import com.sseudam.notification.NotificationMessages
64
import com.sseudam.notification.NotificationService
75
import com.sseudam.notification.NotificationStored
86
import com.sseudam.notification.NotificationStoredKeyGenerator
97
import com.sseudam.notification.ReadStatus
8+
import com.sseudam.notification.fcm.FcmSender
9+
import com.sseudam.notification.fcm.NewFirebaseCloudMessage
1010
import com.sseudam.user.UserService
1111
import com.sseudam.user.device.UserDeviceService
1212
import org.springframework.scheduling.annotation.Scheduled

sseudam-clients/notification/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ dependencies {
22
// Notification
33
implementation(libs.bundles.openfeign)
44
implementation(libs.firebase)
5+
implementation(libs.spring.retry)
6+
implementation(libs.spring.boot.starter.aop)
57

68
implementation(project(":sseudam-core:core-domain"))
79
implementation(project(":sseudam-core:core-contract"))
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.sseudam.client.config
2+
3+
import org.springframework.cloud.openfeign.EnableFeignClients
4+
import org.springframework.context.annotation.Configuration
5+
import org.springframework.retry.annotation.EnableRetry
6+
7+
@Configuration
8+
@EnableFeignClients(basePackages = ["com.sseudam.client.discord", "com.sseudam.client.notification"])
9+
@EnableRetry
10+
internal class NotificationFeignConfig
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.sseudam.client.discord
2+
3+
import com.sseudam.notification.discord.DiscordClient
4+
import com.sseudam.user.UserProfile
5+
import org.springframework.core.env.Environment
6+
import org.springframework.retry.annotation.Backoff
7+
import org.springframework.retry.annotation.Retryable
8+
import org.springframework.stereotype.Component
9+
import java.net.URI
10+
11+
@Component
12+
class DiscordClientSender(
13+
private val environment: Environment,
14+
private val discordWebhookClient: DiscordWebhookClient,
15+
private val discordWebhookProperties: DiscordWebhookProperties,
16+
) : DiscordClient {
17+
@Retryable(
18+
maxAttempts = 3,
19+
backoff = Backoff(delay = 1000, multiplier = 2.0),
20+
retryFor = [Exception::class],
21+
)
22+
override fun sendCreateUserMessage(userProfile: UserProfile) {
23+
val environment = environment.getProperty("spring.profiles.active")
24+
val environmentName =
25+
when (environment) {
26+
"prod" -> "운영"
27+
"staging" -> "스테이징"
28+
"dev" -> "개발"
29+
else -> "그 외 환경"
30+
}
31+
val content =
32+
"""
33+
## 🎉 쓰담 새 회원 가입 알림 ($environmentName)
34+
35+
**닉네임:** ${userProfile.nickname}
36+
**이메일:** ${userProfile.email}
37+
**이름:** ${userProfile.name ?: "Unknown"}
38+
**회원 ID:** ${userProfile.id}
39+
**가입일시:** ${userProfile.createdAt.toLocalDate()} ${userProfile.createdAt.toLocalTime()}
40+
""".trimIndent()
41+
42+
val message = DiscordMessagePayload(content)
43+
discordWebhookClient.sendMessage(URI.create(discordWebhookProperties.userChannel), message)
44+
}
45+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.sseudam.client.discord
2+
3+
import org.springframework.cloud.openfeign.FeignClient
4+
import org.springframework.web.bind.annotation.PostMapping
5+
import org.springframework.web.bind.annotation.RequestBody
6+
import java.net.URI
7+
8+
@FeignClient(name = "discord-webhook", url = "placeholder")
9+
interface DiscordWebhookClient {
10+
@PostMapping
11+
fun sendMessage(
12+
uri: URI,
13+
@RequestBody message: DiscordMessagePayload,
14+
)
15+
}
16+
17+
data class DiscordMessagePayload(
18+
val content: String,
19+
)
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.sseudam.client.discord
2+
3+
import org.springframework.boot.context.properties.ConfigurationProperties
4+
5+
@ConfigurationProperties(prefix = "discord.webhook.alert")
6+
data class DiscordWebhookProperties(
7+
val userChannel: String,
8+
val reportChannel: String,
9+
val suggestionChannel: String,
10+
)

0 commit comments

Comments
 (0)