using DigitalData.Core.Abstraction.Application.Repository; using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Application.Extensions; using MediatR; using Microsoft.EntityFrameworkCore; using EnvelopeGenerator.Domain.Constants; using EnvelopeGenerator.Application.Common.Model; namespace EnvelopeGenerator.Application.EnvelopeReceivers.Queries; /// /// /// public record ReceiverAlreadySignedQuery : EnvelopeReceiverQueryBase, IRequest; /// /// /// public static class ReceiverAlreadySignedQueryExtensions { /// /// /// /// /// /// /// public static Task IsSignedAsync(this IMediator mediator, string key, CancellationToken cancel = default) => mediator.Send(new ReceiverAlreadySignedQuery { Key = key }, cancel); /// /// /// /// /// /// /// /// public static Task IsSignedAsync(this IMediator mediator, string uuid, string signature, CancellationToken cancel = default) => mediator.Send(new ReceiverAlreadySignedQuery { Envelope = new() { Uuid = uuid }, Receiver = new() { Signature = signature } }, cancel); } /// /// /// public class ReceiverAlreadySignedQueryHandler : IRequestHandler { private readonly IRepository _repo; /// /// /// /// public ReceiverAlreadySignedQueryHandler(IRepository repo) { _repo = repo; } /// /// /// /// /// /// public async Task Handle(ReceiverAlreadySignedQuery request, CancellationToken cancel = default) { return await _repo.Read() .Where(er => er.Envelope!.Uuid == request.Envelope.Uuid) .Where(er => er.Receiver!.Signature == request.Receiver.Signature) .Where(er => er.Envelope!.Histories.Any(hist => hist.Status == EnvelopeStatus.DocumentSigned)) .AnyAsync(cancel); } }