From 4d3f72a3ed1f0e0659106080ad1586136e842cc8 Mon Sep 17 00:00:00 2001 From: TekH Date: Tue, 29 Sep 2026 11:58:29 +0200 Subject: [PATCH] Add ReceiverService and enhance DocumentService Added `ReceiverService` to the dependency injection container in `Program.cs` and implemented its functionality for fetching receiver email suggestions via API. Enhanced `DocumentService` with a new method `GetSenderDocumentDetailsByEnvelopeIdAsync` to fetch sender document details by envelope ID. Introduced JSON handling improvements with `JsonSerializerOptions`. These changes improve support for receiver-related operations and extend document-related capabilities. --- .../Program.cs | 1 + .../Services/DocumentService.cs | 26 +++++++++++++++++ .../Services/ReceiverService.cs | 29 +++++++++++++++++++ .../EnvelopeGenerator.Server/Program.cs | 1 + 4 files changed, 57 insertions(+) create mode 100644 EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Services/ReceiverService.cs diff --git a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Program.cs b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Program.cs index 015ccfbb..e9d390ed 100644 --- a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Program.cs +++ b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Program.cs @@ -42,6 +42,7 @@ builder.Services.AddScoped(); builder.Services.AddSingleton(); builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddScoped(); // UI Preferences & Theme builder.Services.AddScoped(); diff --git a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Services/DocumentService.cs b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Services/DocumentService.cs index ff649c3c..1502225d 100644 --- a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Services/DocumentService.cs +++ b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Services/DocumentService.cs @@ -1,10 +1,14 @@ 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. @@ -29,4 +33,26 @@ public class DocumentService(IHttpClientFactory httpClientFactory) 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); + } } diff --git a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Services/ReceiverService.cs b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Services/ReceiverService.cs new file mode 100644 index 00000000..2d7f83ee --- /dev/null +++ b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Services/ReceiverService.cs @@ -0,0 +1,29 @@ +using System.Net.Http.Json; +using System.Text.Json; + +namespace EnvelopeGenerator.Server.Client.Services; + +public class ReceiverService(IHttpClientFactory httpClientFactory) +{ + private static readonly JsonSerializerOptions JsonOptions = new(JsonSerializerDefaults.Web); + + /// + /// Fetches receiver email suggestions from sender-authorized API. + /// Calls GET /api/Receiver?EmailAddressSearch={term}&onlyEmailAddress=true. + /// + public async Task> SearchReceiverEmailsAsync(string searchTerm, CancellationToken cancel = default) + { + if (string.IsNullOrWhiteSpace(searchTerm)) + return []; + + using var http = httpClientFactory.CreateClient("EnvelopeGenerator.Server"); + var url = $"/api/Receiver?EmailAddressSearch={Uri.EscapeDataString(searchTerm)}&onlyEmailAddress=true"; + var response = await http.GetAsync(url, cancel); + + if (!response.IsSuccessStatusCode) + return []; + + var emails = await response.Content.ReadFromJsonAsync>(JsonOptions, cancel); + return emails ?? []; + } +} diff --git a/EnvelopeGenerator.Server/EnvelopeGenerator.Server/Program.cs b/EnvelopeGenerator.Server/EnvelopeGenerator.Server/Program.cs index c9ab4fad..e1114efe 100644 --- a/EnvelopeGenerator.Server/EnvelopeGenerator.Server/Program.cs +++ b/EnvelopeGenerator.Server/EnvelopeGenerator.Server/Program.cs @@ -341,6 +341,7 @@ try builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); + builder.Services.AddScoped(); // Business Services (Server specific) builder.Services.AddScoped();