diff --git a/EnvelopeGenerator.Application/Envelopes/Queries/ReadSingleEnvelopeQuery.cs b/EnvelopeGenerator.Application/Envelopes/Queries/ReadSingleEnvelopeQuery.cs new file mode 100644 index 00000000..feae8002 --- /dev/null +++ b/EnvelopeGenerator.Application/Envelopes/Queries/ReadSingleEnvelopeQuery.cs @@ -0,0 +1,71 @@ +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; + +/// +/// 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 envelope = await query + .Include(e => e.Documents) + .FirstOrDefaultAsync(cancel); + + return envelope is null ? null : _mapper.Map(envelope); + } +}