using System.Net; using System.Net.Http; using System.Net.Http.Json; using System.Text.Json; using EnvelopeGenerator.Application.EnvelopeReceivers.Commands.CreateEnvelopeReceiver; using EnvelopeGenerator.Server.Client.Models; namespace EnvelopeGenerator.Server.Client.Services; /// /// Retrieves the for the authenticated receiver /// from GET /api/EnvelopeReceiver/{envelopeKey}. /// Also creates new envelopes via POST /api/EnvelopeReceiver. /// public class EnvelopeReceiverService(IHttpClientFactory httpClientFactory) { private static readonly JsonSerializerOptions _jsonOptions = new(JsonSerializerDefaults.Web); private sealed record ReceiverEnvelopeUrlResponse(string Url); private sealed record ReceiverEnvelopeUrlEnabledResponse(bool Enabled); /// /// Fetches the envelope receiver data 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 GetAsync(string envelopeKey, CancellationToken cancel = default) { using var http = httpClientFactory.CreateClient("EnvelopeGenerator.Server"); var url = $"/api/EnvelopeReceiver/{Uri.EscapeDataString(envelopeKey)}"; 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 envelope receiver data. Status: {statusCode} ({reasonPhrase})", null, response.StatusCode); } return await response.Content.ReadFromJsonAsync(_jsonOptions, cancel); } /// /// Creates a new envelope with document and receivers via POST /api/EnvelopeReceiver. /// Requires sender authentication cookie to be present in the request. /// /// Thrown when the API request fails. public async Task CreateAsync( CreateEnvelopeReceiverCommand request, CancellationToken cancel = default) { using var http = httpClientFactory.CreateClient("EnvelopeGenerator.Server"); var response = await http.PostAsJsonAsync("/api/EnvelopeReceiver", request, _jsonOptions, cancel); if (!response.IsSuccessStatusCode) { var body = await response.Content.ReadAsStringAsync(cancel); throw new HttpRequestException( $"Fehler beim Erstellen des Umschlags. Status: {(int)response.StatusCode} – {body}", null, response.StatusCode); } return await response.Content.ReadFromJsonAsync(_jsonOptions, cancel); } public async Task GetReceiverEnvelopeUrlAsync(string envelopeUuid, string receiverSignature, CancellationToken cancel = default) { if (string.IsNullOrWhiteSpace(envelopeUuid) || string.IsNullOrWhiteSpace(receiverSignature)) return null; using var http = httpClientFactory.CreateClient("EnvelopeGenerator.Server"); var url = $"/api/EnvelopeReceiver/receiver-envelope-url?envelopeUuid={Uri.EscapeDataString(envelopeUuid)}&receiverSignature={Uri.EscapeDataString(receiverSignature)}"; var response = await http.GetAsync(url, cancel); if (!response.IsSuccessStatusCode) return null; var payload = await response.Content.ReadFromJsonAsync(_jsonOptions, cancel); return payload?.Url; } public async Task GetReceiverEnvelopeUrlFeatureEnabledAsync(CancellationToken cancel = default) { using var http = httpClientFactory.CreateClient("EnvelopeGenerator.Server"); var response = await http.GetAsync("/api/EnvelopeReceiver/receiver-envelope-url/enabled", cancel); if (!response.IsSuccessStatusCode) return false; var payload = await response.Content.ReadFromJsonAsync(_jsonOptions, cancel); return payload?.Enabled == true; } }