using MediatR; using ColaFlow.Modules.ProjectManagement.Application.DTOs; using ColaFlow.Modules.ProjectManagement.Domain.Repositories; using ColaFlow.Modules.ProjectManagement.Domain.ValueObjects; using ColaFlow.Modules.ProjectManagement.Domain.Exceptions; using ColaFlow.Modules.ProjectManagement.Domain.Aggregates.ProjectAggregate; namespace ColaFlow.Modules.ProjectManagement.Application.Queries.GetProjectById; /// /// Handler for GetProjectByIdQuery /// public sealed class GetProjectByIdQueryHandler(IProjectRepository projectRepository) : IRequestHandler { private readonly IProjectRepository _projectRepository = projectRepository ?? throw new ArgumentNullException(nameof(projectRepository)); public async Task Handle(GetProjectByIdQuery request, CancellationToken cancellationToken) { var project = await _projectRepository.GetByIdAsync( ProjectId.From(request.ProjectId), cancellationToken); if (project == null) { throw new DomainException($"Project with ID '{request.ProjectId}' not found"); } return MapToDto(project); } private static ProjectDto MapToDto(Project project) { return new ProjectDto { Id = project.Id.Value, Name = project.Name, Description = project.Description, Key = project.Key.Value, Status = project.Status.Name, OwnerId = project.OwnerId.Value, CreatedAt = project.CreatedAt, UpdatedAt = project.UpdatedAt, Epics = project.Epics.Select(e => new EpicDto { Id = e.Id.Value, Name = e.Name, Description = e.Description, ProjectId = e.ProjectId.Value, Status = e.Status.Name, Priority = e.Priority.Name, CreatedBy = e.CreatedBy.Value, CreatedAt = e.CreatedAt, UpdatedAt = e.UpdatedAt, Stories = e.Stories.Select(s => new StoryDto { Id = s.Id.Value, Title = s.Title, Description = s.Description, EpicId = s.EpicId.Value, Status = s.Status.Name, Priority = s.Priority.Name, AssigneeId = s.AssigneeId?.Value, EstimatedHours = s.EstimatedHours, ActualHours = s.ActualHours, CreatedBy = s.CreatedBy.Value, CreatedAt = s.CreatedAt, UpdatedAt = s.UpdatedAt, Tasks = s.Tasks.Select(t => new TaskDto { Id = t.Id.Value, Title = t.Title, Description = t.Description, StoryId = t.StoryId.Value, Status = t.Status.Name, Priority = t.Priority.Name, AssigneeId = t.AssigneeId?.Value, EstimatedHours = t.EstimatedHours, ActualHours = t.ActualHours, CreatedBy = t.CreatedBy.Value, CreatedAt = t.CreatedAt, UpdatedAt = t.UpdatedAt }).ToList() }).ToList() }).ToList() }; } }