using AutoMapper; using MediatR; using mws.backend.dotnet.application.Common; using mws.backend.dotnet.domain.Documents; namespace mws.backend.dotnet.application.Projects; public record GetProjectOverviewQuery(Guid UserId, Guid ProjectId) : IRequest; public class GetProjectOverviewHandler(IUnitOfWork uow, IMapper mapper) : IRequestHandler { public async Task Handle(GetProjectOverviewQuery query, CancellationToken ct) { var project = await ProjectAccess.GetForUserOrThrowAsync(uow, query.UserId, query.ProjectId, ct); var memberCount = await uow.Projects.CountMembersAsync(query.ProjectId, ct); var documentCount = await uow.Documents.CountByTypeForProjectAsync(query.ProjectId, DocumentType.Document, ct); var taskCounts = await uow.Tasks.CountByStatusForProjectAsync(query.ProjectId, ct); var taskCountsByStatus = taskCounts.ToDictionary(kv => kv.Key.ToString(), kv => kv.Value); var recentTasks = await uow.Tasks.GetRecentForProjectAsync(query.ProjectId, 5, ct); var recentDocuments = await uow.Documents.GetRecentForProjectAsync(query.ProjectId, DocumentType.Document, 5, ct); return new ProjectOverviewDto { Project = mapper.Map(project), MemberCount = memberCount, DocumentCount = documentCount, TaskCountsByStatus = taskCountsByStatus, RecentTasks = mapper.Map>(recentTasks), RecentDocuments = mapper.Map>(recentDocuments), }; } }