using MediatR; using Microsoft.AspNetCore.Mvc; using ColaFlow.Modules.ProjectManagement.Application.DTOs; using ColaFlow.Modules.ProjectManagement.Application.Commands.CreateEpic; using ColaFlow.Modules.ProjectManagement.Application.Commands.UpdateEpic; using ColaFlow.Modules.ProjectManagement.Application.Queries.GetEpicById; using ColaFlow.Modules.ProjectManagement.Application.Queries.GetEpicsByProjectId; namespace ColaFlow.API.Controllers; /// /// Epics API Controller /// [ApiController] [Route("api/v1")] public class EpicsController : ControllerBase { private readonly IMediator _mediator; public EpicsController(IMediator mediator) { _mediator = mediator ?? throw new ArgumentNullException(nameof(mediator)); } /// /// Get all epics for a project /// [HttpGet("projects/{projectId:guid}/epics")] [ProducesResponseType(typeof(List), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task GetProjectEpics(Guid projectId, CancellationToken cancellationToken = default) { var query = new GetEpicsByProjectIdQuery(projectId); var result = await _mediator.Send(query, cancellationToken); return Ok(result); } /// /// Get epic by ID /// [HttpGet("epics/{id:guid}")] [ProducesResponseType(typeof(EpicDto), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task GetEpic(Guid id, CancellationToken cancellationToken = default) { var query = new GetEpicByIdQuery(id); var result = await _mediator.Send(query, cancellationToken); return Ok(result); } /// /// Create a new epic /// [HttpPost("projects/{projectId:guid}/epics")] [ProducesResponseType(typeof(EpicDto), StatusCodes.Status201Created)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task CreateEpic( Guid projectId, [FromBody] CreateEpicRequest request, CancellationToken cancellationToken = default) { var command = new CreateEpicCommand { ProjectId = projectId, Name = request.Name, Description = request.Description, CreatedBy = request.CreatedBy }; var result = await _mediator.Send(command, cancellationToken); return CreatedAtAction(nameof(GetEpic), new { id = result.Id }, result); } /// /// Update an existing epic /// [HttpPut("epics/{id:guid}")] [ProducesResponseType(typeof(EpicDto), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task UpdateEpic( Guid id, [FromBody] UpdateEpicRequest request, CancellationToken cancellationToken = default) { var command = new UpdateEpicCommand { EpicId = id, Name = request.Name, Description = request.Description }; var result = await _mediator.Send(command, cancellationToken); return Ok(result); } } /// /// Request model for creating an epic /// public record CreateEpicRequest { public string Name { get; init; } = string.Empty; public string Description { get; init; } = string.Empty; public Guid CreatedBy { get; init; } } /// /// Request model for updating an epic /// public record UpdateEpicRequest { public string Name { get; init; } = string.Empty; public string Description { get; init; } = string.Empty; }