From 3fda9e6db4fb0025068bcae55d9449fdc5f50b7c Mon Sep 17 00:00:00 2001 From: guqing <38999863+guqing@users.noreply.github.com> Date: Sat, 14 Sep 2024 15:16:31 +0800 Subject: [PATCH] refactor: remove trailing slash in site url for notification (#6660) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #### What type of PR is this? /kind improvement /area core /milestone 2.20.x #### What this PR does / why we need it: 修复 external-url 配置带了尾部斜杠导致邮件通知的查看通知链接无法访问的问题 #### Which issue(s) this PR fixes: Fixes #6655 #### Does this PR introduce a user-facing change? ```release-note 修复 external-url 配置带了尾部斜杠导致邮件通知的查看通知链接无法访问的问题 ``` --- .../DefaultNotificationTemplateRender.java | 7 ++++- ...DefaultNotificationTemplateRenderTest.java | 28 +++++++++++++++++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/application/src/main/java/run/halo/app/notification/DefaultNotificationTemplateRender.java b/application/src/main/java/run/halo/app/notification/DefaultNotificationTemplateRender.java index b15ff738e..08c150523 100644 --- a/application/src/main/java/run/halo/app/notification/DefaultNotificationTemplateRender.java +++ b/application/src/main/java/run/halo/app/notification/DefaultNotificationTemplateRender.java @@ -5,7 +5,9 @@ import static org.apache.commons.lang3.StringUtils.defaultString; import java.util.HashMap; import java.util.Locale; import java.util.Map; +import java.util.Optional; import lombok.RequiredArgsConstructor; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; import org.thymeleaf.TemplateEngine; import org.thymeleaf.context.Context; @@ -40,13 +42,16 @@ public class DefaultNotificationTemplateRender implements NotificationTemplateRe @Override public Mono render(String template, Map model) { var context = new Context(Locale.getDefault(), model); + var externalUrl = Optional.ofNullable(externalUrlSupplier.getRaw()) + .map(url -> StringUtils.removeEnd(url.toString(), "/")) + .orElse(StringUtils.EMPTY); var globalAttributeMono = getBasicSetting() .doOnNext(basic -> { var site = new HashMap<>(); site.put("title", basic.getTitle()); site.put("logo", basic.getLogo()); site.put("subtitle", basic.getSubtitle()); - site.put("url", externalUrlSupplier.getRaw()); + site.put("url", externalUrl); context.setVariable("site", site); }); return Mono.when(globalAttributeMono) diff --git a/application/src/test/java/run/halo/app/notification/DefaultNotificationTemplateRenderTest.java b/application/src/test/java/run/halo/app/notification/DefaultNotificationTemplateRenderTest.java index e4d10336f..592574012 100644 --- a/application/src/test/java/run/halo/app/notification/DefaultNotificationTemplateRenderTest.java +++ b/application/src/test/java/run/halo/app/notification/DefaultNotificationTemplateRenderTest.java @@ -9,6 +9,7 @@ import static org.mockito.Mockito.when; import java.net.MalformedURLException; import java.net.URI; +import java.net.URL; import java.util.Map; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -88,7 +89,7 @@ class DefaultNotificationTemplateRenderTest { 以下是回复的具体内容: 这是回复的内容 - + Halo http://localhost:8090 祝好! @@ -101,4 +102,27 @@ class DefaultNotificationTemplateRenderTest { eq(SystemSetting.Basic.class)); verify(externalUrlSupplier).getRaw(); } -} + + @Test + void siteUrlTest() throws MalformedURLException { + when(environmentFetcher.fetch(eq(SystemSetting.Basic.GROUP), eq(SystemSetting.Basic.class))) + .thenReturn(Mono.just(new SystemSetting.Basic())); + + var template = "查看通知"; + var expected = "查看通知"; + + when(externalUrlSupplier.getRaw()).thenReturn(new URL("http://localhost:8090/")); + templateRender.render(template, + Map.of()) + .as(StepVerifier::create) + .expectNext(expected) + .verifyComplete(); + + when(externalUrlSupplier.getRaw()).thenReturn(new URL("http://localhost:8090")); + templateRender.render(template, + Map.of()) + .as(StepVerifier::create) + .expectNext(expected) + .verifyComplete(); + } +} \ No newline at end of file