- Added `BackToPerMethodId` constant and updated validation rules in `CloseWorkflowCommandValidator`. - Refactored `GetWorkflowsQueryHandler` for simpler `hasListingData` logic. - Replaced strongly-typed properties with `JsonElement` in `ContractsSourceBlock` and `FerdinandSourceBlock`. - Updated `WorkflowListingReadModel` to use smaller data types for efficiency. - Refactored `WorkflowRepository` to use JSON-based data retrieval and parsing. - Introduced `MetaOnlyResponse` and `WorkflowsResponse` for consistent API responses. - Updated `DocumentsController` and `WorkflowsController` to use new response types. - Added `ApiKeyAuthMiddleware` for API key validation and integrated it into the middleware pipeline. - Refactored `ExceptionHandlingMiddleware` to use `MetaOnlyResponse` for error handling. - Performed general cleanup and modernization for improved readability and maintainability.
37 lines
1.7 KiB
C#
37 lines
1.7 KiB
C#
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;
|
|
|
|
/// <summary>
|
|
/// Provides document binary download endpoints.
|
|
/// </summary>
|
|
[ApiController]
|
|
[Route("api/documents")]
|
|
public sealed class DocumentsController(ISender sender) : ControllerBase
|
|
{
|
|
/// <summary>
|
|
/// Returns binary document content by document identifier.
|
|
/// </summary>
|
|
/// <param name="id">Document identifier.</param>
|
|
/// <param name="cancellationToken">Cancellation token.</param>
|
|
/// <returns>Binary stream when available.</returns>
|
|
[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<IActionResult> 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);
|
|
}
|
|
}
|