diff --git a/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/ReadEnvelopeReceiverQuery.cs b/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/ReadEnvelopeReceiverQuery.cs index efba8719..6c0bc362 100644 --- a/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/ReadEnvelopeReceiverQuery.cs +++ b/EnvelopeGenerator.Application/EnvelopeReceivers/Queries/ReadEnvelopeReceiverQuery.cs @@ -1,4 +1,4 @@ -using AutoMapper; +using AutoMapper; using DigitalData.Core.Abstraction.Application.Repository; using DigitalData.Core.Exceptions; using EnvelopeGenerator.Application.Envelopes.Queries; @@ -47,7 +47,13 @@ namespace EnvelopeGenerator.Application.EnvelopeReceivers.Queries; /// 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 record ReadEnvelopeReceiverQuery : EnvelopeReceiverQueryBase, IRequest> +{ + /// + /// Optionaler Benutzernamefilter, um Ergebnisse auf Umschläge eines bestimmten Besitzers einzuschränken. + /// + public string? Username { get; init; } +} /// /// @@ -82,73 +88,68 @@ public static class Extensions 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; - /// - /// + /// Verarbeitet und liefert passende -Ergebnisse. /// - /// - /// - public ReadEnvelopeReceiverQueryHandler(IRepository envelopeReceiver, IRepository rcvRepo, IMapper mapper) + public class ReadEnvelopeReceiverQueryHandler : IRequestHandler> { - _repo = envelopeReceiver; - _mapper = mapper; - _rcvRepo = rcvRepo; - } + private readonly IRepository _repo; + private readonly IRepository _rcvRepo; + private readonly IMapper _mapper; - /// - /// - /// - /// - /// - /// - /// - public async Task> Handle(ReadEnvelopeReceiverQuery request, CancellationToken cancel) - { - var q = _repo.ReadOnly().Where(request, notnull: false); - - if (request.Envelope.Status is not null) + public ReadEnvelopeReceiverQueryHandler(IRepository envelopeReceiver, IRepository rcvRepo, IMapper mapper) { - 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)); + _repo = envelopeReceiver; + _mapper = mapper; + _rcvRepo = rcvRepo; } - 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()) + /// + /// + /// + /// + /// + /// + /// + public async Task> Handle(ReadEnvelopeReceiverQuery request, CancellationToken cancel) { - var receiver = await _rcvRepo.ReadOnly().Where(request.Receiver).FirstAsync(cancel); + var q = _repo.Query.Where(request, notnull: false); - foreach (var envRcv in envRcvs) - envRcv.Envelope?.Documents?.First().Elements.RemoveAll(s => s.ReceiverId != receiver.Id); + if (request.Username is string username) + q = q.Where(er => er.Envelope!.User.Username == username); + + 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.Count != 0) + { + var receiver = await _rcvRepo.Query.Where(request.Receiver).FirstAsync(cancel); + + foreach (var envRcv in envRcvs) + envRcv.Envelope?.Documents?.FirstOrDefault()?.Elements?.RemoveAll(s => s.ReceiverId != receiver.Id); + } + + return _mapper.Map>(envRcvs); } - - return _mapper.Map>(envRcvs); } -} \ No newline at end of file +} \ No newline at end of file