using DigitalData.Core.Abstraction.Application.Repository;
using DigitalData.Core.Exceptions;
using EnvelopeGenerator.Domain.Entities;
using MediatR;
using Microsoft.EntityFrameworkCore;
namespace EnvelopeGenerator.Application.Histories.Queries;
//TODO: Add sender query
///
/// Repräsentiert eine Abfrage für die Verlaufshistorie eines Umschlags.
///
public record CountHistoryQuery : HistoryQueryBase, IRequest;
///
///
///
public static class CountHistoryQueryExtensions
{
///
///
///
///
///
///
///
public static async Task AnyHistoryAsync(this ISender sender, Action queryOptions, CancellationToken cancel = default)
{
var query = new CountHistoryQuery();
queryOptions(query);
var count = await sender.Send(query, cancel);
return count > 0;
}
}
///
///
///
public class CountHistoryQueryHandler : IRequestHandler
{
private readonly IRepository _repo;
///
///
///
///
public CountHistoryQueryHandler(IRepository repo)
{
_repo = repo;
}
///
///
///
///
///
///
///
public Task Handle(CountHistoryQuery 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.");
if (request.Status is not null)
query = query.Where(h => h.Status == request.Status);
return query.CountAsync(cancel);
}
}