using DigitalData.Core.Abstraction.Application.Repository; using MediatR; using EnvelopeGenerator.Domain.Entities; using Microsoft.EntityFrameworkCore; using AutoMapper; using EnvelopeGenerator.Application.Common.Dto; using DigitalData.Core.Exceptions; namespace EnvelopeGenerator.Application.Documents.Queries; /// /// Represents a query to read a document based on its unique identifier or associated envelope identifier. /// /// The unique identifier of the document. Optional. /// The identifier of the envelope associated with the document. Optional. public record ReadDocumentQuery(int? Id = null, int? EnvelopeId = null) : IRequest { } /// /// Handles queries for reading data based on either the document ID or the envelope ID. /// public class ReadDocumentQueryHandler : IRequestHandler { /// /// TempRepo for accessing entities. /// private readonly IRepository _repo; private readonly IMapper _mapper; /// /// Initializes a new instance of the class. /// /// The repository used to access entities. /// public ReadDocumentQueryHandler(IRepository envelopeDocumentRepository, IMapper mapper) { _repo = envelopeDocumentRepository; _mapper = mapper; } /// /// Handles the and returns a based on the provided identifiers. /// /// The query containing the document ID or envelope ID to search for. /// A token to monitor for cancellation requests. /// /// A if a matching document is found; otherwise, null. /// /// /// Thrown when neither nor is provided. /// public async Task Handle(ReadDocumentQuery query, CancellationToken cancel) { if (query.Id is not null) { var doc = await _repo.Query.Where(d => d.Id == query.Id).FirstOrDefaultAsync(cancel); return _mapper.Map(doc); } else if (query.EnvelopeId is not null) { var doc = await _repo.Query.Where(d => d.EnvelopeId == query.EnvelopeId).FirstOrDefaultAsync(cancel); return _mapper.Map(doc); } throw new NotFoundException(); } }