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>; public class GetProjectMembersHandler(IUnitOfWork uow) : IRequestHandler> { public async Task> 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 { Items = items, TotalCount = members.TotalCount, Page = members.Page, PageSize = members.PageSize, }; } }