using EnvelopeGenerator.Application.Common.Dto;
using EnvelopeGenerator.Application.Common.Query;
using MediatR;
using AutoMapper;
using DigitalData.Core.Abstraction.Application.Repository;
using EnvelopeGenerator.Domain.Entities;
using Microsoft.EntityFrameworkCore;
namespace EnvelopeGenerator.Application.Envelopes.Queries;
///
///
///
public record ReadUserEnvelopesQuery : EnvelopeQueryBase, IRequest>
{
///
///
///
public required int UserId { get; init; }
///
///
///
public EnvelopeStatusQuery? Status { get; init; }
}
///
///
///
public class ReadUserEnvelopesQueryHandler : IRequestHandler>
{
private readonly IRepository _repository;
private readonly IMapper _mapper;
///
///
///
///
///
public ReadUserEnvelopesQueryHandler(IRepository repository, IMapper mapper)
{
_repository = repository;
_mapper = mapper;
}
///
///
///
///
///
///
public async Task> Handle(ReadUserEnvelopesQuery request, CancellationToken cancellationToken)
{
var query = _repository.Query
.Include(e => e.Documents)
.Where(e => e.UserId == request.UserId);
if (request.Status is { } status)
{
if (status.Min is not null)
query = query.Where(e => e.Status >= status.Min);
if (status.Max is not null)
query = query.Where(e => e.Status <= status.Max);
if (status.Include?.Length > 0)
query = query.Where(e => status.Include.Contains(e.Status));
if (status.Ignore?.Length > 0)
query = query.Where(e => !status.Ignore.Contains(e.Status));
}
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.AsNoTracking().ToListAsync(cancellationToken);
return _mapper.Map>(envelopes);
}
}