diff --git a/application/src/main/kotlin/com/dobby/usecase/member/email/SendMatchingEmailUseCase.kt b/application/src/main/kotlin/com/dobby/usecase/member/email/SendMatchingEmailUseCase.kt index 101e74a3..57a9baec 100644 --- a/application/src/main/kotlin/com/dobby/usecase/member/email/SendMatchingEmailUseCase.kt +++ b/application/src/main/kotlin/com/dobby/usecase/member/email/SendMatchingEmailUseCase.kt @@ -11,6 +11,7 @@ import com.dobby.model.experiment.ExperimentPost import com.dobby.usecase.UseCase import com.dobby.util.EmailUtils import com.dobby.util.RetryUtils +import com.dobby.util.UtmLinkUtils import java.time.LocalDate import java.time.LocalDateTime import java.time.format.DateTimeFormatter @@ -70,13 +71,15 @@ class SendMatchingEmailUseCase( return groupedPosts.flatMap { (place, posts) -> val sortedPosts = posts.sortedBy { it.createdAt } sortedPosts.mapIndexed { index, post -> - val postUrl = urlGeneratorGateway.getExperimentPostUrl(post.id) + val baseUrl = urlGeneratorGateway.getExperimentPostUrl(post.id) + val postUrlWithUtm = UtmLinkUtils.add(baseUrl) + mapOf( "title" to post.title, "place" to if (index == 0) place else "", "uploadDate" to LocalDate.now().toString(), "reward" to post.reward, - "postUrl" to postUrl + "postUrl" to postUrlWithUtm ) } } diff --git a/application/src/main/kotlin/com/dobby/util/UtmLinkUtils.kt b/application/src/main/kotlin/com/dobby/util/UtmLinkUtils.kt new file mode 100644 index 00000000..6ad45cd6 --- /dev/null +++ b/application/src/main/kotlin/com/dobby/util/UtmLinkUtils.kt @@ -0,0 +1,11 @@ +package com.dobby.util + +object UtmLinkUtils { + private const val EMAIL_UTM = "utm_source=email&utm_medium=daily" + + fun add(url: String, utm: String = EMAIL_UTM): String { + if (url.contains("utm_source=") || url.contains("utm_medium=")) return url + val sep = if (url.contains("?")) "&" else "?" + return url + sep + utm + } +} diff --git a/application/src/test/kotlin/com/dobby/util/UtmLinkUtilsTest.kt b/application/src/test/kotlin/com/dobby/util/UtmLinkUtilsTest.kt new file mode 100644 index 00000000..f0f9ebd5 --- /dev/null +++ b/application/src/test/kotlin/com/dobby/util/UtmLinkUtilsTest.kt @@ -0,0 +1,33 @@ +package com.dobby.util + +import io.kotest.core.spec.style.BehaviorSpec +import io.kotest.matchers.shouldBe + +class UtmLinkUtilsTest : BehaviorSpec({ + + given("메일 트래킹 정책(utm_source=email&utm_medium=daily)") { + `when`("원본 쿼리스트링이 없는 URL이면") { + val url = "https://gradmeet.co.kr/post/123" + then("UTM이 ?로 시작하여 붙는다") { + UtmLinkUtils.add(url) shouldBe + "https://gradmeet.co.kr/post/123?utm_source=email&utm_medium=daily" + } + } + + `when`("이미 쿼리스트링이 있는 URL이면") { + val url = "https://gradmeet.co.kr/post/123?param=test" + then("UTM이 &로 붙는다") { + UtmLinkUtils.add(url) shouldBe + "https://gradmeet.co.kr/post/123?param=test&utm_source=email&utm_medium=daily" + } + } + + `when`("이미 동일한 UTM이 붙어 있는 URL이면") { + val url = "https://gradmeet.co.kr/321?utm_source=email&utm_medium=daily" + then("중복 추가하지 않는다") { + UtmLinkUtils.add(url) shouldBe + "https://gradmeet.co.kr/321?utm_source=email&utm_medium=daily" + } + } + } +})