Skip to content

Commit 19d45df

Browse files
Introduce UpdateChecker class for managing version updates and integrate it into AppConfiguration
1 parent c0280be commit 19d45df

File tree

2 files changed

+56
-0
lines changed

2 files changed

+56
-0
lines changed

src/main/java/net/andrecarbajal/mine_control_cli/config/AppConfiguration.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import net.andrecarbajal.mine_control_cli.config.path.ApplicationPathResolver;
66
import net.andrecarbajal.mine_control_cli.config.properties.ConfigProperties;
77
import net.andrecarbajal.mine_control_cli.config.properties.ConfigurationManager;
8+
import net.andrecarbajal.mine_control_cli.util.api.UpdateChecker;
89
import net.andrecarbajal.mine_control_cli.util.ui.ProgressBar;
910
import org.jline.terminal.Terminal;
1011
import org.springframework.context.annotation.Bean;
@@ -20,13 +21,15 @@
2021
public class AppConfiguration {
2122
private final ApplicationProperties applicationProperties;
2223
private final ApplicationPathResolver applicationPathResolver;
24+
private final UpdateChecker updateChecker;
2325
private ConfigProperties configProperties;
2426
private Path instancesPath;
2527
private Path backupsPath;
2628

2729
public AppConfiguration(ApplicationProperties applicationProperties) {
2830
this.applicationProperties = applicationProperties;
2931
this.applicationPathResolver = new ApplicationPathResolver(applicationProperties);
32+
this.updateChecker = new UpdateChecker(applicationProperties);
3033
}
3134

3235
@PostConstruct
@@ -57,6 +60,15 @@ private void initializePaths() {
5760
}
5861
}
5962

63+
@Bean
64+
public String updateChecker() {
65+
updateChecker.checkForUpdates().ifPresent(update -> {
66+
System.out.println("A new version is available: " + update.version());
67+
System.out.println("Download it at: " + update.downloadUrl());
68+
});
69+
return "Update Checker";
70+
}
71+
6072
@Bean
6173
public ConfigProperties configProperties() {
6274
return configProperties;
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package net.andrecarbajal.mine_control_cli.util.api;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import net.andrecarbajal.mine_control_cli.config.ApplicationProperties;
5+
import org.json.JSONArray;
6+
7+
import java.util.Optional;
8+
9+
@RequiredArgsConstructor
10+
public class UpdateChecker {
11+
private final ApplicationProperties applicationProperties;
12+
13+
private static final String GITHUB_API_URL = "https://api.github.com/repos/MineControlCli/mine-control-cli/tags";
14+
private static final String DOWNLOAD_URL = "https://github.com/MineControlCli/mine-control-cli/releases";
15+
16+
public Optional<UpdateInfo> checkForUpdates() {
17+
JSONArray jsonArray = ApiClient.getJsonArray(GITHUB_API_URL);
18+
String latestVersion = jsonArray.getJSONObject(0).getString("name");
19+
return latestVersion != null && isNewerVersion(latestVersion) ? Optional.of(new UpdateInfo(latestVersion, DOWNLOAD_URL)) : Optional.empty();
20+
}
21+
22+
private boolean isNewerVersion(String latestVersion) {
23+
String normalizedLatestVersion = latestVersion.startsWith("v") ? latestVersion.substring(1) : latestVersion;
24+
25+
String[] latestParts = normalizedLatestVersion.split("\\.");
26+
String[] currentParts = applicationProperties.getVersion().split("\\.");
27+
28+
for (int i = 0; i < Math.min(latestParts.length, currentParts.length); i++) {
29+
int latestPart = Integer.parseInt(latestParts[i]);
30+
int currentPart = Integer.parseInt(currentParts[i]);
31+
32+
if (latestPart > currentPart) {
33+
return true;
34+
} else if (latestPart < currentPart) {
35+
return false;
36+
}
37+
}
38+
39+
return latestParts.length > currentParts.length;
40+
}
41+
42+
public record UpdateInfo(String version, String downloadUrl) {
43+
}
44+
}

0 commit comments

Comments
 (0)