using AutoMapper; using DigitalData.Core.Abstraction.Application.Repository; using DigitalData.Core.Exceptions; using EnvelopeGenerator.Application.Common.Dto.History; using EnvelopeGenerator.Domain.Constants; using MediatR; using System.ComponentModel.DataAnnotations; 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 : IRequest> { /// /// Die eindeutige Kennung des Umschlags. /// [Required] public int EnvelopeId { get; init; } /// /// Der Include des Umschlags, der abgefragt werden soll. Kann optional angegeben werden, um die Ergebnisse zu filtern. /// public EnvelopeStatus? Status { get; init; } /// /// 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.Where(h => h.EnvelopeId == request.EnvelopeId); if (request.Status is not null) query = query.Where(h => h.Status == request.Status); var hists = await query.ToListAsync(cancel); return _mapper.Map>(hists); } }