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