using MediatR; using Mws.Application.Common; using Mws.Domain.Projects; namespace Mws.Application.Projects; public record UpdateMemberDocumentPermissionsCommand( Guid UserId, Guid ProjectId, Guid MemberUserId, UpdateMemberDocumentPermissionsRequest Request) : IRequest; public class UpdateMemberDocumentPermissionsHandler(IUnitOfWork uow) : 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); 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, }; } }