using AutoMapper; using DigitalData.Core.Abstraction.Application.Repository; using DigitalData.Core.Exceptions; using EnvelopeGenerator.Application.Common.Dto.History; using MediatR; using EnvelopeGenerator.Domain.Entities; using Microsoft.EntityFrameworkCore; namespace EnvelopeGenerator.Application.Histories.Queries; //TODO: Add sender query /// /// Repräsentiert eine Abfrage für die Verlaufshistorie eines Umschlags. /// public record ReadHistoryQuery : HistoryQueryBase, IRequest> { /// /// Abfrage zur Steuerung, ob nur der aktuelle Include oder der gesamte Datensatz zurückgegeben wird. /// public bool OnlyLast { get; init; } = true; } /// /// /// public class ReadHistoryQueryHandler : IRequestHandler> { private readonly IRepository _repo; private readonly IMapper _mapper; /// /// /// /// /// public ReadHistoryQueryHandler(IRepository repo, IMapper mapper) { _repo = repo; _mapper = mapper; } /// /// /// /// /// /// /// public async Task> Handle(ReadHistoryQuery request, CancellationToken cancel = default) { var query = _repo.Query; if (request.Envelope.Id is int envId) query = query.Where(e => e.Id == envId); else if (request.Envelope.Uuid is string uuid) query = query.Where(e => e.Envelope!.Uuid == uuid); #pragma warning disable CS0618 // Type or member is obsolete else if (request.EnvelopeId is not null) query = query.Where(h => h.EnvelopeId == request.EnvelopeId); #pragma warning restore CS0618 // Type or member is obsolete else throw new BadRequestException("Invalid request: An Envelope object or a valid EnvelopeId/UUID must be supplied."); #pragma warning disable CS0618 // Type or member is obsolete if (request.Status is not null) query = query.Where(h => h.Status == request.Status); #pragma warning restore CS0618 // Type or member is obsolete if (request.Statuses is not null) { var status = request.Statuses; if (status.Min is not null) query = query.Where(er => er.Envelope!.Status >= status.Min); if (status.Max is not null) query = query.Where(er => er.Envelope!.Status <= status.Max); if (status.Include?.Count() > 0) query = query.Where(er => status.Include.Contains(er.Envelope!.Status)); if (status.Ignore is not null) query = query.Where(er => !status.Ignore.Contains(er.Envelope!.Status)); } if (request.OnlyLast) query = query.OrderByDescending(x => x.AddedWhen); var hists = await query.ToListAsync(cancel); return _mapper.Map>(hists); } }