Refactor EnvelopeReceiverPage for modular data handling

Refactored `EnvelopeReceiverPage.razor` to use new services for receiver authentication and data retrieval. Introduced `EnvelopeReceiverAuthorizationService` for handling JWT-based authorization and `EnvelopeReceiverPageDataService` for centralized data access and caching. Updated dependency injection in `Program.cs` to register these services.

Replaced direct service calls with `PageDataService` methods for document, signature, and receiver data retrieval. Improved logging with `ILogger` and added debug logs for token validation. Enhanced modularity, maintainability, and performance by consolidating logic and reducing coupling between components.
This commit is contained in:
2026-06-29 01:26:43 +02:00
parent 7466fd78f6
commit 489d2808a1
4 changed files with 215 additions and 16 deletions

View File

@@ -3,20 +3,19 @@
@using EnvelopeGenerator.Server.Client.Models
@using EnvelopeGenerator.Server.Client.Models.Constants
@using EnvelopeGenerator.Server.Client.Services
@using EnvelopeGenerator.Application.Common.Dto.EnvelopeReceiver
@using System.Security.Claims
@using Microsoft.Extensions.Options
@using EnvelopeGenerator.Server.Client.Options
@using Microsoft.JSInterop
@using DevExpress.Blazor
@inject DocumentService DocumentService
@inject NavigationManager Navigation
@inject IOptions<ApiOptions> AppOptions
@inject IOptions<PdfViewerOptions> PdfViewerOptions
@inject IJSRuntime JSRuntime
@inject DocReceiverElementService SignatureService
@inject SignatureCacheService SignatureCacheService
@inject EnvelopeGenerator.Server.Client.Services.AuthService AuthService
@inject EnvelopeGenerator.Server.Client.Services.EnvelopeReceiverService EnvelopeReceiverService
@inject AppVersionService AppVersion
@inject EnvelopeGenerator.Server.Services.EnvelopeReceiverAuthorizationService ReceiverAuthorizationService
@inject EnvelopeGenerator.Server.Services.EnvelopeReceiverPageDataService PageDataService
@inject ILogger<EnvelopeReceiverPage> logger
@implements IAsyncDisposable
@@ -557,7 +556,8 @@
bool _isLoggingOut = false;
DotNetObjectReference<EnvelopeReceiverPage>? _dotNetRef;
IReadOnlyList<SignatureDto> _signatures = [];
EnvelopeReceiverDto? _envelopeReceiver;
EnvelopeGenerator.Application.Common.Dto.EnvelopeReceiver.EnvelopeReceiverDto? _envelopeReceiver;
ClaimsPrincipal? _receiverUser;
// Signature navigation state
int _totalSignatures = 0;
@@ -602,9 +602,8 @@
return;
}
// Check authentication
var hasAccess = await AuthService.CheckEnvelopeAccessAsync(EnvelopeKey);
if (!hasAccess)
_receiverUser = await ReceiverAuthorizationService.AuthorizeAsync(EnvelopeKey);
if (_receiverUser is null)
{
Navigation.NavigateTo($"/envelope/login/{Uri.EscapeDataString(EnvelopeKey)}");
return;
@@ -612,7 +611,7 @@
try
{
var pdfBytes = await DocumentService.GetDocumentAsync(EnvelopeKey);
var pdfBytes = await PageDataService.GetDocumentAsync(_receiverUser);
if (pdfBytes is { Length: > 0 })
{
@@ -624,21 +623,20 @@
_errorMessage = "Dokument konnte nicht geladen werden: Keine Daten empfangen.";
}
var signatures = await SignatureService.GetAsync(EnvelopeKey);
_signatures = signatures.Convert(UnitOfLength.Point);
_signatures = await PageDataService.GetSignaturesAsync(_receiverUser);
_envelopeReceiver = await EnvelopeReceiverService.GetAsync(EnvelopeKey);
_envelopeReceiver = await PageDataService.GetEnvelopeReceiverAsync(EnvelopeKey);
if (_envelopeReceiver is null)
{
logger.LogWarning("Envelope receiver data is null for envelope {EnvelopeKey}", EnvelopeKey);
}
await JSRuntime.InvokeVoidAsync("console.log", "Loaded signatures:", _signatures);
logger.LogInformation("Loaded {SignatureCount} signatures for envelope {EnvelopeKey}", _signatures.Count, EnvelopeKey);
// Try to load cached signature first
try
{
var cachedSignature = await SignatureCacheService.GetSignatureAsync(EnvelopeKey);
var cachedSignature = await PageDataService.GetCachedSignatureAsync(_receiverUser);
if (cachedSignature is not null)
{
_capturedSignature = cachedSignature;
@@ -1094,7 +1092,10 @@
{
try
{
await SignatureCacheService.SaveSignatureAsync(EnvelopeKey, _capturedSignature);
if (_receiverUser is not null)
{
await PageDataService.SaveCachedSignatureAsync(_receiverUser, _capturedSignature);
}
}
catch
{