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