Files
EnvelopeGenerator/EnvelopeGenerator.Application/Envelopes/Queries/ReadSingleEnvelopeQuery.cs
TekH 90031db6a5 Add query/handler for retrieving a single envelope
Introduced ReadSingleEnvelopeQuery and its handler to enable
retrieval of a single envelope with optional user filtering.
Supports filtering by user ID, envelope ID, or UUID, includes
related documents, and maps results to EnvelopeDto using
AutoMapper for secure and flexible access.
2026-04-08 10:49:23 +02:00

72 lines
2.2 KiB
C#

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;
namespace EnvelopeGenerator.Application.Envelopes.Queries;
/// <summary>
/// Repräsentiert eine Abfrage für einen einzelnen Umschlag.
/// </summary>
public record ReadSingleEnvelopeQuery : EnvelopeQueryBase, IRequest<EnvelopeDto?>
{
/// <summary>
/// Optionaler Benutzerfilter; wenn gesetzt, werden nur Umschläge des Benutzers geladen.
/// </summary>
public int? UserId { get; init; }
/// <summary>
/// Setzt den Benutzerkontext für die Abfrage.
/// </summary>
public ReadSingleEnvelopeQuery Authorize(int userId) => this with { UserId = userId };
}
/// <summary>
/// Verarbeitet <see cref="ReadSingleEnvelopeQuery"/> und liefert ein einzelnes <see cref="EnvelopeDto"/>-Ergebnis.
/// </summary>
public class ReadSingleEnvelopeQueryHandler : IRequestHandler<ReadSingleEnvelopeQuery, EnvelopeDto?>
{
private readonly IRepository<Envelope> _repository;
private readonly IMapper _mapper;
/// <summary>
///
/// </summary>
/// <param name="repository"></param>
/// <param name="mapper"></param>
public ReadSingleEnvelopeQueryHandler(IRepository<Envelope> repository, IMapper mapper)
{
_repository = repository;
_mapper = mapper;
}
/// <summary>
///
/// </summary>
/// <param name="request"></param>
/// <param name="cancel"></param>
/// <returns></returns>
public async Task<EnvelopeDto?> 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 envelope = await query
.Include(e => e.Documents)
.FirstOrDefaultAsync(cancel);
return envelope is null ? null : _mapper.Map<EnvelopeDto>(envelope);
}
}