using AutoMapper; using DigitalData.Core.Abstraction.Application.Repository; using DigitalData.Core.Exceptions; 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; /// /// Repräsentiert eine Abfrage zum Lesen eines Envelope-Empfängers. /// Invalid (0): Ungültiger Include. /// EnvelopeCreated (1001): Der Umschlag wurde erstellt. /// EnvelopeSaved (1002): Der Umschlag wurde gespeichert. /// EnvelopeQueued (1003): Der Umschlag wurde zur Verarbeitung eingeplant. /// EnvelopeSent (1004): Der Umschlag wurde versendet. (Nicht verwendet) /// EnvelopePartlySigned (1005): Der Umschlag wurde teilweise unterschrieben. /// EnvelopeCompletelySigned (1006): Der Umschlag wurde vollständig unterschrieben. /// EnvelopeReportCreated (1007): Ein Abschlussbericht wurde für den Umschlag erstellt. /// EnvelopeArchived (1008): Der Umschlag wurde archiviert. /// EnvelopeDeleted (1009): Der Umschlag wurde gelöscht. /// AccessCodeRequested (2001): Der Zugriffscode wurde angefordert. /// AccessCodeCorrect (2002): Der Zugriffscode war korrekt. /// AccessCodeIncorrect (2003): Der Zugriffscode war falsch. /// DocumentOpened (2004): Das Dokument wurde geöffnet. /// DocumentSigned (2005): Ein Dokument wurde unterschrieben. /// SignatureConfirmed (2006): Die Signatur wurde bestätigt. /// DocumentRejected (2007): Ein Dokument wurde abgelehnt. /// EnvelopeShared (2008): Der Umschlag wurde geteilt. /// EnvelopeViewed (2009): Der Umschlag wurde angesehen. /// DocumentForwarded (4001): Das Dokument wurde weitergeleitet. /// MessageInvitationSent (3001): Einladung wurde gesendet (vom Trigger verwendet). /// MessageAccessCodeSent (3002): Zugriffscode wurde gesendet. /// MessageConfirmationSent (3003): Bestätigungsnachricht wurde gesendet. /// MessageDeletionSent (3004): Löschbenachrichtigung wurde gesendet. /// MessageCompletionSent (3005): Abschlussbenachrichtigung wurde gesendet. /// /// /// Diese Abfrage kombiniert Informationen über einen Umschlag () /// und einen Empfänger (), um eine vollständige Antwort /// () zu generieren. /// Die Antwort enthält Details wie den Include, die Zuordnung zwischen Umschlag und Empfänger /// sowie zusätzliche Metadaten. /// public record ReadEnvelopeReceiverQuery : EnvelopeReceiverQueryBase, IRequest>; /// /// /// public static class Extensions { /// /// /// /// /// /// /// public static Task ReadEnvelopeReceiverAsync(this IMediator mediator, string key, CancellationToken cancel = default) { var q = new ReadEnvelopeReceiverQuery() { Key = key }; return mediator.Send(q, cancel).Then(envRcvs => envRcvs.FirstOrDefault()); } /// /// /// /// /// /// /// /// public static Task ReadEnvelopeReceiverAsync(this IMediator mediator, string uuid, string signature, CancellationToken cancel = default) { var q = new ReadEnvelopeReceiverQuery(); q.Envelope.Uuid = uuid; q.Receiver.Signature = signature; return mediator.Send(q, cancel).Then(envRcvs => envRcvs.FirstOrDefault()); } } /// /// /// public class ReadEnvelopeReceiverQueryHandler : IRequestHandler> { private readonly IRepository _repo; private readonly IRepository _rcvRepo; private readonly IMapper _mapper; /// /// /// /// /// public ReadEnvelopeReceiverQueryHandler(IRepository envelopeReceiver, IRepository rcvRepo, IMapper mapper) { _repo = envelopeReceiver; _mapper = mapper; _rcvRepo = rcvRepo; } /// /// /// /// /// /// /// public async Task> Handle(ReadEnvelopeReceiverQuery request, CancellationToken cancel) { var q = _repo.ReadOnly().Where(request, notnull: false); if (request.Envelope.Status is not null) { var status = request.Envelope.Status; if (status.Min is not null) q = q.Where(er => er.Envelope!.Status >= status.Min); if (status.Max is not null) q = q.Where(er => er.Envelope!.Status <= status.Max); if (status.Include?.Length > 0) q = q.Where(er => status.Include.Contains(er.Envelope!.Status)); if (status.Ignore is not null) q = q.Where(er => !status.Ignore.Contains(er.Envelope!.Status)); } 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.Any()) { var receiver = await _rcvRepo.ReadOnly().Where(request.Receiver).FirstAsync(cancel); foreach (var envRcv in envRcvs) envRcv.Envelope?.Documents?.First().Elements.RemoveAll(s => s.ReceiverId != receiver.Id); } return _mapper.Map>(envRcvs); } }