using MediatR; using EnvelopeGenerator.Application.Common.Query; using EnvelopeGenerator.Application.Common.Dto; using AutoMapper; using DigitalData.Core.Abstraction.Application.Repository; using EnvelopeGenerator.Domain.Entities; using Microsoft.EntityFrameworkCore; using DigitalData.Core.Exceptions; namespace EnvelopeGenerator.Application.Envelopes.Queries; /// /// Repräsentiert eine Abfrage für einen einzelnen Umschlag. /// public record ReadSingleEnvelopeQuery : EnvelopeQueryBase, IRequest { /// /// Optionaler Benutzerfilter; wenn gesetzt, werden nur Umschläge des Benutzers geladen. /// public int? UserId { get; init; } /// /// Setzt den Benutzerkontext für die Abfrage. /// public ReadSingleEnvelopeQuery Authorize(int userId) => this with { UserId = userId }; } /// /// Verarbeitet und liefert ein einzelnes -Ergebnis. /// public class ReadSingleEnvelopeQueryHandler : IRequestHandler { private readonly IRepository _repository; private readonly IMapper _mapper; /// /// /// /// /// public ReadSingleEnvelopeQueryHandler(IRepository repository, IMapper mapper) { _repository = repository; _mapper = mapper; } /// /// /// /// /// /// public async Task Handle(ReadSingleEnvelopeQuery request, CancellationToken cancel) { var query = _repository.Query; if (request.UserId is int userId) query = query.Where(e => e.UserId == userId); if (request.Id is int id) query = query.Where(e => e.Id == id); if (request.Uuid is string uuid) query = query.Where(e => e.Uuid == uuid); var envelopes = await query .Include(e => e.Documents) .Take(2) .ToListAsync(cancel); if (envelopes.Count > 1) throw new BadRequestException($"Multiple envelopes found for the given criteria: Id={request.Id}, Uuid={request.Uuid}, UserId={request.UserId}"); return envelopes.SingleOrDefault() is Envelope envelope ? _mapper.Map(envelope) : throw new NotFoundException($"Envelope with Id={request.Id}, Uuid={request.Uuid} not found"); } }