using AutoMapper; using DigitalData.Core.Abstraction.Application.Repository; using DigitalData.Core.Exceptions; using EnvelopeGenerator.Application.Common.Dto.EnvelopeHistory; using EnvelopeGenerator.Application.Common.Extensions; using EnvelopeGenerator.Application.Common.Model; using EnvelopeGenerator.Domain.Constants; using EnvelopeGenerator.Domain.Entities; using MediatR; using Microsoft.EntityFrameworkCore; namespace EnvelopeGenerator.Application.Histories.Commands; /// /// /// public record CreateHistoryCommand : EnvelopeReceiverQueryBase, IRequest { /// /// /// public int? EnvelopeId { get; set; } /// /// /// public string? UserReference { get; set; } /// /// /// public EnvelopeStatus Status { get; set; } /// /// /// public DateTime AddedWhen { get; } = DateTime.Now; /// /// /// public DateTime ActionDate => AddedWhen; /// /// /// public string? Comment { get; set; } } /// /// /// public class CreateHistoryCommandHandler : IRequestHandler { private readonly IRepository _repo; private readonly IRepository _erRepo; private readonly IMapper _mapper; /// /// /// /// /// /// public CreateHistoryCommandHandler(IRepository repo, IRepository erRepo, IMapper mapper) { _repo = repo; _erRepo = erRepo; _mapper = mapper; } /// /// /// /// /// /// public async Task Handle(CreateHistoryCommand request, CancellationToken cancel) { if(request.UserReference is null) { var receivers = await _erRepo .ReadOnly() .Where(request) .Include(er => er.Receiver) .ToListAsync(cancel); if (receivers.Count != 1) throw new BadRequestException( receivers.Count > 1 ? "Multiple receivers found for the given envelope and receiver criteria." : "No receiver found for the given envelope and receiver criteria." ); var receiver = receivers.Single().Receiver ?? throw new BadRequestException("No receiver found for the given envelope and receiver criteria."); request.UserReference = receiver.EmailAddress; } // create entitiy var hist = await _repo.CreateAsync(request, cancel); return _mapper.Map(hist); } }