diff --git a/EnvelopeGenerator.Application/Signatures/Behaviors/EnvelopeReceiverResolutionBehavior.cs b/EnvelopeGenerator.Application/Signatures/Behaviors/EnvelopeReceiverResolutionBehavior.cs new file mode 100644 index 00000000..c90603e3 --- /dev/null +++ b/EnvelopeGenerator.Application/Signatures/Behaviors/EnvelopeReceiverResolutionBehavior.cs @@ -0,0 +1,54 @@ +using AutoMapper; +using DigitalData.Core.Abstraction.Application.Repository; +using DigitalData.Core.Exceptions; +using EnvelopeGenerator.Application.Common.Dto.EnvelopeReceiver; +using EnvelopeGenerator.Application.Common.Extensions; +using EnvelopeGenerator.Application.Signatures.Commands; +using EnvelopeGenerator.Domain.Entities; +using MediatR; +using Microsoft.EntityFrameworkCore; + +namespace EnvelopeGenerator.Application.Signatures.Behaviors; + +/// +/// Pipeline behavior that resolves and validates EnvelopeReceiver. +/// Executes FIRST in the signing process - before all other behaviors. +/// If EnvelopeReceiver is not provided, it queries the database using EnvelopeReceiverQueryBase parameters. +/// +public class EnvelopeReceiverResolutionBehavior : IPipelineBehavior +{ + private readonly IRepository _erRepo; + private readonly IMapper _mapper; + + /// + /// + /// + /// + /// + public EnvelopeReceiverResolutionBehavior(IRepository erRepo, IMapper mapper) + { + _erRepo = erRepo; + _mapper = mapper; + } + + /// + /// + /// + /// + /// + /// + /// + public async Task Handle(SignCommand request, RequestHandlerDelegate next, CancellationToken cancellationToken) + { + // If EnvelopeReceiver is not provided, query it from database + if (request.EnvelopeReceiver is null) + { + var er = await _erRepo.Query.Where(request, notnull: true).SingleOrDefaultAsync(cancellationToken) + ?? throw new NotFoundException("EnvelopeReceiver not found"); + + request.SetEnvelopeReceiver(_mapper.Map(er)); + } + + return await next(cancellationToken); + } +}