using DigitalData.TaskFlow.Application.Features.Documents.Queries.GetDocument; using DigitalData.TaskFlow.API.Contracts.Common; using DigitalData.TaskFlow.Domain.Common; using DigitalData.TaskFlow.Domain.Documents; using MediatR; using Microsoft.AspNetCore.Mvc; namespace DigitalData.TaskFlow.API.Controllers; /// /// Provides document binary download endpoints. /// [ApiController] [Route("api/documents")] public sealed class DocumentsController(ISender sender) : ControllerBase { /// /// Returns binary document content by document identifier. /// /// Document identifier. /// Cancellation token. /// Binary stream when available. [HttpGet("{id}")] [ProducesResponseType(typeof(FileContentResult), StatusCodes.Status200OK)] [ProducesResponseType(typeof(MetaOnlyResponse), StatusCodes.Status400BadRequest)] [ProducesResponseType(typeof(MetaOnlyResponse), StatusCodes.Status401Unauthorized)] [ProducesResponseType(typeof(MetaOnlyResponse), StatusCodes.Status403Forbidden)] [ProducesResponseType(typeof(MetaOnlyResponse), StatusCodes.Status404NotFound)] [ProducesResponseType(typeof(MetaOnlyResponse), StatusCodes.Status500InternalServerError)] public async Task GetAsync([FromRoute] string id, CancellationToken cancellationToken) { var response = await sender.Send(new GetDocumentQuery(id), cancellationToken); var data = response.Data ?? throw new InvalidOperationException("Document payload is unexpectedly null."); return File(data.Content, data.ContentType, data.FileName); } }