using System.Net; using System.Net.Http; using System.Net.Http.Json; using System.Text.Json; using EnvelopeGenerator.Application.Common.Dto; namespace EnvelopeGenerator.Server.Client.Services; public class DocumentService(IHttpClientFactory httpClientFactory) { private static readonly JsonSerializerOptions _jsonOptions = new(JsonSerializerDefaults.Web); /// /// Fetches the PDF bytes for the given envelope key from the API. /// Throws HttpRequestException on failure with appropriate status code. /// /// Thrown when the API request fails. public async Task GetDocumentAsync(string envelopeKey, CancellationToken cancel = default) { using var http = httpClientFactory.CreateClient("EnvelopeGenerator.Server"); var response = await http.GetAsync($"/api/Document/{Uri.EscapeDataString(envelopeKey)}", cancel); if (!response.IsSuccessStatusCode) { var statusCode = (int)response.StatusCode; var reasonPhrase = response.ReasonPhrase ?? "Unknown error"; throw new HttpRequestException( $"Failed to load document. Status: {statusCode} ({reasonPhrase})", null, response.StatusCode); } var bytes = await response.Content.ReadAsByteArrayAsync(cancel); return bytes; } /// /// Fetches sender document details (including signature elements) by envelope id. /// Uses GET /api/Document?EnvelopeId={envelopeId}. /// public async Task GetSenderDocumentDetailsByEnvelopeIdAsync(int envelopeId, CancellationToken cancel = default) { using var http = httpClientFactory.CreateClient("EnvelopeGenerator.Server"); var response = await http.GetAsync($"/api/Document?EnvelopeId={envelopeId}", cancel); if (!response.IsSuccessStatusCode) { var statusCode = (int)response.StatusCode; var reasonPhrase = response.ReasonPhrase ?? "Unknown error"; throw new HttpRequestException( $"Failed to load sender document details. Status: {statusCode} ({reasonPhrase})", null, response.StatusCode); } return await response.Content.ReadFromJsonAsync(_jsonOptions, cancel); } }