Introduced the ability to create envelopes with documents and receivers via a new `CreateAsync` method in `EnvelopeReceiverService`. Integrated this functionality into `EnvelopeSenderEditorPage.razor` with UI updates, including a save button spinner, validation checks, and a result popup for success or error feedback. - Added `CreateAsync` method to handle `POST /api/EnvelopeReceiver` API calls. - Injected `EnvelopeReceiverService` into `EnvelopeSenderEditorPage.razor`. - Implemented save logic with validation for PDF upload, receivers, and signature fields. - Added success and error popups for user feedback. - Improved logging for envelope creation and validation warnings. - Refactored save logic for better readability and maintainability.
67 lines
2.9 KiB
C#
67 lines
2.9 KiB
C#
using System.Net;
|
||
using System.Net.Http;
|
||
using System.Net.Http.Json;
|
||
using System.Text.Json;
|
||
using EnvelopeGenerator.Application.EnvelopeReceivers.Commands;
|
||
using EnvelopeGenerator.Server.Client.Models;
|
||
|
||
namespace EnvelopeGenerator.Server.Client.Services;
|
||
|
||
/// <summary>
|
||
/// Retrieves the <see cref="EnvelopeReceiverDto"/> for the authenticated receiver
|
||
/// from <c>GET /api/EnvelopeReceiver/{envelopeKey}</c>.
|
||
/// Also creates new envelopes via <c>POST /api/EnvelopeReceiver</c>.
|
||
/// </summary>
|
||
public class EnvelopeReceiverService(IHttpClientFactory httpClientFactory)
|
||
{
|
||
private static readonly JsonSerializerOptions _jsonOptions = new(JsonSerializerDefaults.Web);
|
||
|
||
/// <summary>
|
||
/// Fetches the envelope receiver data for the given envelope key from the API.
|
||
/// Throws HttpRequestException on failure with appropriate status code.
|
||
/// </summary>
|
||
/// <exception cref="HttpRequestException">Thrown when the API request fails.</exception>
|
||
public async Task<EnvelopeReceiverDto?> 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<EnvelopeReceiverDto>(_jsonOptions, cancel);
|
||
}
|
||
|
||
/// <summary>
|
||
/// Creates a new envelope with document and receivers via <c>POST /api/EnvelopeReceiver</c>.
|
||
/// Requires sender authentication cookie to be present in the request.
|
||
/// </summary>
|
||
/// <exception cref="HttpRequestException">Thrown when the API request fails.</exception>
|
||
public async Task<CreateEnvelopeReceiverResponse?> 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<CreateEnvelopeReceiverResponse>(_jsonOptions, cancel);
|
||
}
|
||
}
|