using System.Net; using System.Net.Http.Json; using Prefab.Web.Client.Models.Shared; namespace Prefab.Web.Client.Services; public interface INavMenuService { Task> Get(int depth, CancellationToken cancellationToken); } public sealed class NavMenuService : INavMenuService { private readonly HttpClient _httpClient; public NavMenuService(HttpClient httpClient) { _httpClient = httpClient ?? throw new ArgumentNullException(nameof(httpClient)); } public async Task> Get(int depth, CancellationToken cancellationToken) { var normalizedDepth = Math.Clamp(depth, 1, 2); try { using var response = await _httpClient.GetAsync($"/bff/nav-menu/{normalizedDepth}", cancellationToken); var payload = await response.Content.ReadFromJsonAsync>(cancellationToken: cancellationToken); if (payload is not null) { return payload; } if (!response.IsSuccessStatusCode) { var statusCode = (HttpStatusCode)response.StatusCode; var problem = ResultProblem.Unexpected( "Failed to load navigation menu.", new HttpRequestException($"Navigation menu request failed with status code {(int)statusCode} ({statusCode})."), statusCode); return Result.Failure(problem); } var emptyProblem = ResultProblem.Unexpected( "Failed to load navigation menu.", new InvalidOperationException("Navigation menu response body was empty."), (HttpStatusCode)response.StatusCode); return Result.Failure(emptyProblem); } catch (Exception exception) { var problem = ResultProblem.Unexpected("Failed to load navigation menu.", exception); return Result.Failure(problem); } } }