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