From c5f9c766bb2e04e7e5f8bf0f16c279c8b8af158b Mon Sep 17 00:00:00 2001 From: John Niang Date: Sat, 14 Sep 2024 10:48:29 +0800 Subject: [PATCH 01/13] Support changing locale using query language (#6658) 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: This PR adds support changing locale using query `language`. After passing the query, we will automatically respond a cookie `language` back to browser. Please see the result below: ```bash http http://localhost:8090/\?language\=zh-CN Accept:text/html -p h HTTP/1.1 200 OK Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Language: zh-CN Content-Type: text/html Expires: 0 Pragma: no-cache Referrer-Policy: strict-origin-when-cross-origin Vary: Origin Vary: Access-Control-Request-Method Vary: Access-Control-Request-Headers X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-XSS-Protection: 0 content-encoding: gzip content-length: 4765 set-cookie: language=zh-CN; Path=/; Secure set-cookie: XSRF-TOKEN=f0f2c972-0024-4575-aef2-0609356b4757; Path=/ ``` #### Does this PR introduce a user-facing change? ```release-note 支持利用参数 language 切换地域语言 ``` --- .../app/webfilter/LocaleChangeWebFilter.java | 59 ++++++++++++ .../webfilter/LocaleChangeWebFilterTest.java | 90 +++++++++++++++++++ 2 files changed, 149 insertions(+) create mode 100644 application/src/main/java/run/halo/app/webfilter/LocaleChangeWebFilter.java create mode 100644 application/src/test/java/run/halo/app/webfilter/LocaleChangeWebFilterTest.java diff --git a/application/src/main/java/run/halo/app/webfilter/LocaleChangeWebFilter.java b/application/src/main/java/run/halo/app/webfilter/LocaleChangeWebFilter.java new file mode 100644 index 000000000..3329d34f3 --- /dev/null +++ b/application/src/main/java/run/halo/app/webfilter/LocaleChangeWebFilter.java @@ -0,0 +1,59 @@ +package run.halo.app.webfilter; + +import static run.halo.app.theme.ThemeLocaleContextResolver.LANGUAGE_COOKIE_NAME; +import static run.halo.app.theme.ThemeLocaleContextResolver.LANGUAGE_PARAMETER_NAME; + +import java.util.Locale; +import java.util.Set; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseCookie; +import org.springframework.lang.NonNull; +import org.springframework.security.web.server.util.matcher.AndServerWebExchangeMatcher; +import org.springframework.security.web.server.util.matcher.MediaTypeServerWebExchangeMatcher; +import org.springframework.security.web.server.util.matcher.ServerWebExchangeMatcher; +import org.springframework.security.web.server.util.matcher.ServerWebExchangeMatcher.MatchResult; +import org.springframework.security.web.server.util.matcher.ServerWebExchangeMatchers; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; +import org.springframework.web.server.ServerWebExchange; +import org.springframework.web.server.WebFilter; +import org.springframework.web.server.WebFilterChain; +import reactor.core.publisher.Mono; + +@Component +public class LocaleChangeWebFilter implements WebFilter { + + private final ServerWebExchangeMatcher matcher; + + public LocaleChangeWebFilter() { + var pathMatcher = ServerWebExchangeMatchers.pathMatchers(HttpMethod.GET, "/**"); + var textHtmlMatcher = new MediaTypeServerWebExchangeMatcher(MediaType.TEXT_HTML); + textHtmlMatcher.setIgnoredMediaTypes(Set.of(MediaType.ALL)); + matcher = new AndServerWebExchangeMatcher(pathMatcher, textHtmlMatcher); + } + + @Override + @NonNull + public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { + var request = exchange.getRequest(); + return matcher.matches(exchange) + .filter(MatchResult::isMatch) + .doOnNext(result -> { + var language = request + .getQueryParams() + .getFirst(LANGUAGE_PARAMETER_NAME); + if (StringUtils.hasText(language)) { + var locale = Locale.forLanguageTag(language); + exchange.getResponse() + .addCookie(ResponseCookie.from(LANGUAGE_COOKIE_NAME, locale.toLanguageTag()) + .path("/") + .secure(true) + .build() + ); + } + }) + .then(Mono.defer(() -> chain.filter(exchange))); + } + +} diff --git a/application/src/test/java/run/halo/app/webfilter/LocaleChangeWebFilterTest.java b/application/src/test/java/run/halo/app/webfilter/LocaleChangeWebFilterTest.java new file mode 100644 index 000000000..0ec207fa8 --- /dev/null +++ b/application/src/test/java/run/halo/app/webfilter/LocaleChangeWebFilterTest.java @@ -0,0 +1,90 @@ +package run.halo.app.webfilter; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; + +import java.util.stream.Stream; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import org.springframework.http.MediaType; +import org.springframework.mock.http.server.reactive.MockServerHttpRequest; +import org.springframework.mock.web.server.MockServerWebExchange; +import org.springframework.web.server.WebFilterChain; +import reactor.core.publisher.Mono; + +class LocaleChangeWebFilterTest { + + LocaleChangeWebFilter filter; + + @BeforeEach + void setUp() { + filter = new LocaleChangeWebFilter(); + } + + @Test + void shouldRespondLanguageCookie() { + WebFilterChain webFilterChain = filterExchange -> { + var languageCookie = filterExchange.getResponse().getCookies().getFirst("language"); + assertNotNull(languageCookie); + assertEquals("zh-CN", languageCookie.getValue()); + return Mono.empty(); + }; + var exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/home") + .accept(MediaType.TEXT_HTML) + .queryParam("language", "zh-CN") + .build() + ); + this.filter.filter(exchange, webFilterChain).block(); + } + + @Test + void shouldRespondLanguageCookieWithUndefinedLanguageTag() { + WebFilterChain webFilterChain = filterExchange -> { + var languageCookie = filterExchange.getResponse().getCookies().getFirst("language"); + assertNotNull(languageCookie); + assertEquals("und", languageCookie.getValue()); + return Mono.empty(); + }; + var exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/home") + .accept(MediaType.TEXT_HTML) + .queryParam("language", "invalid_language_tag") + .build() + ); + this.filter.filter(exchange, webFilterChain).block(); + } + + @ParameterizedTest + @MethodSource("provideInvalidRequest") + void shouldNotRespondLanguageCookieIfRequestNotMatch(MockServerHttpRequest mockRequest) { + WebFilterChain webFilterChain = filterExchange -> { + var languageCookie = filterExchange.getResponse().getCookies().getFirst("language"); + assertNull(languageCookie); + return Mono.empty(); + }; + var exchange = MockServerWebExchange.from(mockRequest); + this.filter.filter(exchange, webFilterChain).block(); + } + + static Stream provideInvalidRequest() { + return Stream.of( + MockServerHttpRequest.get("/home") + .accept(MediaType.ALL) + .queryParam("language", "zh-CN") + .build(), + MockServerHttpRequest.get("/home") + .accept(MediaType.APPLICATION_JSON) + .queryParam("language", "zh-CN") + .build(), + MockServerHttpRequest.post("/home") + .accept(MediaType.TEXT_HTML) + .queryParam("language", "zh-CN") + .build(), + MockServerHttpRequest.get("/home") + .accept(MediaType.TEXT_HTML) + .build() + ); + } +} \ No newline at end of file From a9c0ecebe36230f116d084185653320b1e77b3a1 Mon Sep 17 00:00:00 2001 From: John Niang Date: Sat, 14 Sep 2024 10:52:30 +0800 Subject: [PATCH 02/13] Support resolving i18n message with standard way (#6648) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #### What type of PR is this? /kind feature /area theme /sig docs /milestone 2.20.x #### What this PR does / why we need it: After this PR, we can define i18n message files next to the template file. ```yaml i18n: default.properties templates: index.html index.properties # Higher properties than default.properties index_zh.properties # Higher properties than index.properties index_zh_CN.properties # Higher priority than index_zh.properties ``` It's convenient for plugins that define the template files. See https://www.thymeleaf.org/doc/tutorials/3.1/usingthymeleaf.html#standard-message-resolver for more. #### Does this PR introduce a user-facing change? ```release-note 支持在主题中通过 Thymeleaf 默认行为实现国际化 ``` --- .../halo/app/theme/message/ThemeMessageResolver.java | 10 +++++++++- .../theme/message/ThemeMessageResolutionUtilsTest.java | 8 ++++---- .../message/ThemeMessageResolverIntegrationTest.java | 5 ++++- .../resources/themes/default/i18n/default.properties | 3 ++- .../test/resources/themes/default/i18n/zh.properties | 1 + .../test/resources/themes/default/templates/index.html | 2 +- .../themes/default/templates/index.properties | 1 + .../themes/default/templates/index_zh.properties | 1 + 8 files changed, 23 insertions(+), 8 deletions(-) create mode 100644 application/src/test/resources/themes/default/i18n/zh.properties create mode 100644 application/src/test/resources/themes/default/templates/index.properties create mode 100644 application/src/test/resources/themes/default/templates/index_zh.properties diff --git a/application/src/main/java/run/halo/app/theme/message/ThemeMessageResolver.java b/application/src/main/java/run/halo/app/theme/message/ThemeMessageResolver.java index 673770023..18c9819fc 100644 --- a/application/src/main/java/run/halo/app/theme/message/ThemeMessageResolver.java +++ b/application/src/main/java/run/halo/app/theme/message/ThemeMessageResolver.java @@ -1,7 +1,10 @@ package run.halo.app.theme.message; +import java.util.Collections; +import java.util.HashMap; import java.util.Locale; import java.util.Map; +import java.util.Optional; import org.thymeleaf.messageresolver.StandardMessageResolver; import org.thymeleaf.templateresource.ITemplateResource; import run.halo.app.theme.ThemeContext; @@ -22,7 +25,12 @@ public class ThemeMessageResolver extends StandardMessageResolver { protected Map resolveMessagesForTemplate(String template, ITemplateResource templateResource, Locale locale) { - return ThemeMessageResolutionUtils.resolveMessagesForTemplate(locale, theme); + var properties = new HashMap(); + Optional.ofNullable(ThemeMessageResolutionUtils.resolveMessagesForTemplate(locale, theme)) + .ifPresent(properties::putAll); + Optional.ofNullable(super.resolveMessagesForTemplate(template, templateResource, locale)) + .ifPresent(properties::putAll); + return Collections.unmodifiableMap(properties); } @Override diff --git a/application/src/test/java/run/halo/app/theme/message/ThemeMessageResolutionUtilsTest.java b/application/src/test/java/run/halo/app/theme/message/ThemeMessageResolutionUtilsTest.java index 924f1edcf..b7966673b 100644 --- a/application/src/test/java/run/halo/app/theme/message/ThemeMessageResolutionUtilsTest.java +++ b/application/src/test/java/run/halo/app/theme/message/ThemeMessageResolutionUtilsTest.java @@ -29,16 +29,16 @@ class ThemeMessageResolutionUtilsTest { void resolveMessagesForTemplateForDefault() throws URISyntaxException { Map properties = ThemeMessageResolutionUtils.resolveMessagesForTemplate(Locale.CHINESE, getTheme()); - assertThat(properties).hasSize(1); - assertThat(properties).containsEntry("index.welcome", "欢迎来到首页"); + assertThat(properties).isEqualTo(Map.of("index.welcome", "欢迎来到首页", + "title", "来自 i18n/zh.properties 的标题")); } @Test void resolveMessagesForTemplateForEnglish() throws URISyntaxException { Map properties = ThemeMessageResolutionUtils.resolveMessagesForTemplate(Locale.ENGLISH, getTheme()); - assertThat(properties).hasSize(1); - assertThat(properties).containsEntry("index.welcome", "Welcome to the index"); + assertThat(properties).isEqualTo(Map.of("index.welcome", "Welcome to the index", + "title", "这是来自 i18n/default.properties 的标题")); } @Test diff --git a/application/src/test/java/run/halo/app/theme/message/ThemeMessageResolverIntegrationTest.java b/application/src/test/java/run/halo/app/theme/message/ThemeMessageResolverIntegrationTest.java index 6948c4e96..4c461ff6b 100644 --- a/application/src/test/java/run/halo/app/theme/message/ThemeMessageResolverIntegrationTest.java +++ b/application/src/test/java/run/halo/app/theme/message/ThemeMessageResolverIntegrationTest.java @@ -93,6 +93,9 @@ public class ThemeMessageResolverIntegrationTest { .expectStatus() .isOk() .expectBody() + // make sure the "templates/index.properties" file is precedence over the + // "i18n/default.properties". + .xpath("/html/head/title").isEqualTo("Title from index.properties") .xpath("/html/body/div[1]").isEqualTo("foo") .xpath("/html/body/div[2]").isEqualTo("欢迎来到首页"); } @@ -105,7 +108,7 @@ public class ThemeMessageResolverIntegrationTest { .expectStatus() .isOk() .expectBody() - .xpath("/html/head/title").isEqualTo("Title") + .xpath("/html/head/title").isEqualTo("来自 index_zh.properties 的标题") .xpath("/html/body/div[1]").isEqualTo("zh") .xpath("/html/body/div[2]").isEqualTo("欢迎来到首页") ; diff --git a/application/src/test/resources/themes/default/i18n/default.properties b/application/src/test/resources/themes/default/i18n/default.properties index 0321c8140..352794999 100644 --- a/application/src/test/resources/themes/default/i18n/default.properties +++ b/application/src/test/resources/themes/default/i18n/default.properties @@ -1 +1,2 @@ -index.welcome=\u6B22\u8FCE\u6765\u5230\u9996\u9875 \ No newline at end of file +index.welcome=欢迎来到首页 +title=这是来自 i18n/default.properties 的标题 diff --git a/application/src/test/resources/themes/default/i18n/zh.properties b/application/src/test/resources/themes/default/i18n/zh.properties new file mode 100644 index 000000000..dbc13ede3 --- /dev/null +++ b/application/src/test/resources/themes/default/i18n/zh.properties @@ -0,0 +1 @@ +title=来自 i18n/zh.properties 的标题 diff --git a/application/src/test/resources/themes/default/templates/index.html b/application/src/test/resources/themes/default/templates/index.html index 7d38411c4..08c0bc430 100644 --- a/application/src/test/resources/themes/default/templates/index.html +++ b/application/src/test/resources/themes/default/templates/index.html @@ -2,7 +2,7 @@ - Title + Title index diff --git a/application/src/test/resources/themes/default/templates/index.properties b/application/src/test/resources/themes/default/templates/index.properties new file mode 100644 index 000000000..44e41acd8 --- /dev/null +++ b/application/src/test/resources/themes/default/templates/index.properties @@ -0,0 +1 @@ +title=Title from index.properties diff --git a/application/src/test/resources/themes/default/templates/index_zh.properties b/application/src/test/resources/themes/default/templates/index_zh.properties new file mode 100644 index 000000000..300ca1cfc --- /dev/null +++ b/application/src/test/resources/themes/default/templates/index_zh.properties @@ -0,0 +1 @@ +title=来自 index_zh.properties 的标题 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 03/13] 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 From 749c80cb964f37006cee4008207f3ff6f904681a Mon Sep 17 00:00:00 2001 From: guqing <38999863+guqing@users.noreply.github.com> Date: Wed, 18 Sep 2024 12:18:49 +0800 Subject: [PATCH 04/13] chore: cleanup subscription integration test (#6671) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #### What type of PR is this? /kind cleanup /area core /milestone 2.20.x #### What this PR does / why we need it: 删除 SubscriptionServiceIntegrationTest 类。因为当前测试类不经常性出错,暂时无法排查原因。 #### Does this PR introduce a user-facing change? ```release-note None ``` --- .../SubscriptionServiceIntegrationTest.java | 171 ------------------ 1 file changed, 171 deletions(-) delete mode 100644 application/src/test/java/run/halo/app/notification/SubscriptionServiceIntegrationTest.java diff --git a/application/src/test/java/run/halo/app/notification/SubscriptionServiceIntegrationTest.java b/application/src/test/java/run/halo/app/notification/SubscriptionServiceIntegrationTest.java deleted file mode 100644 index 6a55506f7..000000000 --- a/application/src/test/java/run/halo/app/notification/SubscriptionServiceIntegrationTest.java +++ /dev/null @@ -1,171 +0,0 @@ -package run.halo.app.notification; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.atLeast; -import static org.mockito.Mockito.verify; -import static run.halo.app.extension.index.query.QueryFactory.isNull; - -import java.util.ArrayList; -import java.util.List; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.SpyBean; -import org.springframework.test.annotation.DirtiesContext; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; -import reactor.test.StepVerifier; -import run.halo.app.core.extension.notification.Subscription; -import run.halo.app.extension.Extension; -import run.halo.app.extension.ExtensionStoreUtil; -import run.halo.app.extension.ListOptions; -import run.halo.app.extension.PageRequestImpl; -import run.halo.app.extension.ReactiveExtensionClient; -import run.halo.app.extension.SchemeManager; -import run.halo.app.extension.index.IndexerFactory; -import run.halo.app.extension.router.selector.FieldSelector; -import run.halo.app.extension.store.ReactiveExtensionStoreClient; -import run.halo.app.infra.utils.JsonUtils; - -/** - * Integration tests for {@link SubscriptionService}. - * - * @author guqing - * @since 2.15.0 - */ -@DirtiesContext -@SpringBootTest -class SubscriptionServiceIntegrationTest { - - @Autowired - private SchemeManager schemeManager; - - @SpyBean - private ReactiveExtensionClient client; - - @Autowired - private ReactiveExtensionStoreClient storeClient; - - @Autowired - private IndexerFactory indexerFactory; - - Mono deleteImmediately(Extension extension) { - var name = extension.getMetadata().getName(); - var scheme = schemeManager.get(extension.getClass()); - // un-index - var indexer = indexerFactory.getIndexer(extension.groupVersionKind()); - indexer.unIndexRecord(extension.getMetadata().getName()); - - // delete from db - var storeName = ExtensionStoreUtil.buildStoreName(scheme, name); - return storeClient.delete(storeName, extension.getMetadata().getVersion()) - .thenReturn(extension); - } - - @Nested - class RemoveInitialBatchTest { - static int size = 310; - private final List storedSubscriptions = subscriptionsForStore(); - - @Autowired - private SubscriptionService subscriptionService; - - @BeforeEach - void setUp() { - Flux.fromIterable(storedSubscriptions) - .flatMap(comment -> client.create(comment)) - .as(StepVerifier::create) - .expectNextCount(storedSubscriptions.size()) - .verifyComplete(); - } - - @AfterEach - void tearDown() { - Flux.fromIterable(storedSubscriptions) - .flatMap(SubscriptionServiceIntegrationTest.this::deleteImmediately) - .as(StepVerifier::create) - .expectNextCount(storedSubscriptions.size()) - .verifyComplete(); - } - - private List subscriptionsForStore() { - List subscriptions = new ArrayList<>(size); - for (int i = 0; i < size; i++) { - var subscription = createSubscription(); - subscription.getMetadata().setName("subscription-" + i); - subscriptions.add(subscription); - } - return subscriptions; - } - - @Test - void removeTest() { - var subscriber = new Subscription.Subscriber(); - subscriber.setName("admin"); - var interestReason = new Subscription.InterestReason(); - interestReason.setReasonType("new-comment-on-post"); - var subject = new Subscription.ReasonSubject(); - subject.setApiVersion("content.halo.run/v1alpha1"); - subject.setKind("Post"); - interestReason.setSubject(subject); - - subscriptionService.remove(subscriber, interestReason).block(); - - verify(client, atLeast(size)).delete(any(Subscription.class)); - assertCleanedUp(); - } - - @Test - void removeBySubscriberTest() { - var subscriber = new Subscription.Subscriber(); - subscriber.setName("admin"); - - subscriptionService.remove(subscriber).block(); - verify(client, atLeast(size)).delete(any(Subscription.class)); - assertCleanedUp(); - } - - private void assertCleanedUp() { - var listOptions = new ListOptions(); - listOptions.setFieldSelector(FieldSelector.of(isNull("metadata.deletionTimestamp"))); - client.listBy(Subscription.class, listOptions, PageRequestImpl.ofSize(1)) - .as(StepVerifier::create) - .consumeNextWith(result -> { - assertThat(result.getTotal()).isEqualTo(0); - assertThat(result.getItems()).isEmpty(); - }) - .verifyComplete(); - } - } - - Subscription createSubscription() { - return JsonUtils.jsonToObject(""" - { - "spec": { - "subscriber": { - "name": "admin" - }, - "unsubscribeToken": "423530c9-bec7-446e-b73b-dd98ac00ba2b", - "reason": { - "reasonType": "new-comment-on-post", - "subject": { - "name": "5152aea5-c2e8-4717-8bba-2263d46e19d5", - "apiVersion": "content.halo.run/v1alpha1", - "kind": "Post" - } - }, - "disabled": false - }, - "apiVersion": "notification.halo.run/v1alpha1", - "kind": "Subscription", - "metadata": { - "generateName": "subscription-" - } - } - """, Subscription.class); - } -} \ No newline at end of file From ded5b4135f66e0f4b711a86a071fb73fe5076313 Mon Sep 17 00:00:00 2001 From: John Niang Date: Wed, 18 Sep 2024 16:22:50 +0800 Subject: [PATCH 05/13] Generate JS and CSS bundle with fixed buffer size (#6573) 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: If we are running Halo instance in machine with small memory available, the JS/CSS bundle might not be accessible. This RP refactors generation of JS and CSS bundle with fixed buffer size rather than length of original resources. ```java 2024-09-02T15:01:27.667+08:00 WARN 62039 --- [boundedElastic-3] reactor.core.Exceptions : throwIfFatal detected a jvm fatal exception, which is thrown and logged below: java.lang.OutOfMemoryError: Java heap space at java.base/java.nio.HeapByteBuffer.(HeapByteBuffer.java:64) ~[na:na] at java.base/java.nio.ByteBuffer.allocate(ByteBuffer.java:363) ~[na:na] at org.springframework.core.io.buffer.DefaultDataBuffer.allocate(DefaultDataBuffer.java:234) ~[spring-core-6.1.12.jar:6.1.12] at org.springframework.core.io.buffer.DefaultDataBuffer.setCapacity(DefaultDataBuffer.java:196) ~[spring-core-6.1.12.jar:6.1.12] at org.springframework.core.io.buffer.DefaultDataBuffer.ensureWritable(DefaultDataBuffer.java:228) ~[spring-core-6.1.12.jar:6.1.12] at org.springframework.core.io.buffer.DefaultDataBuffer.write(DefaultDataBuffer.java:296) ~[spring-core-6.1.12.jar:6.1.12] at org.springframework.core.io.buffer.DefaultDataBuffer.write(DefaultDataBuffer.java:289) ~[spring-core-6.1.12.jar:6.1.12] at org.springframework.core.io.buffer.DefaultDataBuffer.write(DefaultDataBuffer.java:43) ~[spring-core-6.1.12.jar:6.1.12] at run.halo.app.core.extension.service.impl.PluginServiceImpl.lambda$uglifyJsBundle$17(PluginServiceImpl.java:257) ~[classes/:na] at run.halo.app.core.extension.service.impl.PluginServiceImpl$$Lambda$4661/0x000000c80214e298.accept(Unknown Source) ~[na:na] at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onNext(FluxPeekFuseable.java:196) ~[reactor-core-3.6.9.jar:3.6.9] at reactor.core.publisher.FluxUsing$UsingFuseableSubscriber.onNext(FluxUsing.java:353) ~[reactor-core-3.6.9.jar:3.6.9] at reactor.core.publisher.FluxGenerate$GenerateSubscription.next(FluxGenerate.java:178) ~[reactor-core-3.6.9.jar:3.6.9] at org.springframework.core.io.buffer.DataBufferUtils$ReadableByteChannelGenerator.accept(DataBufferUtils.java:1002) ~[spring-core-6.1.12.jar:6.1.12] at org.springframework.core.io.buffer.DataBufferUtils$ReadableByteChannelGenerator.accept(DataBufferUtils.java:974) ~[spring-core-6.1.12.jar:6.1.12] at reactor.core.publisher.FluxGenerate.lambda$new$1(FluxGenerate.java:58) ~[reactor-core-3.6.9.jar:3.6.9] at reactor.core.publisher.FluxGenerate$$Lambda$4155/0x000000c802069228.apply(Unknown Source) ~[na:na] at reactor.core.publisher.FluxGenerate$GenerateSubscription.slowPath(FluxGenerate.java:271) ~[reactor-core-3.6.9.jar:3.6.9] at reactor.core.publisher.FluxGenerate$GenerateSubscription.request(FluxGenerate.java:213) ~[reactor-core-3.6.9.jar:3.6.9] at reactor.core.publisher.FluxUsing$UsingFuseableSubscriber.request(FluxUsing.java:320) ~[reactor-core-3.6.9.jar:3.6.9] at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.request(FluxPeekFuseable.java:144) ~[reactor-core-3.6.9.jar:3.6.9] at reactor.core.publisher.FluxFlatMap$FlatMapInner.onSubscribe(FluxFlatMap.java:968) ~[reactor-core-3.6.9.jar:3.6.9] at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onSubscribe(FluxPeekFuseable.java:178) ~[reactor-core-3.6.9.jar:3.6.9] at reactor.core.publisher.FluxUsing$UsingFuseableSubscriber.onSubscribe(FluxUsing.java:347) ~[reactor-core-3.6.9.jar:3.6.9] at reactor.core.publisher.FluxGenerate.subscribe(FluxGenerate.java:85) ~[reactor-core-3.6.9.jar:3.6.9] at reactor.core.publisher.FluxUsing.subscribe(FluxUsing.java:102) ~[reactor-core-3.6.9.jar:3.6.9] at reactor.core.publisher.Flux.subscribe(Flux.java:8848) ~[reactor-core-3.6.9.jar:3.6.9] at reactor.core.publisher.FluxFlatMap$FlatMapMain.onNext(FluxFlatMap.java:430) ~[reactor-core-3.6.9.jar:3.6.9] at reactor.core.publisher.FluxHandleFuseable$HandleFuseableSubscriber.tryOnNext(FluxHandleFuseable.java:135) ~[reactor-core-3.6.9.jar:3.6.9] at reactor.core.publisher.FluxIterable$IterableSubscriptionConditional.slowPath(FluxIterable.java:664) ~[reactor-core-3.6.9.jar:3.6.9] at reactor.core.publisher.FluxIterable$IterableSubscriptionConditional.request(FluxIterable.java:623) ~[reactor-core-3.6.9.jar:3.6.9] at reactor.core.publisher.FluxHandleFuseable$HandleFuseableSubscriber.request(FluxHandleFuseable.java:260) ~[reactor-core-3.6.9.jar:3.6.9] 2024-09-02T15:01:27.681+08:00 DEBUG 62039 --- [boundedElastic-3] a.w.r.e.AbstractErrorWebExceptionHandler : [131a559b-102] Resolved [OutOfMemoryError: Java heap space] for HTTP GET /apis/api.console.halo.run/v1alpha1/plugins/-/bundle.js 2024-09-02T15:01:27.681+08:00 ERROR 62039 --- [boundedElastic-3] a.w.r.e.AbstractErrorWebExceptionHandler : [131a559b-102] 500 Server Error for HTTP GET "/apis/api.console.halo.run/v1alpha1/plugins/-/bundle.js?v=1725260408176" java.lang.OutOfMemoryError: Java heap space at java.base/java.nio.HeapByteBuffer.(HeapByteBuffer.java:64) ~[na:na] ``` #### Does this PR introduce a user-facing change? ```release-note 优化在内存紧张时 Console 端无法加载插件资源的问题 ``` --- .../service/impl/PluginServiceImpl.java | 111 ++++++++++-------- 1 file changed, 62 insertions(+), 49 deletions(-) diff --git a/application/src/main/java/run/halo/app/core/extension/service/impl/PluginServiceImpl.java b/application/src/main/java/run/halo/app/core/extension/service/impl/PluginServiceImpl.java index 817ea1d05..991250aac 100644 --- a/application/src/main/java/run/halo/app/core/extension/service/impl/PluginServiceImpl.java +++ b/application/src/main/java/run/halo/app/core/extension/service/impl/PluginServiceImpl.java @@ -40,6 +40,7 @@ import org.springframework.stereotype.Component; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import org.springframework.util.FileSystemUtils; +import org.springframework.util.StreamUtils; import org.springframework.web.server.ServerWebInputException; import reactor.core.Exceptions; import reactor.core.publisher.Flux; @@ -229,61 +230,73 @@ public class PluginServiceImpl implements PluginService, InitializingBean, Dispo @Override public Flux uglifyJsBundle() { var startedPlugins = List.copyOf(pluginManager.getStartedPlugins()); - String plugins = """ - this.enabledPlugins = [%s] - """.formatted(startedPlugins.stream() - .map(plugin -> """ - { - "name": "%s", - "version": "%s" + var dataBufferFactory = DefaultDataBufferFactory.sharedInstance; + var end = Mono.fromSupplier( + () -> { + var sb = new StringBuilder("this.enabledPlugins = ["); + var iterator = startedPlugins.iterator(); + while (iterator.hasNext()) { + var plugin = iterator.next(); + sb.append(""" + {"name":"%s","version":"%s"}\ + """ + .formatted( + plugin.getPluginId(), + plugin.getDescriptor().getVersion() + ) + ); + if (iterator.hasNext()) { + sb.append(','); + } } - """.formatted(plugin.getPluginId(), plugin.getDescriptor().getVersion()) - ) - .collect(Collectors.joining(", "))); - return Flux.fromIterable(startedPlugins) - .mapNotNull(pluginWrapper -> { - var pluginName = pluginWrapper.getPluginId(); - return BundleResourceUtils.getJsBundleResource(pluginManager, pluginName, - BundleResourceUtils.JS_BUNDLE); - }) - .flatMap(resource -> { - try { - // Specifying bufferSize as resource content length is - // to append line breaks at the end of each plugin - return DataBufferUtils.read(resource, DefaultDataBufferFactory.sharedInstance, - (int) resource.contentLength()) - .doOnNext(dataBuffer -> { - // add a new line after each plugin bundle to avoid syntax error - dataBuffer.write("\n".getBytes(StandardCharsets.UTF_8)); - }); - } catch (IOException e) { - log.error("Failed to read plugin bundle resource", e); - return Flux.empty(); - } - }) - .concatWith(Flux.defer(() -> { - var dataBuffer = DefaultDataBufferFactory.sharedInstance - .wrap(plugins.getBytes(StandardCharsets.UTF_8)); - return Flux.just(dataBuffer); - })); + sb.append(']'); + return dataBufferFactory.wrap(sb.toString().getBytes(StandardCharsets.UTF_8)); + }); + var body = Flux.fromIterable(startedPlugins) + .sort(Comparator.comparing(PluginWrapper::getPluginId)) + .concatMap(pluginWrapper -> { + var pluginId = pluginWrapper.getPluginId(); + return Mono.fromSupplier( + () -> BundleResourceUtils.getJsBundleResource( + pluginManager, pluginId, BundleResourceUtils.JS_BUNDLE + ) + ) + .filter(Resource::isReadable) + .flatMapMany(resource -> { + var head = Mono.fromSupplier( + () -> dataBufferFactory.wrap( + ("// Generated from plugin " + pluginId + "\n").getBytes() + )); + var content = DataBufferUtils.read( + resource, dataBufferFactory, StreamUtils.BUFFER_SIZE + ); + var tail = Mono.fromSupplier(() -> dataBufferFactory.wrap("\n".getBytes())); + return Flux.concat(head, content, tail); + }); + }); + return Flux.concat(body, end); } @Override public Flux uglifyCssBundle() { return Flux.fromIterable(pluginManager.getStartedPlugins()) - .mapNotNull(pluginWrapper -> { - String pluginName = pluginWrapper.getPluginId(); - return BundleResourceUtils.getJsBundleResource(pluginManager, pluginName, - BundleResourceUtils.CSS_BUNDLE); - }) - .flatMap(resource -> { - try { - return DataBufferUtils.read(resource, DefaultDataBufferFactory.sharedInstance, - (int) resource.contentLength()); - } catch (IOException e) { - log.error("Failed to read plugin css bundle resource", e); - return Flux.empty(); - } + .sort(Comparator.comparing(PluginWrapper::getPluginId)) + .concatMap(pluginWrapper -> { + var pluginId = pluginWrapper.getPluginId(); + var dataBufferFactory = DefaultDataBufferFactory.sharedInstance; + return Mono.fromSupplier(() -> BundleResourceUtils.getJsBundleResource( + pluginManager, pluginId, BundleResourceUtils.CSS_BUNDLE + )) + .filter(Resource::isReadable) + .flatMapMany(resource -> { + var head = Mono.fromSupplier(() -> dataBufferFactory.wrap( + ("/* Generated from plugin " + pluginId + " */\n").getBytes() + )); + var content = DataBufferUtils.read( + resource, dataBufferFactory, StreamUtils.BUFFER_SIZE); + var tail = Mono.fromSupplier(() -> dataBufferFactory.wrap("\n".getBytes())); + return Flux.concat(head, content, tail); + }); }); } From 07077f7d0c2ba0ad564c33b149dffeab693a2b37 Mon Sep 17 00:00:00 2001 From: John Niang Date: Thu, 19 Sep 2024 10:56:53 +0800 Subject: [PATCH 06/13] Provide ElementTagProcessor to handle element tag in plugin (#6670) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #### What type of PR is this? /kind feature /area plugin #### What this PR does / why we need it: This PR provides an interface ElementTagProcessor to make plugin handle element tag easily. e.g.: ```java public class ImgTagProcessor implements ElementTagPostProcessor { @Override public Mono process(ITemplateContext context, IProcessableElementTag tag, IElementTagStructureHandler structureHandler) { var elementName = tag.getElementDefinition().getElementName(); if (!Objects.equals("img", elementName.getElementName())) { return Mono.empty(); } var srcAttr = tag.getAttribute("src"); if (srcAttr == null) { return Mono.empty(); } var newSrc = srcAttr.getValue(); // TODO rewrite src structureHandler.setAttribute("src", newSrc); return Mono.empty(); } } ``` After PR merged, plugins https://github.com/webp-sh/halo-plugin-webp-cloud and https://github.com/guqing/plugin-cloudinary can be refined with new method. #### Does this PR introduce a user-facing change? ```release-note 支持在插件中操作渲染结果 ``` --- .../extensionpoint/ExtensionGetter.java | 11 ++ .../dialect/ElementTagPostProcessor.java | 41 +++++ .../DefaultExtensionGetter.java | 13 ++ .../dialect/HaloPostTemplateHandler.java | 69 ++++++++ .../theme/dialect/HaloProcessorDialect.java | 19 ++- .../DefaultExtensionGetterTest.java | 18 +++ .../ReactiveFinderExpressionParserTests.java | 11 +- .../CommentElementTagProcessorTest.java | 7 + .../dialect/HaloPostTemplateHandlerTest.java | 153 ++++++++++++++++++ 9 files changed, 339 insertions(+), 3 deletions(-) create mode 100644 api/src/main/java/run/halo/app/theme/dialect/ElementTagPostProcessor.java create mode 100644 application/src/main/java/run/halo/app/theme/dialect/HaloPostTemplateHandler.java create mode 100644 application/src/test/java/run/halo/app/theme/dialect/HaloPostTemplateHandlerTest.java diff --git a/api/src/main/java/run/halo/app/plugin/extensionpoint/ExtensionGetter.java b/api/src/main/java/run/halo/app/plugin/extensionpoint/ExtensionGetter.java index 58615ec72..964bf1a78 100644 --- a/api/src/main/java/run/halo/app/plugin/extensionpoint/ExtensionGetter.java +++ b/api/src/main/java/run/halo/app/plugin/extensionpoint/ExtensionGetter.java @@ -1,5 +1,6 @@ package run.halo.app.plugin.extensionpoint; +import java.util.List; import org.pf4j.ExtensionPoint; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -34,4 +35,14 @@ public interface ExtensionGetter { * @return a bunch of extension points. */ Flux getExtensions(Class extensionPointClass); + + /** + * Get all extensions according to extension point class. + * + * @param extensionPointClass extension point class + * @param type of extension point + * @return a bunch of extension points. + */ + List getExtensionList(Class extensionPointClass); + } diff --git a/api/src/main/java/run/halo/app/theme/dialect/ElementTagPostProcessor.java b/api/src/main/java/run/halo/app/theme/dialect/ElementTagPostProcessor.java new file mode 100644 index 000000000..77a295faa --- /dev/null +++ b/api/src/main/java/run/halo/app/theme/dialect/ElementTagPostProcessor.java @@ -0,0 +1,41 @@ +package run.halo.app.theme.dialect; + +import org.pf4j.ExtensionPoint; +import org.thymeleaf.context.ITemplateContext; +import org.thymeleaf.model.IProcessableElementTag; +import reactor.core.publisher.Mono; + +/** + * An extension point for post-processing element tag. + * + * @author johnniang + * @since 2.20.0 + */ +public interface ElementTagPostProcessor extends ExtensionPoint { + + /** + *

+ * Execute the processor. + *

+ *

+ * The {@link IProcessableElementTag} object argument is immutable, so all modifications to + * this object or any + * instructions to be given to the engine should be done through the specified + * {@link org.thymeleaf.model.IModelFactory} model factory in context. + *

+ *

+ * Don't forget to return the new tag after processing or + * {@link reactor.core.publisher.Mono#empty()} if not processable. + *

+ * + * @param context the template context. + * @param tag the event this processor is executing on. + * @return a {@link reactor.core.publisher.Mono} that will complete when processing finishes + * or empty mono if not support. + */ + Mono process( + ITemplateContext context, + final IProcessableElementTag tag + ); + +} diff --git a/application/src/main/java/run/halo/app/plugin/extensionpoint/DefaultExtensionGetter.java b/application/src/main/java/run/halo/app/plugin/extensionpoint/DefaultExtensionGetter.java index 9f5404ab3..e6c162879 100644 --- a/application/src/main/java/run/halo/app/plugin/extensionpoint/DefaultExtensionGetter.java +++ b/application/src/main/java/run/halo/app/plugin/extensionpoint/DefaultExtensionGetter.java @@ -2,7 +2,10 @@ package run.halo.app.plugin.extensionpoint; import static run.halo.app.extension.index.query.QueryFactory.equal; +import java.util.LinkedList; +import java.util.List; import java.util.Objects; +import java.util.Optional; import lombok.RequiredArgsConstructor; import org.pf4j.ExtensionPoint; import org.pf4j.PluginManager; @@ -41,6 +44,16 @@ public class DefaultExtensionGetter implements ExtensionGetter { .sort(new AnnotationAwareOrderComparator()); } + @Override + public List getExtensionList(Class extensionPoint) { + var extensions = new LinkedList(); + Optional.ofNullable(pluginManager.getExtensions(extensionPoint)) + .ifPresent(extensions::addAll); + extensions.addAll(beanFactory.getBeanProvider(extensionPoint).orderedStream().toList()); + extensions.sort(new AnnotationAwareOrderComparator()); + return extensions; + } + @Override public Mono getEnabledExtension(Class extensionPoint) { return getEnabledExtensions(extensionPoint).next(); diff --git a/application/src/main/java/run/halo/app/theme/dialect/HaloPostTemplateHandler.java b/application/src/main/java/run/halo/app/theme/dialect/HaloPostTemplateHandler.java new file mode 100644 index 000000000..1eebd67fe --- /dev/null +++ b/application/src/main/java/run/halo/app/theme/dialect/HaloPostTemplateHandler.java @@ -0,0 +1,69 @@ +package run.halo.app.theme.dialect; + +import static org.thymeleaf.spring6.context.SpringContextUtils.getApplicationContext; + +import java.time.Duration; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import org.springframework.lang.NonNull; +import org.springframework.util.CollectionUtils; +import org.thymeleaf.context.ITemplateContext; +import org.thymeleaf.engine.AbstractTemplateHandler; +import org.thymeleaf.model.IOpenElementTag; +import org.thymeleaf.model.IProcessableElementTag; +import org.thymeleaf.model.IStandaloneElementTag; +import reactor.core.publisher.Mono; +import run.halo.app.plugin.extensionpoint.ExtensionGetter; + +/** + * Template post-handler. + * + * @author johnniang + * @since 2.20.0 + */ +public class HaloPostTemplateHandler extends AbstractTemplateHandler { + + private List postProcessors = List.of(); + + @Override + public void setContext(ITemplateContext context) { + super.setContext(context); + this.postProcessors = Optional.ofNullable(getApplicationContext(context)) + .map(appContext -> appContext.getBeanProvider(ExtensionGetter.class).getIfUnique()) + .map(extensionGetter -> extensionGetter.getExtensionList(ElementTagPostProcessor.class)) + .orElseGet(List::of); + } + + @Override + public void handleStandaloneElement(IStandaloneElementTag standaloneElementTag) { + var processedTag = handleElementTag(standaloneElementTag); + super.handleStandaloneElement((IStandaloneElementTag) processedTag); + } + + @Override + public void handleOpenElement(IOpenElementTag openElementTag) { + var processedTag = handleElementTag(openElementTag); + super.handleOpenElement((IOpenElementTag) processedTag); + } + + @NonNull + private IProcessableElementTag handleElementTag( + @NonNull IProcessableElementTag processableElementTag + ) { + IProcessableElementTag processedTag = processableElementTag; + if (!CollectionUtils.isEmpty(postProcessors)) { + var tagProcessorChain = Mono.just(processableElementTag); + var context = getContext(); + for (ElementTagPostProcessor elementTagPostProcessor : postProcessors) { + tagProcessorChain = tagProcessorChain.flatMap( + tag -> elementTagPostProcessor.process(context, tag).defaultIfEmpty(tag) + ); + } + processedTag = + Objects.requireNonNull(tagProcessorChain.defaultIfEmpty(processableElementTag) + .block(Duration.ofMinutes(1))); + } + return processedTag; + } +} diff --git a/application/src/main/java/run/halo/app/theme/dialect/HaloProcessorDialect.java b/application/src/main/java/run/halo/app/theme/dialect/HaloProcessorDialect.java index 6d61b3c48..a88296531 100644 --- a/application/src/main/java/run/halo/app/theme/dialect/HaloProcessorDialect.java +++ b/application/src/main/java/run/halo/app/theme/dialect/HaloProcessorDialect.java @@ -1,10 +1,15 @@ package run.halo.app.theme.dialect; +import static org.thymeleaf.templatemode.TemplateMode.HTML; + import java.util.HashSet; import java.util.Set; import org.thymeleaf.dialect.AbstractProcessorDialect; import org.thymeleaf.dialect.IExpressionObjectDialect; +import org.thymeleaf.dialect.IPostProcessorDialect; import org.thymeleaf.expression.IExpressionObjectFactory; +import org.thymeleaf.postprocessor.IPostProcessor; +import org.thymeleaf.postprocessor.PostProcessor; import org.thymeleaf.processor.IProcessor; import org.thymeleaf.standard.StandardDialect; @@ -14,8 +19,8 @@ import org.thymeleaf.standard.StandardDialect; * @author guqing * @since 2.0.0 */ -public class HaloProcessorDialect extends AbstractProcessorDialect implements - IExpressionObjectDialect { +public class HaloProcessorDialect extends AbstractProcessorDialect + implements IExpressionObjectDialect, IPostProcessorDialect { private static final String DIALECT_NAME = "haloThemeProcessorDialect"; private static final IExpressionObjectFactory HALO_EXPRESSION_OBJECTS_FACTORY = @@ -43,4 +48,14 @@ public class HaloProcessorDialect extends AbstractProcessorDialect implements public IExpressionObjectFactory getExpressionObjectFactory() { return HALO_EXPRESSION_OBJECTS_FACTORY; } + + @Override + public int getDialectPostProcessorPrecedence() { + return Integer.MAX_VALUE; + } + + @Override + public Set getPostProcessors() { + return Set.of(new PostProcessor(HTML, HaloPostTemplateHandler.class, Integer.MAX_VALUE)); + } } diff --git a/application/src/test/java/run/halo/app/plugin/extensionpoint/DefaultExtensionGetterTest.java b/application/src/test/java/run/halo/app/plugin/extensionpoint/DefaultExtensionGetterTest.java index bab1b6e7d..b876aa10c 100644 --- a/application/src/test/java/run/halo/app/plugin/extensionpoint/DefaultExtensionGetterTest.java +++ b/application/src/test/java/run/halo/app/plugin/extensionpoint/DefaultExtensionGetterTest.java @@ -1,5 +1,6 @@ package run.halo.app.plugin.extensionpoint; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.same; import static org.mockito.Mockito.mock; @@ -44,6 +45,9 @@ class DefaultExtensionGetterTest { @Mock BeanFactory beanFactory; + @Mock + ObjectProvider extensionPointObjectProvider; + @InjectMocks DefaultExtensionGetter getter; @@ -209,6 +213,20 @@ class DefaultExtensionGetterTest { .verifyComplete(); } + @Test + void shouldGetExtensionsFromPluginManagerAndApplicationContext() { + var extensionFromPlugin = new FakeExtensionPointDefaultImpl(); + var extensionFromAppContext = new FakeExtensionPointImpl(); + when(pluginManager.getExtensions(FakeExtensionPoint.class)) + .thenReturn(List.of(extensionFromPlugin)); + when(beanFactory.getBeanProvider(FakeExtensionPoint.class)) + .thenReturn(extensionPointObjectProvider); + when(extensionPointObjectProvider.orderedStream()) + .thenReturn(Stream.of(extensionFromAppContext)); + var extensions = getter.getExtensionList(FakeExtensionPoint.class); + assertEquals(List.of(extensionFromAppContext, extensionFromPlugin), extensions); + } + interface FakeExtensionPoint extends ExtensionPoint { } diff --git a/application/src/test/java/run/halo/app/theme/ReactiveFinderExpressionParserTests.java b/application/src/test/java/run/halo/app/theme/ReactiveFinderExpressionParserTests.java index cd6f5bd02..346aa9945 100644 --- a/application/src/test/java/run/halo/app/theme/ReactiveFinderExpressionParserTests.java +++ b/application/src/test/java/run/halo/app/theme/ReactiveFinderExpressionParserTests.java @@ -3,6 +3,7 @@ package run.halo.app.theme; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.lenient; +import static org.mockito.Mockito.when; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ArrayNode; @@ -14,6 +15,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.context.ApplicationContext; import org.thymeleaf.IEngineConfiguration; import org.thymeleaf.TemplateEngine; @@ -29,6 +31,7 @@ import reactor.core.publisher.Mono; import run.halo.app.infra.SystemConfigurableEnvironmentFetcher; import run.halo.app.infra.SystemSetting; import run.halo.app.infra.utils.JsonUtils; +import run.halo.app.plugin.extensionpoint.ExtensionGetter; import run.halo.app.theme.dialect.HaloProcessorDialect; /** @@ -44,6 +47,9 @@ public class ReactiveFinderExpressionParserTests { @Mock private ApplicationContext applicationContext; + @Mock + private ObjectProvider extensionGetterProvider; + @Mock private SystemConfigurableEnvironmentFetcher environmentFetcher; @@ -62,6 +68,9 @@ public class ReactiveFinderExpressionParserTests { templateEngine.addTemplateResolver(new TestTemplateResolver()); lenient().when(applicationContext.getBean(eq(SystemConfigurableEnvironmentFetcher.class))) .thenReturn(environmentFetcher); + when(applicationContext.getBeanProvider(ExtensionGetter.class)) + .thenReturn(extensionGetterProvider); + when(extensionGetterProvider.getIfUnique()).thenReturn(null); lenient().when(environmentFetcher.fetchComment()) .thenReturn(Mono.just(new SystemSetting.Comment())); } @@ -155,7 +164,7 @@ public class ReactiveFinderExpressionParserTests { var mapMono = /*[[${target.mapMono.foo}]]*/; var arrayNodeMono = /*[[${target.arrayNodeMono.get(0).foo}]]*/; - """); + """); } } diff --git a/application/src/test/java/run/halo/app/theme/dialect/CommentElementTagProcessorTest.java b/application/src/test/java/run/halo/app/theme/dialect/CommentElementTagProcessorTest.java index 2a0726b2e..a348af54d 100644 --- a/application/src/test/java/run/halo/app/theme/dialect/CommentElementTagProcessorTest.java +++ b/application/src/test/java/run/halo/app/theme/dialect/CommentElementTagProcessorTest.java @@ -13,6 +13,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.context.ApplicationContext; import org.thymeleaf.IEngineConfiguration; import org.thymeleaf.TemplateEngine; @@ -48,6 +49,9 @@ class CommentElementTagProcessorTest { @Mock private ExtensionGetter extensionGetter; + @Mock + private ObjectProvider extensionGetterProvider; + @Mock private SystemConfigurableEnvironmentFetcher environmentFetcher; @@ -61,6 +65,9 @@ class CommentElementTagProcessorTest { templateEngine.addTemplateResolver(new TestTemplateResolver()); lenient().when(applicationContext.getBean(eq(ExtensionGetter.class))) .thenReturn(extensionGetter); + when(applicationContext.getBeanProvider(ExtensionGetter.class)) + .thenReturn(extensionGetterProvider); + when(extensionGetterProvider.getIfUnique()).thenReturn(null); } @Test diff --git a/application/src/test/java/run/halo/app/theme/dialect/HaloPostTemplateHandlerTest.java b/application/src/test/java/run/halo/app/theme/dialect/HaloPostTemplateHandlerTest.java new file mode 100644 index 000000000..20c32f90b --- /dev/null +++ b/application/src/test/java/run/halo/app/theme/dialect/HaloPostTemplateHandlerTest.java @@ -0,0 +1,153 @@ +package run.halo.app.theme.dialect; + +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static org.thymeleaf.spring6.expression.ThymeleafEvaluationContext.THYMELEAF_EVALUATION_CONTEXT_CONTEXT_VARIABLE_NAME; + +import java.util.List; +import java.util.stream.Stream; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.context.ApplicationContext; +import org.thymeleaf.context.ITemplateContext; +import org.thymeleaf.engine.ITemplateHandler; +import org.thymeleaf.model.IOpenElementTag; +import org.thymeleaf.model.IStandaloneElementTag; +import org.thymeleaf.spring6.expression.ThymeleafEvaluationContext; +import reactor.core.publisher.Mono; +import run.halo.app.plugin.extensionpoint.ExtensionGetter; + +@ExtendWith(MockitoExtension.class) +class HaloPostTemplateHandlerTest { + + HaloPostTemplateHandler postHandler; + + @Mock + ITemplateContext templateContext; + + @Mock + ITemplateHandler next; + + @Mock + ApplicationContext applicationContext; + + @Mock + IStandaloneElementTag standaloneElementTag; + + @Mock + IOpenElementTag openElementTag; + + @Mock + ObjectProvider extensionGetterProvider; + + @Mock + ExtensionGetter extensionGetter; + + + @BeforeEach + void setUp() { + postHandler = new HaloPostTemplateHandler(); + var evaluationContext = mock(ThymeleafEvaluationContext.class); + when(evaluationContext.getApplicationContext()).thenReturn(applicationContext); + when(templateContext.getVariable(THYMELEAF_EVALUATION_CONTEXT_CONTEXT_VARIABLE_NAME)) + .thenReturn(evaluationContext); + when(applicationContext.getBeanProvider(ExtensionGetter.class)) + .thenReturn(extensionGetterProvider); + when(extensionGetterProvider.getIfUnique()).thenReturn(extensionGetter); + } + + @ParameterizedTest + @MethodSource("provideEmptyElementTagProcessors") + void shouldHandleStandaloneElementIfNoElementTagProcessors( + List processors + ) { + when(extensionGetter.getExtensionList(ElementTagPostProcessor.class)) + .thenReturn(processors); + + postHandler.setContext(templateContext); + postHandler.setNext(next); + postHandler.handleStandaloneElement(standaloneElementTag); + verify(next).handleStandaloneElement(standaloneElementTag); + } + + @Test + void shouldHandleStandaloneElementIfOneElementTagProcessorProvided() { + var processor = mock(ElementTagPostProcessor.class); + var newTag = mock(IStandaloneElementTag.class); + when(processor.process(templateContext, standaloneElementTag)) + .thenReturn(Mono.just(newTag)); + when(extensionGetter.getExtensionList(ElementTagPostProcessor.class)) + .thenReturn(List.of(processor)); + + postHandler.setContext(templateContext); + postHandler.setNext(next); + postHandler.handleStandaloneElement(standaloneElementTag); + verify(next).handleStandaloneElement(newTag); + } + + @Test + void shouldHandleStandaloneElementIfTagTypeChanged() { + var processor = mock(ElementTagPostProcessor.class); + var newTag = mock(IStandaloneElementTag.class); + when(processor.process(templateContext, standaloneElementTag)) + .thenReturn(Mono.just(newTag)); + when(extensionGetter.getExtensionList(ElementTagPostProcessor.class)) + .thenReturn(List.of(processor)); + + postHandler.setContext(templateContext); + postHandler.setNext(next); + postHandler.handleStandaloneElement(standaloneElementTag); + verify(next).handleStandaloneElement(newTag); + } + + @Test + void shouldHandleStandaloneElementIfMoreElementTagProcessorsProvided() { + var processor1 = mock(ElementTagPostProcessor.class); + var processor2 = mock(ElementTagPostProcessor.class); + var newTag1 = mock(IStandaloneElementTag.class); + var newTag2 = mock(IStandaloneElementTag.class); + when(processor1.process(templateContext, standaloneElementTag)) + .thenReturn(Mono.just(newTag1)); + when(processor2.process(templateContext, newTag1)) + .thenReturn(Mono.just(newTag2)); + when(extensionGetter.getExtensionList(ElementTagPostProcessor.class)) + .thenReturn(List.of(processor1, processor2)); + + postHandler.setContext(templateContext); + postHandler.setNext(next); + postHandler.handleStandaloneElement(standaloneElementTag); + verify(next).handleStandaloneElement(newTag2); + } + + @Test + void shouldNotHandleIfProcessedTagTypeChanged() { + var processor = mock(ElementTagPostProcessor.class); + var newTag = mock(IOpenElementTag.class); + when(processor.process(templateContext, standaloneElementTag)) + .thenReturn(Mono.just(newTag)); + when(extensionGetter.getExtensionList(ElementTagPostProcessor.class)) + .thenReturn(List.of(processor)); + + postHandler.setContext(templateContext); + postHandler.setNext(next); + assertThrows(ClassCastException.class, + () -> postHandler.handleStandaloneElement(standaloneElementTag) + ); + } + + static Stream> provideEmptyElementTagProcessors() { + return Stream.of( + null, + List.of() + ); + } + +} \ No newline at end of file From dcadd38843038916752df915a9a161e951b42e07 Mon Sep 17 00:00:00 2001 From: guqing <38999863+guqing@users.noreply.github.com> Date: Thu, 19 Sep 2024 15:20:54 +0800 Subject: [PATCH 07/13] feat: add Halo version variable to theme model (#6677) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #### What type of PR is this? /kind feature /milestone 2.20.x /area theme #### What this PR does / why we need it: 主题支持通过 `${site.version}` 得到 Halo 版本号 #### Which issue(s) this PR fixes: Fixes #6676 #### Does this PR introduce a user-facing change? ```release-note 主题支持通过 `${site.version}` 得到 Halo 版本号 ``` --- .../app/theme/SiteSettingVariablesAcquirer.java | 5 ++++- .../halo/app/theme/finders/vo/SiteSettingVo.java | 3 +++ .../app/theme/SiteSettingVariablesAcquirerTest.java | 13 ++++++++++++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/application/src/main/java/run/halo/app/theme/SiteSettingVariablesAcquirer.java b/application/src/main/java/run/halo/app/theme/SiteSettingVariablesAcquirer.java index d5145ae8e..72271a42e 100644 --- a/application/src/main/java/run/halo/app/theme/SiteSettingVariablesAcquirer.java +++ b/application/src/main/java/run/halo/app/theme/SiteSettingVariablesAcquirer.java @@ -7,6 +7,7 @@ import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; import run.halo.app.infra.ExternalUrlSupplier; import run.halo.app.infra.SystemConfigurableEnvironmentFetcher; +import run.halo.app.infra.SystemVersionSupplier; import run.halo.app.theme.finders.vo.SiteSettingVo; /** @@ -21,6 +22,7 @@ public class SiteSettingVariablesAcquirer implements ViewContextBasedVariablesAc private final SystemConfigurableEnvironmentFetcher environmentFetcher; private final ExternalUrlSupplier externalUrlSupplier; + private final SystemVersionSupplier systemVersionSupplier; @Override public Mono> acquire(ServerWebExchange exchange) { @@ -28,7 +30,8 @@ public class SiteSettingVariablesAcquirer implements ViewContextBasedVariablesAc .filter(configMap -> configMap.getData() != null) .map(configMap -> { SiteSettingVo siteSettingVo = SiteSettingVo.from(configMap) - .withUrl(externalUrlSupplier.getURL(exchange.getRequest())); + .withUrl(externalUrlSupplier.getURL(exchange.getRequest())) + .withVersion(systemVersionSupplier.get().toString()); return Map.of("site", siteSettingVo); }); } diff --git a/application/src/main/java/run/halo/app/theme/finders/vo/SiteSettingVo.java b/application/src/main/java/run/halo/app/theme/finders/vo/SiteSettingVo.java index 485ee1a11..558dbb3c5 100644 --- a/application/src/main/java/run/halo/app/theme/finders/vo/SiteSettingVo.java +++ b/application/src/main/java/run/halo/app/theme/finders/vo/SiteSettingVo.java @@ -25,6 +25,9 @@ public class SiteSettingVo { @With URL url; + @With + String version; + String subtitle; String logo; diff --git a/application/src/test/java/run/halo/app/theme/SiteSettingVariablesAcquirerTest.java b/application/src/test/java/run/halo/app/theme/SiteSettingVariablesAcquirerTest.java index 8fd8066ab..11d6dce14 100644 --- a/application/src/test/java/run/halo/app/theme/SiteSettingVariablesAcquirerTest.java +++ b/application/src/test/java/run/halo/app/theme/SiteSettingVariablesAcquirerTest.java @@ -6,6 +6,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import com.github.zafarkhaja.semver.Version; import java.net.MalformedURLException; import java.net.URL; import java.util.Map; @@ -20,6 +21,7 @@ import reactor.test.StepVerifier; import run.halo.app.extension.ConfigMap; import run.halo.app.infra.ExternalUrlSupplier; import run.halo.app.infra.SystemConfigurableEnvironmentFetcher; +import run.halo.app.infra.SystemVersionSupplier; import run.halo.app.theme.finders.vo.SiteSettingVo; /** @@ -32,6 +34,10 @@ import run.halo.app.theme.finders.vo.SiteSettingVo; public class SiteSettingVariablesAcquirerTest { @Mock private ExternalUrlSupplier externalUrlSupplier; + + @Mock + private SystemVersionSupplier systemVersionSupplier; + @Mock private SystemConfigurableEnvironmentFetcher environmentFetcher; @@ -45,6 +51,7 @@ public class SiteSettingVariablesAcquirerTest { var url = new URL("https://halo.run"); when(externalUrlSupplier.getURL(any())).thenReturn(url); + when(systemVersionSupplier.get()).thenReturn(Version.parse("0.0.0-alpha.1")); when(environmentFetcher.getConfigMap()).thenReturn(Mono.just(configMap)); siteSettingVariablesAcquirer.acquire(mock(ServerWebExchange.class)) @@ -52,9 +59,13 @@ public class SiteSettingVariablesAcquirerTest { .consumeNextWith(result -> { assertThat(result).containsKey("site"); assertThat(result.get("site")).isInstanceOf(SiteSettingVo.class); - assertThat((SiteSettingVo) result.get("site")) + var site = (SiteSettingVo) result.get("site"); + assertThat(site) .extracting(SiteSettingVo::getUrl) .isEqualTo(url); + assertThat(site) + .extracting(SiteSettingVo::getVersion) + .isEqualTo("0.0.0-alpha.1"); }) .verifyComplete(); verify(externalUrlSupplier).getURL(any()); From 1c3191777856e5703bbe9473d378994ea8a76582 Mon Sep 17 00:00:00 2001 From: guqing <38999863+guqing@users.noreply.github.com> Date: Thu, 19 Sep 2024 15:50:55 +0800 Subject: [PATCH 08/13] chore: replace deprecated Version methods with updated API (#6678) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #### What type of PR is this? /milestone 2.20.x /area core #### What this PR does / why we need it: 替换 Version 过时方法的引用为新 API #### Does this PR introduce a user-facing change? ```release-note None ``` --- .../app/core/extension/service/impl/PluginServiceImpl.java | 2 +- .../java/run/halo/app/infra/DefaultSystemVersionSupplier.java | 4 ++-- .../src/main/java/run/halo/app/infra/utils/VersionUtils.java | 2 +- .../halo/app/core/extension/endpoint/PluginEndpointTest.java | 2 +- .../app/core/extension/reconciler/ThemeReconcilerTest.java | 4 ++-- .../core/extension/service/impl/PluginServiceImplTest.java | 2 +- .../halo/app/core/extension/theme/ThemeServiceImplTest.java | 2 +- .../run/halo/app/infra/DefaultSystemVersionSupplierTest.java | 2 +- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/application/src/main/java/run/halo/app/core/extension/service/impl/PluginServiceImpl.java b/application/src/main/java/run/halo/app/core/extension/service/impl/PluginServiceImpl.java index 991250aac..266f0df39 100644 --- a/application/src/main/java/run/halo/app/core/extension/service/impl/PluginServiceImpl.java +++ b/application/src/main/java/run/halo/app/core/extension/service/impl/PluginServiceImpl.java @@ -476,7 +476,7 @@ public class PluginServiceImpl implements PluginService, InitializingBean, Dispo Version version = systemVersion.get(); // validate the plugin version // only use the nominal system version to compare, the format is like MAJOR.MINOR.PATCH - String systemVersion = version.getNormalVersion(); + String systemVersion = version.toStableVersion().toString(); String requires = newPlugin.getSpec().getRequires(); if (!VersionUtils.satisfiesRequires(systemVersion, requires)) { throw new UnsatisfiedAttributeValueException(String.format( diff --git a/application/src/main/java/run/halo/app/infra/DefaultSystemVersionSupplier.java b/application/src/main/java/run/halo/app/infra/DefaultSystemVersionSupplier.java index f91b48e73..806070a6b 100644 --- a/application/src/main/java/run/halo/app/infra/DefaultSystemVersionSupplier.java +++ b/application/src/main/java/run/halo/app/infra/DefaultSystemVersionSupplier.java @@ -26,9 +26,9 @@ public class DefaultSystemVersionSupplier implements SystemVersionSupplier { public Version get() { var properties = buildProperties.getIfUnique(); if (properties == null) { - return Version.valueOf(DEFAULT_VERSION); + return Version.parse(DEFAULT_VERSION); } var projectVersion = Objects.toString(properties.getVersion(), DEFAULT_VERSION); - return Version.valueOf(projectVersion); + return Version.parse(projectVersion); } } diff --git a/application/src/main/java/run/halo/app/infra/utils/VersionUtils.java b/application/src/main/java/run/halo/app/infra/utils/VersionUtils.java index 09441ac08..2f537b944 100644 --- a/application/src/main/java/run/halo/app/infra/utils/VersionUtils.java +++ b/application/src/main/java/run/halo/app/infra/utils/VersionUtils.java @@ -41,7 +41,7 @@ public class VersionUtils { try { return StringUtils.isBlank(constraint) || "*".equals(constraint) - || Version.valueOf(version).satisfies(constraint); + || Version.parse(version).satisfies(constraint); } catch (Exception e) { throw new ServerWebInputException("Illegal requires version expression.", null, e); } diff --git a/application/src/test/java/run/halo/app/core/extension/endpoint/PluginEndpointTest.java b/application/src/test/java/run/halo/app/core/extension/endpoint/PluginEndpointTest.java index 3de56eb72..2ff443606 100644 --- a/application/src/test/java/run/halo/app/core/extension/endpoint/PluginEndpointTest.java +++ b/application/src/test/java/run/halo/app/core/extension/endpoint/PluginEndpointTest.java @@ -183,7 +183,7 @@ class PluginEndpointTest { webClient = WebTestClient.bindToRouterFunction(endpoint.endpoint()) .build(); - lenient().when(systemVersionSupplier.get()).thenReturn(Version.valueOf("0.0.0")); + lenient().when(systemVersionSupplier.get()).thenReturn(Version.parse("0.0.0")); tempDirectory = Files.createTempDirectory("halo-test-plugin-upgrade-"); plugin002 = tempDirectory.resolve("plugin-0.0.2.jar"); diff --git a/application/src/test/java/run/halo/app/core/extension/reconciler/ThemeReconcilerTest.java b/application/src/test/java/run/halo/app/core/extension/reconciler/ThemeReconcilerTest.java index b18f928a8..e95044c8c 100644 --- a/application/src/test/java/run/halo/app/core/extension/reconciler/ThemeReconcilerTest.java +++ b/application/src/test/java/run/halo/app/core/extension/reconciler/ThemeReconcilerTest.java @@ -74,7 +74,7 @@ class ThemeReconcilerTest { @BeforeEach void setUp() throws IOException { defaultTheme = ResourceUtils.getFile("classpath:themes/default"); - lenient().when(systemVersionSupplier.get()).thenReturn(Version.valueOf("0.0.0")); + lenient().when(systemVersionSupplier.get()).thenReturn(Version.parse("0.0.0")); } @Test @@ -190,7 +190,7 @@ class ThemeReconcilerTest { @Test void reconcileStatus() { - when(systemVersionSupplier.get()).thenReturn(Version.valueOf("2.3.0")); + when(systemVersionSupplier.get()).thenReturn(Version.parse("2.3.0")); Path testWorkDir = tempDirectory.resolve("reconcile-delete"); when(themeRoot.get()).thenReturn(testWorkDir); diff --git a/application/src/test/java/run/halo/app/core/extension/service/impl/PluginServiceImplTest.java b/application/src/test/java/run/halo/app/core/extension/service/impl/PluginServiceImplTest.java index 2e79ce0fe..d90303fa1 100644 --- a/application/src/test/java/run/halo/app/core/extension/service/impl/PluginServiceImplTest.java +++ b/application/src/test/java/run/halo/app/core/extension/service/impl/PluginServiceImplTest.java @@ -123,7 +123,7 @@ class PluginServiceImplTest { getClass().getClassLoader().getResource("plugin/plugin-0.0.2")).toURI(); FileUtils.jar(Paths.get(fakePluingUri), tempDirectory.resolve("plugin-0.0.2.jar")); - lenient().when(systemVersionSupplier.get()).thenReturn(Version.valueOf("0.0.0")); + lenient().when(systemVersionSupplier.get()).thenReturn(Version.parse("0.0.0")); } @Test diff --git a/application/src/test/java/run/halo/app/core/extension/theme/ThemeServiceImplTest.java b/application/src/test/java/run/halo/app/core/extension/theme/ThemeServiceImplTest.java index 045b5f14e..6ef808b8d 100644 --- a/application/src/test/java/run/halo/app/core/extension/theme/ThemeServiceImplTest.java +++ b/application/src/test/java/run/halo/app/core/extension/theme/ThemeServiceImplTest.java @@ -78,7 +78,7 @@ class ThemeServiceImplTest { // init the folder Files.createDirectory(themeRoot.get()); - lenient().when(systemVersionSupplier.get()).thenReturn(Version.valueOf("0.0.0")); + lenient().when(systemVersionSupplier.get()).thenReturn(Version.parse("0.0.0")); } @AfterEach diff --git a/application/src/test/java/run/halo/app/infra/DefaultSystemVersionSupplierTest.java b/application/src/test/java/run/halo/app/infra/DefaultSystemVersionSupplierTest.java index 6be7f0a5f..217de47a9 100644 --- a/application/src/test/java/run/halo/app/infra/DefaultSystemVersionSupplierTest.java +++ b/application/src/test/java/run/halo/app/infra/DefaultSystemVersionSupplierTest.java @@ -60,6 +60,6 @@ class DefaultSystemVersionSupplierTest { when(buildPropertiesProvider.getIfUnique()).thenReturn(buildProperties); version = systemVersionSupplier.get(); assertThat(version.toString()).isEqualTo("2.0.0-SNAPSHOT"); - assertThat(version.getPreReleaseVersion()).isEqualTo("SNAPSHOT"); + assertThat(version.preReleaseVersion().orElseThrow()).isEqualTo("SNAPSHOT"); } } \ No newline at end of file From fb9aff00cad2904f4c4fe7e2067b37cb8afd8c23 Mon Sep 17 00:00:00 2001 From: John Niang Date: Thu, 19 Sep 2024 18:16:55 +0800 Subject: [PATCH 09/13] Add chunked transfer support for rendering templates (#6580) 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: This PR adds chunked transfer support for rendering templates, which means that the max memory used by rendering template will be max chunk size instead of size of rendering result. Users can define the max chunk size like below: ```yaml spring: thymeleaf: reactive: maxChunkSize: 8KB # Setting to 0 will disable the chunked response. ``` #### Special notes for your reviewer: 1. Try to start Halo instance 2. Execute the command like below and see if the response headers contain `transfer-encoding: chunked`: ```bash http http://localhost:8090/ -p h HTTP/1.1 200 OK Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Language: en-CN Content-Type: text/html Expires: 0 Pragma: no-cache Referrer-Policy: strict-origin-when-cross-origin Vary: Origin Vary: Access-Control-Request-Method Vary: Access-Control-Request-Headers X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-XSS-Protection: 0 content-encoding: gzip set-cookie: XSRF-TOKEN=1e677724-ce82-4b63-911c-f78b22cd9169; Path=/ transfer-encoding: chunked ``` #### Does this PR introduce a user-facing change? ```release-note 优化模板渲染时所需的内存 ``` --- .../run/halo/app/theme/HaloViewResolver.java | 45 +++++++++++++++++-- .../app/theme/engine/HaloTemplateEngine.java | 13 +++++- .../src/main/resources/application.yaml | 3 ++ 3 files changed, 56 insertions(+), 5 deletions(-) diff --git a/application/src/main/java/run/halo/app/theme/HaloViewResolver.java b/application/src/main/java/run/halo/app/theme/HaloViewResolver.java index 540e54512..3446240d0 100644 --- a/application/src/main/java/run/halo/app/theme/HaloViewResolver.java +++ b/application/src/main/java/run/halo/app/theme/HaloViewResolver.java @@ -6,11 +6,16 @@ import java.util.Locale; import java.util.Map; import java.util.Optional; import org.attoparser.ParseException; +import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.thymeleaf.ThymeleafProperties; +import org.springframework.boot.context.properties.PropertyMapper; import org.springframework.context.ApplicationContext; +import org.springframework.core.Ordered; import org.springframework.http.MediaType; import org.springframework.lang.NonNull; import org.springframework.stereotype.Component; +import org.springframework.util.unit.DataSize; import org.springframework.web.ErrorResponse; import org.springframework.web.reactive.result.view.View; import org.springframework.web.server.ServerWebExchange; @@ -24,13 +29,16 @@ import run.halo.app.theme.finders.FinderRegistry; import run.halo.app.theme.router.ModelConst; @Component("thymeleafReactiveViewResolver") -public class HaloViewResolver extends ThymeleafReactiveViewResolver { +public class HaloViewResolver extends ThymeleafReactiveViewResolver implements InitializingBean { private final FinderRegistry finderRegistry; - public HaloViewResolver(FinderRegistry finderRegistry) { - setViewClass(HaloView.class); + private final ThymeleafProperties thymeleafProperties; + + public HaloViewResolver(FinderRegistry finderRegistry, + ThymeleafProperties thymeleafProperties) { this.finderRegistry = finderRegistry; + this.thymeleafProperties = thymeleafProperties; } @Override @@ -44,6 +52,37 @@ public class HaloViewResolver extends ThymeleafReactiveViewResolver { }); } + @Override + public void afterPropertiesSet() throws Exception { + setViewClass(HaloView.class); + var map = PropertyMapper.get(); + map.from(thymeleafProperties::getEncoding) + .whenNonNull() + .to(this::setDefaultCharset); + map.from(thymeleafProperties::getExcludedViewNames) + .whenNonNull() + .to(this::setExcludedViewNames); + map.from(thymeleafProperties::getViewNames) + .whenNonNull() + .to(this::setViewNames); + + var reactive = thymeleafProperties.getReactive(); + map.from(reactive::getMediaTypes) + .whenNonNull() + .to(this::setSupportedMediaTypes); + map.from(reactive::getFullModeViewNames) + .whenNonNull() + .to(this::setFullModeViewNames); + map.from(reactive::getChunkedModeViewNames) + .whenNonNull() + .to(this::setChunkedModeViewNames); + map.from(reactive::getMaxChunkSize) + .asInt(DataSize::toBytes) + .when(size -> size > 0) + .to(this::setResponseMaxChunkSizeBytes); + setOrder(Ordered.LOWEST_PRECEDENCE - 5); + } + public static class HaloView extends ThymeleafReactiveView { @Autowired diff --git a/application/src/main/java/run/halo/app/theme/engine/HaloTemplateEngine.java b/application/src/main/java/run/halo/app/theme/engine/HaloTemplateEngine.java index fcbd3c3e1..c890d57df 100644 --- a/application/src/main/java/run/halo/app/theme/engine/HaloTemplateEngine.java +++ b/application/src/main/java/run/halo/app/theme/engine/HaloTemplateEngine.java @@ -42,10 +42,19 @@ public class HaloTemplateEngine extends SpringWebFluxTemplateEngine { // We have to subscribe on blocking thread, because some blocking operations will be present // while processing. if (publisher instanceof Mono mono) { - return mono.subscribeOn(Schedulers.boundedElastic()); + return mono.subscribeOn(Schedulers.boundedElastic()) + // We should switch back to non-blocking thread. + // See https://github.com/spring-projects/spring-framework/issues/26958 + // for more details. + .publishOn(Schedulers.parallel()); } if (publisher instanceof Flux flux) { - return flux.subscribeOn(Schedulers.boundedElastic()); + return flux + .subscribeOn(Schedulers.boundedElastic()) + // We should switch back to non-blocking thread. + // See https://github.com/spring-projects/spring-framework/issues/26958 + // for more details. + .publishOn(Schedulers.parallel()); } return publisher; } diff --git a/application/src/main/resources/application.yaml b/application/src/main/resources/application.yaml index a24b43d73..681a94adc 100644 --- a/application/src/main/resources/application.yaml +++ b/application/src/main/resources/application.yaml @@ -27,6 +27,9 @@ spring: cache: cachecontrol: max-age: 365d + thymeleaf: + reactive: + maxChunkSize: 8KB cache: type: caffeine caffeine: From a87dedd916314bc81fa319adc6a024b14bf81c92 Mon Sep 17 00:00:00 2001 From: John Niang Date: Fri, 20 Sep 2024 11:14:58 +0800 Subject: [PATCH 10/13] Make ApplicationContext inaccessible in ITemplateContext (#6680) #### What type of PR is this? /kind improvement /area core /area plugin /milestone 2.20.x #### What this PR does / why we need it: This PR disables access to ApplicationContext using ITemplateContext. #### Does this PR introduce a user-facing change? ```release-note None ``` --- .../dialect/CommentElementTagProcessor.java | 2 +- .../dialect/GlobalHeadInjectionProcessor.java | 4 +- .../dialect/HaloPostTemplateHandler.java | 3 +- .../theme/dialect/SecureTemplateContext.java | 159 ++++++++++++++++++ .../TemplateFooterElementTagProcessor.java | 4 +- .../dialect/HaloPostTemplateHandlerTest.java | 10 +- 6 files changed, 172 insertions(+), 10 deletions(-) create mode 100644 application/src/main/java/run/halo/app/theme/dialect/SecureTemplateContext.java diff --git a/application/src/main/java/run/halo/app/theme/dialect/CommentElementTagProcessor.java b/application/src/main/java/run/halo/app/theme/dialect/CommentElementTagProcessor.java index 96b9935c1..f449f2e69 100644 --- a/application/src/main/java/run/halo/app/theme/dialect/CommentElementTagProcessor.java +++ b/application/src/main/java/run/halo/app/theme/dialect/CommentElementTagProcessor.java @@ -45,6 +45,6 @@ public class CommentElementTagProcessor extends AbstractElementTagProcessor { structureHandler.replaceWith("", false); return; } - commentWidget.render(context, tag, structureHandler); + commentWidget.render(new SecureTemplateContext(context), tag, structureHandler); } } diff --git a/application/src/main/java/run/halo/app/theme/dialect/GlobalHeadInjectionProcessor.java b/application/src/main/java/run/halo/app/theme/dialect/GlobalHeadInjectionProcessor.java index 6be5c52bb..a346d42e0 100644 --- a/application/src/main/java/run/halo/app/theme/dialect/GlobalHeadInjectionProcessor.java +++ b/application/src/main/java/run/halo/app/theme/dialect/GlobalHeadInjectionProcessor.java @@ -71,7 +71,9 @@ public class GlobalHeadInjectionProcessor extends AbstractElementModelProcessor // apply processors to modelToInsert getTemplateHeadProcessors(context) - .concatMap(processor -> processor.process(context, modelToInsert, structureHandler)) + .concatMap(processor -> processor.process( + new SecureTemplateContext(context), modelToInsert, structureHandler) + ) .then() .block(); diff --git a/application/src/main/java/run/halo/app/theme/dialect/HaloPostTemplateHandler.java b/application/src/main/java/run/halo/app/theme/dialect/HaloPostTemplateHandler.java index 1eebd67fe..25755a457 100644 --- a/application/src/main/java/run/halo/app/theme/dialect/HaloPostTemplateHandler.java +++ b/application/src/main/java/run/halo/app/theme/dialect/HaloPostTemplateHandler.java @@ -57,7 +57,8 @@ public class HaloPostTemplateHandler extends AbstractTemplateHandler { var context = getContext(); for (ElementTagPostProcessor elementTagPostProcessor : postProcessors) { tagProcessorChain = tagProcessorChain.flatMap( - tag -> elementTagPostProcessor.process(context, tag).defaultIfEmpty(tag) + tag -> elementTagPostProcessor.process(new SecureTemplateContext(context), tag) + .defaultIfEmpty(tag) ); } processedTag = diff --git a/application/src/main/java/run/halo/app/theme/dialect/SecureTemplateContext.java b/application/src/main/java/run/halo/app/theme/dialect/SecureTemplateContext.java new file mode 100644 index 000000000..3fe8d0403 --- /dev/null +++ b/application/src/main/java/run/halo/app/theme/dialect/SecureTemplateContext.java @@ -0,0 +1,159 @@ +package run.halo.app.theme.dialect; + +import static org.thymeleaf.spring6.expression.ThymeleafEvaluationContext.THYMELEAF_EVALUATION_CONTEXT_CONTEXT_VARIABLE_NAME; + +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; +import org.thymeleaf.IEngineConfiguration; +import org.thymeleaf.context.ITemplateContext; +import org.thymeleaf.context.IdentifierSequences; +import org.thymeleaf.engine.TemplateData; +import org.thymeleaf.expression.IExpressionObjects; +import org.thymeleaf.inline.IInliner; +import org.thymeleaf.model.IModelFactory; +import org.thymeleaf.model.IProcessableElementTag; +import org.thymeleaf.templatemode.TemplateMode; + +/** + * Secure template context. + * + * @author johnniang + * @since 2.20.0 + */ +class SecureTemplateContext implements ITemplateContext { + + private static final Set DANGEROUS_VARIABLES = + Set.of(THYMELEAF_EVALUATION_CONTEXT_CONTEXT_VARIABLE_NAME); + + private final ITemplateContext delegate; + + public SecureTemplateContext(ITemplateContext delegate) { + this.delegate = delegate; + } + + @Override + public TemplateData getTemplateData() { + return delegate.getTemplateData(); + } + + @Override + public TemplateMode getTemplateMode() { + return delegate.getTemplateMode(); + } + + @Override + public List getTemplateStack() { + return delegate.getTemplateStack(); + } + + @Override + public List getElementStack() { + return delegate.getElementStack(); + } + + @Override + public Map getTemplateResolutionAttributes() { + return delegate.getTemplateResolutionAttributes(); + } + + @Override + public IModelFactory getModelFactory() { + return delegate.getModelFactory(); + } + + @Override + public boolean hasSelectionTarget() { + return delegate.hasSelectionTarget(); + } + + @Override + public Object getSelectionTarget() { + return delegate.getSelectionTarget(); + } + + @Override + public IInliner getInliner() { + return delegate.getInliner(); + } + + @Override + public String getMessage( + Class origin, + String key, + Object[] messageParameters, + boolean useAbsentMessageRepresentation + ) { + return delegate.getMessage(origin, key, messageParameters, useAbsentMessageRepresentation); + } + + @Override + public String buildLink(String base, Map parameters) { + return delegate.buildLink(base, parameters); + } + + @Override + public IdentifierSequences getIdentifierSequences() { + return delegate.getIdentifierSequences(); + } + + @Override + public IEngineConfiguration getConfiguration() { + return delegate.getConfiguration(); + } + + @Override + public IExpressionObjects getExpressionObjects() { + return delegate.getExpressionObjects(); + } + + @Override + public Locale getLocale() { + return delegate.getLocale(); + } + + @Override + public boolean containsVariable(String name) { + if (DANGEROUS_VARIABLES.contains(name)) { + return false; + } + return delegate.containsVariable(name); + } + + @Override + public Set getVariableNames() { + return delegate.getVariableNames() + .stream() + .filter(name -> !DANGEROUS_VARIABLES.contains(name)) + .collect(Collectors.toSet()); + } + + @Override + public Object getVariable(String name) { + if (DANGEROUS_VARIABLES.contains(name)) { + return null; + } + return delegate.getVariable(name); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + SecureTemplateContext that = (SecureTemplateContext) o; + return Objects.equals(delegate, that.delegate); + } + + @Override + public int hashCode() { + return Objects.hashCode(delegate); + } +} diff --git a/application/src/main/java/run/halo/app/theme/dialect/TemplateFooterElementTagProcessor.java b/application/src/main/java/run/halo/app/theme/dialect/TemplateFooterElementTagProcessor.java index 74239b1f2..26a286b26 100644 --- a/application/src/main/java/run/halo/app/theme/dialect/TemplateFooterElementTagProcessor.java +++ b/application/src/main/java/run/halo/app/theme/dialect/TemplateFooterElementTagProcessor.java @@ -58,8 +58,8 @@ public class TemplateFooterElementTagProcessor extends AbstractElementTagProcess modelToInsert.add(context.getModelFactory().createText(globalFooterText)); getTemplateFooterProcessors(context) - .concatMap(processor -> processor.process(context, tag, - structureHandler, modelToInsert) + .concatMap(processor -> processor.process( + new SecureTemplateContext(context), tag, structureHandler, modelToInsert) ) .then() .block(); diff --git a/application/src/test/java/run/halo/app/theme/dialect/HaloPostTemplateHandlerTest.java b/application/src/test/java/run/halo/app/theme/dialect/HaloPostTemplateHandlerTest.java index 20c32f90b..9d6266f2d 100644 --- a/application/src/test/java/run/halo/app/theme/dialect/HaloPostTemplateHandlerTest.java +++ b/application/src/test/java/run/halo/app/theme/dialect/HaloPostTemplateHandlerTest.java @@ -82,7 +82,7 @@ class HaloPostTemplateHandlerTest { void shouldHandleStandaloneElementIfOneElementTagProcessorProvided() { var processor = mock(ElementTagPostProcessor.class); var newTag = mock(IStandaloneElementTag.class); - when(processor.process(templateContext, standaloneElementTag)) + when(processor.process(new SecureTemplateContext(templateContext), standaloneElementTag)) .thenReturn(Mono.just(newTag)); when(extensionGetter.getExtensionList(ElementTagPostProcessor.class)) .thenReturn(List.of(processor)); @@ -97,7 +97,7 @@ class HaloPostTemplateHandlerTest { void shouldHandleStandaloneElementIfTagTypeChanged() { var processor = mock(ElementTagPostProcessor.class); var newTag = mock(IStandaloneElementTag.class); - when(processor.process(templateContext, standaloneElementTag)) + when(processor.process(new SecureTemplateContext(templateContext), standaloneElementTag)) .thenReturn(Mono.just(newTag)); when(extensionGetter.getExtensionList(ElementTagPostProcessor.class)) .thenReturn(List.of(processor)); @@ -114,9 +114,9 @@ class HaloPostTemplateHandlerTest { var processor2 = mock(ElementTagPostProcessor.class); var newTag1 = mock(IStandaloneElementTag.class); var newTag2 = mock(IStandaloneElementTag.class); - when(processor1.process(templateContext, standaloneElementTag)) + when(processor1.process(new SecureTemplateContext(templateContext), standaloneElementTag)) .thenReturn(Mono.just(newTag1)); - when(processor2.process(templateContext, newTag1)) + when(processor2.process(new SecureTemplateContext(templateContext), newTag1)) .thenReturn(Mono.just(newTag2)); when(extensionGetter.getExtensionList(ElementTagPostProcessor.class)) .thenReturn(List.of(processor1, processor2)); @@ -131,7 +131,7 @@ class HaloPostTemplateHandlerTest { void shouldNotHandleIfProcessedTagTypeChanged() { var processor = mock(ElementTagPostProcessor.class); var newTag = mock(IOpenElementTag.class); - when(processor.process(templateContext, standaloneElementTag)) + when(processor.process(new SecureTemplateContext(templateContext), standaloneElementTag)) .thenReturn(Mono.just(newTag)); when(extensionGetter.getExtensionList(ElementTagPostProcessor.class)) .thenReturn(List.of(processor)); From df195b12f2801b1de7119bd3552afa796ac44889 Mon Sep 17 00:00:00 2001 From: John Niang Date: Fri, 20 Sep 2024 11:16:59 +0800 Subject: [PATCH 11/13] Make ApplicationContext inaccessible in ServerWebExchange (#6679) #### What type of PR is this? /kind improvement /area core /area plugin /milestone 2.20.x #### What this PR does / why we need it: Plugins can implement their own RouterFunctions and ControllerMappings, but those might expose root ApplicationContext for plugins, which is not expected. So this PR fixes the insecure access to root ApplicationContext. #### Does this PR introduce a user-facing change? ```release-note None ``` --- .../run/halo/app/config/WebFluxConfig.java | 16 ++++++++++ .../SecureRequestMappingHandlerAdapter.java | 26 ++++++++++++++++ .../halo/app/infra/SecureServerRequest.java | 31 +++++++++++++++++++ .../app/infra/SecureServerWebExchange.java | 25 +++++++++++++++ .../app/plugin/AggregatedRouterFunction.java | 3 +- .../DefaultPluginRouterFunctionRegistry.java | 4 ++- 6 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 application/src/main/java/run/halo/app/infra/SecureRequestMappingHandlerAdapter.java create mode 100644 application/src/main/java/run/halo/app/infra/SecureServerRequest.java create mode 100644 application/src/main/java/run/halo/app/infra/SecureServerWebExchange.java diff --git a/application/src/main/java/run/halo/app/config/WebFluxConfig.java b/application/src/main/java/run/halo/app/config/WebFluxConfig.java index 1a864ca63..22a8b50e1 100644 --- a/application/src/main/java/run/halo/app/config/WebFluxConfig.java +++ b/application/src/main/java/run/halo/app/config/WebFluxConfig.java @@ -12,6 +12,7 @@ import java.util.List; import java.util.Objects; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.web.WebProperties; +import org.springframework.boot.autoconfigure.web.reactive.WebFluxRegistrations; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -33,6 +34,7 @@ import org.springframework.web.reactive.function.server.RouterFunction; import org.springframework.web.reactive.function.server.ServerResponse; import org.springframework.web.reactive.resource.EncodedResourceResolver; import org.springframework.web.reactive.resource.PathResourceResolver; +import org.springframework.web.reactive.result.method.annotation.RequestMappingHandlerAdapter; import org.springframework.web.reactive.result.view.ViewResolutionResultHandler; import org.springframework.web.reactive.result.view.ViewResolver; import reactor.core.publisher.Mono; @@ -41,6 +43,7 @@ import run.halo.app.console.WebSocketRequestPredicate; import run.halo.app.core.endpoint.WebSocketHandlerMapping; import run.halo.app.core.extension.endpoint.CustomEndpoint; import run.halo.app.core.extension.endpoint.CustomEndpointsBuilder; +import run.halo.app.infra.SecureRequestMappingHandlerAdapter; import run.halo.app.infra.properties.AttachmentProperties; import run.halo.app.infra.properties.HaloProperties; import run.halo.app.plugin.extensionpoint.ExtensionGetter; @@ -67,6 +70,19 @@ public class WebFluxConfig implements WebFluxConfigurer { this.applicationContext = applicationContext; } + @Bean + WebFluxRegistrations webFluxRegistrations() { + return new WebFluxRegistrations() { + @Override + public RequestMappingHandlerAdapter getRequestMappingHandlerAdapter() { + // Because we have no chance to customize ServerWebExchangeMethodArgumentResolver, + // we have to use SecureRequestMappingHandlerAdapter to replace a secure + // ServerWebExchange. + return new SecureRequestMappingHandlerAdapter(); + } + }; + } + @Bean ServerResponse.Context context(CodecConfigurer codec, ViewResolutionResultHandler resultHandler) { diff --git a/application/src/main/java/run/halo/app/infra/SecureRequestMappingHandlerAdapter.java b/application/src/main/java/run/halo/app/infra/SecureRequestMappingHandlerAdapter.java new file mode 100644 index 000000000..78b75531d --- /dev/null +++ b/application/src/main/java/run/halo/app/infra/SecureRequestMappingHandlerAdapter.java @@ -0,0 +1,26 @@ +package run.halo.app.infra; + +import org.springframework.lang.NonNull; +import org.springframework.web.reactive.HandlerResult; +import org.springframework.web.reactive.result.method.annotation.RequestMappingHandlerAdapter; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; + +/** + * Secure request mapping handler adapter. + * + * @author johnniang + * @since 2.20.0 + */ +public class SecureRequestMappingHandlerAdapter extends RequestMappingHandlerAdapter { + + @Override + @NonNull + public Mono handle( + @NonNull ServerWebExchange exchange, + @NonNull Object handler + ) { + return super.handle(new SecureServerWebExchange(exchange), handler); + } + +} diff --git a/application/src/main/java/run/halo/app/infra/SecureServerRequest.java b/application/src/main/java/run/halo/app/infra/SecureServerRequest.java new file mode 100644 index 000000000..851b8140c --- /dev/null +++ b/application/src/main/java/run/halo/app/infra/SecureServerRequest.java @@ -0,0 +1,31 @@ +package run.halo.app.infra; + +import org.springframework.lang.NonNull; +import org.springframework.web.reactive.function.server.ServerRequest; +import org.springframework.web.reactive.function.server.support.ServerRequestWrapper; +import org.springframework.web.server.ServerWebExchange; + +/** + * Secure server request without application context available. + * + * @author johnniang + * @since 2.20.0 + */ +public class SecureServerRequest extends ServerRequestWrapper { + + /** + * Create a new {@code ServerRequestWrapper} that wraps the given request. + * + * @param delegate the request to wrap + */ + public SecureServerRequest(ServerRequest delegate) { + super(delegate); + } + + @Override + @NonNull + public ServerWebExchange exchange() { + return new SecureServerWebExchange(super.exchange()); + } + +} diff --git a/application/src/main/java/run/halo/app/infra/SecureServerWebExchange.java b/application/src/main/java/run/halo/app/infra/SecureServerWebExchange.java new file mode 100644 index 000000000..4d244532f --- /dev/null +++ b/application/src/main/java/run/halo/app/infra/SecureServerWebExchange.java @@ -0,0 +1,25 @@ +package run.halo.app.infra; + +import org.springframework.context.ApplicationContext; +import org.springframework.web.server.ServerWebExchange; +import org.springframework.web.server.ServerWebExchangeDecorator; + +/** + * Secure server web exchange without application context available. + * + * @author johnniang + * @since 2.20.0 + */ +public class SecureServerWebExchange extends ServerWebExchangeDecorator { + + public SecureServerWebExchange(ServerWebExchange delegate) { + super(delegate); + } + + @Override + public ApplicationContext getApplicationContext() { + // Always return null to prevent access to application context + return null; + } + +} diff --git a/application/src/main/java/run/halo/app/plugin/AggregatedRouterFunction.java b/application/src/main/java/run/halo/app/plugin/AggregatedRouterFunction.java index 396c2d49d..6dbbbd484 100644 --- a/application/src/main/java/run/halo/app/plugin/AggregatedRouterFunction.java +++ b/application/src/main/java/run/halo/app/plugin/AggregatedRouterFunction.java @@ -9,6 +9,7 @@ import org.springframework.web.reactive.function.server.ServerResponse; import reactor.core.publisher.Mono; import run.halo.app.core.extension.endpoint.CustomEndpoint; import run.halo.app.core.extension.endpoint.CustomEndpointsBuilder; +import run.halo.app.infra.SecureServerRequest; /** * Aggregated router function built from all custom endpoints. @@ -28,7 +29,7 @@ public class AggregatedRouterFunction implements RouterFunction @Override public Mono> route(ServerRequest request) { - return aggregated.route(request); + return aggregated.route(new SecureServerRequest(request)); } @Override diff --git a/application/src/main/java/run/halo/app/plugin/DefaultPluginRouterFunctionRegistry.java b/application/src/main/java/run/halo/app/plugin/DefaultPluginRouterFunctionRegistry.java index 602fd5606..547a07a54 100644 --- a/application/src/main/java/run/halo/app/plugin/DefaultPluginRouterFunctionRegistry.java +++ b/application/src/main/java/run/halo/app/plugin/DefaultPluginRouterFunctionRegistry.java @@ -11,6 +11,7 @@ import org.springframework.web.reactive.function.server.ServerRequest; import org.springframework.web.reactive.function.server.ServerResponse; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import run.halo.app.infra.SecureServerRequest; /** * A composite {@link RouterFunction} implementation for plugin. @@ -31,8 +32,9 @@ public class DefaultPluginRouterFunctionRegistry @Override @NonNull public Mono> route(@NonNull ServerRequest request) { + var secureRequest = new SecureServerRequest(request); return Flux.fromIterable(this.routerFunctions) - .concatMap(routerFunction -> routerFunction.route(request)) + .concatMap(routerFunction -> routerFunction.route(secureRequest)) .next(); } From 8b3bde050f28d4b423f65fd2b6326631cafa5b2f Mon Sep 17 00:00:00 2001 From: John Niang Date: Mon, 23 Sep 2024 16:47:15 +0800 Subject: [PATCH 12/13] Refactor ReactivePropertyAccessor by wrapping existing PropertyAccessor (#6686) #### What type of PR is this? /kind improvement /area core /area theme #### What this PR does / why we need it: This PR removes ReactivePropertyAccessor because it use `AstUtils#getPropertyAccessorsToTry` which is already hidden in [the commit](https://github.com/spring-projects/spring-framework/commit/33fbd7141d46c281cdc0a26d4bdeb21b00bdb5d3#diff-deaf3517fbd66f40a8717877a8328dee0fb2581dfb6be487f327dc73ea33b5b5). If we upgraded to Spring Boot 3.4.0-M3, the code in ReactivePropertyAccessor would be broken. More importantly, I believe there is one issue with the current implementation although it can resolve the reactive issue. - The PropertyAccessor modified the process flow of SPEL This PR provides some wrappers to wrap existing PropertyAccessor and MethodResolver to evaluate reactive return value. #### Does this PR introduce a user-facing change? ```release-note None ``` --- .../halo/app/infra/utils/ReactiveUtils.java | 62 ++++++ .../app/theme/ReactivePropertyAccessor.java | 118 ---------- ...activeSpelVariableExpressionEvaluator.java | 33 ++- .../dialect/EvaluationContextEnhancer.java | 210 ++++++++++++++++++ .../theme/dialect/HaloProcessorDialect.java | 2 +- ...dePropertyAccessorBoundariesProcessor.java | 49 ---- .../ReactiveFinderExpressionParserTests.java | 1 - 7 files changed, 288 insertions(+), 187 deletions(-) create mode 100644 application/src/main/java/run/halo/app/infra/utils/ReactiveUtils.java delete mode 100644 application/src/main/java/run/halo/app/theme/ReactivePropertyAccessor.java create mode 100644 application/src/main/java/run/halo/app/theme/dialect/EvaluationContextEnhancer.java delete mode 100644 application/src/main/java/run/halo/app/theme/dialect/JsonNodePropertyAccessorBoundariesProcessor.java diff --git a/application/src/main/java/run/halo/app/infra/utils/ReactiveUtils.java b/application/src/main/java/run/halo/app/infra/utils/ReactiveUtils.java new file mode 100644 index 000000000..c87b0e03b --- /dev/null +++ b/application/src/main/java/run/halo/app/infra/utils/ReactiveUtils.java @@ -0,0 +1,62 @@ +package run.halo.app.infra.utils; + +import java.time.Duration; +import org.springframework.lang.NonNull; +import org.springframework.lang.Nullable; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +/** + * Utility class for reactive. + * + * @author johnniang + * @since 2.20.0 + */ +public enum ReactiveUtils { + ; + + private static final Duration DEFAULT_TIMEOUT = Duration.ofMinutes(1); + + /** + * Resolve reactive value by blocking operation. + * + * @param value the normal value or reactive value + * @return the resolved value + */ + @Nullable + public static Object blockReactiveValue(@Nullable Object value) { + return blockReactiveValue(value, DEFAULT_TIMEOUT); + } + + /** + * Resolve reactive value by blocking operation. + * + * @param value the normal value or reactive value + * @param timeout the timeout of blocking operation + * @return the resolved value + */ + @Nullable + public static Object blockReactiveValue(@Nullable Object value, @NonNull Duration timeout) { + if (value == null) { + return null; + } + Class clazz = value.getClass(); + if (Mono.class.isAssignableFrom(clazz)) { + return ((Mono) value).blockOptional(timeout).orElse(null); + } + if (Flux.class.isAssignableFrom(clazz)) { + return ((Flux) value).collectList().block(timeout); + } + return value; + } + + /** + * Check if the class is a reactive type. + * + * @param clazz the class to check + * @return true if the class is a reactive type, false otherwise + */ + public static boolean isReactiveType(@NonNull Class clazz) { + return Mono.class.isAssignableFrom(clazz) || Flux.class.isAssignableFrom(clazz); + } +} diff --git a/application/src/main/java/run/halo/app/theme/ReactivePropertyAccessor.java b/application/src/main/java/run/halo/app/theme/ReactivePropertyAccessor.java deleted file mode 100644 index db847d24b..000000000 --- a/application/src/main/java/run/halo/app/theme/ReactivePropertyAccessor.java +++ /dev/null @@ -1,118 +0,0 @@ -package run.halo.app.theme; - -import java.util.List; -import org.springframework.expression.AccessException; -import org.springframework.expression.EvaluationContext; -import org.springframework.expression.PropertyAccessor; -import org.springframework.expression.TypedValue; -import org.springframework.expression.spel.ast.AstUtils; -import org.springframework.integration.json.JsonPropertyAccessor; -import org.springframework.lang.NonNull; -import org.springframework.lang.Nullable; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; - -/** - * A SpEL PropertyAccessor that knows how to read properties from {@link Mono} or {@link Flux} - * object. It first converts the target to the actual value and then calls other - * {@link PropertyAccessor}s to parse the result, If it still cannot be resolved, - * {@link JsonPropertyAccessor} will be used to resolve finally. - * - * @author guqing - * @since 2.0.0 - */ -public class ReactivePropertyAccessor implements PropertyAccessor { - - @Override - public Class[] getSpecificTargetClasses() { - return null; - } - - @Override - public boolean canRead(@NonNull EvaluationContext context, Object target, @NonNull String name) - throws AccessException { - if (isReactiveType(target)) { - return true; - } - var propertyAccessors = - getPropertyAccessorsToTry(target.getClass(), context.getPropertyAccessors()); - for (PropertyAccessor propertyAccessor : propertyAccessors) { - if (propertyAccessor.canRead(context, target, name)) { - return true; - } - } - return false; - } - - @Override - @NonNull - public TypedValue read(@NonNull EvaluationContext context, Object target, @NonNull String name) - throws AccessException { - if (target == null) { - return TypedValue.NULL; - } - Object value = blockingGetForReactive(target); - - List propertyAccessorsToTry = - getPropertyAccessorsToTry(value, context.getPropertyAccessors()); - for (PropertyAccessor propertyAccessor : propertyAccessorsToTry) { - try { - TypedValue result = propertyAccessor.read(context, value, name); - return new TypedValue(blockingGetForReactive(result.getValue())); - } catch (AccessException e) { - // ignore this - } - } - - throw new AccessException("Cannot read property '" + name + "' from [" + value + "]"); - } - - @Nullable - private static Object blockingGetForReactive(@Nullable Object target) { - if (target == null) { - return null; - } - Class clazz = target.getClass(); - Object value = target; - if (Mono.class.isAssignableFrom(clazz)) { - value = ((Mono) target).block(); - } else if (Flux.class.isAssignableFrom(clazz)) { - value = ((Flux) target).collectList().block(); - } - return value; - } - - private boolean isReactiveType(Object target) { - if (target == null) { - return true; - } - Class clazz = target.getClass(); - return Mono.class.isAssignableFrom(clazz) - || Flux.class.isAssignableFrom(clazz); - } - - private List getPropertyAccessorsToTry( - @Nullable Object contextObject, List propertyAccessors) { - - Class targetType = (contextObject != null ? contextObject.getClass() : null); - - List resolvers = - AstUtils.getPropertyAccessorsToTry(targetType, propertyAccessors); - // remove this resolver to avoid infinite loop - resolvers.remove(this); - return resolvers; - } - - @Override - public boolean canWrite(@NonNull EvaluationContext context, Object target, @NonNull String name) - throws AccessException { - return false; - } - - @Override - public void write(@NonNull EvaluationContext context, Object target, @NonNull String name, - Object newValue) - throws AccessException { - throw new UnsupportedOperationException("Write is not supported"); - } -} diff --git a/application/src/main/java/run/halo/app/theme/ReactiveSpelVariableExpressionEvaluator.java b/application/src/main/java/run/halo/app/theme/ReactiveSpelVariableExpressionEvaluator.java index 179449778..b961f0eea 100644 --- a/application/src/main/java/run/halo/app/theme/ReactiveSpelVariableExpressionEvaluator.java +++ b/application/src/main/java/run/halo/app/theme/ReactiveSpelVariableExpressionEvaluator.java @@ -1,12 +1,12 @@ package run.halo.app.theme; +import java.util.Optional; import org.thymeleaf.context.IExpressionContext; import org.thymeleaf.spring6.expression.SPELVariableExpressionEvaluator; import org.thymeleaf.standard.expression.IStandardVariableExpression; import org.thymeleaf.standard.expression.IStandardVariableExpressionEvaluator; import org.thymeleaf.standard.expression.StandardExpressionExecutionContext; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; +import run.halo.app.infra.utils.ReactiveUtils; /** * Reactive SPEL variable expression evaluator. @@ -17,28 +17,25 @@ import reactor.core.publisher.Mono; public class ReactiveSpelVariableExpressionEvaluator implements IStandardVariableExpressionEvaluator { - private final SPELVariableExpressionEvaluator delegate = - SPELVariableExpressionEvaluator.INSTANCE; + private final IStandardVariableExpressionEvaluator delegate; public static final ReactiveSpelVariableExpressionEvaluator INSTANCE = new ReactiveSpelVariableExpressionEvaluator(); + public ReactiveSpelVariableExpressionEvaluator(IStandardVariableExpressionEvaluator delegate) { + this.delegate = delegate; + } + + public ReactiveSpelVariableExpressionEvaluator() { + this(SPELVariableExpressionEvaluator.INSTANCE); + } + @Override public Object evaluate(IExpressionContext context, IStandardVariableExpression expression, StandardExpressionExecutionContext expContext) { - Object returnValue = delegate.evaluate(context, expression, expContext); - if (returnValue == null) { - return null; - } - - Class clazz = returnValue.getClass(); - // Note that: 3 instanceof Foo -> syntax error - if (Mono.class.isAssignableFrom(clazz)) { - return ((Mono) returnValue).block(); - } - if (Flux.class.isAssignableFrom(clazz)) { - return ((Flux) returnValue).collectList().block(); - } - return returnValue; + var returnValue = delegate.evaluate(context, expression, expContext); + return Optional.ofNullable(returnValue) + .map(ReactiveUtils::blockReactiveValue) + .orElse(null); } } diff --git a/application/src/main/java/run/halo/app/theme/dialect/EvaluationContextEnhancer.java b/application/src/main/java/run/halo/app/theme/dialect/EvaluationContextEnhancer.java new file mode 100644 index 000000000..2d01e48b6 --- /dev/null +++ b/application/src/main/java/run/halo/app/theme/dialect/EvaluationContextEnhancer.java @@ -0,0 +1,210 @@ +package run.halo.app.theme.dialect; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; +import org.springframework.core.convert.TypeDescriptor; +import org.springframework.expression.AccessException; +import org.springframework.expression.EvaluationContext; +import org.springframework.expression.MethodExecutor; +import org.springframework.expression.MethodResolver; +import org.springframework.expression.PropertyAccessor; +import org.springframework.expression.TypedValue; +import org.springframework.expression.spel.support.ReflectivePropertyAccessor; +import org.springframework.integration.json.JsonPropertyAccessor; +import org.springframework.lang.Nullable; +import org.thymeleaf.context.ITemplateContext; +import org.thymeleaf.model.ITemplateEnd; +import org.thymeleaf.model.ITemplateStart; +import org.thymeleaf.processor.templateboundaries.AbstractTemplateBoundariesProcessor; +import org.thymeleaf.processor.templateboundaries.ITemplateBoundariesStructureHandler; +import org.thymeleaf.spring6.expression.ThymeleafEvaluationContext; +import org.thymeleaf.standard.StandardDialect; +import org.thymeleaf.templatemode.TemplateMode; +import run.halo.app.infra.utils.ReactiveUtils; + +/** + * Enhance the evaluation context to support reactive types. + * + * @author guqing + * @author johnniang + * @since 2.20.0 + */ +public class EvaluationContextEnhancer extends AbstractTemplateBoundariesProcessor { + + private static final int PRECEDENCE = StandardDialect.PROCESSOR_PRECEDENCE; + + private static final JsonPropertyAccessor JSON_PROPERTY_ACCESSOR = new JsonPropertyAccessor(); + + public EvaluationContextEnhancer() { + super(TemplateMode.HTML, PRECEDENCE); + } + + @Override + public void doProcessTemplateStart(ITemplateContext context, ITemplateStart templateStart, + ITemplateBoundariesStructureHandler structureHandler) { + var evluationContextObject = context.getVariable( + ThymeleafEvaluationContext.THYMELEAF_EVALUATION_CONTEXT_CONTEXT_VARIABLE_NAME + ); + if (evluationContextObject instanceof ThymeleafEvaluationContext evaluationContext) { + evaluationContext.addPropertyAccessor(JSON_PROPERTY_ACCESSOR); + ReactiveReflectivePropertyAccessor.wrap(evaluationContext); + ReactiveMethodResolver.wrap(evaluationContext); + } + } + + @Override + public void doProcessTemplateEnd(ITemplateContext context, ITemplateEnd templateEnd, + ITemplateBoundariesStructureHandler structureHandler) { + // nothing to do + } + + /** + * A {@link PropertyAccessor} that wraps the original {@link ReflectivePropertyAccessor} and + * blocks the reactive value. + */ + private static class ReactiveReflectivePropertyAccessor + extends ReflectivePropertyAccessor { + private final ReflectivePropertyAccessor delegate; + + private ReactiveReflectivePropertyAccessor(ReflectivePropertyAccessor delegate) { + this.delegate = delegate; + } + + @Override + public boolean canRead(EvaluationContext context, Object target, String name) + throws AccessException { + if (target == null) { + // For backward compatibility + return true; + } + return this.delegate.canRead(context, target, name); + } + + @Override + public TypedValue read(EvaluationContext context, Object target, String name) + throws AccessException { + if (target == null) { + // For backward compatibility + return TypedValue.NULL; + } + var typedValue = delegate.read(context, target, name); + return Optional.of(typedValue) + .filter(tv -> + Objects.nonNull(tv.getValue()) + && Objects.nonNull(tv.getTypeDescriptor()) + && ReactiveUtils.isReactiveType(tv.getTypeDescriptor().getType()) + ) + .map(tv -> new TypedValue(ReactiveUtils.blockReactiveValue(tv.getValue()))) + .orElse(typedValue); + } + + @Override + public boolean canWrite(EvaluationContext context, Object target, String name) + throws AccessException { + return delegate.canWrite(context, target, name); + } + + @Override + public void write(EvaluationContext context, Object target, String name, Object newValue) + throws AccessException { + delegate.write(context, target, name, newValue); + } + + @Override + public Class[] getSpecificTargetClasses() { + return delegate.getSpecificTargetClasses(); + } + + @Override + public PropertyAccessor createOptimalAccessor(EvaluationContext context, Object target, + String name) { + var optimalAccessor = delegate.createOptimalAccessor(context, target, name); + if (optimalAccessor instanceof OptimalPropertyAccessor optimalPropertyAccessor) { + if (ReactiveUtils.isReactiveType(optimalPropertyAccessor.getPropertyType())) { + return this; + } + return optimalPropertyAccessor; + } + return this; + } + + static void wrap(ThymeleafEvaluationContext evaluationContext) { + var wrappedPropertyAccessors = evaluationContext.getPropertyAccessors() + .stream() + .map(propertyAccessor -> { + if (propertyAccessor instanceof ReflectivePropertyAccessor reflectiveAccessor) { + return new ReactiveReflectivePropertyAccessor(reflectiveAccessor); + } + return propertyAccessor; + }) + // make the list mutable + .collect(Collectors.toCollection(ArrayList::new)); + evaluationContext.setPropertyAccessors(wrappedPropertyAccessors); + } + + @Override + public boolean equals(Object obj) { + return delegate.equals(obj); + } + + @Override + public int hashCode() { + return delegate.hashCode(); + } + + } + + /** + * A {@link MethodResolver} that wraps the original {@link MethodResolver} and blocks the + * reactive value. + * + * @param delegate the original {@link MethodResolver} + */ + private record ReactiveMethodResolver(MethodResolver delegate) implements MethodResolver { + + @Override + @Nullable + public MethodExecutor resolve(EvaluationContext context, Object targetObject, String name, + List argumentTypes) throws AccessException { + var executor = delegate.resolve(context, targetObject, name, argumentTypes); + return Optional.ofNullable(executor).map(ReactiveMethodExecutor::new).orElse(null); + } + + static void wrap(ThymeleafEvaluationContext evaluationContext) { + var wrappedMethodResolvers = evaluationContext.getMethodResolvers() + .stream() + .map(ReactiveMethodResolver::new) + // make the list mutable + .collect(Collectors.toCollection(ArrayList::new)); + evaluationContext.setMethodResolvers(wrappedMethodResolvers); + } + + } + + /** + * A {@link MethodExecutor} that wraps the original {@link MethodExecutor} and blocks the + * reactive value. + * + * @param delegate the original {@link MethodExecutor} + */ + private record ReactiveMethodExecutor(MethodExecutor delegate) implements MethodExecutor { + + @Override + public TypedValue execute(EvaluationContext context, Object target, Object... arguments) + throws AccessException { + var typedValue = delegate.execute(context, target, arguments); + return Optional.of(typedValue) + .filter(tv -> + Objects.nonNull(tv.getValue()) + && Objects.nonNull(tv.getTypeDescriptor()) + && ReactiveUtils.isReactiveType(tv.getTypeDescriptor().getType()) + ) + .map(tv -> new TypedValue(ReactiveUtils.blockReactiveValue(tv.getValue()))) + .orElse(typedValue); + } + + } +} diff --git a/application/src/main/java/run/halo/app/theme/dialect/HaloProcessorDialect.java b/application/src/main/java/run/halo/app/theme/dialect/HaloProcessorDialect.java index a88296531..a355f5ae8 100644 --- a/application/src/main/java/run/halo/app/theme/dialect/HaloProcessorDialect.java +++ b/application/src/main/java/run/halo/app/theme/dialect/HaloProcessorDialect.java @@ -38,7 +38,7 @@ public class HaloProcessorDialect extends AbstractProcessorDialect // add more processors processors.add(new GlobalHeadInjectionProcessor(dialectPrefix)); processors.add(new TemplateFooterElementTagProcessor(dialectPrefix)); - processors.add(new JsonNodePropertyAccessorBoundariesProcessor()); + processors.add(new EvaluationContextEnhancer()); processors.add(new CommentElementTagProcessor(dialectPrefix)); processors.add(new CommentEnabledVariableProcessor()); return processors; diff --git a/application/src/main/java/run/halo/app/theme/dialect/JsonNodePropertyAccessorBoundariesProcessor.java b/application/src/main/java/run/halo/app/theme/dialect/JsonNodePropertyAccessorBoundariesProcessor.java deleted file mode 100644 index 0ab86fffe..000000000 --- a/application/src/main/java/run/halo/app/theme/dialect/JsonNodePropertyAccessorBoundariesProcessor.java +++ /dev/null @@ -1,49 +0,0 @@ -package run.halo.app.theme.dialect; - -import org.springframework.integration.json.JsonPropertyAccessor; -import org.thymeleaf.context.ITemplateContext; -import org.thymeleaf.model.ITemplateEnd; -import org.thymeleaf.model.ITemplateStart; -import org.thymeleaf.processor.templateboundaries.AbstractTemplateBoundariesProcessor; -import org.thymeleaf.processor.templateboundaries.ITemplateBoundariesStructureHandler; -import org.thymeleaf.spring6.expression.ThymeleafEvaluationContext; -import org.thymeleaf.standard.StandardDialect; -import org.thymeleaf.templatemode.TemplateMode; -import run.halo.app.theme.ReactivePropertyAccessor; - -/** - * A template boundaries processor for add {@link JsonPropertyAccessor} to - * {@link ThymeleafEvaluationContext}. - * - * @author guqing - * @since 2.0.0 - */ -public class JsonNodePropertyAccessorBoundariesProcessor - extends AbstractTemplateBoundariesProcessor { - private static final int PRECEDENCE = StandardDialect.PROCESSOR_PRECEDENCE; - private static final JsonPropertyAccessor JSON_PROPERTY_ACCESSOR = new JsonPropertyAccessor(); - private static final ReactivePropertyAccessor REACTIVE_PROPERTY_ACCESSOR = - new ReactivePropertyAccessor(); - - public JsonNodePropertyAccessorBoundariesProcessor() { - super(TemplateMode.HTML, PRECEDENCE); - } - - @Override - public void doProcessTemplateStart(ITemplateContext context, ITemplateStart templateStart, - ITemplateBoundariesStructureHandler structureHandler) { - ThymeleafEvaluationContext evaluationContext = - (ThymeleafEvaluationContext) context.getVariable( - ThymeleafEvaluationContext.THYMELEAF_EVALUATION_CONTEXT_CONTEXT_VARIABLE_NAME); - if (evaluationContext != null) { - evaluationContext.addPropertyAccessor(JSON_PROPERTY_ACCESSOR); - evaluationContext.addPropertyAccessor(REACTIVE_PROPERTY_ACCESSOR); - } - } - - @Override - public void doProcessTemplateEnd(ITemplateContext context, ITemplateEnd templateEnd, - ITemplateBoundariesStructureHandler structureHandler) { - // nothing to do - } -} diff --git a/application/src/test/java/run/halo/app/theme/ReactiveFinderExpressionParserTests.java b/application/src/test/java/run/halo/app/theme/ReactiveFinderExpressionParserTests.java index 346aa9945..20010b0f3 100644 --- a/application/src/test/java/run/halo/app/theme/ReactiveFinderExpressionParserTests.java +++ b/application/src/test/java/run/halo/app/theme/ReactiveFinderExpressionParserTests.java @@ -38,7 +38,6 @@ import run.halo.app.theme.dialect.HaloProcessorDialect; * Tests expression parser for reactive return value. * * @author guqing - * @see ReactivePropertyAccessor * @see ReactiveSpelVariableExpressionEvaluator * @since 2.0.0 */ From 03368281cc73e91c26fe2105263d243bf2e99247 Mon Sep 17 00:00:00 2001 From: guqing <38999863+guqing@users.noreply.github.com> Date: Mon, 23 Sep 2024 17:59:03 +0800 Subject: [PATCH 13/13] chore: reorganize package structure in application project (#6691) * chore: reorganize package structure in application project --- .../app/content/comment/AbstractCommentService.java | 4 ++-- .../halo/app/content/comment/CommentServiceImpl.java | 4 ++-- .../run/halo/app/content/comment/ReplyServiceImpl.java | 4 ++-- .../run/halo/app/content/impl/PostServiceImpl.java | 2 +- .../halo/app/content/impl/SinglePageServiceImpl.java | 2 +- .../app/core/attachment/LocalThumbnailService.java | 2 +- .../attachment/endpoint/AttachmentEndpoint.java | 2 +- .../endpoint/LocalAttachmentUploadHandler.java | 3 ++- .../extension}/LocalThumbnail.java | 2 +- .../attachment => attachment/extension}/Thumbnail.java | 2 +- .../attachment/impl/LocalThumbnailServiceImpl.java | 2 +- .../app/core/attachment/impl/ThumbnailServiceImpl.java | 2 +- .../reconciler/LocalThumbnailsReconciler.java | 4 ++-- .../app/core/endpoint/WebSocketHandlerMapping.java | 2 +- .../console}/AuthProviderEndpoint.java | 3 ++- .../endpoint => endpoint/console}/CommentEndpoint.java | 3 ++- .../console}/CustomEndpointsBuilder.java | 3 ++- .../endpoint => endpoint/console}/PluginEndpoint.java | 7 ++++--- .../endpoint => endpoint/console}/PostEndpoint.java | 3 ++- .../endpoint => endpoint/console}/ReplyEndpoint.java | 3 ++- .../console}/SinglePageEndpoint.java | 3 ++- .../endpoint => endpoint/console}/StatsEndpoint.java | 3 ++- .../console}/SystemInitializationEndpoint.java | 3 ++- .../endpoint => endpoint/console}/TagEndpoint.java | 3 ++- .../endpoint => endpoint/console}/TrackerEndpoint.java | 3 ++- .../endpoint => endpoint/console}/UserEndpoint.java | 9 +++++---- .../endpoint/theme}/CategoryQueryEndpoint.java | 4 ++-- .../endpoint/theme}/CommentFinderEndpoint.java | 2 +- .../endpoint/theme}/MenuQueryEndpoint.java | 2 +- .../endpoint/theme}/PluginQueryEndpoint.java | 2 +- .../endpoint/theme}/PostPublicQuery.java | 2 +- .../endpoint/theme}/PostQueryEndpoint.java | 2 +- .../endpoint/theme}/PublicApiUtils.java | 2 +- .../endpoint/theme}/PublicUserEndpoint.java | 8 ++++---- .../endpoint/theme}/SinglePageQueryEndpoint.java | 2 +- .../endpoint/theme}/SiteStatsQueryEndpoint.java | 2 +- .../endpoint/theme}/TagQueryEndpoint.java | 2 +- .../endpoint/theme}/ThumbnailEndpoint.java | 2 +- .../endpoint/uc}/UcPostAttachmentEndpoint.java | 2 +- .../content => core/endpoint/uc}/UcPostEndpoint.java | 2 +- .../endpoint/uc}/UcSnapshotEndpoint.java | 2 +- .../reconciler/AnnotationSettingReconciler.java | 2 +- .../reconciler/AuthProviderReconciler.java | 2 +- .../{extension => }/reconciler/CategoryReconciler.java | 2 +- .../{extension => }/reconciler/CommentReconciler.java | 2 +- .../{extension => }/reconciler/MenuItemReconciler.java | 2 +- .../{extension => }/reconciler/PluginReconciler.java | 4 ++-- .../reconciler/PostCounterReconciler.java | 2 +- .../{extension => }/reconciler/PostReconciler.java | 2 +- .../{extension => }/reconciler/ReplyReconciler.java | 2 +- .../reconciler/ReverseProxyReconciler.java | 2 +- .../{extension => }/reconciler/RoleReconciler.java | 2 +- .../reconciler/SinglePageReconciler.java | 2 +- .../reconciler/SystemSettingReconciler.java | 2 +- .../core/{extension => }/reconciler/TagReconciler.java | 2 +- .../{extension => }/reconciler/ThemeReconciler.java | 4 ++-- .../{extension => }/reconciler/UserReconciler.java | 6 +++--- .../service/DefaultRoleService.java | 2 +- .../service/EmailPasswordRecoveryService.java | 2 +- .../service/EmailVerificationService.java | 2 +- .../core/{extension => user}/service/RoleService.java | 2 +- .../core/{extension => user}/service/UserService.java | 2 +- .../{extension => user}/service/UserServiceImpl.java | 2 +- .../service/impl/DefaultAttachmentService.java | 2 +- .../service/impl/EmailPasswordRecoveryServiceImpl.java | 6 +++--- .../service/impl/EmailVerificationServiceImpl.java | 6 +++--- .../run/halo/app/infra/DefaultThemeInitializer.java | 4 ++-- .../java/run/halo/app/infra/SchemeInitializer.java | 4 ++-- .../{ => infra}/actuator/DatabaseInfoContributor.java | 2 +- .../app/{ => infra}/actuator/GlobalInfoEndpoint.java | 2 +- .../halo/app/{ => infra}/actuator/RestartEndpoint.java | 2 +- .../app/{ => infra}/config/ExtensionConfiguration.java | 2 +- .../halo/app/{ => infra}/config/HaloConfiguration.java | 2 +- .../run/halo/app/{ => infra}/config/SwaggerConfig.java | 2 +- .../run/halo/app/{ => infra}/config/WebFluxConfig.java | 10 +++++----- .../{ => infra}/config/WebServerSecurityConfig.java | 6 +++--- .../run/halo/app/{ => infra}/console/ProxyFilter.java | 2 +- .../{ => infra}/console/WebSocketRequestPredicate.java | 4 ++-- .../console/WebSocketServerWebExchangeMatcher.java | 4 ++-- .../halo/app/{ => infra}/console/WebSocketUtils.java | 2 +- .../extension/theme => infra/utils}/SettingUtils.java | 4 +--- .../webfilter/AdditionalWebFilterChainProxy.java | 2 +- .../{ => infra}/webfilter/LocaleChangeWebFilter.java | 2 +- .../run/halo/app/plugin/AggregatedRouterFunction.java | 2 +- .../extension/service => plugin}/PluginService.java | 2 +- .../service/impl => plugin}/PluginServiceImpl.java | 9 +-------- .../halo/app/security/DefaultUserDetailService.java | 4 ++-- .../pat/impl/UserScopedPatHandlerImpl.java | 2 +- .../twofactor/TwoFactorAuthEndpoint.java | 2 +- .../security/authorization/DefaultRuleResolver.java | 2 +- .../authorization/RequestInfoAuthorizationManager.java | 2 +- .../app/security/authorization/RequestInfoFactory.java | 2 +- .../theme => theme/endpoint}/ThemeEndpoint.java | 4 +++- .../finders/impl/CommentPublicQueryServiceImpl.java | 2 +- .../app/theme/finders/impl/ContributorFinderImpl.java | 2 +- .../theme => theme/service}/ThemeService.java | 2 +- .../theme => theme/service}/ThemeServiceImpl.java | 9 +++++---- .../extension/theme => theme/service}/ThemeUtils.java | 8 +++++--- .../halo/app/config/ExtensionConfigurationTest.java | 2 +- .../java/run/halo/app/config/WebFluxConfigTest.java | 2 +- .../console/WebSocketServerWebExchangeMatcherTest.java | 1 + .../java/run/halo/app/console/WebSocketUtilsTest.java | 1 + .../run/halo/app/content/PostIntegrationTests.java | 2 +- .../app/content/comment/CommentServiceImplTest.java | 4 ++-- .../attachment/impl/LocalThumbnailServiceImplTest.java | 2 +- .../core/attachment/impl/ThumbnailServiceImplTest.java | 2 +- .../console}/EmailVerificationCodeTest.java | 6 +++--- .../console}/PluginEndpointTest.java | 4 ++-- .../console}/PostEndpointTest.java | 2 +- .../console}/SinglePageEndpointTest.java | 2 +- .../console}/SystemInitializationEndpointTest.java | 4 ++-- .../endpoint => endpoint/console}/TagEndpointTest.java | 2 +- .../console}/UserEndpointIntegrationTest.java | 4 ++-- .../console}/UserEndpointTest.java | 6 +++--- .../endpoint/theme}/CategoryQueryEndpointTest.java | 2 +- .../endpoint/theme}/CommentFinderEndpointTest.java | 2 +- .../endpoint/theme}/MenuQueryEndpointTest.java | 2 +- .../endpoint/theme}/PluginQueryEndpointTest.java | 2 +- .../endpoint/theme}/PostQueryEndpointTest.java | 2 +- .../endpoint/theme}/PublicApiUtilsTest.java | 2 +- .../endpoint/theme}/PublicUserEndpointTest.java | 4 ++-- .../endpoint/theme}/SinglePageQueryEndpointTest.java | 2 +- .../endpoint/theme}/ThumbnailEndpointTest.java | 2 +- .../attachment/endpoint/AttachmentEndpointTest.java | 3 ++- .../reconciler/CommentReconcilerTest.java | 3 ++- .../reconciler/MenuItemReconcilerTest.java | 3 ++- .../reconciler/PluginReconcilerTest.java | 3 ++- .../{extension => }/reconciler/PostReconcilerTest.java | 3 ++- .../reconciler/ReverseProxyReconcilerTest.java | 3 ++- .../reconciler/SinglePageReconcilerTest.java | 3 ++- .../reconciler/SystemSettingReconcilerTest.java | 3 ++- .../{extension => }/reconciler/TagReconcilerTest.java | 3 ++- .../reconciler/ThemeReconcilerTest.java | 3 ++- .../{extension => }/reconciler/UserReconcilerTest.java | 5 +++-- .../service/DefaultRoleServiceTest.java | 3 ++- .../service/UserServiceImplTest.java | 4 +++- .../impl/EmailPasswordRecoveryServiceImplTest.java | 3 ++- .../service/impl/EmailVerificationServiceImplTest.java | 5 +++-- .../theme => infra/utils}/SettingUtilsTest.java | 3 +-- .../service/impl => plugin}/PluginServiceImplTest.java | 6 +----- .../app/security/DefaultUserDetailServiceTest.java | 4 ++-- .../app/security/authorization/AuthorizationTest.java | 2 +- .../authorization/DefaultRuleResolverTest.java | 2 +- .../theme => theme/endpoint}/ThemeEndpointTest.java | 3 ++- .../impl/CommentPublicQueryServiceImplTest.java | 2 +- .../theme => theme/service}/ThemeServiceImplTest.java | 2 +- .../halo/app/webfilter/LocaleChangeWebFilterTest.java | 1 + 147 files changed, 231 insertions(+), 207 deletions(-) rename application/src/main/java/run/halo/app/core/{extension => }/attachment/endpoint/AttachmentEndpoint.java (99%) rename application/src/main/java/run/halo/app/core/{extension => }/attachment/endpoint/LocalAttachmentUploadHandler.java (99%) rename application/src/main/java/run/halo/app/core/{extension/attachment => attachment/extension}/LocalThumbnail.java (98%) rename application/src/main/java/run/halo/app/core/{extension/attachment => attachment/extension}/Thumbnail.java (96%) rename application/src/main/java/run/halo/app/core/{extension/endpoint => endpoint/console}/AuthProviderEndpoint.java (97%) rename application/src/main/java/run/halo/app/core/{extension/endpoint => endpoint/console}/CommentEndpoint.java (98%) rename application/src/main/java/run/halo/app/core/{extension/endpoint => endpoint/console}/CustomEndpointsBuilder.java (94%) rename application/src/main/java/run/halo/app/core/{extension/endpoint => endpoint/console}/PluginEndpoint.java (99%) rename application/src/main/java/run/halo/app/core/{extension/endpoint => endpoint/console}/PostEndpoint.java (99%) rename application/src/main/java/run/halo/app/core/{extension/endpoint => endpoint/console}/ReplyEndpoint.java (94%) rename application/src/main/java/run/halo/app/core/{extension/endpoint => endpoint/console}/SinglePageEndpoint.java (99%) rename application/src/main/java/run/halo/app/core/{extension/endpoint => endpoint/console}/StatsEndpoint.java (97%) rename application/src/main/java/run/halo/app/core/{extension/endpoint => endpoint/console}/SystemInitializationEndpoint.java (98%) rename application/src/main/java/run/halo/app/core/{extension/endpoint => endpoint/console}/TagEndpoint.java (97%) rename application/src/main/java/run/halo/app/core/{extension/endpoint => endpoint/console}/TrackerEndpoint.java (98%) rename application/src/main/java/run/halo/app/core/{extension/endpoint => endpoint/console}/UserEndpoint.java (99%) rename application/src/main/java/run/halo/app/{theme/endpoint => core/endpoint/theme}/CategoryQueryEndpoint.java (97%) rename application/src/main/java/run/halo/app/{theme/endpoint => core/endpoint/theme}/CommentFinderEndpoint.java (99%) rename application/src/main/java/run/halo/app/{theme/endpoint => core/endpoint/theme}/MenuQueryEndpoint.java (98%) rename application/src/main/java/run/halo/app/{theme/endpoint => core/endpoint/theme}/PluginQueryEndpoint.java (98%) rename application/src/main/java/run/halo/app/{theme/endpoint => core/endpoint/theme}/PostPublicQuery.java (92%) rename application/src/main/java/run/halo/app/{theme/endpoint => core/endpoint/theme}/PostQueryEndpoint.java (99%) rename application/src/main/java/run/halo/app/{theme/endpoint => core/endpoint/theme}/PublicApiUtils.java (98%) rename application/src/main/java/run/halo/app/{theme/endpoint => core/endpoint/theme}/PublicUserEndpoint.java (98%) rename application/src/main/java/run/halo/app/{theme/endpoint => core/endpoint/theme}/SinglePageQueryEndpoint.java (98%) rename application/src/main/java/run/halo/app/{theme/endpoint => core/endpoint/theme}/SiteStatsQueryEndpoint.java (97%) rename application/src/main/java/run/halo/app/{theme/endpoint => core/endpoint/theme}/TagQueryEndpoint.java (99%) rename application/src/main/java/run/halo/app/{theme/endpoint => core/endpoint/theme}/ThumbnailEndpoint.java (99%) rename application/src/main/java/run/halo/app/{endpoint/uc/content => core/endpoint/uc}/UcPostAttachmentEndpoint.java (99%) rename application/src/main/java/run/halo/app/{endpoint/uc/content => core/endpoint/uc}/UcPostEndpoint.java (99%) rename application/src/main/java/run/halo/app/{endpoint/uc/content => core/endpoint/uc}/UcSnapshotEndpoint.java (99%) rename application/src/main/java/run/halo/app/core/{extension => }/reconciler/AnnotationSettingReconciler.java (97%) rename application/src/main/java/run/halo/app/core/{extension => }/reconciler/AuthProviderReconciler.java (97%) rename application/src/main/java/run/halo/app/core/{extension => }/reconciler/CategoryReconciler.java (98%) rename application/src/main/java/run/halo/app/core/{extension => }/reconciler/CommentReconciler.java (99%) rename application/src/main/java/run/halo/app/core/{extension => }/reconciler/MenuItemReconciler.java (99%) rename application/src/main/java/run/halo/app/core/{extension => }/reconciler/PluginReconciler.java (99%) rename application/src/main/java/run/halo/app/core/{extension => }/reconciler/PostCounterReconciler.java (97%) rename application/src/main/java/run/halo/app/core/{extension => }/reconciler/PostReconciler.java (99%) rename application/src/main/java/run/halo/app/core/{extension => }/reconciler/ReplyReconciler.java (98%) rename application/src/main/java/run/halo/app/core/{extension => }/reconciler/ReverseProxyReconciler.java (98%) rename application/src/main/java/run/halo/app/core/{extension => }/reconciler/RoleReconciler.java (97%) rename application/src/main/java/run/halo/app/core/{extension => }/reconciler/SinglePageReconciler.java (99%) rename application/src/main/java/run/halo/app/core/{extension => }/reconciler/SystemSettingReconciler.java (99%) rename application/src/main/java/run/halo/app/core/{extension => }/reconciler/TagReconciler.java (98%) rename application/src/main/java/run/halo/app/core/{extension => }/reconciler/ThemeReconciler.java (98%) rename application/src/main/java/run/halo/app/core/{extension => }/reconciler/UserReconciler.java (97%) rename application/src/main/java/run/halo/app/core/{extension => user}/service/DefaultRoleService.java (99%) rename application/src/main/java/run/halo/app/core/{extension => user}/service/EmailPasswordRecoveryService.java (96%) rename application/src/main/java/run/halo/app/core/{extension => user}/service/EmailVerificationService.java (96%) rename application/src/main/java/run/halo/app/core/{extension => user}/service/RoleService.java (96%) rename application/src/main/java/run/halo/app/core/{extension => user}/service/UserService.java (94%) rename application/src/main/java/run/halo/app/core/{extension => user}/service/UserServiceImpl.java (99%) rename application/src/main/java/run/halo/app/core/{extension => user}/service/impl/DefaultAttachmentService.java (99%) rename application/src/main/java/run/halo/app/core/{extension => user}/service/impl/EmailPasswordRecoveryServiceImpl.java (97%) rename application/src/main/java/run/halo/app/core/{extension => user}/service/impl/EmailVerificationServiceImpl.java (98%) rename application/src/main/java/run/halo/app/{ => infra}/actuator/DatabaseInfoContributor.java (97%) rename application/src/main/java/run/halo/app/{ => infra}/actuator/GlobalInfoEndpoint.java (99%) rename application/src/main/java/run/halo/app/{ => infra}/actuator/RestartEndpoint.java (98%) rename application/src/main/java/run/halo/app/{ => infra}/config/ExtensionConfiguration.java (97%) rename application/src/main/java/run/halo/app/{ => infra}/config/HaloConfiguration.java (97%) rename application/src/main/java/run/halo/app/{ => infra}/config/SwaggerConfig.java (99%) rename application/src/main/java/run/halo/app/{ => infra}/config/WebFluxConfig.java (97%) rename application/src/main/java/run/halo/app/{ => infra}/config/WebServerSecurityConfig.java (97%) rename application/src/main/java/run/halo/app/{ => infra}/console/ProxyFilter.java (98%) rename application/src/main/java/run/halo/app/{ => infra}/console/WebSocketRequestPredicate.java (78%) rename application/src/main/java/run/halo/app/{ => infra}/console/WebSocketServerWebExchangeMatcher.java (85%) rename application/src/main/java/run/halo/app/{ => infra}/console/WebSocketUtils.java (94%) rename application/src/main/java/run/halo/app/{core/extension/theme => infra/utils}/SettingUtils.java (97%) rename application/src/main/java/run/halo/app/{ => infra}/webfilter/AdditionalWebFilterChainProxy.java (97%) rename application/src/main/java/run/halo/app/{ => infra}/webfilter/LocaleChangeWebFilter.java (98%) rename application/src/main/java/run/halo/app/{core/extension/service => plugin}/PluginService.java (98%) rename application/src/main/java/run/halo/app/{core/extension/service/impl => plugin}/PluginServiceImpl.java (98%) rename application/src/main/java/run/halo/app/{core/extension/theme => theme/endpoint}/ThemeEndpoint.java (99%) rename application/src/main/java/run/halo/app/{core/extension/theme => theme/service}/ThemeService.java (92%) rename application/src/main/java/run/halo/app/{core/extension/theme => theme/service}/ThemeServiceImpl.java (98%) rename application/src/main/java/run/halo/app/{core/extension/theme => theme/service}/ThemeUtils.java (97%) rename application/src/test/java/run/halo/app/core/{extension/endpoint => endpoint/console}/EmailVerificationCodeTest.java (96%) rename application/src/test/java/run/halo/app/core/{extension/endpoint => endpoint/console}/PluginEndpointTest.java (99%) rename application/src/test/java/run/halo/app/core/{extension/endpoint => endpoint/console}/PostEndpointTest.java (99%) rename application/src/test/java/run/halo/app/core/{extension/endpoint => endpoint/console}/SinglePageEndpointTest.java (98%) rename application/src/test/java/run/halo/app/core/{extension/endpoint => endpoint/console}/SystemInitializationEndpointTest.java (95%) rename application/src/test/java/run/halo/app/core/{extension/endpoint => endpoint/console}/TagEndpointTest.java (98%) rename application/src/test/java/run/halo/app/core/{extension/endpoint => endpoint/console}/UserEndpointIntegrationTest.java (97%) rename application/src/test/java/run/halo/app/core/{extension/endpoint => endpoint/console}/UserEndpointTest.java (99%) rename application/src/test/java/run/halo/app/{theme/endpoint => core/endpoint/theme}/CategoryQueryEndpointTest.java (98%) rename application/src/test/java/run/halo/app/{theme/endpoint => core/endpoint/theme}/CommentFinderEndpointTest.java (99%) rename application/src/test/java/run/halo/app/{theme/endpoint => core/endpoint/theme}/MenuQueryEndpointTest.java (98%) rename application/src/test/java/run/halo/app/{theme/endpoint => core/endpoint/theme}/PluginQueryEndpointTest.java (97%) rename application/src/test/java/run/halo/app/{theme/endpoint => core/endpoint/theme}/PostQueryEndpointTest.java (98%) rename application/src/test/java/run/halo/app/{theme/endpoint => core/endpoint/theme}/PublicApiUtilsTest.java (97%) rename application/src/test/java/run/halo/app/{theme/endpoint => core/endpoint/theme}/PublicUserEndpointTest.java (97%) rename application/src/test/java/run/halo/app/{theme/endpoint => core/endpoint/theme}/SinglePageQueryEndpointTest.java (98%) rename application/src/test/java/run/halo/app/{theme/endpoint => core/endpoint/theme}/ThumbnailEndpointTest.java (97%) rename application/src/test/java/run/halo/app/core/{extension => }/reconciler/CommentReconcilerTest.java (97%) rename application/src/test/java/run/halo/app/core/{extension => }/reconciler/MenuItemReconcilerTest.java (98%) rename application/src/test/java/run/halo/app/core/{extension => }/reconciler/PluginReconcilerTest.java (99%) rename application/src/test/java/run/halo/app/core/{extension => }/reconciler/PostReconcilerTest.java (99%) rename application/src/test/java/run/halo/app/core/{extension => }/reconciler/ReverseProxyReconcilerTest.java (95%) rename application/src/test/java/run/halo/app/core/{extension => }/reconciler/SinglePageReconcilerTest.java (99%) rename application/src/test/java/run/halo/app/core/{extension => }/reconciler/SystemSettingReconcilerTest.java (98%) rename application/src/test/java/run/halo/app/core/{extension => }/reconciler/TagReconcilerTest.java (97%) rename application/src/test/java/run/halo/app/core/{extension => }/reconciler/ThemeReconcilerTest.java (99%) rename application/src/test/java/run/halo/app/core/{extension => }/reconciler/UserReconcilerTest.java (96%) rename application/src/test/java/run/halo/app/core/{extension => user}/service/DefaultRoleServiceTest.java (99%) rename application/src/test/java/run/halo/app/core/{extension => user}/service/UserServiceImplTest.java (99%) rename application/src/test/java/run/halo/app/core/{extension => user}/service/impl/EmailPasswordRecoveryServiceImplTest.java (96%) rename application/src/test/java/run/halo/app/core/{extension => user}/service/impl/EmailVerificationServiceImplTest.java (94%) rename application/src/test/java/run/halo/app/{core/extension/theme => infra/utils}/SettingUtilsTest.java (98%) rename application/src/test/java/run/halo/app/{core/extension/service/impl => plugin}/PluginServiceImplTest.java (98%) rename application/src/test/java/run/halo/app/{core/extension/theme => theme/endpoint}/ThemeEndpointTest.java (99%) rename application/src/test/java/run/halo/app/{core/extension/theme => theme/service}/ThemeServiceImplTest.java (99%) diff --git a/application/src/main/java/run/halo/app/content/comment/AbstractCommentService.java b/application/src/main/java/run/halo/app/content/comment/AbstractCommentService.java index 175d1817f..3ebc08df8 100644 --- a/application/src/main/java/run/halo/app/content/comment/AbstractCommentService.java +++ b/application/src/main/java/run/halo/app/content/comment/AbstractCommentService.java @@ -8,8 +8,8 @@ import reactor.core.publisher.Mono; import run.halo.app.core.extension.User; import run.halo.app.core.extension.content.Comment; import run.halo.app.core.extension.content.Reply; -import run.halo.app.core.extension.service.RoleService; -import run.halo.app.core.extension.service.UserService; +import run.halo.app.core.user.service.RoleService; +import run.halo.app.core.user.service.UserService; import run.halo.app.extension.ReactiveExtensionClient; import run.halo.app.metrics.CounterService; import run.halo.app.metrics.MeterUtils; diff --git a/application/src/main/java/run/halo/app/content/comment/CommentServiceImpl.java b/application/src/main/java/run/halo/app/content/comment/CommentServiceImpl.java index a7510bdab..76e985aae 100644 --- a/application/src/main/java/run/halo/app/content/comment/CommentServiceImpl.java +++ b/application/src/main/java/run/halo/app/content/comment/CommentServiceImpl.java @@ -17,8 +17,8 @@ import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.util.retry.Retry; import run.halo.app.core.extension.content.Comment; -import run.halo.app.core.extension.service.RoleService; -import run.halo.app.core.extension.service.UserService; +import run.halo.app.core.user.service.RoleService; +import run.halo.app.core.user.service.UserService; import run.halo.app.extension.Extension; import run.halo.app.extension.ListOptions; import run.halo.app.extension.ListResult; diff --git a/application/src/main/java/run/halo/app/content/comment/ReplyServiceImpl.java b/application/src/main/java/run/halo/app/content/comment/ReplyServiceImpl.java index 26b99e63e..54687b929 100644 --- a/application/src/main/java/run/halo/app/content/comment/ReplyServiceImpl.java +++ b/application/src/main/java/run/halo/app/content/comment/ReplyServiceImpl.java @@ -22,8 +22,8 @@ import reactor.core.publisher.Mono; import reactor.util.retry.Retry; import run.halo.app.core.extension.content.Comment; import run.halo.app.core.extension.content.Reply; -import run.halo.app.core.extension.service.RoleService; -import run.halo.app.core.extension.service.UserService; +import run.halo.app.core.user.service.RoleService; +import run.halo.app.core.user.service.UserService; import run.halo.app.extension.ListOptions; import run.halo.app.extension.ListResult; import run.halo.app.extension.PageRequest; diff --git a/application/src/main/java/run/halo/app/content/impl/PostServiceImpl.java b/application/src/main/java/run/halo/app/content/impl/PostServiceImpl.java index bf535a9fa..b8a12c0f0 100644 --- a/application/src/main/java/run/halo/app/content/impl/PostServiceImpl.java +++ b/application/src/main/java/run/halo/app/content/impl/PostServiceImpl.java @@ -34,7 +34,7 @@ import run.halo.app.core.extension.content.Category; import run.halo.app.core.extension.content.Post; import run.halo.app.core.extension.content.Snapshot; import run.halo.app.core.extension.content.Tag; -import run.halo.app.core.extension.service.UserService; +import run.halo.app.core.user.service.UserService; import run.halo.app.extension.ListOptions; import run.halo.app.extension.ListResult; import run.halo.app.extension.MetadataOperator; diff --git a/application/src/main/java/run/halo/app/content/impl/SinglePageServiceImpl.java b/application/src/main/java/run/halo/app/content/impl/SinglePageServiceImpl.java index ab055b67d..868ca69df 100644 --- a/application/src/main/java/run/halo/app/content/impl/SinglePageServiceImpl.java +++ b/application/src/main/java/run/halo/app/content/impl/SinglePageServiceImpl.java @@ -28,7 +28,7 @@ import run.halo.app.content.Stats; import run.halo.app.core.extension.content.Post; import run.halo.app.core.extension.content.SinglePage; import run.halo.app.core.extension.content.Snapshot; -import run.halo.app.core.extension.service.UserService; +import run.halo.app.core.user.service.UserService; import run.halo.app.extension.ListResult; import run.halo.app.extension.ReactiveExtensionClient; import run.halo.app.extension.Ref; diff --git a/application/src/main/java/run/halo/app/core/attachment/LocalThumbnailService.java b/application/src/main/java/run/halo/app/core/attachment/LocalThumbnailService.java index 050650ddb..a372446e8 100644 --- a/application/src/main/java/run/halo/app/core/attachment/LocalThumbnailService.java +++ b/application/src/main/java/run/halo/app/core/attachment/LocalThumbnailService.java @@ -6,7 +6,7 @@ import java.nio.file.Path; import org.springframework.core.io.Resource; import org.springframework.lang.NonNull; import reactor.core.publisher.Mono; -import run.halo.app.core.extension.attachment.LocalThumbnail; +import run.halo.app.core.attachment.extension.LocalThumbnail; import run.halo.app.infra.ExternalLinkProcessor; import run.halo.app.infra.exception.NotFoundException; diff --git a/application/src/main/java/run/halo/app/core/extension/attachment/endpoint/AttachmentEndpoint.java b/application/src/main/java/run/halo/app/core/attachment/endpoint/AttachmentEndpoint.java similarity index 99% rename from application/src/main/java/run/halo/app/core/extension/attachment/endpoint/AttachmentEndpoint.java rename to application/src/main/java/run/halo/app/core/attachment/endpoint/AttachmentEndpoint.java index 3e9c5b35d..a79e0f326 100644 --- a/application/src/main/java/run/halo/app/core/extension/attachment/endpoint/AttachmentEndpoint.java +++ b/application/src/main/java/run/halo/app/core/attachment/endpoint/AttachmentEndpoint.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.attachment.endpoint; +package run.halo.app.core.attachment.endpoint; import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; import static org.springdoc.core.fn.builders.apiresponse.Builder.responseBuilder; diff --git a/application/src/main/java/run/halo/app/core/extension/attachment/endpoint/LocalAttachmentUploadHandler.java b/application/src/main/java/run/halo/app/core/attachment/endpoint/LocalAttachmentUploadHandler.java similarity index 99% rename from application/src/main/java/run/halo/app/core/extension/attachment/endpoint/LocalAttachmentUploadHandler.java rename to application/src/main/java/run/halo/app/core/attachment/endpoint/LocalAttachmentUploadHandler.java index b0db21fc8..f13408cea 100644 --- a/application/src/main/java/run/halo/app/core/extension/attachment/endpoint/LocalAttachmentUploadHandler.java +++ b/application/src/main/java/run/halo/app/core/attachment/endpoint/LocalAttachmentUploadHandler.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.attachment.endpoint; +package run.halo.app.core.attachment.endpoint; import static java.nio.file.StandardOpenOption.CREATE_NEW; import static run.halo.app.infra.utils.FileNameUtils.randomFileName; @@ -41,6 +41,7 @@ import run.halo.app.core.extension.attachment.Attachment; import run.halo.app.core.extension.attachment.Attachment.AttachmentSpec; import run.halo.app.core.extension.attachment.Constant; import run.halo.app.core.extension.attachment.Policy; +import run.halo.app.core.extension.attachment.endpoint.AttachmentHandler; import run.halo.app.extension.ConfigMap; import run.halo.app.extension.Metadata; import run.halo.app.infra.ExternalUrlSupplier; diff --git a/application/src/main/java/run/halo/app/core/extension/attachment/LocalThumbnail.java b/application/src/main/java/run/halo/app/core/attachment/extension/LocalThumbnail.java similarity index 98% rename from application/src/main/java/run/halo/app/core/extension/attachment/LocalThumbnail.java rename to application/src/main/java/run/halo/app/core/attachment/extension/LocalThumbnail.java index a4378853a..97ee3974b 100644 --- a/application/src/main/java/run/halo/app/core/extension/attachment/LocalThumbnail.java +++ b/application/src/main/java/run/halo/app/core/attachment/extension/LocalThumbnail.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.attachment; +package run.halo.app.core.attachment.extension; import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.NOT_REQUIRED; import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; diff --git a/application/src/main/java/run/halo/app/core/extension/attachment/Thumbnail.java b/application/src/main/java/run/halo/app/core/attachment/extension/Thumbnail.java similarity index 96% rename from application/src/main/java/run/halo/app/core/extension/attachment/Thumbnail.java rename to application/src/main/java/run/halo/app/core/attachment/extension/Thumbnail.java index 759a362f5..0228cc99d 100644 --- a/application/src/main/java/run/halo/app/core/extension/attachment/Thumbnail.java +++ b/application/src/main/java/run/halo/app/core/attachment/extension/Thumbnail.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.attachment; +package run.halo.app.core.attachment.extension; import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; diff --git a/application/src/main/java/run/halo/app/core/attachment/impl/LocalThumbnailServiceImpl.java b/application/src/main/java/run/halo/app/core/attachment/impl/LocalThumbnailServiceImpl.java index 747606253..5b25d4b01 100644 --- a/application/src/main/java/run/halo/app/core/attachment/impl/LocalThumbnailServiceImpl.java +++ b/application/src/main/java/run/halo/app/core/attachment/impl/LocalThumbnailServiceImpl.java @@ -38,7 +38,7 @@ import run.halo.app.core.attachment.LocalThumbnailService; import run.halo.app.core.attachment.ThumbnailGenerator; import run.halo.app.core.attachment.ThumbnailSigner; import run.halo.app.core.attachment.ThumbnailSize; -import run.halo.app.core.extension.attachment.LocalThumbnail; +import run.halo.app.core.attachment.extension.LocalThumbnail; import run.halo.app.extension.ListOptions; import run.halo.app.extension.ListResult; import run.halo.app.extension.Metadata; diff --git a/application/src/main/java/run/halo/app/core/attachment/impl/ThumbnailServiceImpl.java b/application/src/main/java/run/halo/app/core/attachment/impl/ThumbnailServiceImpl.java index 11cc3cadf..a499ebc00 100644 --- a/application/src/main/java/run/halo/app/core/attachment/impl/ThumbnailServiceImpl.java +++ b/application/src/main/java/run/halo/app/core/attachment/impl/ThumbnailServiceImpl.java @@ -20,7 +20,7 @@ import run.halo.app.core.attachment.ThumbnailProvider.ThumbnailContext; import run.halo.app.core.attachment.ThumbnailService; import run.halo.app.core.attachment.ThumbnailSigner; import run.halo.app.core.attachment.ThumbnailSize; -import run.halo.app.core.extension.attachment.Thumbnail; +import run.halo.app.core.attachment.extension.Thumbnail; import run.halo.app.extension.ListOptions; import run.halo.app.extension.ListResult; import run.halo.app.extension.Metadata; diff --git a/application/src/main/java/run/halo/app/core/attachment/reconciler/LocalThumbnailsReconciler.java b/application/src/main/java/run/halo/app/core/attachment/reconciler/LocalThumbnailsReconciler.java index ce2d90f82..900f57ff2 100644 --- a/application/src/main/java/run/halo/app/core/attachment/reconciler/LocalThumbnailsReconciler.java +++ b/application/src/main/java/run/halo/app/core/attachment/reconciler/LocalThumbnailsReconciler.java @@ -1,7 +1,7 @@ package run.halo.app.core.attachment.reconciler; import static org.springframework.data.domain.Sort.Order.desc; -import static run.halo.app.core.extension.attachment.LocalThumbnail.REQUEST_TO_GENERATE_ANNO; +import static run.halo.app.core.attachment.extension.LocalThumbnail.REQUEST_TO_GENERATE_ANNO; import static run.halo.app.extension.MetadataUtil.nullSafeAnnotations; import static run.halo.app.extension.index.query.QueryFactory.and; import static run.halo.app.extension.index.query.QueryFactory.equal; @@ -23,9 +23,9 @@ import run.halo.app.core.attachment.AttachmentRootGetter; import run.halo.app.core.attachment.AttachmentUtils; import run.halo.app.core.attachment.LocalThumbnailService; import run.halo.app.core.attachment.ThumbnailGenerator; +import run.halo.app.core.attachment.extension.LocalThumbnail; import run.halo.app.core.extension.attachment.Attachment; import run.halo.app.core.extension.attachment.Constant; -import run.halo.app.core.extension.attachment.LocalThumbnail; import run.halo.app.extension.ExtensionClient; import run.halo.app.extension.ExtensionUtil; import run.halo.app.extension.ListOptions; diff --git a/application/src/main/java/run/halo/app/core/endpoint/WebSocketHandlerMapping.java b/application/src/main/java/run/halo/app/core/endpoint/WebSocketHandlerMapping.java index 0105c03b3..c76fa0de2 100644 --- a/application/src/main/java/run/halo/app/core/endpoint/WebSocketHandlerMapping.java +++ b/application/src/main/java/run/halo/app/core/endpoint/WebSocketHandlerMapping.java @@ -19,7 +19,7 @@ import org.springframework.web.reactive.socket.WebSocketHandler; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.util.pattern.PathPattern; import reactor.core.publisher.Mono; -import run.halo.app.console.WebSocketUtils; +import run.halo.app.infra.console.WebSocketUtils; public class WebSocketHandlerMapping extends AbstractHandlerMapping implements WebSocketEndpointManager, InitializingBean { diff --git a/application/src/main/java/run/halo/app/core/extension/endpoint/AuthProviderEndpoint.java b/application/src/main/java/run/halo/app/core/endpoint/console/AuthProviderEndpoint.java similarity index 97% rename from application/src/main/java/run/halo/app/core/extension/endpoint/AuthProviderEndpoint.java rename to application/src/main/java/run/halo/app/core/endpoint/console/AuthProviderEndpoint.java index a58b922fe..e1ecbbc1b 100644 --- a/application/src/main/java/run/halo/app/core/extension/endpoint/AuthProviderEndpoint.java +++ b/application/src/main/java/run/halo/app/core/endpoint/console/AuthProviderEndpoint.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.endpoint; +package run.halo.app.core.endpoint.console; import static org.springdoc.core.fn.builders.apiresponse.Builder.responseBuilder; import static org.springdoc.core.fn.builders.parameter.Builder.parameterBuilder; @@ -12,6 +12,7 @@ import org.springframework.web.reactive.function.server.ServerRequest; import org.springframework.web.reactive.function.server.ServerResponse; import reactor.core.publisher.Mono; import run.halo.app.core.extension.AuthProvider; +import run.halo.app.core.extension.endpoint.CustomEndpoint; import run.halo.app.security.AuthProviderService; import run.halo.app.security.ListedAuthProvider; diff --git a/application/src/main/java/run/halo/app/core/extension/endpoint/CommentEndpoint.java b/application/src/main/java/run/halo/app/core/endpoint/console/CommentEndpoint.java similarity index 98% rename from application/src/main/java/run/halo/app/core/extension/endpoint/CommentEndpoint.java rename to application/src/main/java/run/halo/app/core/endpoint/console/CommentEndpoint.java index 18c904c53..e1efd293b 100644 --- a/application/src/main/java/run/halo/app/core/extension/endpoint/CommentEndpoint.java +++ b/application/src/main/java/run/halo/app/core/endpoint/console/CommentEndpoint.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.endpoint; +package run.halo.app.core.endpoint.console; import static org.springdoc.core.fn.builders.apiresponse.Builder.responseBuilder; import static org.springdoc.core.fn.builders.content.Builder.contentBuilder; @@ -23,6 +23,7 @@ import run.halo.app.content.comment.ReplyRequest; import run.halo.app.content.comment.ReplyService; import run.halo.app.core.extension.content.Comment; import run.halo.app.core.extension.content.Reply; +import run.halo.app.core.extension.endpoint.CustomEndpoint; import run.halo.app.extension.ListResult; import run.halo.app.infra.utils.HaloUtils; import run.halo.app.infra.utils.IpAddressUtils; diff --git a/application/src/main/java/run/halo/app/core/extension/endpoint/CustomEndpointsBuilder.java b/application/src/main/java/run/halo/app/core/endpoint/console/CustomEndpointsBuilder.java similarity index 94% rename from application/src/main/java/run/halo/app/core/extension/endpoint/CustomEndpointsBuilder.java rename to application/src/main/java/run/halo/app/core/endpoint/console/CustomEndpointsBuilder.java index 6b8d7cf06..b328709a6 100644 --- a/application/src/main/java/run/halo/app/core/extension/endpoint/CustomEndpointsBuilder.java +++ b/application/src/main/java/run/halo/app/core/endpoint/console/CustomEndpointsBuilder.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.endpoint; +package run.halo.app.core.endpoint.console; import java.util.HashMap; import java.util.LinkedList; @@ -9,6 +9,7 @@ import org.springframework.web.reactive.function.server.RequestPredicates; import org.springframework.web.reactive.function.server.RouterFunction; import org.springframework.web.reactive.function.server.ServerResponse; import reactor.core.publisher.Mono; +import run.halo.app.core.extension.endpoint.CustomEndpoint; import run.halo.app.extension.GroupVersion; public class CustomEndpointsBuilder { diff --git a/application/src/main/java/run/halo/app/core/extension/endpoint/PluginEndpoint.java b/application/src/main/java/run/halo/app/core/endpoint/console/PluginEndpoint.java similarity index 99% rename from application/src/main/java/run/halo/app/core/extension/endpoint/PluginEndpoint.java rename to application/src/main/java/run/halo/app/core/endpoint/console/PluginEndpoint.java index a05a216bd..2f3dea989 100644 --- a/application/src/main/java/run/halo/app/core/extension/endpoint/PluginEndpoint.java +++ b/application/src/main/java/run/halo/app/core/endpoint/console/PluginEndpoint.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.endpoint; +package run.halo.app.core.endpoint.console; import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.NOT_REQUIRED; import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; @@ -60,15 +60,16 @@ import reactor.core.scheduler.Schedulers; import reactor.util.retry.Retry; import run.halo.app.core.extension.Plugin; import run.halo.app.core.extension.Setting; -import run.halo.app.core.extension.service.PluginService; -import run.halo.app.core.extension.theme.SettingUtils; +import run.halo.app.core.extension.endpoint.CustomEndpoint; import run.halo.app.extension.ConfigMap; import run.halo.app.extension.ListOptions; import run.halo.app.extension.ReactiveExtensionClient; import run.halo.app.extension.router.IListRequest; import run.halo.app.extension.router.SortableRequest; import run.halo.app.infra.ReactiveUrlDataBufferFetcher; +import run.halo.app.infra.utils.SettingUtils; import run.halo.app.plugin.PluginNotFoundException; +import run.halo.app.plugin.PluginService; @Slf4j @Component diff --git a/application/src/main/java/run/halo/app/core/extension/endpoint/PostEndpoint.java b/application/src/main/java/run/halo/app/core/endpoint/console/PostEndpoint.java similarity index 99% rename from application/src/main/java/run/halo/app/core/extension/endpoint/PostEndpoint.java rename to application/src/main/java/run/halo/app/core/endpoint/console/PostEndpoint.java index 07049041a..689a0f201 100644 --- a/application/src/main/java/run/halo/app/core/extension/endpoint/PostEndpoint.java +++ b/application/src/main/java/run/halo/app/core/endpoint/console/PostEndpoint.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.endpoint; +package run.halo.app.core.endpoint.console; import static org.springdoc.core.fn.builders.apiresponse.Builder.responseBuilder; import static org.springdoc.core.fn.builders.content.Builder.contentBuilder; @@ -37,6 +37,7 @@ import run.halo.app.content.PostQuery; import run.halo.app.content.PostRequest; import run.halo.app.content.PostService; import run.halo.app.core.extension.content.Post; +import run.halo.app.core.extension.endpoint.CustomEndpoint; import run.halo.app.extension.ListResult; import run.halo.app.extension.MetadataUtil; import run.halo.app.extension.ReactiveExtensionClient; diff --git a/application/src/main/java/run/halo/app/core/extension/endpoint/ReplyEndpoint.java b/application/src/main/java/run/halo/app/core/endpoint/console/ReplyEndpoint.java similarity index 94% rename from application/src/main/java/run/halo/app/core/extension/endpoint/ReplyEndpoint.java rename to application/src/main/java/run/halo/app/core/endpoint/console/ReplyEndpoint.java index 61e2fb589..29a6cd9cc 100644 --- a/application/src/main/java/run/halo/app/core/extension/endpoint/ReplyEndpoint.java +++ b/application/src/main/java/run/halo/app/core/endpoint/console/ReplyEndpoint.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.endpoint; +package run.halo.app.core.endpoint.console; import static org.springdoc.core.fn.builders.apiresponse.Builder.responseBuilder; @@ -12,6 +12,7 @@ import run.halo.app.content.comment.ListedReply; import run.halo.app.content.comment.ReplyQuery; import run.halo.app.content.comment.ReplyService; import run.halo.app.core.extension.content.Reply; +import run.halo.app.core.extension.endpoint.CustomEndpoint; import run.halo.app.extension.ListResult; /** diff --git a/application/src/main/java/run/halo/app/core/extension/endpoint/SinglePageEndpoint.java b/application/src/main/java/run/halo/app/core/endpoint/console/SinglePageEndpoint.java similarity index 99% rename from application/src/main/java/run/halo/app/core/extension/endpoint/SinglePageEndpoint.java rename to application/src/main/java/run/halo/app/core/endpoint/console/SinglePageEndpoint.java index 0c86c0164..56f8ce014 100644 --- a/application/src/main/java/run/halo/app/core/extension/endpoint/SinglePageEndpoint.java +++ b/application/src/main/java/run/halo/app/core/endpoint/console/SinglePageEndpoint.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.endpoint; +package run.halo.app.core.endpoint.console; import static org.springdoc.core.fn.builders.apiresponse.Builder.responseBuilder; import static org.springdoc.core.fn.builders.content.Builder.contentBuilder; @@ -33,6 +33,7 @@ import run.halo.app.content.SinglePageRequest; import run.halo.app.content.SinglePageService; import run.halo.app.core.extension.content.Post; import run.halo.app.core.extension.content.SinglePage; +import run.halo.app.core.extension.endpoint.CustomEndpoint; import run.halo.app.extension.ListResult; import run.halo.app.extension.MetadataUtil; import run.halo.app.extension.ReactiveExtensionClient; diff --git a/application/src/main/java/run/halo/app/core/extension/endpoint/StatsEndpoint.java b/application/src/main/java/run/halo/app/core/endpoint/console/StatsEndpoint.java similarity index 97% rename from application/src/main/java/run/halo/app/core/extension/endpoint/StatsEndpoint.java rename to application/src/main/java/run/halo/app/core/endpoint/console/StatsEndpoint.java index 84881b73d..6be262e68 100644 --- a/application/src/main/java/run/halo/app/core/extension/endpoint/StatsEndpoint.java +++ b/application/src/main/java/run/halo/app/core/endpoint/console/StatsEndpoint.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.endpoint; +package run.halo.app.core.endpoint.console; import static org.springdoc.core.fn.builders.apiresponse.Builder.responseBuilder; import static run.halo.app.extension.index.query.QueryFactory.and; @@ -15,6 +15,7 @@ import reactor.core.publisher.Mono; import run.halo.app.core.extension.Counter; import run.halo.app.core.extension.User; import run.halo.app.core.extension.content.Post; +import run.halo.app.core.extension.endpoint.CustomEndpoint; import run.halo.app.extension.ListOptions; import run.halo.app.extension.PageRequestImpl; import run.halo.app.extension.ReactiveExtensionClient; diff --git a/application/src/main/java/run/halo/app/core/extension/endpoint/SystemInitializationEndpoint.java b/application/src/main/java/run/halo/app/core/endpoint/console/SystemInitializationEndpoint.java similarity index 98% rename from application/src/main/java/run/halo/app/core/extension/endpoint/SystemInitializationEndpoint.java rename to application/src/main/java/run/halo/app/core/endpoint/console/SystemInitializationEndpoint.java index 37477cc81..4bb6b21b3 100644 --- a/application/src/main/java/run/halo/app/core/extension/endpoint/SystemInitializationEndpoint.java +++ b/application/src/main/java/run/halo/app/core/endpoint/console/SystemInitializationEndpoint.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.endpoint; +package run.halo.app.core.endpoint.console; import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; import static org.springdoc.core.fn.builders.apiresponse.Builder.responseBuilder; @@ -25,6 +25,7 @@ import org.springframework.web.server.ResponseStatusException; import org.springframework.web.server.ServerWebInputException; import reactor.core.publisher.Mono; import reactor.util.retry.Retry; +import run.halo.app.core.extension.endpoint.CustomEndpoint; import run.halo.app.extension.ConfigMap; import run.halo.app.extension.ReactiveExtensionClient; import run.halo.app.infra.InitializationStateGetter; diff --git a/application/src/main/java/run/halo/app/core/extension/endpoint/TagEndpoint.java b/application/src/main/java/run/halo/app/core/endpoint/console/TagEndpoint.java similarity index 97% rename from application/src/main/java/run/halo/app/core/extension/endpoint/TagEndpoint.java rename to application/src/main/java/run/halo/app/core/endpoint/console/TagEndpoint.java index ca768092f..612113413 100644 --- a/application/src/main/java/run/halo/app/core/extension/endpoint/TagEndpoint.java +++ b/application/src/main/java/run/halo/app/core/endpoint/console/TagEndpoint.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.endpoint; +package run.halo.app.core.endpoint.console; import static org.springdoc.core.fn.builders.apiresponse.Builder.responseBuilder; import static org.springdoc.core.fn.builders.parameter.Builder.parameterBuilder; @@ -19,6 +19,7 @@ import org.springframework.web.reactive.function.server.ServerRequest; import org.springframework.web.reactive.function.server.ServerResponse; import reactor.core.publisher.Mono; import run.halo.app.core.extension.content.Tag; +import run.halo.app.core.extension.endpoint.CustomEndpoint; import run.halo.app.extension.ListOptions; import run.halo.app.extension.ListResult; import run.halo.app.extension.PageRequestImpl; diff --git a/application/src/main/java/run/halo/app/core/extension/endpoint/TrackerEndpoint.java b/application/src/main/java/run/halo/app/core/endpoint/console/TrackerEndpoint.java similarity index 98% rename from application/src/main/java/run/halo/app/core/extension/endpoint/TrackerEndpoint.java rename to application/src/main/java/run/halo/app/core/endpoint/console/TrackerEndpoint.java index 8ada7725f..a69a30150 100644 --- a/application/src/main/java/run/halo/app/core/extension/endpoint/TrackerEndpoint.java +++ b/application/src/main/java/run/halo/app/core/endpoint/console/TrackerEndpoint.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.endpoint; +package run.halo.app.core.endpoint.console; import static org.springdoc.core.fn.builders.apiresponse.Builder.responseBuilder; import static org.springdoc.core.fn.builders.content.Builder.contentBuilder; @@ -16,6 +16,7 @@ import org.springframework.web.reactive.function.server.RouterFunction; import org.springframework.web.reactive.function.server.ServerRequest; import org.springframework.web.reactive.function.server.ServerResponse; import reactor.core.publisher.Mono; +import run.halo.app.core.extension.endpoint.CustomEndpoint; import run.halo.app.event.post.DownvotedEvent; import run.halo.app.event.post.UpvotedEvent; import run.halo.app.event.post.VisitedEvent; diff --git a/application/src/main/java/run/halo/app/core/extension/endpoint/UserEndpoint.java b/application/src/main/java/run/halo/app/core/endpoint/console/UserEndpoint.java similarity index 99% rename from application/src/main/java/run/halo/app/core/extension/endpoint/UserEndpoint.java rename to application/src/main/java/run/halo/app/core/endpoint/console/UserEndpoint.java index d8bc8bd98..8a907e84c 100644 --- a/application/src/main/java/run/halo/app/core/extension/endpoint/UserEndpoint.java +++ b/application/src/main/java/run/halo/app/core/endpoint/console/UserEndpoint.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.endpoint; +package run.halo.app.core.endpoint.console; import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; import static org.apache.commons.lang3.ObjectUtils.defaultIfNull; @@ -70,10 +70,11 @@ import reactor.util.retry.Retry; import run.halo.app.core.extension.Role; import run.halo.app.core.extension.User; import run.halo.app.core.extension.attachment.Attachment; +import run.halo.app.core.extension.endpoint.CustomEndpoint; import run.halo.app.core.extension.service.AttachmentService; -import run.halo.app.core.extension.service.EmailVerificationService; -import run.halo.app.core.extension.service.RoleService; -import run.halo.app.core.extension.service.UserService; +import run.halo.app.core.user.service.EmailVerificationService; +import run.halo.app.core.user.service.RoleService; +import run.halo.app.core.user.service.UserService; import run.halo.app.extension.ListOptions; import run.halo.app.extension.ListResult; import run.halo.app.extension.Metadata; diff --git a/application/src/main/java/run/halo/app/theme/endpoint/CategoryQueryEndpoint.java b/application/src/main/java/run/halo/app/core/endpoint/theme/CategoryQueryEndpoint.java similarity index 97% rename from application/src/main/java/run/halo/app/theme/endpoint/CategoryQueryEndpoint.java rename to application/src/main/java/run/halo/app/core/endpoint/theme/CategoryQueryEndpoint.java index 1183211a3..85587ad40 100644 --- a/application/src/main/java/run/halo/app/theme/endpoint/CategoryQueryEndpoint.java +++ b/application/src/main/java/run/halo/app/core/endpoint/theme/CategoryQueryEndpoint.java @@ -1,8 +1,8 @@ -package run.halo.app.theme.endpoint; +package run.halo.app.core.endpoint.theme; import static org.springdoc.core.fn.builders.apiresponse.Builder.responseBuilder; import static org.springdoc.core.fn.builders.parameter.Builder.parameterBuilder; -import static run.halo.app.theme.endpoint.PublicApiUtils.toAnotherListResult; +import static run.halo.app.core.endpoint.theme.PublicApiUtils.toAnotherListResult; import io.swagger.v3.oas.annotations.enums.ParameterIn; import lombok.RequiredArgsConstructor; diff --git a/application/src/main/java/run/halo/app/theme/endpoint/CommentFinderEndpoint.java b/application/src/main/java/run/halo/app/core/endpoint/theme/CommentFinderEndpoint.java similarity index 99% rename from application/src/main/java/run/halo/app/theme/endpoint/CommentFinderEndpoint.java rename to application/src/main/java/run/halo/app/core/endpoint/theme/CommentFinderEndpoint.java index edfd4c4ae..2e4169ff1 100644 --- a/application/src/main/java/run/halo/app/theme/endpoint/CommentFinderEndpoint.java +++ b/application/src/main/java/run/halo/app/core/endpoint/theme/CommentFinderEndpoint.java @@ -1,4 +1,4 @@ -package run.halo.app.theme.endpoint; +package run.halo.app.core.endpoint.theme; import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; import static org.apache.commons.lang3.BooleanUtils.isFalse; diff --git a/application/src/main/java/run/halo/app/theme/endpoint/MenuQueryEndpoint.java b/application/src/main/java/run/halo/app/core/endpoint/theme/MenuQueryEndpoint.java similarity index 98% rename from application/src/main/java/run/halo/app/theme/endpoint/MenuQueryEndpoint.java rename to application/src/main/java/run/halo/app/core/endpoint/theme/MenuQueryEndpoint.java index b43eff049..f0ac37df1 100644 --- a/application/src/main/java/run/halo/app/theme/endpoint/MenuQueryEndpoint.java +++ b/application/src/main/java/run/halo/app/core/endpoint/theme/MenuQueryEndpoint.java @@ -1,4 +1,4 @@ -package run.halo.app.theme.endpoint; +package run.halo.app.core.endpoint.theme; import static org.springdoc.core.fn.builders.apiresponse.Builder.responseBuilder; import static org.springdoc.core.fn.builders.parameter.Builder.parameterBuilder; diff --git a/application/src/main/java/run/halo/app/theme/endpoint/PluginQueryEndpoint.java b/application/src/main/java/run/halo/app/core/endpoint/theme/PluginQueryEndpoint.java similarity index 98% rename from application/src/main/java/run/halo/app/theme/endpoint/PluginQueryEndpoint.java rename to application/src/main/java/run/halo/app/core/endpoint/theme/PluginQueryEndpoint.java index 2de30247d..d649f7961 100644 --- a/application/src/main/java/run/halo/app/theme/endpoint/PluginQueryEndpoint.java +++ b/application/src/main/java/run/halo/app/core/endpoint/theme/PluginQueryEndpoint.java @@ -1,4 +1,4 @@ -package run.halo.app.theme.endpoint; +package run.halo.app.core.endpoint.theme; import static org.springdoc.core.fn.builders.apiresponse.Builder.responseBuilder; import static org.springdoc.core.fn.builders.parameter.Builder.parameterBuilder; diff --git a/application/src/main/java/run/halo/app/theme/endpoint/PostPublicQuery.java b/application/src/main/java/run/halo/app/core/endpoint/theme/PostPublicQuery.java similarity index 92% rename from application/src/main/java/run/halo/app/theme/endpoint/PostPublicQuery.java rename to application/src/main/java/run/halo/app/core/endpoint/theme/PostPublicQuery.java index c880186a1..281748108 100644 --- a/application/src/main/java/run/halo/app/theme/endpoint/PostPublicQuery.java +++ b/application/src/main/java/run/halo/app/core/endpoint/theme/PostPublicQuery.java @@ -1,4 +1,4 @@ -package run.halo.app.theme.endpoint; +package run.halo.app.core.endpoint.theme; import org.springdoc.core.fn.builders.operation.Builder; import org.springframework.web.server.ServerWebExchange; diff --git a/application/src/main/java/run/halo/app/theme/endpoint/PostQueryEndpoint.java b/application/src/main/java/run/halo/app/core/endpoint/theme/PostQueryEndpoint.java similarity index 99% rename from application/src/main/java/run/halo/app/theme/endpoint/PostQueryEndpoint.java rename to application/src/main/java/run/halo/app/core/endpoint/theme/PostQueryEndpoint.java index 9136eea7e..9588265f9 100644 --- a/application/src/main/java/run/halo/app/theme/endpoint/PostQueryEndpoint.java +++ b/application/src/main/java/run/halo/app/core/endpoint/theme/PostQueryEndpoint.java @@ -1,4 +1,4 @@ -package run.halo.app.theme.endpoint; +package run.halo.app.core.endpoint.theme; import static org.springdoc.core.fn.builders.apiresponse.Builder.responseBuilder; import static org.springdoc.core.fn.builders.parameter.Builder.parameterBuilder; diff --git a/application/src/main/java/run/halo/app/theme/endpoint/PublicApiUtils.java b/application/src/main/java/run/halo/app/core/endpoint/theme/PublicApiUtils.java similarity index 98% rename from application/src/main/java/run/halo/app/theme/endpoint/PublicApiUtils.java rename to application/src/main/java/run/halo/app/core/endpoint/theme/PublicApiUtils.java index 142b72055..5a622e85d 100644 --- a/application/src/main/java/run/halo/app/theme/endpoint/PublicApiUtils.java +++ b/application/src/main/java/run/halo/app/core/endpoint/theme/PublicApiUtils.java @@ -1,4 +1,4 @@ -package run.halo.app.theme.endpoint; +package run.halo.app.core.endpoint.theme; import java.util.Collection; import java.util.List; diff --git a/application/src/main/java/run/halo/app/theme/endpoint/PublicUserEndpoint.java b/application/src/main/java/run/halo/app/core/endpoint/theme/PublicUserEndpoint.java similarity index 98% rename from application/src/main/java/run/halo/app/theme/endpoint/PublicUserEndpoint.java rename to application/src/main/java/run/halo/app/core/endpoint/theme/PublicUserEndpoint.java index 9ebd7b22a..862aad334 100644 --- a/application/src/main/java/run/halo/app/theme/endpoint/PublicUserEndpoint.java +++ b/application/src/main/java/run/halo/app/core/endpoint/theme/PublicUserEndpoint.java @@ -1,4 +1,4 @@ -package run.halo.app.theme.endpoint; +package run.halo.app.core.endpoint.theme; import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.NOT_REQUIRED; import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; @@ -30,9 +30,9 @@ import org.springframework.web.server.ServerWebInputException; import reactor.core.publisher.Mono; import run.halo.app.core.extension.User; import run.halo.app.core.extension.endpoint.CustomEndpoint; -import run.halo.app.core.extension.service.EmailPasswordRecoveryService; -import run.halo.app.core.extension.service.EmailVerificationService; -import run.halo.app.core.extension.service.UserService; +import run.halo.app.core.user.service.EmailPasswordRecoveryService; +import run.halo.app.core.user.service.EmailVerificationService; +import run.halo.app.core.user.service.UserService; import run.halo.app.extension.GroupVersion; import run.halo.app.infra.SystemConfigurableEnvironmentFetcher; import run.halo.app.infra.SystemSetting; diff --git a/application/src/main/java/run/halo/app/theme/endpoint/SinglePageQueryEndpoint.java b/application/src/main/java/run/halo/app/core/endpoint/theme/SinglePageQueryEndpoint.java similarity index 98% rename from application/src/main/java/run/halo/app/theme/endpoint/SinglePageQueryEndpoint.java rename to application/src/main/java/run/halo/app/core/endpoint/theme/SinglePageQueryEndpoint.java index 933f3516d..8813cd273 100644 --- a/application/src/main/java/run/halo/app/theme/endpoint/SinglePageQueryEndpoint.java +++ b/application/src/main/java/run/halo/app/core/endpoint/theme/SinglePageQueryEndpoint.java @@ -1,4 +1,4 @@ -package run.halo.app.theme.endpoint; +package run.halo.app.core.endpoint.theme; import static org.springdoc.core.fn.builders.apiresponse.Builder.responseBuilder; import static org.springdoc.core.fn.builders.parameter.Builder.parameterBuilder; diff --git a/application/src/main/java/run/halo/app/theme/endpoint/SiteStatsQueryEndpoint.java b/application/src/main/java/run/halo/app/core/endpoint/theme/SiteStatsQueryEndpoint.java similarity index 97% rename from application/src/main/java/run/halo/app/theme/endpoint/SiteStatsQueryEndpoint.java rename to application/src/main/java/run/halo/app/core/endpoint/theme/SiteStatsQueryEndpoint.java index 40792d06b..13ed5c0a7 100644 --- a/application/src/main/java/run/halo/app/theme/endpoint/SiteStatsQueryEndpoint.java +++ b/application/src/main/java/run/halo/app/core/endpoint/theme/SiteStatsQueryEndpoint.java @@ -1,4 +1,4 @@ -package run.halo.app.theme.endpoint; +package run.halo.app.core.endpoint.theme; import static org.springdoc.core.fn.builders.apiresponse.Builder.responseBuilder; diff --git a/application/src/main/java/run/halo/app/theme/endpoint/TagQueryEndpoint.java b/application/src/main/java/run/halo/app/core/endpoint/theme/TagQueryEndpoint.java similarity index 99% rename from application/src/main/java/run/halo/app/theme/endpoint/TagQueryEndpoint.java rename to application/src/main/java/run/halo/app/core/endpoint/theme/TagQueryEndpoint.java index a54120d7a..b25f3cdae 100644 --- a/application/src/main/java/run/halo/app/theme/endpoint/TagQueryEndpoint.java +++ b/application/src/main/java/run/halo/app/core/endpoint/theme/TagQueryEndpoint.java @@ -1,4 +1,4 @@ -package run.halo.app.theme.endpoint; +package run.halo.app.core.endpoint.theme; import static org.springdoc.core.fn.builders.apiresponse.Builder.responseBuilder; import static org.springdoc.core.fn.builders.parameter.Builder.parameterBuilder; diff --git a/application/src/main/java/run/halo/app/theme/endpoint/ThumbnailEndpoint.java b/application/src/main/java/run/halo/app/core/endpoint/theme/ThumbnailEndpoint.java similarity index 99% rename from application/src/main/java/run/halo/app/theme/endpoint/ThumbnailEndpoint.java rename to application/src/main/java/run/halo/app/core/endpoint/theme/ThumbnailEndpoint.java index aeb332b0d..012bdd249 100644 --- a/application/src/main/java/run/halo/app/theme/endpoint/ThumbnailEndpoint.java +++ b/application/src/main/java/run/halo/app/core/endpoint/theme/ThumbnailEndpoint.java @@ -1,4 +1,4 @@ -package run.halo.app.theme.endpoint; +package run.halo.app.core.endpoint.theme; import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; import static org.springdoc.core.fn.builders.apiresponse.Builder.responseBuilder; diff --git a/application/src/main/java/run/halo/app/endpoint/uc/content/UcPostAttachmentEndpoint.java b/application/src/main/java/run/halo/app/core/endpoint/uc/UcPostAttachmentEndpoint.java similarity index 99% rename from application/src/main/java/run/halo/app/endpoint/uc/content/UcPostAttachmentEndpoint.java rename to application/src/main/java/run/halo/app/core/endpoint/uc/UcPostAttachmentEndpoint.java index 47063a455..0e04701a7 100644 --- a/application/src/main/java/run/halo/app/endpoint/uc/content/UcPostAttachmentEndpoint.java +++ b/application/src/main/java/run/halo/app/core/endpoint/uc/UcPostAttachmentEndpoint.java @@ -1,4 +1,4 @@ -package run.halo.app.endpoint.uc.content; +package run.halo.app.core.endpoint.uc; import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.NOT_REQUIRED; import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; diff --git a/application/src/main/java/run/halo/app/endpoint/uc/content/UcPostEndpoint.java b/application/src/main/java/run/halo/app/core/endpoint/uc/UcPostEndpoint.java similarity index 99% rename from application/src/main/java/run/halo/app/endpoint/uc/content/UcPostEndpoint.java rename to application/src/main/java/run/halo/app/core/endpoint/uc/UcPostEndpoint.java index 0b30aec49..a969e64e8 100644 --- a/application/src/main/java/run/halo/app/endpoint/uc/content/UcPostEndpoint.java +++ b/application/src/main/java/run/halo/app/core/endpoint/uc/UcPostEndpoint.java @@ -1,4 +1,4 @@ -package run.halo.app.endpoint.uc.content; +package run.halo.app.core.endpoint.uc; import static org.springdoc.core.fn.builders.apiresponse.Builder.responseBuilder; import static org.springdoc.core.fn.builders.parameter.Builder.parameterBuilder; diff --git a/application/src/main/java/run/halo/app/endpoint/uc/content/UcSnapshotEndpoint.java b/application/src/main/java/run/halo/app/core/endpoint/uc/UcSnapshotEndpoint.java similarity index 99% rename from application/src/main/java/run/halo/app/endpoint/uc/content/UcSnapshotEndpoint.java rename to application/src/main/java/run/halo/app/core/endpoint/uc/UcSnapshotEndpoint.java index 1f196bc66..f674d84cc 100644 --- a/application/src/main/java/run/halo/app/endpoint/uc/content/UcSnapshotEndpoint.java +++ b/application/src/main/java/run/halo/app/core/endpoint/uc/UcSnapshotEndpoint.java @@ -1,4 +1,4 @@ -package run.halo.app.endpoint.uc.content; +package run.halo.app.core.endpoint.uc; import static org.springdoc.core.fn.builders.apiresponse.Builder.responseBuilder; import static org.springdoc.core.fn.builders.parameter.Builder.parameterBuilder; diff --git a/application/src/main/java/run/halo/app/core/extension/reconciler/AnnotationSettingReconciler.java b/application/src/main/java/run/halo/app/core/reconciler/AnnotationSettingReconciler.java similarity index 97% rename from application/src/main/java/run/halo/app/core/extension/reconciler/AnnotationSettingReconciler.java rename to application/src/main/java/run/halo/app/core/reconciler/AnnotationSettingReconciler.java index 8b6fce832..fb314e260 100644 --- a/application/src/main/java/run/halo/app/core/extension/reconciler/AnnotationSettingReconciler.java +++ b/application/src/main/java/run/halo/app/core/reconciler/AnnotationSettingReconciler.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.reconciler; +package run.halo.app.core.reconciler; import java.util.Map; import lombok.AllArgsConstructor; diff --git a/application/src/main/java/run/halo/app/core/extension/reconciler/AuthProviderReconciler.java b/application/src/main/java/run/halo/app/core/reconciler/AuthProviderReconciler.java similarity index 97% rename from application/src/main/java/run/halo/app/core/extension/reconciler/AuthProviderReconciler.java rename to application/src/main/java/run/halo/app/core/reconciler/AuthProviderReconciler.java index 5176f8a3f..b43c2fdaf 100644 --- a/application/src/main/java/run/halo/app/core/extension/reconciler/AuthProviderReconciler.java +++ b/application/src/main/java/run/halo/app/core/reconciler/AuthProviderReconciler.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.reconciler; +package run.halo.app.core.reconciler; import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.BooleanUtils; diff --git a/application/src/main/java/run/halo/app/core/extension/reconciler/CategoryReconciler.java b/application/src/main/java/run/halo/app/core/reconciler/CategoryReconciler.java similarity index 98% rename from application/src/main/java/run/halo/app/core/extension/reconciler/CategoryReconciler.java rename to application/src/main/java/run/halo/app/core/reconciler/CategoryReconciler.java index d4abf4862..a64d462fa 100644 --- a/application/src/main/java/run/halo/app/core/extension/reconciler/CategoryReconciler.java +++ b/application/src/main/java/run/halo/app/core/reconciler/CategoryReconciler.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.reconciler; +package run.halo.app.core.reconciler; import static run.halo.app.extension.ExtensionUtil.addFinalizers; import static run.halo.app.extension.ExtensionUtil.removeFinalizers; diff --git a/application/src/main/java/run/halo/app/core/extension/reconciler/CommentReconciler.java b/application/src/main/java/run/halo/app/core/reconciler/CommentReconciler.java similarity index 99% rename from application/src/main/java/run/halo/app/core/extension/reconciler/CommentReconciler.java rename to application/src/main/java/run/halo/app/core/reconciler/CommentReconciler.java index 4e9ce5237..abcca1947 100644 --- a/application/src/main/java/run/halo/app/core/extension/reconciler/CommentReconciler.java +++ b/application/src/main/java/run/halo/app/core/reconciler/CommentReconciler.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.reconciler; +package run.halo.app.core.reconciler; import static org.apache.commons.lang3.ObjectUtils.defaultIfNull; import static run.halo.app.extension.ExtensionUtil.addFinalizers; diff --git a/application/src/main/java/run/halo/app/core/extension/reconciler/MenuItemReconciler.java b/application/src/main/java/run/halo/app/core/reconciler/MenuItemReconciler.java similarity index 99% rename from application/src/main/java/run/halo/app/core/extension/reconciler/MenuItemReconciler.java rename to application/src/main/java/run/halo/app/core/reconciler/MenuItemReconciler.java index 9d2768036..ba267bb5f 100644 --- a/application/src/main/java/run/halo/app/core/extension/reconciler/MenuItemReconciler.java +++ b/application/src/main/java/run/halo/app/core/reconciler/MenuItemReconciler.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.reconciler; +package run.halo.app.core.reconciler; import java.time.Duration; import java.util.Objects; diff --git a/application/src/main/java/run/halo/app/core/extension/reconciler/PluginReconciler.java b/application/src/main/java/run/halo/app/core/reconciler/PluginReconciler.java similarity index 99% rename from application/src/main/java/run/halo/app/core/extension/reconciler/PluginReconciler.java rename to application/src/main/java/run/halo/app/core/reconciler/PluginReconciler.java index 145c7df77..5a5a2ecd2 100644 --- a/application/src/main/java/run/halo/app/core/extension/reconciler/PluginReconciler.java +++ b/application/src/main/java/run/halo/app/core/reconciler/PluginReconciler.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.reconciler; +package run.halo.app.core.reconciler; import static run.halo.app.core.extension.Plugin.PluginStatus.nullSafeConditions; import static run.halo.app.extension.ExtensionUtil.addFinalizers; @@ -44,7 +44,6 @@ import org.springframework.web.util.UriComponentsBuilder; import run.halo.app.core.extension.Plugin; import run.halo.app.core.extension.ReverseProxy; import run.halo.app.core.extension.Setting; -import run.halo.app.core.extension.theme.SettingUtils; import run.halo.app.extension.ConfigMap; import run.halo.app.extension.ExtensionClient; import run.halo.app.extension.ExtensionUtil; @@ -59,6 +58,7 @@ import run.halo.app.infra.Condition; import run.halo.app.infra.ConditionList; import run.halo.app.infra.ConditionStatus; import run.halo.app.infra.utils.PathUtils; +import run.halo.app.infra.utils.SettingUtils; import run.halo.app.infra.utils.YamlUnstructuredLoader; import run.halo.app.plugin.PluginConst; import run.halo.app.plugin.PluginProperties; diff --git a/application/src/main/java/run/halo/app/core/extension/reconciler/PostCounterReconciler.java b/application/src/main/java/run/halo/app/core/reconciler/PostCounterReconciler.java similarity index 97% rename from application/src/main/java/run/halo/app/core/extension/reconciler/PostCounterReconciler.java rename to application/src/main/java/run/halo/app/core/reconciler/PostCounterReconciler.java index a6986a54c..24f8ada28 100644 --- a/application/src/main/java/run/halo/app/core/extension/reconciler/PostCounterReconciler.java +++ b/application/src/main/java/run/halo/app/core/reconciler/PostCounterReconciler.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.reconciler; +package run.halo.app.core.reconciler; import static run.halo.app.extension.index.query.QueryFactory.startsWith; diff --git a/application/src/main/java/run/halo/app/core/extension/reconciler/PostReconciler.java b/application/src/main/java/run/halo/app/core/reconciler/PostReconciler.java similarity index 99% rename from application/src/main/java/run/halo/app/core/extension/reconciler/PostReconciler.java rename to application/src/main/java/run/halo/app/core/reconciler/PostReconciler.java index 29d546944..5018b89aa 100644 --- a/application/src/main/java/run/halo/app/core/extension/reconciler/PostReconciler.java +++ b/application/src/main/java/run/halo/app/core/reconciler/PostReconciler.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.reconciler; +package run.halo.app.core.reconciler; import static java.nio.charset.StandardCharsets.UTF_8; import static org.apache.commons.lang3.BooleanUtils.TRUE; diff --git a/application/src/main/java/run/halo/app/core/extension/reconciler/ReplyReconciler.java b/application/src/main/java/run/halo/app/core/reconciler/ReplyReconciler.java similarity index 98% rename from application/src/main/java/run/halo/app/core/extension/reconciler/ReplyReconciler.java rename to application/src/main/java/run/halo/app/core/reconciler/ReplyReconciler.java index 3dc0b89c9..9a3886dc9 100644 --- a/application/src/main/java/run/halo/app/core/extension/reconciler/ReplyReconciler.java +++ b/application/src/main/java/run/halo/app/core/reconciler/ReplyReconciler.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.reconciler; +package run.halo.app.core.reconciler; import static org.apache.commons.lang3.ObjectUtils.defaultIfNull; import static run.halo.app.extension.ExtensionUtil.addFinalizers; diff --git a/application/src/main/java/run/halo/app/core/extension/reconciler/ReverseProxyReconciler.java b/application/src/main/java/run/halo/app/core/reconciler/ReverseProxyReconciler.java similarity index 98% rename from application/src/main/java/run/halo/app/core/extension/reconciler/ReverseProxyReconciler.java rename to application/src/main/java/run/halo/app/core/reconciler/ReverseProxyReconciler.java index e0a34ca77..7c2620baa 100644 --- a/application/src/main/java/run/halo/app/core/extension/reconciler/ReverseProxyReconciler.java +++ b/application/src/main/java/run/halo/app/core/reconciler/ReverseProxyReconciler.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.reconciler; +package run.halo.app.core.reconciler; import java.util.HashSet; import java.util.Map; diff --git a/application/src/main/java/run/halo/app/core/extension/reconciler/RoleReconciler.java b/application/src/main/java/run/halo/app/core/reconciler/RoleReconciler.java similarity index 97% rename from application/src/main/java/run/halo/app/core/extension/reconciler/RoleReconciler.java rename to application/src/main/java/run/halo/app/core/reconciler/RoleReconciler.java index e3d631139..247300464 100644 --- a/application/src/main/java/run/halo/app/core/extension/reconciler/RoleReconciler.java +++ b/application/src/main/java/run/halo/app/core/reconciler/RoleReconciler.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.reconciler; +package run.halo.app.core.reconciler; import static java.util.Objects.deepEquals; diff --git a/application/src/main/java/run/halo/app/core/extension/reconciler/SinglePageReconciler.java b/application/src/main/java/run/halo/app/core/reconciler/SinglePageReconciler.java similarity index 99% rename from application/src/main/java/run/halo/app/core/extension/reconciler/SinglePageReconciler.java rename to application/src/main/java/run/halo/app/core/reconciler/SinglePageReconciler.java index b803b6df5..d35a3cef6 100644 --- a/application/src/main/java/run/halo/app/core/extension/reconciler/SinglePageReconciler.java +++ b/application/src/main/java/run/halo/app/core/reconciler/SinglePageReconciler.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.reconciler; +package run.halo.app.core.reconciler; import static java.nio.charset.StandardCharsets.UTF_8; import static org.springframework.web.util.UriUtils.encodePath; diff --git a/application/src/main/java/run/halo/app/core/extension/reconciler/SystemSettingReconciler.java b/application/src/main/java/run/halo/app/core/reconciler/SystemSettingReconciler.java similarity index 99% rename from application/src/main/java/run/halo/app/core/extension/reconciler/SystemSettingReconciler.java rename to application/src/main/java/run/halo/app/core/reconciler/SystemSettingReconciler.java index f3f7638fd..ea920d839 100644 --- a/application/src/main/java/run/halo/app/core/extension/reconciler/SystemSettingReconciler.java +++ b/application/src/main/java/run/halo/app/core/reconciler/SystemSettingReconciler.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.reconciler; +package run.halo.app.core.reconciler; import java.util.HashMap; import java.util.HashSet; diff --git a/application/src/main/java/run/halo/app/core/extension/reconciler/TagReconciler.java b/application/src/main/java/run/halo/app/core/reconciler/TagReconciler.java similarity index 98% rename from application/src/main/java/run/halo/app/core/extension/reconciler/TagReconciler.java rename to application/src/main/java/run/halo/app/core/reconciler/TagReconciler.java index 1318e6c28..466059790 100644 --- a/application/src/main/java/run/halo/app/core/extension/reconciler/TagReconciler.java +++ b/application/src/main/java/run/halo/app/core/reconciler/TagReconciler.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.reconciler; +package run.halo.app.core.reconciler; import static run.halo.app.extension.ExtensionUtil.addFinalizers; import static run.halo.app.extension.ExtensionUtil.removeFinalizers; diff --git a/application/src/main/java/run/halo/app/core/extension/reconciler/ThemeReconciler.java b/application/src/main/java/run/halo/app/core/reconciler/ThemeReconciler.java similarity index 98% rename from application/src/main/java/run/halo/app/core/extension/reconciler/ThemeReconciler.java rename to application/src/main/java/run/halo/app/core/reconciler/ThemeReconciler.java index 0899e0a5e..e0e086b9c 100644 --- a/application/src/main/java/run/halo/app/core/extension/reconciler/ThemeReconciler.java +++ b/application/src/main/java/run/halo/app/core/reconciler/ThemeReconciler.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.reconciler; +package run.halo.app.core.reconciler; import static org.apache.commons.lang3.ObjectUtils.defaultIfNull; @@ -17,7 +17,6 @@ import org.springframework.util.FileSystemUtils; import run.halo.app.core.extension.AnnotationSetting; import run.halo.app.core.extension.Setting; import run.halo.app.core.extension.Theme; -import run.halo.app.core.extension.theme.SettingUtils; import run.halo.app.extension.ExtensionClient; import run.halo.app.extension.MetadataUtil; import run.halo.app.extension.controller.Controller; @@ -30,6 +29,7 @@ import run.halo.app.infra.SystemVersionSupplier; import run.halo.app.infra.ThemeRootGetter; import run.halo.app.infra.exception.ThemeUninstallException; import run.halo.app.infra.utils.JsonUtils; +import run.halo.app.infra.utils.SettingUtils; import run.halo.app.infra.utils.VersionUtils; /** diff --git a/application/src/main/java/run/halo/app/core/extension/reconciler/UserReconciler.java b/application/src/main/java/run/halo/app/core/reconciler/UserReconciler.java similarity index 97% rename from application/src/main/java/run/halo/app/core/extension/reconciler/UserReconciler.java rename to application/src/main/java/run/halo/app/core/reconciler/UserReconciler.java index c74d087b1..397b89afd 100644 --- a/application/src/main/java/run/halo/app/core/extension/reconciler/UserReconciler.java +++ b/application/src/main/java/run/halo/app/core/reconciler/UserReconciler.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.reconciler; +package run.halo.app.core.reconciler; import static run.halo.app.extension.ExtensionUtil.addFinalizers; import static run.halo.app.extension.ExtensionUtil.defaultSort; @@ -23,8 +23,8 @@ import run.halo.app.core.extension.User; import run.halo.app.core.extension.UserConnection; import run.halo.app.core.extension.attachment.Attachment; import run.halo.app.core.extension.service.AttachmentService; -import run.halo.app.core.extension.service.RoleService; -import run.halo.app.core.extension.service.UserService; +import run.halo.app.core.user.service.RoleService; +import run.halo.app.core.user.service.UserService; import run.halo.app.extension.ExtensionClient; import run.halo.app.extension.ListOptions; import run.halo.app.extension.controller.Controller; diff --git a/application/src/main/java/run/halo/app/core/extension/service/DefaultRoleService.java b/application/src/main/java/run/halo/app/core/user/service/DefaultRoleService.java similarity index 99% rename from application/src/main/java/run/halo/app/core/extension/service/DefaultRoleService.java rename to application/src/main/java/run/halo/app/core/user/service/DefaultRoleService.java index b02954113..0ac6672d3 100644 --- a/application/src/main/java/run/halo/app/core/extension/service/DefaultRoleService.java +++ b/application/src/main/java/run/halo/app/core/user/service/DefaultRoleService.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.service; +package run.halo.app.core.user.service; import static run.halo.app.extension.ExtensionUtil.defaultSort; import static run.halo.app.extension.ExtensionUtil.notDeleting; diff --git a/application/src/main/java/run/halo/app/core/extension/service/EmailPasswordRecoveryService.java b/application/src/main/java/run/halo/app/core/user/service/EmailPasswordRecoveryService.java similarity index 96% rename from application/src/main/java/run/halo/app/core/extension/service/EmailPasswordRecoveryService.java rename to application/src/main/java/run/halo/app/core/user/service/EmailPasswordRecoveryService.java index 3e1a97723..a586589f0 100644 --- a/application/src/main/java/run/halo/app/core/extension/service/EmailPasswordRecoveryService.java +++ b/application/src/main/java/run/halo/app/core/user/service/EmailPasswordRecoveryService.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.service; +package run.halo.app.core.user.service; import reactor.core.publisher.Mono; import run.halo.app.infra.exception.AccessDeniedException; diff --git a/application/src/main/java/run/halo/app/core/extension/service/EmailVerificationService.java b/application/src/main/java/run/halo/app/core/user/service/EmailVerificationService.java similarity index 96% rename from application/src/main/java/run/halo/app/core/extension/service/EmailVerificationService.java rename to application/src/main/java/run/halo/app/core/user/service/EmailVerificationService.java index 762f92afe..f2c233688 100644 --- a/application/src/main/java/run/halo/app/core/extension/service/EmailVerificationService.java +++ b/application/src/main/java/run/halo/app/core/user/service/EmailVerificationService.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.service; +package run.halo.app.core.user.service; import reactor.core.publisher.Mono; import run.halo.app.infra.exception.EmailVerificationFailed; diff --git a/application/src/main/java/run/halo/app/core/extension/service/RoleService.java b/application/src/main/java/run/halo/app/core/user/service/RoleService.java similarity index 96% rename from application/src/main/java/run/halo/app/core/extension/service/RoleService.java rename to application/src/main/java/run/halo/app/core/user/service/RoleService.java index d22beff91..b6d108047 100644 --- a/application/src/main/java/run/halo/app/core/extension/service/RoleService.java +++ b/application/src/main/java/run/halo/app/core/user/service/RoleService.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.service; +package run.halo.app.core.user.service; import java.util.Collection; import java.util.Map; diff --git a/application/src/main/java/run/halo/app/core/extension/service/UserService.java b/application/src/main/java/run/halo/app/core/user/service/UserService.java similarity index 94% rename from application/src/main/java/run/halo/app/core/extension/service/UserService.java rename to application/src/main/java/run/halo/app/core/user/service/UserService.java index f252d1536..5a2b8135a 100644 --- a/application/src/main/java/run/halo/app/core/extension/service/UserService.java +++ b/application/src/main/java/run/halo/app/core/user/service/UserService.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.service; +package run.halo.app.core.user.service; import java.util.Set; import reactor.core.publisher.Flux; diff --git a/application/src/main/java/run/halo/app/core/extension/service/UserServiceImpl.java b/application/src/main/java/run/halo/app/core/user/service/UserServiceImpl.java similarity index 99% rename from application/src/main/java/run/halo/app/core/extension/service/UserServiceImpl.java rename to application/src/main/java/run/halo/app/core/user/service/UserServiceImpl.java index 5d9f85fcd..9290b3ec4 100644 --- a/application/src/main/java/run/halo/app/core/extension/service/UserServiceImpl.java +++ b/application/src/main/java/run/halo/app/core/user/service/UserServiceImpl.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.service; +package run.halo.app.core.user.service; import static org.springframework.data.domain.Sort.Order.asc; import static org.springframework.data.domain.Sort.Order.desc; diff --git a/application/src/main/java/run/halo/app/core/extension/service/impl/DefaultAttachmentService.java b/application/src/main/java/run/halo/app/core/user/service/impl/DefaultAttachmentService.java similarity index 99% rename from application/src/main/java/run/halo/app/core/extension/service/impl/DefaultAttachmentService.java rename to application/src/main/java/run/halo/app/core/user/service/impl/DefaultAttachmentService.java index 50486eb2c..525ed17e7 100644 --- a/application/src/main/java/run/halo/app/core/extension/service/impl/DefaultAttachmentService.java +++ b/application/src/main/java/run/halo/app/core/user/service/impl/DefaultAttachmentService.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.service.impl; +package run.halo.app.core.user.service.impl; import java.net.URI; import java.net.URL; diff --git a/application/src/main/java/run/halo/app/core/extension/service/impl/EmailPasswordRecoveryServiceImpl.java b/application/src/main/java/run/halo/app/core/user/service/impl/EmailPasswordRecoveryServiceImpl.java similarity index 97% rename from application/src/main/java/run/halo/app/core/extension/service/impl/EmailPasswordRecoveryServiceImpl.java rename to application/src/main/java/run/halo/app/core/user/service/impl/EmailPasswordRecoveryServiceImpl.java index 4fbe8c859..ac66225ee 100644 --- a/application/src/main/java/run/halo/app/core/extension/service/impl/EmailPasswordRecoveryServiceImpl.java +++ b/application/src/main/java/run/halo/app/core/user/service/impl/EmailPasswordRecoveryServiceImpl.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.service.impl; +package run.halo.app.core.user.service.impl; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; @@ -18,8 +18,8 @@ import reactor.util.retry.Retry; import run.halo.app.core.extension.User; import run.halo.app.core.extension.notification.Reason; import run.halo.app.core.extension.notification.Subscription; -import run.halo.app.core.extension.service.EmailPasswordRecoveryService; -import run.halo.app.core.extension.service.UserService; +import run.halo.app.core.user.service.EmailPasswordRecoveryService; +import run.halo.app.core.user.service.UserService; import run.halo.app.extension.GroupVersion; import run.halo.app.extension.ReactiveExtensionClient; import run.halo.app.infra.ExternalLinkProcessor; diff --git a/application/src/main/java/run/halo/app/core/extension/service/impl/EmailVerificationServiceImpl.java b/application/src/main/java/run/halo/app/core/user/service/impl/EmailVerificationServiceImpl.java similarity index 98% rename from application/src/main/java/run/halo/app/core/extension/service/impl/EmailVerificationServiceImpl.java rename to application/src/main/java/run/halo/app/core/user/service/impl/EmailVerificationServiceImpl.java index 857b4647c..b362a96c8 100644 --- a/application/src/main/java/run/halo/app/core/extension/service/impl/EmailVerificationServiceImpl.java +++ b/application/src/main/java/run/halo/app/core/user/service/impl/EmailVerificationServiceImpl.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.service.impl; +package run.halo.app.core.user.service.impl; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; @@ -19,8 +19,8 @@ import reactor.util.retry.Retry; import run.halo.app.core.extension.User; import run.halo.app.core.extension.notification.Reason; import run.halo.app.core.extension.notification.Subscription; -import run.halo.app.core.extension.service.EmailVerificationService; -import run.halo.app.core.extension.service.UserService; +import run.halo.app.core.user.service.EmailVerificationService; +import run.halo.app.core.user.service.UserService; import run.halo.app.extension.GroupVersion; import run.halo.app.extension.MetadataUtil; import run.halo.app.extension.ReactiveExtensionClient; diff --git a/application/src/main/java/run/halo/app/infra/DefaultThemeInitializer.java b/application/src/main/java/run/halo/app/infra/DefaultThemeInitializer.java index b18692366..31af2d0a0 100644 --- a/application/src/main/java/run/halo/app/infra/DefaultThemeInitializer.java +++ b/application/src/main/java/run/halo/app/infra/DefaultThemeInitializer.java @@ -10,10 +10,10 @@ import org.springframework.core.io.buffer.DefaultDataBufferFactory; import org.springframework.stereotype.Component; import org.springframework.util.ResourceUtils; import org.springframework.util.StreamUtils; -import run.halo.app.core.extension.theme.ThemeService; import run.halo.app.infra.properties.HaloProperties; import run.halo.app.infra.properties.ThemeProperties; import run.halo.app.infra.utils.FileUtils; +import run.halo.app.theme.service.ThemeService; @Slf4j @Component @@ -44,7 +44,7 @@ public class DefaultThemeInitializer implements ApplicationListener listAllThemesFromThemeDir(Path themesDir) { + public static Flux listAllThemesFromThemeDir(Path themesDir) { return walkThemesFromPath(themesDir) .filter(Files::isDirectory) .map(ThemeUtils::findThemeManifest) diff --git a/application/src/test/java/run/halo/app/config/ExtensionConfigurationTest.java b/application/src/test/java/run/halo/app/config/ExtensionConfigurationTest.java index ee0ad619e..9cc8a8140 100644 --- a/application/src/test/java/run/halo/app/config/ExtensionConfigurationTest.java +++ b/application/src/test/java/run/halo/app/config/ExtensionConfigurationTest.java @@ -26,7 +26,7 @@ import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.web.reactive.server.WebTestClient; import reactor.core.publisher.Flux; import run.halo.app.core.extension.Role; -import run.halo.app.core.extension.service.RoleService; +import run.halo.app.core.user.service.RoleService; import run.halo.app.extension.ExtensionClient; import run.halo.app.extension.FakeExtension; import run.halo.app.extension.GroupVersionKind; diff --git a/application/src/test/java/run/halo/app/config/WebFluxConfigTest.java b/application/src/test/java/run/halo/app/config/WebFluxConfigTest.java index e60e2870c..70f2db955 100644 --- a/application/src/test/java/run/halo/app/config/WebFluxConfigTest.java +++ b/application/src/test/java/run/halo/app/config/WebFluxConfigTest.java @@ -25,7 +25,7 @@ import reactor.core.publisher.Flux; import reactor.test.StepVerifier; import run.halo.app.core.endpoint.WebSocketEndpoint; import run.halo.app.core.extension.Role; -import run.halo.app.core.extension.service.RoleService; +import run.halo.app.core.user.service.RoleService; import run.halo.app.extension.GroupVersion; import run.halo.app.extension.Metadata; diff --git a/application/src/test/java/run/halo/app/console/WebSocketServerWebExchangeMatcherTest.java b/application/src/test/java/run/halo/app/console/WebSocketServerWebExchangeMatcherTest.java index cf2944bc2..11c40030c 100644 --- a/application/src/test/java/run/halo/app/console/WebSocketServerWebExchangeMatcherTest.java +++ b/application/src/test/java/run/halo/app/console/WebSocketServerWebExchangeMatcherTest.java @@ -8,6 +8,7 @@ import org.springframework.http.HttpHeaders; import org.springframework.mock.http.server.reactive.MockServerHttpRequest; import org.springframework.mock.web.server.MockServerWebExchange; import reactor.test.StepVerifier; +import run.halo.app.infra.console.WebSocketServerWebExchangeMatcher; class WebSocketServerWebExchangeMatcherTest { diff --git a/application/src/test/java/run/halo/app/console/WebSocketUtilsTest.java b/application/src/test/java/run/halo/app/console/WebSocketUtilsTest.java index aac0fd1bc..225a6e91f 100644 --- a/application/src/test/java/run/halo/app/console/WebSocketUtilsTest.java +++ b/application/src/test/java/run/halo/app/console/WebSocketUtilsTest.java @@ -6,6 +6,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.springframework.http.HttpHeaders; +import run.halo.app.infra.console.WebSocketUtils; class WebSocketUtilsTest { diff --git a/application/src/test/java/run/halo/app/content/PostIntegrationTests.java b/application/src/test/java/run/halo/app/content/PostIntegrationTests.java index 629f3bbf9..6eb47e1c4 100644 --- a/application/src/test/java/run/halo/app/content/PostIntegrationTests.java +++ b/application/src/test/java/run/halo/app/content/PostIntegrationTests.java @@ -19,7 +19,7 @@ import org.springframework.test.web.reactive.server.WebTestClient; import reactor.core.publisher.Flux; import run.halo.app.core.extension.Role; import run.halo.app.core.extension.content.Post; -import run.halo.app.core.extension.service.RoleService; +import run.halo.app.core.user.service.RoleService; import run.halo.app.extension.Metadata; import run.halo.app.extension.MetadataOperator; import run.halo.app.infra.utils.JsonUtils; diff --git a/application/src/test/java/run/halo/app/content/comment/CommentServiceImplTest.java b/application/src/test/java/run/halo/app/content/comment/CommentServiceImplTest.java index ac23f1e13..3e706594d 100644 --- a/application/src/test/java/run/halo/app/content/comment/CommentServiceImplTest.java +++ b/application/src/test/java/run/halo/app/content/comment/CommentServiceImplTest.java @@ -35,8 +35,8 @@ import run.halo.app.core.extension.Counter; import run.halo.app.core.extension.User; import run.halo.app.core.extension.content.Comment; import run.halo.app.core.extension.content.Post; -import run.halo.app.core.extension.service.RoleService; -import run.halo.app.core.extension.service.UserService; +import run.halo.app.core.user.service.RoleService; +import run.halo.app.core.user.service.UserService; import run.halo.app.extension.ListOptions; import run.halo.app.extension.ListResult; import run.halo.app.extension.Metadata; diff --git a/application/src/test/java/run/halo/app/core/attachment/impl/LocalThumbnailServiceImplTest.java b/application/src/test/java/run/halo/app/core/attachment/impl/LocalThumbnailServiceImplTest.java index 6643d3837..54d3d2c43 100644 --- a/application/src/test/java/run/halo/app/core/attachment/impl/LocalThumbnailServiceImplTest.java +++ b/application/src/test/java/run/halo/app/core/attachment/impl/LocalThumbnailServiceImplTest.java @@ -24,7 +24,7 @@ import reactor.core.publisher.Mono; import reactor.test.StepVerifier; import run.halo.app.core.attachment.AttachmentRootGetter; import run.halo.app.core.attachment.ThumbnailSize; -import run.halo.app.core.extension.attachment.LocalThumbnail; +import run.halo.app.core.attachment.extension.LocalThumbnail; import run.halo.app.extension.ListResult; import run.halo.app.extension.PageRequest; import run.halo.app.extension.ReactiveExtensionClient; diff --git a/application/src/test/java/run/halo/app/core/attachment/impl/ThumbnailServiceImplTest.java b/application/src/test/java/run/halo/app/core/attachment/impl/ThumbnailServiceImplTest.java index 7a22f73d4..5461fc874 100644 --- a/application/src/test/java/run/halo/app/core/attachment/impl/ThumbnailServiceImplTest.java +++ b/application/src/test/java/run/halo/app/core/attachment/impl/ThumbnailServiceImplTest.java @@ -29,7 +29,7 @@ import run.halo.app.core.attachment.LocalThumbnailService; import run.halo.app.core.attachment.ThumbnailProvider; import run.halo.app.core.attachment.ThumbnailSigner; import run.halo.app.core.attachment.ThumbnailSize; -import run.halo.app.core.extension.attachment.Thumbnail; +import run.halo.app.core.attachment.extension.Thumbnail; import run.halo.app.extension.ListOptions; import run.halo.app.extension.PageRequest; import run.halo.app.extension.ReactiveExtensionClient; diff --git a/application/src/test/java/run/halo/app/core/extension/endpoint/EmailVerificationCodeTest.java b/application/src/test/java/run/halo/app/core/endpoint/console/EmailVerificationCodeTest.java similarity index 96% rename from application/src/test/java/run/halo/app/core/extension/endpoint/EmailVerificationCodeTest.java rename to application/src/test/java/run/halo/app/core/endpoint/console/EmailVerificationCodeTest.java index ee3838c10..683e6552c 100644 --- a/application/src/test/java/run/halo/app/core/extension/endpoint/EmailVerificationCodeTest.java +++ b/application/src/test/java/run/halo/app/core/endpoint/console/EmailVerificationCodeTest.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.endpoint; +package run.halo.app.core.endpoint.console; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; @@ -23,8 +23,8 @@ import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.web.reactive.server.WebTestClient; import reactor.core.publisher.Mono; import run.halo.app.core.extension.User; -import run.halo.app.core.extension.service.EmailVerificationService; -import run.halo.app.core.extension.service.UserService; +import run.halo.app.core.user.service.EmailVerificationService; +import run.halo.app.core.user.service.UserService; import run.halo.app.extension.Metadata; import run.halo.app.extension.ReactiveExtensionClient; diff --git a/application/src/test/java/run/halo/app/core/extension/endpoint/PluginEndpointTest.java b/application/src/test/java/run/halo/app/core/endpoint/console/PluginEndpointTest.java similarity index 99% rename from application/src/test/java/run/halo/app/core/extension/endpoint/PluginEndpointTest.java rename to application/src/test/java/run/halo/app/core/endpoint/console/PluginEndpointTest.java index 2ff443606..7d931cba6 100644 --- a/application/src/test/java/run/halo/app/core/extension/endpoint/PluginEndpointTest.java +++ b/application/src/test/java/run/halo/app/core/endpoint/console/PluginEndpointTest.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.endpoint; +package run.halo.app.core.endpoint.console; import static java.util.Objects.requireNonNull; import static org.mockito.ArgumentMatchers.any; @@ -44,7 +44,6 @@ import org.springframework.web.server.ServerWebInputException; import reactor.core.publisher.Mono; import run.halo.app.core.extension.Plugin; import run.halo.app.core.extension.Setting; -import run.halo.app.core.extension.service.PluginService; import run.halo.app.extension.ConfigMap; import run.halo.app.extension.ListOptions; import run.halo.app.extension.ListResult; @@ -53,6 +52,7 @@ import run.halo.app.extension.PageRequest; import run.halo.app.extension.ReactiveExtensionClient; import run.halo.app.infra.SystemVersionSupplier; import run.halo.app.infra.utils.FileUtils; +import run.halo.app.plugin.PluginService; @Slf4j @ExtendWith(MockitoExtension.class) diff --git a/application/src/test/java/run/halo/app/core/extension/endpoint/PostEndpointTest.java b/application/src/test/java/run/halo/app/core/endpoint/console/PostEndpointTest.java similarity index 99% rename from application/src/test/java/run/halo/app/core/extension/endpoint/PostEndpointTest.java rename to application/src/test/java/run/halo/app/core/endpoint/console/PostEndpointTest.java index 7933535bd..0d4754962 100644 --- a/application/src/test/java/run/halo/app/core/extension/endpoint/PostEndpointTest.java +++ b/application/src/test/java/run/halo/app/core/endpoint/console/PostEndpointTest.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.endpoint; +package run.halo.app.core.endpoint.console; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; diff --git a/application/src/test/java/run/halo/app/core/extension/endpoint/SinglePageEndpointTest.java b/application/src/test/java/run/halo/app/core/endpoint/console/SinglePageEndpointTest.java similarity index 98% rename from application/src/test/java/run/halo/app/core/extension/endpoint/SinglePageEndpointTest.java rename to application/src/test/java/run/halo/app/core/endpoint/console/SinglePageEndpointTest.java index 9e3fcd873..cb911c4c2 100644 --- a/application/src/test/java/run/halo/app/core/extension/endpoint/SinglePageEndpointTest.java +++ b/application/src/test/java/run/halo/app/core/endpoint/console/SinglePageEndpointTest.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.endpoint; +package run.halo.app.core.endpoint.console; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; diff --git a/application/src/test/java/run/halo/app/core/extension/endpoint/SystemInitializationEndpointTest.java b/application/src/test/java/run/halo/app/core/endpoint/console/SystemInitializationEndpointTest.java similarity index 95% rename from application/src/test/java/run/halo/app/core/extension/endpoint/SystemInitializationEndpointTest.java rename to application/src/test/java/run/halo/app/core/endpoint/console/SystemInitializationEndpointTest.java index 82cf8a24d..cd2238e86 100644 --- a/application/src/test/java/run/halo/app/core/extension/endpoint/SystemInitializationEndpointTest.java +++ b/application/src/test/java/run/halo/app/core/endpoint/console/SystemInitializationEndpointTest.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.endpoint; +package run.halo.app.core.endpoint.console; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.verify; @@ -13,7 +13,7 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.test.web.reactive.server.WebTestClient; import reactor.core.publisher.Mono; -import run.halo.app.core.extension.endpoint.SystemInitializationEndpoint.SystemInitializationRequest; +import run.halo.app.core.endpoint.console.SystemInitializationEndpoint.SystemInitializationRequest; import run.halo.app.extension.ConfigMap; import run.halo.app.extension.ReactiveExtensionClient; import run.halo.app.infra.InitializationStateGetter; diff --git a/application/src/test/java/run/halo/app/core/extension/endpoint/TagEndpointTest.java b/application/src/test/java/run/halo/app/core/endpoint/console/TagEndpointTest.java similarity index 98% rename from application/src/test/java/run/halo/app/core/extension/endpoint/TagEndpointTest.java rename to application/src/test/java/run/halo/app/core/endpoint/console/TagEndpointTest.java index 1eb32141d..c1e08dbe5 100644 --- a/application/src/test/java/run/halo/app/core/extension/endpoint/TagEndpointTest.java +++ b/application/src/test/java/run/halo/app/core/endpoint/console/TagEndpointTest.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.endpoint; +package run.halo.app.core.endpoint.console; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.same; diff --git a/application/src/test/java/run/halo/app/core/extension/endpoint/UserEndpointIntegrationTest.java b/application/src/test/java/run/halo/app/core/endpoint/console/UserEndpointIntegrationTest.java similarity index 97% rename from application/src/test/java/run/halo/app/core/extension/endpoint/UserEndpointIntegrationTest.java rename to application/src/test/java/run/halo/app/core/endpoint/console/UserEndpointIntegrationTest.java index b83f2f6db..29cfae324 100644 --- a/application/src/test/java/run/halo/app/core/extension/endpoint/UserEndpointIntegrationTest.java +++ b/application/src/test/java/run/halo/app/core/endpoint/console/UserEndpointIntegrationTest.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.endpoint; +package run.halo.app.core.endpoint.console; import static org.mockito.ArgumentMatchers.anySet; import static org.mockito.Mockito.when; @@ -22,7 +22,7 @@ import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import run.halo.app.core.extension.Role; import run.halo.app.core.extension.User; -import run.halo.app.core.extension.service.RoleService; +import run.halo.app.core.user.service.RoleService; import run.halo.app.extension.Metadata; import run.halo.app.extension.ReactiveExtensionClient; diff --git a/application/src/test/java/run/halo/app/core/extension/endpoint/UserEndpointTest.java b/application/src/test/java/run/halo/app/core/endpoint/console/UserEndpointTest.java similarity index 99% rename from application/src/test/java/run/halo/app/core/extension/endpoint/UserEndpointTest.java rename to application/src/test/java/run/halo/app/core/endpoint/console/UserEndpointTest.java index 655c9370c..b76226258 100644 --- a/application/src/test/java/run/halo/app/core/extension/endpoint/UserEndpointTest.java +++ b/application/src/test/java/run/halo/app/core/endpoint/console/UserEndpointTest.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.endpoint; +package run.halo.app.core.endpoint.console; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.any; @@ -37,8 +37,8 @@ import run.halo.app.core.extension.Role; import run.halo.app.core.extension.User; import run.halo.app.core.extension.attachment.Attachment; import run.halo.app.core.extension.service.AttachmentService; -import run.halo.app.core.extension.service.RoleService; -import run.halo.app.core.extension.service.UserService; +import run.halo.app.core.user.service.RoleService; +import run.halo.app.core.user.service.UserService; import run.halo.app.extension.ListResult; import run.halo.app.extension.Metadata; import run.halo.app.extension.PageRequest; diff --git a/application/src/test/java/run/halo/app/theme/endpoint/CategoryQueryEndpointTest.java b/application/src/test/java/run/halo/app/core/endpoint/theme/CategoryQueryEndpointTest.java similarity index 98% rename from application/src/test/java/run/halo/app/theme/endpoint/CategoryQueryEndpointTest.java rename to application/src/test/java/run/halo/app/core/endpoint/theme/CategoryQueryEndpointTest.java index 9ba60c664..2f19d170e 100644 --- a/application/src/test/java/run/halo/app/theme/endpoint/CategoryQueryEndpointTest.java +++ b/application/src/test/java/run/halo/app/core/endpoint/theme/CategoryQueryEndpointTest.java @@ -1,4 +1,4 @@ -package run.halo.app.theme.endpoint; +package run.halo.app.core.endpoint.theme; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; diff --git a/application/src/test/java/run/halo/app/theme/endpoint/CommentFinderEndpointTest.java b/application/src/test/java/run/halo/app/core/endpoint/theme/CommentFinderEndpointTest.java similarity index 99% rename from application/src/test/java/run/halo/app/theme/endpoint/CommentFinderEndpointTest.java rename to application/src/test/java/run/halo/app/core/endpoint/theme/CommentFinderEndpointTest.java index 997b4d3c8..80f1bc01d 100644 --- a/application/src/test/java/run/halo/app/theme/endpoint/CommentFinderEndpointTest.java +++ b/application/src/test/java/run/halo/app/core/endpoint/theme/CommentFinderEndpointTest.java @@ -1,4 +1,4 @@ -package run.halo.app.theme.endpoint; +package run.halo.app.core.endpoint.theme; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; diff --git a/application/src/test/java/run/halo/app/theme/endpoint/MenuQueryEndpointTest.java b/application/src/test/java/run/halo/app/core/endpoint/theme/MenuQueryEndpointTest.java similarity index 98% rename from application/src/test/java/run/halo/app/theme/endpoint/MenuQueryEndpointTest.java rename to application/src/test/java/run/halo/app/core/endpoint/theme/MenuQueryEndpointTest.java index a6dbb503a..27e1c8e5d 100644 --- a/application/src/test/java/run/halo/app/theme/endpoint/MenuQueryEndpointTest.java +++ b/application/src/test/java/run/halo/app/core/endpoint/theme/MenuQueryEndpointTest.java @@ -1,4 +1,4 @@ -package run.halo.app.theme.endpoint; +package run.halo.app.core.endpoint.theme; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.eq; diff --git a/application/src/test/java/run/halo/app/theme/endpoint/PluginQueryEndpointTest.java b/application/src/test/java/run/halo/app/core/endpoint/theme/PluginQueryEndpointTest.java similarity index 97% rename from application/src/test/java/run/halo/app/theme/endpoint/PluginQueryEndpointTest.java rename to application/src/test/java/run/halo/app/core/endpoint/theme/PluginQueryEndpointTest.java index 739b92ca9..4b60a6091 100644 --- a/application/src/test/java/run/halo/app/theme/endpoint/PluginQueryEndpointTest.java +++ b/application/src/test/java/run/halo/app/core/endpoint/theme/PluginQueryEndpointTest.java @@ -1,4 +1,4 @@ -package run.halo.app.theme.endpoint; +package run.halo.app.core.endpoint.theme; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.when; diff --git a/application/src/test/java/run/halo/app/theme/endpoint/PostQueryEndpointTest.java b/application/src/test/java/run/halo/app/core/endpoint/theme/PostQueryEndpointTest.java similarity index 98% rename from application/src/test/java/run/halo/app/theme/endpoint/PostQueryEndpointTest.java rename to application/src/test/java/run/halo/app/core/endpoint/theme/PostQueryEndpointTest.java index f39f1396b..94a984f46 100644 --- a/application/src/test/java/run/halo/app/theme/endpoint/PostQueryEndpointTest.java +++ b/application/src/test/java/run/halo/app/core/endpoint/theme/PostQueryEndpointTest.java @@ -1,4 +1,4 @@ -package run.halo.app.theme.endpoint; +package run.halo.app.core.endpoint.theme; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; diff --git a/application/src/test/java/run/halo/app/theme/endpoint/PublicApiUtilsTest.java b/application/src/test/java/run/halo/app/core/endpoint/theme/PublicApiUtilsTest.java similarity index 97% rename from application/src/test/java/run/halo/app/theme/endpoint/PublicApiUtilsTest.java rename to application/src/test/java/run/halo/app/core/endpoint/theme/PublicApiUtilsTest.java index 56979ed7d..f7b32b72e 100644 --- a/application/src/test/java/run/halo/app/theme/endpoint/PublicApiUtilsTest.java +++ b/application/src/test/java/run/halo/app/core/endpoint/theme/PublicApiUtilsTest.java @@ -1,4 +1,4 @@ -package run.halo.app.theme.endpoint; +package run.halo.app.core.endpoint.theme; import static org.assertj.core.api.Assertions.assertThat; diff --git a/application/src/test/java/run/halo/app/theme/endpoint/PublicUserEndpointTest.java b/application/src/test/java/run/halo/app/core/endpoint/theme/PublicUserEndpointTest.java similarity index 97% rename from application/src/test/java/run/halo/app/theme/endpoint/PublicUserEndpointTest.java rename to application/src/test/java/run/halo/app/core/endpoint/theme/PublicUserEndpointTest.java index 8acdefcc0..b37a20da9 100644 --- a/application/src/test/java/run/halo/app/theme/endpoint/PublicUserEndpointTest.java +++ b/application/src/test/java/run/halo/app/core/endpoint/theme/PublicUserEndpointTest.java @@ -1,4 +1,4 @@ -package run.halo.app.theme.endpoint; +package run.halo.app.core.endpoint.theme; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; @@ -20,7 +20,7 @@ import org.springframework.security.web.server.context.ServerSecurityContextRepo import org.springframework.test.web.reactive.server.WebTestClient; import reactor.core.publisher.Mono; import run.halo.app.core.extension.User; -import run.halo.app.core.extension.service.UserService; +import run.halo.app.core.user.service.UserService; import run.halo.app.extension.Metadata; import run.halo.app.infra.SystemConfigurableEnvironmentFetcher; import run.halo.app.infra.SystemSetting; diff --git a/application/src/test/java/run/halo/app/theme/endpoint/SinglePageQueryEndpointTest.java b/application/src/test/java/run/halo/app/core/endpoint/theme/SinglePageQueryEndpointTest.java similarity index 98% rename from application/src/test/java/run/halo/app/theme/endpoint/SinglePageQueryEndpointTest.java rename to application/src/test/java/run/halo/app/core/endpoint/theme/SinglePageQueryEndpointTest.java index 4b56b1165..83ebb9ebf 100644 --- a/application/src/test/java/run/halo/app/theme/endpoint/SinglePageQueryEndpointTest.java +++ b/application/src/test/java/run/halo/app/core/endpoint/theme/SinglePageQueryEndpointTest.java @@ -1,4 +1,4 @@ -package run.halo.app.theme.endpoint; +package run.halo.app.core.endpoint.theme; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.eq; diff --git a/application/src/test/java/run/halo/app/theme/endpoint/ThumbnailEndpointTest.java b/application/src/test/java/run/halo/app/core/endpoint/theme/ThumbnailEndpointTest.java similarity index 97% rename from application/src/test/java/run/halo/app/theme/endpoint/ThumbnailEndpointTest.java rename to application/src/test/java/run/halo/app/core/endpoint/theme/ThumbnailEndpointTest.java index 18f3414e8..6d02dac6c 100644 --- a/application/src/test/java/run/halo/app/theme/endpoint/ThumbnailEndpointTest.java +++ b/application/src/test/java/run/halo/app/core/endpoint/theme/ThumbnailEndpointTest.java @@ -1,4 +1,4 @@ -package run.halo.app.theme.endpoint; +package run.halo.app.core.endpoint.theme; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; diff --git a/application/src/test/java/run/halo/app/core/extension/attachment/endpoint/AttachmentEndpointTest.java b/application/src/test/java/run/halo/app/core/extension/attachment/endpoint/AttachmentEndpointTest.java index 6e95e5e79..fb0a1ba56 100644 --- a/application/src/test/java/run/halo/app/core/extension/attachment/endpoint/AttachmentEndpointTest.java +++ b/application/src/test/java/run/halo/app/core/extension/attachment/endpoint/AttachmentEndpointTest.java @@ -28,11 +28,12 @@ import org.springframework.test.web.reactive.server.WebTestClient; import org.springframework.web.reactive.function.BodyInserters; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import run.halo.app.core.attachment.endpoint.AttachmentEndpoint; import run.halo.app.core.extension.attachment.Attachment; import run.halo.app.core.extension.attachment.Group; import run.halo.app.core.extension.attachment.Policy; import run.halo.app.core.extension.attachment.Policy.PolicySpec; -import run.halo.app.core.extension.service.impl.DefaultAttachmentService; +import run.halo.app.core.user.service.impl.DefaultAttachmentService; import run.halo.app.extension.ConfigMap; import run.halo.app.extension.ListResult; import run.halo.app.extension.Metadata; diff --git a/application/src/test/java/run/halo/app/core/extension/reconciler/CommentReconcilerTest.java b/application/src/test/java/run/halo/app/core/reconciler/CommentReconcilerTest.java similarity index 97% rename from application/src/test/java/run/halo/app/core/extension/reconciler/CommentReconcilerTest.java rename to application/src/test/java/run/halo/app/core/reconciler/CommentReconcilerTest.java index 1f6af9ec0..3a1e0bd60 100644 --- a/application/src/test/java/run/halo/app/core/extension/reconciler/CommentReconcilerTest.java +++ b/application/src/test/java/run/halo/app/core/reconciler/CommentReconcilerTest.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.reconciler; +package run.halo.app.core.reconciler; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; @@ -21,6 +21,7 @@ import org.mockito.junit.jupiter.MockitoExtension; import reactor.core.publisher.Mono; import run.halo.app.content.comment.ReplyService; import run.halo.app.core.extension.content.Comment; +import run.halo.app.core.reconciler.CommentReconciler; import run.halo.app.extension.ExtensionClient; import run.halo.app.extension.ListOptions; import run.halo.app.extension.ListResult; diff --git a/application/src/test/java/run/halo/app/core/extension/reconciler/MenuItemReconcilerTest.java b/application/src/test/java/run/halo/app/core/reconciler/MenuItemReconcilerTest.java similarity index 98% rename from application/src/test/java/run/halo/app/core/extension/reconciler/MenuItemReconcilerTest.java rename to application/src/test/java/run/halo/app/core/reconciler/MenuItemReconcilerTest.java index aec199326..ece57b13a 100644 --- a/application/src/test/java/run/halo/app/core/extension/reconciler/MenuItemReconcilerTest.java +++ b/application/src/test/java/run/halo/app/core/reconciler/MenuItemReconcilerTest.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.reconciler; +package run.halo.app.core.reconciler; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -24,6 +24,7 @@ import run.halo.app.core.extension.MenuItem; import run.halo.app.core.extension.MenuItem.MenuItemSpec; import run.halo.app.core.extension.content.Category; import run.halo.app.core.extension.content.SinglePage; +import run.halo.app.core.reconciler.MenuItemReconciler; import run.halo.app.extension.ExtensionClient; import run.halo.app.extension.Metadata; import run.halo.app.extension.Ref; diff --git a/application/src/test/java/run/halo/app/core/extension/reconciler/PluginReconcilerTest.java b/application/src/test/java/run/halo/app/core/reconciler/PluginReconcilerTest.java similarity index 99% rename from application/src/test/java/run/halo/app/core/extension/reconciler/PluginReconcilerTest.java rename to application/src/test/java/run/halo/app/core/reconciler/PluginReconcilerTest.java index 92652fb54..a22492cfc 100644 --- a/application/src/test/java/run/halo/app/core/extension/reconciler/PluginReconcilerTest.java +++ b/application/src/test/java/run/halo/app/core/reconciler/PluginReconcilerTest.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.reconciler; +package run.halo.app.core.reconciler; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -48,6 +48,7 @@ import org.springframework.core.io.DefaultResourceLoader; import run.halo.app.core.extension.Plugin; import run.halo.app.core.extension.ReverseProxy; import run.halo.app.core.extension.Setting; +import run.halo.app.core.reconciler.PluginReconciler; import run.halo.app.extension.ConfigMap; import run.halo.app.extension.ExtensionClient; import run.halo.app.extension.Metadata; diff --git a/application/src/test/java/run/halo/app/core/extension/reconciler/PostReconcilerTest.java b/application/src/test/java/run/halo/app/core/reconciler/PostReconcilerTest.java similarity index 99% rename from application/src/test/java/run/halo/app/core/extension/reconciler/PostReconcilerTest.java rename to application/src/test/java/run/halo/app/core/reconciler/PostReconcilerTest.java index b70152353..3dd75e516 100644 --- a/application/src/test/java/run/halo/app/core/extension/reconciler/PostReconcilerTest.java +++ b/application/src/test/java/run/halo/app/core/reconciler/PostReconcilerTest.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.reconciler; +package run.halo.app.core.reconciler; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; @@ -33,6 +33,7 @@ import run.halo.app.content.permalinks.PostPermalinkPolicy; import run.halo.app.core.extension.content.Post; import run.halo.app.core.extension.content.Snapshot; import run.halo.app.core.extension.notification.Subscription; +import run.halo.app.core.reconciler.PostReconciler; import run.halo.app.event.post.PostPublishedEvent; import run.halo.app.extension.ExtensionClient; import run.halo.app.extension.controller.Reconciler; diff --git a/application/src/test/java/run/halo/app/core/extension/reconciler/ReverseProxyReconcilerTest.java b/application/src/test/java/run/halo/app/core/reconciler/ReverseProxyReconcilerTest.java similarity index 95% rename from application/src/test/java/run/halo/app/core/extension/reconciler/ReverseProxyReconcilerTest.java rename to application/src/test/java/run/halo/app/core/reconciler/ReverseProxyReconcilerTest.java index 0f88e2392..30b22eca5 100644 --- a/application/src/test/java/run/halo/app/core/extension/reconciler/ReverseProxyReconcilerTest.java +++ b/application/src/test/java/run/halo/app/core/reconciler/ReverseProxyReconcilerTest.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.reconciler; +package run.halo.app.core.reconciler; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; @@ -19,6 +19,7 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import run.halo.app.core.extension.ReverseProxy; +import run.halo.app.core.reconciler.ReverseProxyReconciler; import run.halo.app.extension.ExtensionClient; import run.halo.app.extension.Metadata; import run.halo.app.extension.controller.Reconciler; diff --git a/application/src/test/java/run/halo/app/core/extension/reconciler/SinglePageReconcilerTest.java b/application/src/test/java/run/halo/app/core/reconciler/SinglePageReconcilerTest.java similarity index 99% rename from application/src/test/java/run/halo/app/core/extension/reconciler/SinglePageReconcilerTest.java rename to application/src/test/java/run/halo/app/core/reconciler/SinglePageReconcilerTest.java index 486efadad..6b7ce7fbb 100644 --- a/application/src/test/java/run/halo/app/core/extension/reconciler/SinglePageReconcilerTest.java +++ b/application/src/test/java/run/halo/app/core/reconciler/SinglePageReconcilerTest.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.reconciler; +package run.halo.app.core.reconciler; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; @@ -34,6 +34,7 @@ import run.halo.app.core.extension.content.Post; import run.halo.app.core.extension.content.SinglePage; import run.halo.app.core.extension.content.Snapshot; import run.halo.app.core.extension.notification.Subscription; +import run.halo.app.core.reconciler.SinglePageReconciler; import run.halo.app.extension.ExtensionClient; import run.halo.app.extension.Metadata; import run.halo.app.extension.controller.Reconciler; diff --git a/application/src/test/java/run/halo/app/core/extension/reconciler/SystemSettingReconcilerTest.java b/application/src/test/java/run/halo/app/core/reconciler/SystemSettingReconcilerTest.java similarity index 98% rename from application/src/test/java/run/halo/app/core/extension/reconciler/SystemSettingReconcilerTest.java rename to application/src/test/java/run/halo/app/core/reconciler/SystemSettingReconcilerTest.java index 61edc6aa4..24a1518bd 100644 --- a/application/src/test/java/run/halo/app/core/extension/reconciler/SystemSettingReconcilerTest.java +++ b/application/src/test/java/run/halo/app/core/reconciler/SystemSettingReconcilerTest.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.reconciler; +package run.halo.app.core.reconciler; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; @@ -18,6 +18,7 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.context.ApplicationContext; +import run.halo.app.core.reconciler.SystemSettingReconciler; import run.halo.app.extension.ConfigMap; import run.halo.app.extension.ExtensionClient; import run.halo.app.extension.Metadata; diff --git a/application/src/test/java/run/halo/app/core/extension/reconciler/TagReconcilerTest.java b/application/src/test/java/run/halo/app/core/reconciler/TagReconcilerTest.java similarity index 97% rename from application/src/test/java/run/halo/app/core/extension/reconciler/TagReconcilerTest.java rename to application/src/test/java/run/halo/app/core/reconciler/TagReconcilerTest.java index d88fe3ca9..522e76c3f 100644 --- a/application/src/test/java/run/halo/app/core/extension/reconciler/TagReconcilerTest.java +++ b/application/src/test/java/run/halo/app/core/reconciler/TagReconcilerTest.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.reconciler; +package run.halo.app.core.reconciler; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; @@ -18,6 +18,7 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import run.halo.app.content.permalinks.TagPermalinkPolicy; import run.halo.app.core.extension.content.Tag; +import run.halo.app.core.reconciler.TagReconciler; import run.halo.app.extension.ExtensionClient; import run.halo.app.extension.Metadata; diff --git a/application/src/test/java/run/halo/app/core/extension/reconciler/ThemeReconcilerTest.java b/application/src/test/java/run/halo/app/core/reconciler/ThemeReconcilerTest.java similarity index 99% rename from application/src/test/java/run/halo/app/core/extension/reconciler/ThemeReconcilerTest.java rename to application/src/test/java/run/halo/app/core/reconciler/ThemeReconcilerTest.java index e95044c8c..ec6eea853 100644 --- a/application/src/test/java/run/halo/app/core/extension/reconciler/ThemeReconcilerTest.java +++ b/application/src/test/java/run/halo/app/core/reconciler/ThemeReconcilerTest.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.reconciler; +package run.halo.app.core.reconciler; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; @@ -35,6 +35,7 @@ import org.springframework.util.ResourceUtils; import run.halo.app.core.extension.AnnotationSetting; import run.halo.app.core.extension.Setting; import run.halo.app.core.extension.Theme; +import run.halo.app.core.reconciler.ThemeReconciler; import run.halo.app.extension.ConfigMap; import run.halo.app.extension.ExtensionClient; import run.halo.app.extension.Metadata; diff --git a/application/src/test/java/run/halo/app/core/extension/reconciler/UserReconcilerTest.java b/application/src/test/java/run/halo/app/core/reconciler/UserReconcilerTest.java similarity index 96% rename from application/src/test/java/run/halo/app/core/extension/reconciler/UserReconcilerTest.java rename to application/src/test/java/run/halo/app/core/reconciler/UserReconcilerTest.java index f54997d69..7aca878e9 100644 --- a/application/src/test/java/run/halo/app/core/extension/reconciler/UserReconcilerTest.java +++ b/application/src/test/java/run/halo/app/core/reconciler/UserReconcilerTest.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.reconciler; +package run.halo.app.core.reconciler; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.any; @@ -21,7 +21,8 @@ import org.mockito.junit.jupiter.MockitoExtension; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import run.halo.app.core.extension.User; -import run.halo.app.core.extension.service.RoleService; +import run.halo.app.core.reconciler.UserReconciler; +import run.halo.app.core.user.service.RoleService; import run.halo.app.extension.ExtensionClient; import run.halo.app.extension.Metadata; import run.halo.app.extension.controller.Reconciler; diff --git a/application/src/test/java/run/halo/app/core/extension/service/DefaultRoleServiceTest.java b/application/src/test/java/run/halo/app/core/user/service/DefaultRoleServiceTest.java similarity index 99% rename from application/src/test/java/run/halo/app/core/extension/service/DefaultRoleServiceTest.java rename to application/src/test/java/run/halo/app/core/user/service/DefaultRoleServiceTest.java index 2498b0e10..ccd13f203 100644 --- a/application/src/test/java/run/halo/app/core/extension/service/DefaultRoleServiceTest.java +++ b/application/src/test/java/run/halo/app/core/user/service/DefaultRoleServiceTest.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.service; +package run.halo.app.core.user.service; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.same; @@ -29,6 +29,7 @@ import reactor.core.publisher.Flux; import reactor.test.StepVerifier; import run.halo.app.core.extension.Role; import run.halo.app.core.extension.RoleBinding; +import run.halo.app.core.user.service.DefaultRoleService; import run.halo.app.extension.ListOptions; import run.halo.app.extension.Metadata; import run.halo.app.extension.ReactiveExtensionClient; diff --git a/application/src/test/java/run/halo/app/core/extension/service/UserServiceImplTest.java b/application/src/test/java/run/halo/app/core/user/service/UserServiceImplTest.java similarity index 99% rename from application/src/test/java/run/halo/app/core/extension/service/UserServiceImplTest.java rename to application/src/test/java/run/halo/app/core/user/service/UserServiceImplTest.java index 8b63e0435..08a400a7a 100644 --- a/application/src/test/java/run/halo/app/core/extension/service/UserServiceImplTest.java +++ b/application/src/test/java/run/halo/app/core/user/service/UserServiceImplTest.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.service; +package run.halo.app.core.user.service; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -34,6 +34,8 @@ import run.halo.app.core.extension.Role; import run.halo.app.core.extension.RoleBinding; import run.halo.app.core.extension.RoleBinding.Subject; import run.halo.app.core.extension.User; +import run.halo.app.core.user.service.RoleService; +import run.halo.app.core.user.service.UserServiceImpl; import run.halo.app.event.user.PasswordChangedEvent; import run.halo.app.extension.Metadata; import run.halo.app.extension.ReactiveExtensionClient; diff --git a/application/src/test/java/run/halo/app/core/extension/service/impl/EmailPasswordRecoveryServiceImplTest.java b/application/src/test/java/run/halo/app/core/user/service/impl/EmailPasswordRecoveryServiceImplTest.java similarity index 96% rename from application/src/test/java/run/halo/app/core/extension/service/impl/EmailPasswordRecoveryServiceImplTest.java rename to application/src/test/java/run/halo/app/core/user/service/impl/EmailPasswordRecoveryServiceImplTest.java index 1d95fced0..37804408e 100644 --- a/application/src/test/java/run/halo/app/core/extension/service/impl/EmailPasswordRecoveryServiceImplTest.java +++ b/application/src/test/java/run/halo/app/core/user/service/impl/EmailPasswordRecoveryServiceImplTest.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.service.impl; +package run.halo.app.core.user.service.impl; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -7,6 +7,7 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.junit.jupiter.MockitoExtension; +import run.halo.app.core.user.service.impl.EmailPasswordRecoveryServiceImpl; import run.halo.app.infra.exception.RateLimitExceededException; /** diff --git a/application/src/test/java/run/halo/app/core/extension/service/impl/EmailVerificationServiceImplTest.java b/application/src/test/java/run/halo/app/core/user/service/impl/EmailVerificationServiceImplTest.java similarity index 94% rename from application/src/test/java/run/halo/app/core/extension/service/impl/EmailVerificationServiceImplTest.java rename to application/src/test/java/run/halo/app/core/user/service/impl/EmailVerificationServiceImplTest.java index 81a99bf02..ab3f3369d 100644 --- a/application/src/test/java/run/halo/app/core/extension/service/impl/EmailVerificationServiceImplTest.java +++ b/application/src/test/java/run/halo/app/core/user/service/impl/EmailVerificationServiceImplTest.java @@ -1,13 +1,14 @@ -package run.halo.app.core.extension.service.impl; +package run.halo.app.core.user.service.impl; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static run.halo.app.core.extension.service.impl.EmailVerificationServiceImpl.MAX_ATTEMPTS; +import static run.halo.app.core.user.service.impl.EmailVerificationServiceImpl.MAX_ATTEMPTS; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.junit.jupiter.MockitoExtension; +import run.halo.app.core.user.service.impl.EmailVerificationServiceImpl; import run.halo.app.infra.exception.EmailVerificationFailed; /** diff --git a/application/src/test/java/run/halo/app/core/extension/theme/SettingUtilsTest.java b/application/src/test/java/run/halo/app/infra/utils/SettingUtilsTest.java similarity index 98% rename from application/src/test/java/run/halo/app/core/extension/theme/SettingUtilsTest.java rename to application/src/test/java/run/halo/app/infra/utils/SettingUtilsTest.java index bbed17119..32ee6b6f4 100644 --- a/application/src/test/java/run/halo/app/core/extension/theme/SettingUtilsTest.java +++ b/application/src/test/java/run/halo/app/infra/utils/SettingUtilsTest.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.theme; +package run.halo.app.infra.utils; import static org.assertj.core.api.Assertions.assertThat; @@ -7,7 +7,6 @@ import org.json.JSONException; import org.junit.jupiter.api.Test; import org.skyscreamer.jsonassert.JSONAssert; import run.halo.app.core.extension.Setting; -import run.halo.app.infra.utils.JsonUtils; /** * Tests for {@link SettingUtils}. diff --git a/application/src/test/java/run/halo/app/core/extension/service/impl/PluginServiceImplTest.java b/application/src/test/java/run/halo/app/plugin/PluginServiceImplTest.java similarity index 98% rename from application/src/test/java/run/halo/app/core/extension/service/impl/PluginServiceImplTest.java rename to application/src/test/java/run/halo/app/plugin/PluginServiceImplTest.java index d90303fa1..bb38bd0fd 100644 --- a/application/src/test/java/run/halo/app/core/extension/service/impl/PluginServiceImplTest.java +++ b/application/src/test/java/run/halo/app/plugin/PluginServiceImplTest.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.service.impl; +package run.halo.app.plugin; import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.Objects.requireNonNull; @@ -57,10 +57,6 @@ import run.halo.app.extension.ReactiveExtensionClient; import run.halo.app.infra.SystemVersionSupplier; import run.halo.app.infra.exception.PluginAlreadyExistsException; import run.halo.app.infra.utils.FileUtils; -import run.halo.app.plugin.PluginConst; -import run.halo.app.plugin.PluginsRootGetter; -import run.halo.app.plugin.SpringPluginManager; -import run.halo.app.plugin.YamlPluginFinder; @ExtendWith(MockitoExtension.class) class PluginServiceImplTest { diff --git a/application/src/test/java/run/halo/app/security/DefaultUserDetailServiceTest.java b/application/src/test/java/run/halo/app/security/DefaultUserDetailServiceTest.java index 123f4362b..58cc144c2 100644 --- a/application/src/test/java/run/halo/app/security/DefaultUserDetailServiceTest.java +++ b/application/src/test/java/run/halo/app/security/DefaultUserDetailServiceTest.java @@ -23,8 +23,8 @@ import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.test.StepVerifier; import run.halo.app.core.extension.Role; -import run.halo.app.core.extension.service.RoleService; -import run.halo.app.core.extension.service.UserService; +import run.halo.app.core.user.service.RoleService; +import run.halo.app.core.user.service.UserService; import run.halo.app.extension.Metadata; import run.halo.app.infra.exception.UserNotFoundException; diff --git a/application/src/test/java/run/halo/app/security/authorization/AuthorizationTest.java b/application/src/test/java/run/halo/app/security/authorization/AuthorizationTest.java index 23d2e7998..21a6758d7 100644 --- a/application/src/test/java/run/halo/app/security/authorization/AuthorizationTest.java +++ b/application/src/test/java/run/halo/app/security/authorization/AuthorizationTest.java @@ -35,7 +35,7 @@ import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import run.halo.app.core.extension.Role; import run.halo.app.core.extension.Role.PolicyRule; -import run.halo.app.core.extension.service.RoleService; +import run.halo.app.core.user.service.RoleService; import run.halo.app.extension.ExtensionClient; import run.halo.app.extension.Metadata; import run.halo.app.infra.AnonymousUserConst; diff --git a/application/src/test/java/run/halo/app/security/authorization/DefaultRuleResolverTest.java b/application/src/test/java/run/halo/app/security/authorization/DefaultRuleResolverTest.java index a311bac5d..bc91cd9d1 100644 --- a/application/src/test/java/run/halo/app/security/authorization/DefaultRuleResolverTest.java +++ b/application/src/test/java/run/halo/app/security/authorization/DefaultRuleResolverTest.java @@ -21,7 +21,7 @@ import reactor.core.publisher.Flux; import reactor.test.StepVerifier; import run.halo.app.core.extension.Role; import run.halo.app.core.extension.Role.PolicyRule; -import run.halo.app.core.extension.service.RoleService; +import run.halo.app.core.user.service.RoleService; import run.halo.app.extension.Metadata; @ExtendWith(MockitoExtension.class) diff --git a/application/src/test/java/run/halo/app/core/extension/theme/ThemeEndpointTest.java b/application/src/test/java/run/halo/app/theme/endpoint/ThemeEndpointTest.java similarity index 99% rename from application/src/test/java/run/halo/app/core/extension/theme/ThemeEndpointTest.java rename to application/src/test/java/run/halo/app/theme/endpoint/ThemeEndpointTest.java index 4fc3194bb..751966ebe 100644 --- a/application/src/test/java/run/halo/app/core/extension/theme/ThemeEndpointTest.java +++ b/application/src/test/java/run/halo/app/theme/endpoint/ThemeEndpointTest.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.theme; +package run.halo.app.theme.endpoint; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; @@ -41,6 +41,7 @@ import run.halo.app.infra.SystemConfigurableEnvironmentFetcher; import run.halo.app.infra.SystemSetting; import run.halo.app.infra.ThemeRootGetter; import run.halo.app.theme.TemplateEngineManager; +import run.halo.app.theme.service.ThemeService; /** * Tests for {@link ThemeEndpoint}. diff --git a/application/src/test/java/run/halo/app/theme/finders/impl/CommentPublicQueryServiceImplTest.java b/application/src/test/java/run/halo/app/theme/finders/impl/CommentPublicQueryServiceImplTest.java index f1c883340..0a4a8060d 100644 --- a/application/src/test/java/run/halo/app/theme/finders/impl/CommentPublicQueryServiceImplTest.java +++ b/application/src/test/java/run/halo/app/theme/finders/impl/CommentPublicQueryServiceImplTest.java @@ -24,7 +24,7 @@ import run.halo.app.core.extension.Counter; import run.halo.app.core.extension.User; import run.halo.app.core.extension.content.Comment; import run.halo.app.core.extension.content.Post; -import run.halo.app.core.extension.service.UserService; +import run.halo.app.core.user.service.UserService; import run.halo.app.extension.GroupVersionKind; import run.halo.app.extension.ListResult; import run.halo.app.extension.Metadata; diff --git a/application/src/test/java/run/halo/app/core/extension/theme/ThemeServiceImplTest.java b/application/src/test/java/run/halo/app/theme/service/ThemeServiceImplTest.java similarity index 99% rename from application/src/test/java/run/halo/app/core/extension/theme/ThemeServiceImplTest.java rename to application/src/test/java/run/halo/app/theme/service/ThemeServiceImplTest.java index 6ef808b8d..184e38a57 100644 --- a/application/src/test/java/run/halo/app/core/extension/theme/ThemeServiceImplTest.java +++ b/application/src/test/java/run/halo/app/theme/service/ThemeServiceImplTest.java @@ -1,4 +1,4 @@ -package run.halo.app.core.extension.theme; +package run.halo.app.theme.service; import static java.nio.file.Files.createTempDirectory; import static org.assertj.core.api.Assertions.assertThat; diff --git a/application/src/test/java/run/halo/app/webfilter/LocaleChangeWebFilterTest.java b/application/src/test/java/run/halo/app/webfilter/LocaleChangeWebFilterTest.java index 0ec207fa8..417bc132e 100644 --- a/application/src/test/java/run/halo/app/webfilter/LocaleChangeWebFilterTest.java +++ b/application/src/test/java/run/halo/app/webfilter/LocaleChangeWebFilterTest.java @@ -14,6 +14,7 @@ import org.springframework.mock.http.server.reactive.MockServerHttpRequest; import org.springframework.mock.web.server.MockServerWebExchange; import org.springframework.web.server.WebFilterChain; import reactor.core.publisher.Mono; +import run.halo.app.infra.webfilter.LocaleChangeWebFilter; class LocaleChangeWebFilterTest {