diff --git a/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/ReadEnvelopeReceiverSecretQuery.cs b/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/ReadEnvelopeReceiverSecretQuery.cs
new file mode 100644
index 00000000..e9fd1c20
--- /dev/null
+++ b/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/ReadEnvelopeReceiverSecretQuery.cs
@@ -0,0 +1,127 @@
+using AutoMapper;
+using DigitalData.Core.Abstraction.Application.Repository;
+using EnvelopeGenerator.Application.Envelopes.Queries;
+using EnvelopeGenerator.Application.Receivers.Queries;
+using MediatR;
+using EnvelopeGenerator.Domain.Entities;
+using Microsoft.EntityFrameworkCore;
+using EnvelopeGenerator.Application.Common.Dto.EnvelopeReceiver;
+using EnvelopeGenerator.Application.Common.Query;
+using EnvelopeGenerator.Application.Common.Extensions;
+
+namespace EnvelopeGenerator.Application.EnvelopeReceivers.Queries;
+
+///
+/// Represents a query for reading an envelope receiver including sensitive fields
+/// (access code, phone number) that are excluded from the standard .
+///
+///
+/// Returns a single matched by UUID and receiver signature.
+/// Equivalent to the legacy ReadWithSecretByUuidSignatureAsync service method.
+///
+public record ReadEnvelopeReceiverSecretQuery
+ : EnvelopeReceiverQueryBase,
+ IRequest;
+
+///
+/// Extension methods for dispatching via .
+///
+public static class ReadEnvelopeReceiverSecretQueryExtensions
+{
+ ///
+ /// Sends a using the composite key (uuid::signature).
+ ///
+ /// The mediator instance.
+ /// Composite key in the format uuid::signature.
+ /// Cancellation token.
+ /// The matching , or null if not found.
+ public static Task ReadEnvelopeReceiverSecretAsync(
+ this IMediator mediator,
+ string key,
+ CancellationToken cancel = default)
+ => mediator.Send(new ReadEnvelopeReceiverSecretQuery { Key = key }, cancel);
+
+ ///
+ /// Sends a using UUID and receiver signature.
+ ///
+ /// The mediator instance.
+ /// Envelope UUID.
+ /// Receiver signature.
+ /// Cancellation token.
+ /// The matching , or null if not found.
+ public static Task ReadEnvelopeReceiverSecretAsync(
+ this IMediator mediator,
+ string uuid,
+ string signature,
+ CancellationToken cancel = default)
+ {
+ var q = new ReadEnvelopeReceiverSecretQuery();
+ q.Envelope.Uuid = uuid;
+ q.Receiver.Signature = signature;
+ return mediator.Send(q, cancel);
+ }
+
+ ///
+ /// Handles and returns a
+ /// containing sensitive fields.
+ ///
+ public class ReadEnvelopeReceiverSecretQueryHandler
+ : IRequestHandler
+ {
+ private readonly IRepository _repo;
+ private readonly IRepository _rcvRepo;
+ private readonly IMapper _mapper;
+
+ ///
+ /// Initializes a new instance of .
+ ///
+ /// Repository for .
+ /// Repository for .
+ /// AutoMapper instance.
+ public ReadEnvelopeReceiverSecretQueryHandler(
+ IRepository envelopeReceiver,
+ IRepository rcvRepo,
+ IMapper mapper)
+ {
+ _repo = envelopeReceiver;
+ _rcvRepo = rcvRepo;
+ _mapper = mapper;
+ }
+
+ ///
+ /// Handles the query and returns the matching .
+ ///
+ /// The query containing filter criteria.
+ /// Cancellation token.
+ ///
+ /// The matched , or null if no record is found.
+ ///
+ public async Task Handle(
+ ReadEnvelopeReceiverSecretQuery request,
+ CancellationToken cancel)
+ {
+ var q = _repo.Query.Where(request, notnull: false);
+
+ var envRcvs = await q
+ .Include(er => er.Envelope).ThenInclude(e => e!.Documents!).ThenInclude(d => d.Elements)
+ .Include(er => er.Envelope).ThenInclude(e => e!.Histories)
+ .Include(er => er.Envelope).ThenInclude(e => e!.User)
+ .Include(er => er.Receiver)
+ .ToListAsync(cancel);
+
+ if (request.Receiver.HasAnyCriteria && envRcvs.Count != 0)
+ {
+ var receiver = await _rcvRepo.Query.Where(request.Receiver).FirstAsync(cancel);
+
+ foreach (var item in envRcvs)
+ item.Envelope?.Documents?.FirstOrDefault()?.Elements?.RemoveAll(s => s.ReceiverId != receiver.Id);
+ }
+
+ var envRcv = envRcvs.FirstOrDefault();
+ if (envRcv is null)
+ return null;
+
+ return _mapper.Map(envRcv);
+ }
+ }
+}
diff --git a/EnvelopeGenerator.Web/Controllers/EnvelopeController.cs b/EnvelopeGenerator.Web/Controllers/EnvelopeController.cs
index e8068bd2..4fc4f10c 100644
--- a/EnvelopeGenerator.Web/Controllers/EnvelopeController.cs
+++ b/EnvelopeGenerator.Web/Controllers/EnvelopeController.cs
@@ -438,4 +438,10 @@ public class EnvelopeController : ViewControllerBase
return this.ViewDocumentNotFound();
}
}
+
+ [HttpGet("EnvelopeReceiverWithSecretByMediatr")]
+ public async Task EnvelopeReceiverWithSecretByMediatr([FromQuery] ReadEnvelopeReceiverSecretQuery q, CancellationToken cancel)
+ {
+ return await _mediator.Send(q, cancel) is EnvelopeReceiverSecretDto dto ? Ok(dto) : NotFound();
+ }
}
\ No newline at end of file