public async Task <IActionResult> Put([FromBody] User user) { if (user is null) { throw new ArgumentNullException(nameof(user)); } if (string.IsNullOrEmpty(ProjectId)) { return(ErrorResult .BadRequest($"Project Id provided in the url path is invalid. Must be a valid GUID.", ResultErrorCode.ValidationError) .ActionResult()); } var validation = new UserValidator().Validate(user); if (!validation.IsValid) { return(ErrorResult .BadRequest(validation) .ActionResult()); } var oldUser = await usersRepository .GetAsync(user.Id) .ConfigureAwait(false); if (oldUser is null || !oldUser.IsMember(ProjectId)) { return(ErrorResult .NotFound($"The user '{user.Id}' could not be found in this project.") .ActionResult()); } if (oldUser.IsOwner(ProjectId) && !user.IsOwner(ProjectId)) { var otherOwners = await usersRepository .ListOwnersAsync(ProjectId) .AnyAsync(o => o.Id.Equals(user.Id, StringComparison.OrdinalIgnoreCase)) .ConfigureAwait(false); if (!otherOwners) { return(ErrorResult .BadRequest($"Projects must have at least one Owner. To change this user's role you must first add another Owner.", ResultErrorCode.ValidationError) .ActionResult()); } } var membership = user.ProjectMembership(ProjectId); if (oldUser.HasEqualMembership(membership)) { return(ErrorResult .BadRequest(new ValidationError { Field = "projectMemberships", Message = $"User's project memberships did not change." }) .ActionResult()); } oldUser.EnsureProjectMembership(membership); var currentUserForCommand = await userService .CurrentUserAsync() .ConfigureAwait(false); var command = new OrchestratorProjectUserUpdateCommand(currentUserForCommand, oldUser, ProjectId); return(await orchestrator .InvokeAndReturnAccepted(command) .ConfigureAwait(false)); }
public async Task <IActionResult> Put([FromBody] User user) { if (user is null) { throw new ArgumentNullException(nameof(user)); } var validation = new UserValidator().Validate(user); if (!validation.IsValid) { return(ErrorResult .BadRequest(validation) .ActionResult()); } var oldUser = await usersRepository .GetAsync(user.Id) .ConfigureAwait(false); if (oldUser is null) { return(ErrorResult .NotFound($"The user '{oldUser.Id}' could not be found on this TeamCloud Instance.") .ActionResult()); } if (oldUser.IsAdmin() && !user.IsAdmin()) { var otherAdmins = await usersRepository .ListAdminsAsync() .AnyAsync(a => a.Id != user.Id) .ConfigureAwait(false); if (!otherAdmins) { return(ErrorResult .BadRequest($"The TeamCloud instance must have at least one Admin user. To change this user's role you must first add another Admin user.", ResultErrorCode.ValidationError) .ActionResult()); } } if (!oldUser.HasEqualMemberships(user)) { return(ErrorResult .BadRequest(new ValidationError { Field = "projectMemberships", Message = $"User's project memberships can not be changed using the TeamCloud (system) users API. To update a user's project memberships use the project users API." }) .ActionResult()); } var currentUserForCommand = await userService .CurrentUserAsync() .ConfigureAwait(false); oldUser.PopulateFromExternalModel(user); var command = new OrchestratorTeamCloudUserUpdateCommand(currentUserForCommand, oldUser); return(await orchestrator .InvokeAndReturnAccepted(command) .ConfigureAwait(false)); }