using MediatR; using Microsoft.AspNetCore.Mvc; using ColaFlow.Modules.ProjectManagement.Application.DTOs; using ColaFlow.Modules.ProjectManagement.Application.Commands.CreateProject; using ColaFlow.Modules.ProjectManagement.Application.Queries.GetProjectById; using ColaFlow.Modules.ProjectManagement.Application.Queries.GetProjects; namespace ColaFlow.API.Controllers; /// /// Projects API Controller /// [ApiController] [Route("api/v1/[controller]")] public class ProjectsController : ControllerBase { private readonly IMediator _mediator; public ProjectsController(IMediator mediator) { _mediator = mediator ?? throw new ArgumentNullException(nameof(mediator)); } /// /// Get all projects /// [HttpGet] [ProducesResponseType(typeof(List), StatusCodes.Status200OK)] public async Task GetProjects(CancellationToken cancellationToken = default) { var query = new GetProjectsQuery(); var result = await _mediator.Send(query, cancellationToken); return Ok(result); } /// /// Get project by ID /// [HttpGet("{id:guid}")] [ProducesResponseType(typeof(ProjectDto), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task GetProject(Guid id, CancellationToken cancellationToken = default) { var query = new GetProjectByIdQuery(id); var result = await _mediator.Send(query, cancellationToken); return Ok(result); } /// /// Create a new project /// [HttpPost] [ProducesResponseType(typeof(ProjectDto), StatusCodes.Status201Created)] [ProducesResponseType(StatusCodes.Status400BadRequest)] public async Task CreateProject( [FromBody] CreateProjectCommand command, CancellationToken cancellationToken = default) { var result = await _mediator.Send(command, cancellationToken); return CreatedAtAction(nameof(GetProject), new { id = result.Id }, result); } }