ref: project structure
This commit is contained in:
@@ -0,0 +1,16 @@
|
||||
using AutoMapper;
|
||||
using MediatR;
|
||||
using mws.backend.dotnet.application.Common;
|
||||
|
||||
namespace mws.backend.dotnet.application.Projects;
|
||||
|
||||
public record GetProjectQuery(Guid UserId, Guid ProjectId) : IRequest<ProjectDto>;
|
||||
|
||||
public class GetProjectHandler(IUnitOfWork uow, IMapper mapper) : IRequestHandler<GetProjectQuery, ProjectDto>
|
||||
{
|
||||
public async Task<ProjectDto> Handle(GetProjectQuery query, CancellationToken ct)
|
||||
{
|
||||
var project = await ProjectAccess.GetForUserOrThrowAsync(uow, query.UserId, query.ProjectId, ct);
|
||||
return mapper.Map<ProjectDto>(project);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
using MediatR;
|
||||
using mws.backend.dotnet.application.Common;
|
||||
using mws.backend.dotnet.domain.Projects;
|
||||
|
||||
namespace mws.backend.dotnet.application.Projects;
|
||||
|
||||
public record GetProjectMembersQuery(Guid UserId, Guid ProjectId, int Page, int PageSize) : IRequest<PagedResult<ProjectMemberDto>>;
|
||||
|
||||
public class GetProjectMembersHandler(IUnitOfWork uow) : IRequestHandler<GetProjectMembersQuery, PagedResult<ProjectMemberDto>>
|
||||
{
|
||||
public async Task<PagedResult<ProjectMemberDto>> Handle(GetProjectMembersQuery query, CancellationToken ct)
|
||||
{
|
||||
var isMember = await uow.Projects.IsMemberAsync(query.ProjectId, query.UserId, ct);
|
||||
if (!isMember)
|
||||
{
|
||||
throw new NotFoundException("Project not found");
|
||||
}
|
||||
|
||||
var members = await uow.Projects.GetMembersWithUserAsync(query.ProjectId, query.Page, query.PageSize, ct);
|
||||
var permissions = await uow.Projects.GetMemberPermissionsAsync(query.ProjectId, ProjectPermissionScreens.Documents, ct);
|
||||
|
||||
var items = members.Items.Select(m =>
|
||||
{
|
||||
permissions.TryGetValue(m.UserId, out var p);
|
||||
return new ProjectMemberDto
|
||||
{
|
||||
UserId = m.UserId,
|
||||
Username = m.User.Username,
|
||||
DisplayName = m.User.DisplayName,
|
||||
Role = m.Role,
|
||||
CanViewDocuments = m.Role == MemberRole.Owner || (p?.CanView ?? false),
|
||||
CanCreateDocuments = m.Role == MemberRole.Owner || (p?.CanCreate ?? false),
|
||||
CanEditDocuments = m.Role == MemberRole.Owner || (p?.CanEdit ?? false),
|
||||
CanDeleteDocuments = m.Role == MemberRole.Owner || (p?.CanDelete ?? false),
|
||||
};
|
||||
}).ToList();
|
||||
|
||||
return new PagedResult<ProjectMemberDto>
|
||||
{
|
||||
Items = items,
|
||||
TotalCount = members.TotalCount,
|
||||
Page = members.Page,
|
||||
PageSize = members.PageSize,
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
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<ProjectOverviewDto>;
|
||||
|
||||
public class GetProjectOverviewHandler(IUnitOfWork uow, IMapper mapper) : IRequestHandler<GetProjectOverviewQuery, ProjectOverviewDto>
|
||||
{
|
||||
public async Task<ProjectOverviewDto> 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<ProjectDto>(project),
|
||||
MemberCount = memberCount,
|
||||
DocumentCount = documentCount,
|
||||
TaskCountsByStatus = taskCountsByStatus,
|
||||
RecentTasks = mapper.Map<List<RecentTaskDto>>(recentTasks),
|
||||
RecentDocuments = mapper.Map<List<RecentDocumentDto>>(recentDocuments),
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
using AutoMapper;
|
||||
using MediatR;
|
||||
using mws.backend.dotnet.application.Common;
|
||||
|
||||
namespace mws.backend.dotnet.application.Projects;
|
||||
|
||||
public record GetProjectsQuery(Guid UserId, int Page, int PageSize) : IRequest<PagedResult<ProjectDto>>;
|
||||
|
||||
public class GetProjectsHandler(IUnitOfWork uow, IMapper mapper) : IRequestHandler<GetProjectsQuery, PagedResult<ProjectDto>>
|
||||
{
|
||||
public async Task<PagedResult<ProjectDto>> Handle(GetProjectsQuery query, CancellationToken ct)
|
||||
{
|
||||
var projects = await uow.Projects.GetForUserAsync(query.UserId, query.Page, query.PageSize, ct);
|
||||
return new PagedResult<ProjectDto>
|
||||
{
|
||||
Items = mapper.Map<List<ProjectDto>>(projects.Items),
|
||||
TotalCount = projects.TotalCount,
|
||||
Page = projects.Page,
|
||||
PageSize = projects.PageSize,
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
using AutoMapper;
|
||||
using MediatR;
|
||||
using mws.backend.dotnet.application.Common;
|
||||
|
||||
namespace mws.backend.dotnet.application.Projects;
|
||||
|
||||
public record SearchProjectsQuery(Guid UserId, string Term) : IRequest<List<ProjectDto>>;
|
||||
|
||||
public class SearchProjectsHandler(IUnitOfWork uow, IMapper mapper) : IRequestHandler<SearchProjectsQuery, List<ProjectDto>>
|
||||
{
|
||||
public async Task<List<ProjectDto>> Handle(SearchProjectsQuery query, CancellationToken ct)
|
||||
{
|
||||
var projects = await uow.Projects.SearchForUserAsync(query.UserId, query.Term, ct);
|
||||
return mapper.Map<List<ProjectDto>>(projects);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user