diff --git a/api/src/main/java/io/kafbat/ui/service/ApplicationInfoService.java b/api/src/main/java/io/kafbat/ui/service/ApplicationInfoService.java index 7d380036c..550e6a1ce 100644 --- a/api/src/main/java/io/kafbat/ui/service/ApplicationInfoService.java +++ b/api/src/main/java/io/kafbat/ui/service/ApplicationInfoService.java @@ -73,7 +73,7 @@ private List getEnabledFeatures() { // updating on startup and every hour @Scheduled(fixedRateString = "${github-release-info-update-rate:3600000}") public void updateGithubReleaseInfo() { - githubReleaseInfo.refresh().subscribe(); + githubReleaseInfo.refresh(); } @VisibleForTesting diff --git a/api/src/main/java/io/kafbat/ui/util/GithubReleaseInfo.java b/api/src/main/java/io/kafbat/ui/util/GithubReleaseInfo.java index ba767a65a..b2e6d8e74 100644 --- a/api/src/main/java/io/kafbat/ui/util/GithubReleaseInfo.java +++ b/api/src/main/java/io/kafbat/ui/util/GithubReleaseInfo.java @@ -1,6 +1,5 @@ package io.kafbat.ui.util; -import com.google.common.annotations.VisibleForTesting; import java.time.Duration; import lombok.Getter; import lombok.extern.slf4j.Slf4j; @@ -9,48 +8,48 @@ @Slf4j public class GithubReleaseInfo { public static final String GITHUB_RELEASE_INFO_TIMEOUT = "github.release.info.timeout"; - private static final String GITHUB_LATEST_RELEASE_RETRIEVAL_URL = "https://api.github.com/repos/kafbat/kafka-ui/releases/latest"; public record GithubReleaseDto(String html_url, String tag_name, String published_at) { - static GithubReleaseDto empty() { return new GithubReleaseDto(null, null, null); } } - private volatile GithubReleaseDto release = GithubReleaseDto.empty(); - - private final Mono refreshMono; - @Getter private final int githubApiMaxWaitTime; + private volatile GithubReleaseDto release; public GithubReleaseInfo(int githubApiMaxWaitTime) { - this(GITHUB_LATEST_RELEASE_RETRIEVAL_URL, githubApiMaxWaitTime); + this.githubApiMaxWaitTime = githubApiMaxWaitTime; } - @VisibleForTesting - GithubReleaseInfo(String url, int githubApiMaxWaitTime) { - this.githubApiMaxWaitTime = githubApiMaxWaitTime; - this.refreshMono = new WebClientConfigurator().build() + public GithubReleaseDto get() { + if (release != null) { + return release; + } + + refresh(); + return release == null ? GithubReleaseDto.empty() : release; + } + + public void refresh() { + refresh(GITHUB_LATEST_RELEASE_RETRIEVAL_URL); + } + + public void refresh(String url) { + new WebClientConfigurator().build() .get() .uri(url) .exchangeToMono(resp -> resp.bodyToMono(GithubReleaseDto.class)) - .timeout(Duration.ofSeconds(this.githubApiMaxWaitTime)) - .doOnError(th -> log.trace("Error getting latest github release info", th)) + .timeout(Duration.ofSeconds(githubApiMaxWaitTime)) + .doOnError(th -> log.error("Failed to retrieve latest release info", th)) .onErrorResume(th -> true, th -> Mono.just(GithubReleaseDto.empty())) - .doOnNext(release -> this.release = release) - .then(); + .doOnNext(r -> this.release = r) + .block(); } - public GithubReleaseDto get() { - return release; - } - public Mono refresh() { - return refreshMono; - } } diff --git a/api/src/test/java/io/kafbat/ui/util/GithubReleaseInfoTest.java b/api/src/test/java/io/kafbat/ui/util/GithubReleaseInfoTest.java index 8d78cedfc..db9b9c8d5 100644 --- a/api/src/test/java/io/kafbat/ui/util/GithubReleaseInfoTest.java +++ b/api/src/test/java/io/kafbat/ui/util/GithubReleaseInfoTest.java @@ -25,6 +25,9 @@ void stopMockServer() throws IOException { @Test void test() { + var infoHolder = new GithubReleaseInfo(10); + var url = mockWebServer.url("repos/kafbat/kafka-ui/releases/latest").toString(); + mockWebServer.enqueue(new MockResponse() .addHeader("content-type: application/json") .setBody(""" @@ -35,10 +38,8 @@ void test() { "some_unused_prop": "ololo" } """)); - var url = mockWebServer.url("repos/kafbat/kafka-ui/releases/latest").toString(); - var infoHolder = new GithubReleaseInfo(url, 10); - infoHolder.refresh().block(); + infoHolder.refresh(url); var i = infoHolder.get(); assertThat(i.html_url())