diff --git a/Marechai.App/Services/Client/ApiClient.cs b/Marechai.App/Services/Client/ApiClient.cs index 3738fdec..c03efe3c 100644 --- a/Marechai.App/Services/Client/ApiClient.cs +++ b/Marechai.App/Services/Client/ApiClient.cs @@ -3,12 +3,9 @@ using Marechai.App.Auth; using Marechai.App.Books; using Marechai.App.BrowserTests; -using Marechai.App.ByLetter; -using Marechai.App.ByYear; using Marechai.App.Companies; using Marechai.App.Computers; using Marechai.App.Consoles; -using Marechai.App.Count; using Marechai.App.Countries; using Marechai.App.Currencies; using Marechai.App.Documents; @@ -25,10 +22,8 @@ using Marechai.App.Machines; using Marechai.App.Magazines; using Marechai.App.MagazinesByMachine; using Marechai.App.MagazinesByMachineFamily; -using Marechai.App.MaximumYear; using Marechai.App.Medias; using Marechai.App.MemoriesByMachine; -using Marechai.App.MinimumYear; using Marechai.App.News; using Marechai.App.People; using Marechai.App.PeopleByBook; @@ -79,16 +74,6 @@ namespace Marechai.App { get => new global::Marechai.App.BrowserTests.BrowserTestsRequestBuilder(PathParameters, RequestAdapter); } - /// The byLetter property - public global::Marechai.App.ByLetter.ByLetterRequestBuilder ByLetter - { - get => new global::Marechai.App.ByLetter.ByLetterRequestBuilder(PathParameters, RequestAdapter); - } - /// The byYear property - public global::Marechai.App.ByYear.ByYearRequestBuilder ByYear - { - get => new global::Marechai.App.ByYear.ByYearRequestBuilder(PathParameters, RequestAdapter); - } /// The companies property public global::Marechai.App.Companies.CompaniesRequestBuilder Companies { @@ -104,11 +89,6 @@ namespace Marechai.App { get => new global::Marechai.App.Consoles.ConsolesRequestBuilder(PathParameters, RequestAdapter); } - /// The count property - public global::Marechai.App.Count.CountRequestBuilder Count - { - get => new global::Marechai.App.Count.CountRequestBuilder(PathParameters, RequestAdapter); - } /// The countries property public global::Marechai.App.Countries.CountriesRequestBuilder Countries { @@ -189,11 +169,6 @@ namespace Marechai.App { get => new global::Marechai.App.MagazinesByMachineFamily.MagazinesByMachineFamilyRequestBuilder(PathParameters, RequestAdapter); } - /// The maximumYear property - public global::Marechai.App.MaximumYear.MaximumYearRequestBuilder MaximumYear - { - get => new global::Marechai.App.MaximumYear.MaximumYearRequestBuilder(PathParameters, RequestAdapter); - } /// The medias property public global::Marechai.App.Medias.MediasRequestBuilder Medias { @@ -204,11 +179,6 @@ namespace Marechai.App { get => new global::Marechai.App.MemoriesByMachine.MemoriesByMachineRequestBuilder(PathParameters, RequestAdapter); } - /// The minimumYear property - public global::Marechai.App.MinimumYear.MinimumYearRequestBuilder MinimumYear - { - get => new global::Marechai.App.MinimumYear.MinimumYearRequestBuilder(PathParameters, RequestAdapter); - } /// The news property public global::Marechai.App.News.NewsRequestBuilder News { diff --git a/Marechai.App/Services/Client/Computers/ComputersRequestBuilder.cs b/Marechai.App/Services/Client/Computers/ComputersRequestBuilder.cs index 784292ea..ac12ce9d 100644 --- a/Marechai.App/Services/Client/Computers/ComputersRequestBuilder.cs +++ b/Marechai.App/Services/Client/Computers/ComputersRequestBuilder.cs @@ -1,5 +1,10 @@ // #pragma warning disable CS0618 +using Marechai.App.Computers.ByLetter; +using Marechai.App.Computers.ByYear; +using Marechai.App.Computers.Count; +using Marechai.App.Computers.MaximumYear; +using Marechai.App.Computers.MinimumYear; using Marechai.App.Models; using Microsoft.Kiota.Abstractions.Extensions; using Microsoft.Kiota.Abstractions.Serialization; @@ -17,6 +22,31 @@ namespace Marechai.App.Computers [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")] public partial class ComputersRequestBuilder : BaseRequestBuilder { + /// The byLetter property + public global::Marechai.App.Computers.ByLetter.ByLetterRequestBuilder ByLetter + { + get => new global::Marechai.App.Computers.ByLetter.ByLetterRequestBuilder(PathParameters, RequestAdapter); + } + /// The byYear property + public global::Marechai.App.Computers.ByYear.ByYearRequestBuilder ByYear + { + get => new global::Marechai.App.Computers.ByYear.ByYearRequestBuilder(PathParameters, RequestAdapter); + } + /// The count property + public global::Marechai.App.Computers.Count.CountRequestBuilder Count + { + get => new global::Marechai.App.Computers.Count.CountRequestBuilder(PathParameters, RequestAdapter); + } + /// The maximumYear property + public global::Marechai.App.Computers.MaximumYear.MaximumYearRequestBuilder MaximumYear + { + get => new global::Marechai.App.Computers.MaximumYear.MaximumYearRequestBuilder(PathParameters, RequestAdapter); + } + /// The minimumYear property + public global::Marechai.App.Computers.MinimumYear.MinimumYearRequestBuilder MinimumYear + { + get => new global::Marechai.App.Computers.MinimumYear.MinimumYearRequestBuilder(PathParameters, RequestAdapter); + } /// /// Instantiates a new and sets the default values. /// diff --git a/Marechai.App/Services/Client/Consoles/ConsolesRequestBuilder.cs b/Marechai.App/Services/Client/Consoles/ConsolesRequestBuilder.cs index a4cd09e1..4f705744 100644 --- a/Marechai.App/Services/Client/Consoles/ConsolesRequestBuilder.cs +++ b/Marechai.App/Services/Client/Consoles/ConsolesRequestBuilder.cs @@ -1,5 +1,10 @@ // #pragma warning disable CS0618 +using Marechai.App.Consoles.ByLetter; +using Marechai.App.Consoles.ByYear; +using Marechai.App.Consoles.Count; +using Marechai.App.Consoles.MaximumYear; +using Marechai.App.Consoles.MinimumYear; using Marechai.App.Models; using Microsoft.Kiota.Abstractions.Extensions; using Microsoft.Kiota.Abstractions.Serialization; @@ -17,6 +22,31 @@ namespace Marechai.App.Consoles [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")] public partial class ConsolesRequestBuilder : BaseRequestBuilder { + /// The byLetter property + public global::Marechai.App.Consoles.ByLetter.ByLetterRequestBuilder ByLetter + { + get => new global::Marechai.App.Consoles.ByLetter.ByLetterRequestBuilder(PathParameters, RequestAdapter); + } + /// The byYear property + public global::Marechai.App.Consoles.ByYear.ByYearRequestBuilder ByYear + { + get => new global::Marechai.App.Consoles.ByYear.ByYearRequestBuilder(PathParameters, RequestAdapter); + } + /// The count property + public global::Marechai.App.Consoles.Count.CountRequestBuilder Count + { + get => new global::Marechai.App.Consoles.Count.CountRequestBuilder(PathParameters, RequestAdapter); + } + /// The maximumYear property + public global::Marechai.App.Consoles.MaximumYear.MaximumYearRequestBuilder MaximumYear + { + get => new global::Marechai.App.Consoles.MaximumYear.MaximumYearRequestBuilder(PathParameters, RequestAdapter); + } + /// The minimumYear property + public global::Marechai.App.Consoles.MinimumYear.MinimumYearRequestBuilder MinimumYear + { + get => new global::Marechai.App.Consoles.MinimumYear.MinimumYearRequestBuilder(PathParameters, RequestAdapter); + } /// /// Instantiates a new and sets the default values. /// diff --git a/Marechai.App/Services/Client/kiota-lock.json b/Marechai.App/Services/Client/kiota-lock.json index b9b0d46d..f726eb09 100644 --- a/Marechai.App/Services/Client/kiota-lock.json +++ b/Marechai.App/Services/Client/kiota-lock.json @@ -1,5 +1,5 @@ { - "descriptionHash": "4C4317F1318B3D4CA2225D2F84196E63FE3991CAA0B4FAC3BDA2432C98D3457223C321CFD97E2BC392D20DCE9E265F204F4B0E90C7FE300BC876152A4FC07520", + "descriptionHash": "1CBF8A151B68ADF959BF4CE97533C13CE3C5B8E0425C6F097F0EF8A5308B53C6DA208B6B18CF8A0B949DD033B070BB2A4B530F0F64BBBAA487D86887990865AF", "descriptionLocation": "http://localhost:5023/openapi/v1.json", "lockFileVersion": "1.0.0", "kiotaVersion": "1.29.0", diff --git a/Marechai.App/Services/ComputersService.cs b/Marechai.App/Services/ComputersService.cs new file mode 100644 index 00000000..67ce4e78 --- /dev/null +++ b/Marechai.App/Services/ComputersService.cs @@ -0,0 +1,121 @@ +using System; +using System.Threading.Tasks; +using Microsoft.Kiota.Abstractions.Serialization; + +namespace Marechai.App.Services; + +/// +/// Service for fetching and managing computers from the Marechai API +/// +public class ComputersService +{ + private readonly ApiClient _apiClient; + private readonly ILogger _logger; + + public ComputersService(ApiClient apiClient, ILogger logger) + { + _apiClient = apiClient; + _logger = logger; + } + + /// + /// Fetches the total count of computers from the API + /// + /// Total number of computers, or 0 if API call fails + public async Task GetComputersCountAsync() + { + try + { + _logger.LogInformation("Fetching computers count from API"); + UntypedNode result = await _apiClient.Computers.Count.GetAsync(); + + // Extract integer value from UntypedNode + // UntypedNode wraps a JsonElement, we need to parse it + int count = ExtractIntFromUntypedNode(result); + _logger.LogInformation("Successfully fetched computers count: {Count}", count); + + return count; + } + catch(Exception ex) + { + _logger.LogError(ex, "Error fetching computers count from API"); + + return 0; + } + } + + /// + /// Fetches the minimum year of computers from the API + /// + /// Minimum year, or 0 if API call fails + public async Task GetMinimumYearAsync() + { + try + { + _logger.LogInformation("Fetching minimum year from API"); + UntypedNode result = await _apiClient.Computers.MinimumYear.GetAsync(); + + // Extract integer value from UntypedNode + int year = ExtractIntFromUntypedNode(result); + _logger.LogInformation("Successfully fetched minimum year: {Year}", year); + + return year; + } + catch(Exception ex) + { + _logger.LogError(ex, "Error fetching minimum year from API"); + + return 0; + } + } + + /// + /// Fetches the maximum year of computers from the API + /// + /// Maximum year, or 0 if API call fails + public async Task GetMaximumYearAsync() + { + try + { + _logger.LogInformation("Fetching maximum year from API"); + UntypedNode result = await _apiClient.Computers.MaximumYear.GetAsync(); + + // Extract integer value from UntypedNode + int year = ExtractIntFromUntypedNode(result); + _logger.LogInformation("Successfully fetched maximum year: {Year}", year); + + return year; + } + catch(Exception ex) + { + _logger.LogError(ex, "Error fetching maximum year from API"); + + return 0; + } + } + + /// + /// Helper method to extract an integer from an UntypedNode + /// + private int ExtractIntFromUntypedNode(UntypedNode node) + { + if(node == null) return 0; + + try + { + // Cast to UntypedInteger to access the Value property + if(node is UntypedInteger intNode) return intNode.GetValue(); + + // Fallback: try to parse ToString() result + var stringValue = node.ToString(); + + if(!string.IsNullOrWhiteSpace(stringValue) && int.TryParse(stringValue, out int result)) return result; + + return 0; + } + catch + { + return 0; + } + } +} \ No newline at end of file diff --git a/Marechai.Server/Controllers/ComputersController.cs b/Marechai.Server/Controllers/ComputersController.cs index 5faa08fe..0a2df10f 100644 --- a/Marechai.Server/Controllers/ComputersController.cs +++ b/Marechai.Server/Controllers/ComputersController.cs @@ -40,13 +40,13 @@ namespace Marechai.Server.Controllers; [ApiController] public class ComputersController(MarechaiContext context) : ControllerBase { - [HttpGet("/count")] + [HttpGet("count")] [AllowAnonymous] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] public Task GetComputersCountAsync() => context.Machines.CountAsync(c => c.Type == MachineType.Computer); - [HttpGet("/minimum-year")] + [HttpGet("minimum-year")] [AllowAnonymous] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] @@ -56,7 +56,7 @@ public class ComputersController(MarechaiContext context) : ControllerBase t.Introduced.Value.Year > 1000) .MinAsync(t => t.Introduced.Value.Year); - [HttpGet("/maximum-year")] + [HttpGet("maximum-year")] [AllowAnonymous] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] @@ -66,7 +66,7 @@ public class ComputersController(MarechaiContext context) : ControllerBase t.Introduced.Value.Year > 1000) .MaxAsync(t => t.Introduced.Value.Year); - [HttpGet("/by-letter/{c}")] + [HttpGet("by-letter/{c}")] [AllowAnonymous] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] @@ -84,7 +84,7 @@ public class ComputersController(MarechaiContext context) : ControllerBase }) .ToListAsync(); - [HttpGet("/by-year/{year:int}")] + [HttpGet("by-year/{year:int}")] [AllowAnonymous] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] diff --git a/Marechai.Server/Controllers/ConsolesController.cs b/Marechai.Server/Controllers/ConsolesController.cs index 4d626a3e..aac0d8d3 100644 --- a/Marechai.Server/Controllers/ConsolesController.cs +++ b/Marechai.Server/Controllers/ConsolesController.cs @@ -40,13 +40,13 @@ namespace Marechai.Server.Controllers; [ApiController] public class ConsolesController(MarechaiContext context) : ControllerBase { - [HttpGet("/count")] + [HttpGet("count")] [AllowAnonymous] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] public Task GetConsolesCountAsync() => context.Machines.CountAsync(c => c.Type == MachineType.Console); - [HttpGet("/minimum-year")] + [HttpGet("minimum-year")] [AllowAnonymous] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] @@ -56,7 +56,7 @@ public class ConsolesController(MarechaiContext context) : ControllerBase t.Introduced.Value.Year > 1000) .MinAsync(t => t.Introduced.Value.Year); - [HttpGet("/maximum-year")] + [HttpGet("maximum-year")] [AllowAnonymous] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] @@ -66,7 +66,7 @@ public class ConsolesController(MarechaiContext context) : ControllerBase t.Introduced.Value.Year > 1000) .MaxAsync(t => t.Introduced.Value.Year); - [HttpGet("/by-letter/{c}")] + [HttpGet("by-letter/{c}")] [AllowAnonymous] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] @@ -84,7 +84,7 @@ public class ConsolesController(MarechaiContext context) : ControllerBase }) .ToListAsync(); - [HttpGet("/by-year/{year:int}")] + [HttpGet("by-year/{year:int}")] [AllowAnonymous] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)]