diff --git a/EnvelopeGenerator.Application/Envelopes/Queries/ReadEnvelopeQuery.cs b/EnvelopeGenerator.Application/Envelopes/Queries/ReadEnvelopeQuery.cs index 04cd767e..7045f59d 100644 --- a/EnvelopeGenerator.Application/Envelopes/Queries/ReadEnvelopeQuery.cs +++ b/EnvelopeGenerator.Application/Envelopes/Queries/ReadEnvelopeQuery.cs @@ -2,6 +2,11 @@ using EnvelopeGenerator.Domain.Constants; using EnvelopeGenerator.Application.Common.Query; using EnvelopeGenerator.Application.Common.Dto; +using AutoMapper; +using DigitalData.Core.Abstraction.Application.Repository; +using EnvelopeGenerator.Application.Common.Extensions; +using EnvelopeGenerator.Domain.Entities; +using Microsoft.EntityFrameworkCore; namespace EnvelopeGenerator.Application.Envelopes.Queries; @@ -71,4 +76,65 @@ public record EnvelopeStatusQuery /// Eine Liste von Statuswerten, die ignoriert werden werden. /// public EnvelopeStatus[]? Ignore { get; init; } +} + +/// +/// +/// +public class ReadEnvelopeQueryHandler : IRequestHandler> +{ + private readonly IMapper _mapper; + + private readonly IRepository _repo; + + /// + /// + /// + /// + /// + public ReadEnvelopeQueryHandler(IMapper mapper, IRepository repo) + { + _mapper = mapper; + _repo = repo; + } + + /// + /// + /// + /// + /// + /// + /// + public async Task> Handle(ReadEnvelopeQuery request, CancellationToken cancel) + { + var q = _repo.Query.Where(request, notnull: false); + + if (request.Status is EnvelopeStatusQuery statusQ) + { + // including status + if (statusQ.Include is EnvelopeStatus[] incStatus) + q = q.Where(e => incStatus.Contains(e.Status)); + + // ignoring status + if (statusQ.Ignore is EnvelopeStatus[] ignoreStatus) + q = q.Where(e => !ignoreStatus.Contains(e.Status)); + + // max status + if (statusQ.Max is EnvelopeStatus maxStatus) + q = q.Where(e => e.Status < maxStatus); + + // min status + if (statusQ.Min is EnvelopeStatus minStatus) + q = q.Where(e => e.Status > minStatus); + } + + if (request.HasDocResult is bool hasDocResult) + q = hasDocResult + ? q.Where(e => e.DocResult != null) + : q.Where(e => e.DocResult == null); + + var envelopes = await q.ToListAsync(cancel); + + return _mapper.Map>(envelopes); + } } \ No newline at end of file