47 lines
1.9 KiB
C#
47 lines
1.9 KiB
C#
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, MemberListFilter Filter, 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.Filter, 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,
|
|
};
|
|
}
|
|
}
|