using AutoMapper;
using DigitalData.Core.Abstraction.Application.Repository;
using EnvelopeGenerator.Application.Dto.EnvelopeReceiver;
using EnvelopeGenerator.Domain.Entities;
using MediatR;
using Microsoft.EntityFrameworkCore;
namespace EnvelopeGenerator.Application.EnvelopeReceivers.Queries;
///
///
///
public class ReadEnvelopeReceiverQueryHandler : IRequestHandler
{
private readonly IRepository _repo;
private readonly IMapper _mapper;
///
///
///
///
///
public ReadEnvelopeReceiverQueryHandler(IRepository envelopeReceiver, IMapper mapper)
{
_repo = envelopeReceiver;
_mapper = mapper;
}
///
///
///
///
///
///
///
public async Task Handle(ReadEnvelopeReceiverQuery request, CancellationToken cancel)
{
var q = _repo.Read();
if(request.Envelope is not null)
{
var env = request.Envelope;
if (env.Id is not null)
q = q.Where(er => er.EnvelopeId == env.Id);
if (env.StatusQ is not null)
{
if(env.StatusQ.MinStatus is not null)
q = q.Where(er => er.Envelope.Status >= env.StatusQ.MinStatus);
if(env.StatusQ.MaxStatus is not null)
q = q.Where(er => er.Envelope.Status <= env.StatusQ.MaxStatus);
if(env.StatusQ .Status?.Length > 0)
q = q.Where(er => env.StatusQ.Status.Contains(er.Envelope.Status));
if(env.StatusQ.IgnoredStatus is not null)
q = q.Where(er => !env.StatusQ.IgnoredStatus.Contains(er.Envelope.Status));
}
if (env.Uuid is not null)
q = q.Where(er => er.Envelope.Uuid == env.Uuid);
}
if (request.Receiver is not null)
{
var rcv = request.Receiver;
if (rcv.Id is not null)
q = q.Where(r => r.ReceiverId == rcv.Id);
if (rcv.EmailAddress is not null)
q = q.Where(r => r.Receiver.EmailAddress == rcv.EmailAddress);
if (rcv.Signature is not null)
q = q.Where(er => er.Receiver.Signature == rcv.Signature);
}
var er = await q.Include(er => er.Envelope).ThenInclude(e => e.Documents).ThenInclude(d => d.Elements)
.Include(er => er.Envelope).ThenInclude(e => e.History)
.Include(er => er.Envelope).ThenInclude(e => e.User)
.Include(er => er.Receiver)
.FirstOrDefaultAsync(cancel);
return er is null ? null : _mapper.Map(er);
}
}