using MediatR; using Mws.Application.Common; using Mws.Domain.Projects; namespace Mws.Application.Projects; public record AddProjectMemberCommand(Guid UserId, Guid ProjectId, AddMemberRequest Request) : IRequest; public class AddProjectMemberHandler(IUnitOfWork uow) : IRequestHandler { public async Task Handle(AddProjectMemberCommand command, CancellationToken ct) { if (await uow.Projects.GetMemberRoleAsync(command.ProjectId, command.UserId, ct) != MemberRole.Owner) { throw new ForbiddenException("Only the project owner can add members"); } var request = command.Request; var user = await uow.Users.GetByIdAsync(request.UserId, ct) ?? throw new NotFoundException("User not found"); var already = await uow.Projects.IsMemberAsync(command.ProjectId, request.UserId, ct); if (already) { throw new BadRequestException("User is already a member of this project"); } var role = request.Role is MemberRole.Owner or MemberRole.Member ? request.Role : MemberRole.Member; var member = new ProjectMember { ProjectId = command.ProjectId, UserId = request.UserId, Role = role, }; uow.Projects.AddMember(member); uow.Projects.AddMemberPermission(new ProjectMemberPermission { ProjectId = command.ProjectId, UserId = request.UserId, Screen = ProjectPermissionScreens.Documents, CanView = true, CanCreate = role == MemberRole.Owner, CanEdit = role == MemberRole.Owner, CanDelete = role == MemberRole.Owner, }); await uow.SaveChangesAsync(ct); return new ProjectMemberDto { UserId = user.Id, Username = user.Username, DisplayName = user.DisplayName, Role = member.Role, CanViewDocuments = true, CanCreateDocuments = role == MemberRole.Owner, CanEditDocuments = role == MemberRole.Owner, CanDeleteDocuments = role == MemberRole.Owner, }; } }