using DigitalData.Core.Abstraction.Application.Repository; using EnvelopeGenerator.Application.Common.Query; using MediatR; using EnvelopeGenerator.Domain.Entities; using Microsoft.EntityFrameworkCore; namespace EnvelopeGenerator.Application.Envelopes.Queries; /// /// Eine Abfrage, um die zuletzt verwendete Anrede eines Empfängers zu ermitteln, /// damit diese für zukünftige Umschläge wiederverwendet werden kann. /// public record ReadReceiverNameQuery() : ReceiverQueryBase, IRequest; /// /// /// public class ReadReceiverNameQueryHandler : IRequestHandler { private readonly IRepository _envelopeReceiverRepository; private readonly IRepository _receiverRepository; /// /// /// /// /// public ReadReceiverNameQueryHandler(IRepository envelopeReceiverRepository, IRepository receiverRepository) { _envelopeReceiverRepository = envelopeReceiverRepository; _receiverRepository = receiverRepository; } /// /// /// /// /// /// public async Task Handle(ReadReceiverNameQuery request, CancellationToken cancellationToken) { var receiverQuery = _receiverRepository.Query.AsNoTracking(); if (request.Id is int id) receiverQuery = receiverQuery.Where(r => r.Id == id); if (request.EmailAddress is string email) receiverQuery = receiverQuery.Where(r => r.EmailAddress == email); if (request.Signature is string signature) receiverQuery = receiverQuery.Where(r => r.Signature == signature); var receiver = await receiverQuery.FirstOrDefaultAsync(cancellationToken); if (receiver is null) return null; var erName = await _envelopeReceiverRepository.Query .Where(er => er.ReceiverId == receiver.Id) .OrderByDescending(er => er.AddedWhen) .Select(er => er.Name) .FirstOrDefaultAsync(cancellationToken); return erName; } }