using MediatR; using mws.backend.dotnet.application.Audit; using mws.backend.dotnet.application.Common; using mws.backend.dotnet.domain.Projects; namespace mws.backend.dotnet.application.Projects; public record UpdateMemberDocumentPermissionsCommand( Guid UserId, Guid ProjectId, Guid MemberUserId, UpdateMemberDocumentPermissionsRequest Request) : IRequest, IAuditableRequest { public string Action => "ProjectMember.UpdatePermissions"; public string EntityType => "ProjectMember"; public Guid? EntityId => MemberUserId; } public class UpdateMemberDocumentPermissionsHandler(IUnitOfWork uow, IAuditContext auditContext) : IRequestHandler { public async Task Handle(UpdateMemberDocumentPermissionsCommand command, CancellationToken ct) { if (await uow.Projects.GetMemberRoleAsync(command.ProjectId, command.UserId, ct) != MemberRole.Owner) { throw new ForbiddenException("Only the project owner can change member permissions"); } var member = await uow.Projects.GetMemberWithUserAsync(command.ProjectId, command.MemberUserId, ct) ?? throw new NotFoundException("Member not found in project"); if (member.Role == MemberRole.Owner) { throw new BadRequestException("Owner permissions cannot be changed"); } var permission = await uow.Projects.GetMemberPermissionAsync(command.ProjectId, command.MemberUserId, ProjectPermissionScreens.Documents, ct); if (permission is null) { permission = new ProjectMemberPermission { ProjectId = command.ProjectId, UserId = command.MemberUserId, Screen = ProjectPermissionScreens.Documents }; uow.Projects.AddMemberPermission(permission); } var request = command.Request; permission.CanView = request.CanViewDocuments; permission.CanCreate = request.CanCreateDocuments; permission.CanEdit = request.CanEditDocuments; permission.CanDelete = request.CanDeleteDocuments; await uow.SaveChangesAsync(ct); auditContext.EntityName = member.User.Username; return new ProjectMemberDto { UserId = member.UserId, Username = member.User.Username, DisplayName = member.User.DisplayName, Role = member.Role, CanViewDocuments = permission.CanView, CanCreateDocuments = permission.CanCreate, CanEditDocuments = permission.CanEdit, CanDeleteDocuments = permission.CanDelete, }; } }