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);
}
}