using DigitalData.Core.Abstraction.Application.Repository; using EnvelopeGenerator.Application.Exceptions; using EnvelopeGenerator.Domain; using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Extensions; using MediatR; using Microsoft.EntityFrameworkCore; namespace EnvelopeGenerator.Application.EnvelopeReceivers.Queries; /// /// /// public record ReceiverAlreadySignedQuery : IRequest { /// /// /// public required string Key { get => (EnvelopeUuid, ReceiverSignature).EncodeEnvelopeReceiverId(); init { (string? EnvelopeUuid, string? ReceiverSignature) = value.DecodeEnvelopeReceiverId(); if (string.IsNullOrEmpty(EnvelopeUuid) || string.IsNullOrEmpty(ReceiverSignature)) { throw new BadRequestException("Der EnvelopeReceiverKey muss ein gültiger Base64-kodierter String sein, der die EnvelopeUuid und die ReceiverSignature enthält."); } } } internal string EnvelopeUuid { get; set; } = null!; internal string ReceiverSignature { get; set; } = null!; } /// /// /// public static class ReceiverAlreadySignedQueryExtensions { /// /// /// /// /// /// /// public static Task ReceiverAlreadySigned(this IMediator mediator, string key, CancellationToken cancel = default) => mediator.Send(new ReceiverAlreadySignedQuery { Key = key }, 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.EnvelopeUuid) .Where(er => er.Receiver.Signature == request.ReceiverSignature) .Where(er => er.Envelope.History.Any(hist => hist.Status == Constants.EnvelopeStatus.DocumentSigned)) .AnyAsync(cancel); } }