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, ILogger logger) : ControllerBase { /// /// Returns the document bytes receiver. /// /// Encoded envelope key. /// Cancellation token. [HttpGet] [Authorize(Roles = $"{Role.Sender},{Role.Receiver.FullyAuth}")] public async Task GetDocument(CancellationToken cancel, [FromQuery] ReadDocumentQuery? query = null) { // Sender: expects query with envelope key if (User.IsInRole(Role.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 (User.IsInRole(Role.Receiver.FullyAuth)) { 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(); } }