using System.Net.Http.Json; using System.Text.Json; using EnvelopeGenerator.ReceiverUI.Models; using EnvelopeGenerator.ReceiverUI.Options; using Microsoft.AspNetCore.WebUtilities; using Microsoft.Extensions.Options; namespace EnvelopeGenerator.ReceiverUI.Services; /// /// Retrieves s from the API. /// public class EnvelopeService { private readonly HttpClient _http; private readonly ApiOptions _apiOptions; private static readonly JsonSerializerOptions _jsonOptions = new(JsonSerializerDefaults.Web); public EnvelopeService(HttpClient http, IOptions apiOptions) { _http = http; _apiOptions = apiOptions.Value; } /// /// Fetches envelopes from the API with optional filters. /// /// Thrown when the API request fails. public async Task?> GetAsync( int? id = null, string? uuid = null, bool? onlyActive = null, bool? onlyCompleted = null, CancellationToken cancel = default) { var baseUrl = $"{_apiOptions.BaseUrl}/api/Envelope"; var queryParams = new Dictionary(); if (id.HasValue) { queryParams["Id"] = id.Value.ToString(); } if (!string.IsNullOrEmpty(uuid)) { queryParams["Uuid"] = uuid; } if (onlyActive.HasValue) { queryParams["OnlyActive"] = onlyActive.Value.ToString(); } if (onlyCompleted.HasValue) { queryParams["OnlyCompleted"] = onlyCompleted.Value.ToString(); } var url = QueryHelpers.AddQueryString(baseUrl, queryParams); var response = await _http.GetAsync(url, cancel); if (!response.IsSuccessStatusCode) { var statusCode = (int)response.StatusCode; var reasonPhrase = response.ReasonPhrase ?? "Unknown error"; throw new HttpRequestException( $"Failed to load envelopes. Status: {statusCode} ({reasonPhrase})", null, response.StatusCode); } return await response.Content.ReadFromJsonAsync>(_jsonOptions, cancel); } }