From 723eb1a7690e03e851f1d315b5b924c133ef0fb3 Mon Sep 17 00:00:00 2001 From: "DESKTOP-T0O5CDB\\DESK-555BD" Date: Sat, 17 May 2025 10:14:36 -0600 Subject: [PATCH] Added API endpoint to check for latest release. --- Controllers/APIController.cs | 27 ++++++++++++++++++++++++--- Helper/StaticHelper.cs | 1 + Models/API/ReleaseVersion.cs | 18 ++++++++++++++++++ Views/API/Index.cshtml | 14 ++++++++++++++ 4 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 Models/API/ReleaseVersion.cs diff --git a/Controllers/APIController.cs b/Controllers/APIController.cs index 92bc258..a3e490d 100644 --- a/Controllers/APIController.cs +++ b/Controllers/APIController.cs @@ -113,10 +113,31 @@ namespace CarCareTracker.Controllers } [HttpGet] [Route("/api/version")] - public IActionResult ServerVersion() + public async Task ServerVersion(bool checkForUpdate = false) { - var serverVersion = StaticHelper.VersionNumber; - return Json(serverVersion); + var viewModel = new ReleaseVersion + { + CurrentVersion = StaticHelper.VersionNumber, + LatestVersion = StaticHelper.VersionNumber + }; + if (checkForUpdate) + { + try + { + var httpClient = new HttpClient(); + httpClient.DefaultRequestHeaders.UserAgent.TryParseAdd("request"); + var releaseResponse = await httpClient.GetFromJsonAsync(StaticHelper.ReleasePath) ?? new ReleaseResponse(); + if (!string.IsNullOrWhiteSpace(releaseResponse.tag_name)) + { + viewModel.LatestVersion = releaseResponse.tag_name; + } + } + catch (Exception ex) + { + return Json(OperationResponse.Failed($"Unable to retrieve latest version from GitHub API: {ex.Message}")); + } + } + return Json(viewModel); } [HttpGet] [Route("/api/vehicles")] diff --git a/Helper/StaticHelper.cs b/Helper/StaticHelper.cs index 7020753..aa88365 100644 --- a/Helper/StaticHelper.cs +++ b/Helper/StaticHelper.cs @@ -22,6 +22,7 @@ namespace CarCareTracker.Helper public const string DefaultAllowedFileExtensions = ".png,.jpg,.jpeg,.pdf,.xls,.xlsx,.docx"; public const string SponsorsPath = "https://hargata.github.io/hargata/sponsors.json"; public const string TranslationPath = "https://hargata.github.io/lubelog_translations"; + public const string ReleasePath = "https://api.github.com/repos/hargata/lubelog/releases/latest"; public const string TranslationDirectoryPath = $"{TranslationPath}/directory.json"; public const string ReportNote = "Report generated by LubeLogger, a Free and Open Source Vehicle Maintenance Tracker - LubeLogger.com"; public static string GetTitleCaseReminderUrgency(ReminderUrgency input) diff --git a/Models/API/ReleaseVersion.cs b/Models/API/ReleaseVersion.cs new file mode 100644 index 0000000..35a8b95 --- /dev/null +++ b/Models/API/ReleaseVersion.cs @@ -0,0 +1,18 @@ +namespace CarCareTracker.Models +{ + /// + /// For deserializing GitHub response for latest version + /// + public class ReleaseResponse + { + public string tag_name { get; set; } + } + /// + /// For returning the version numbers via API. + /// + public class ReleaseVersion + { + public string CurrentVersion { get; set; } + public string LatestVersion { get; set; } + } +} diff --git a/Views/API/Index.cshtml b/Views/API/Index.cshtml index 8a71a68..275eb2d 100644 --- a/Views/API/Index.cshtml +++ b/Views/API/Index.cshtml @@ -40,6 +40,20 @@ No Params +
+
+ GET +
+
+ /api/version +
+
+ Returns current version of LubeLogger and checks for updates +
+
+ CheckForUpdate(bool) - checks for update(optional) +
+
GET