using EnvelopeGenerator.API.Controllers.Interfaces; using EnvelopeGenerator.API.Extensions; using EnvelopeGenerator.Application.Documents.Queries; using EnvelopeGenerator.Domain.Constants; using MediatR; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace EnvelopeGenerator.API.Controllers; /// /// Provides access to envelope documents for authenticated receivers. /// /// /// Initializes a new instance of the class. /// [Authorize] [ApiController] [Route("api/[controller]")] public class DocumentController(IMediator mediator, IAuthorizationService authService) : ControllerBase, IAuthController { /// /// /// public IAuthorizationService AuthService => authService; /// /// Returns the document bytes receiver. /// /// Encoded envelope key. /// Cancellation token. [HttpGet] [Authorize(Policy = AuthPolicy.SenderOrReceiver)] public async Task GetDocument(CancellationToken cancel, [FromQuery] ReadDocumentQuery? query = null) { // Sender: expects query with envelope key if (await this.IsUserInPolicyAsync(AuthPolicy.Sender)) { if (query is null) return BadRequest("Missing document query."); var senderDoc = await mediator.Send(query, cancel); return senderDoc.ByteData is byte[] senderDocByte ? File(senderDocByte, "application/octet-stream") : NotFound("Document is empty."); } // Receiver: resolve envelope id from claims if (await this.IsUserInPolicyAsync(AuthPolicy.Receiver)) { if (query is not null) return BadRequest("Query parameters are not allowed for receiver role."); var envelopeId = User.GetEnvelopeIdOfReceiver(); var receiverDoc = await mediator.Send(new ReadDocumentQuery { EnvelopeId = envelopeId }, cancel); return receiverDoc.ByteData is byte[] receiverDocByte ? File(receiverDocByte, "application/octet-stream") : NotFound("Document is empty."); } return Unauthorized(); } }