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 teamCloudInstance = await teamCloudRepository .GetAsync() .ConfigureAwait(false); if (teamCloudInstance is null) { return(ErrorResult .NotFound($"No TeamCloud Instance was found.") .ActionResult()); } var oldUser = teamCloudInstance.Users?.FirstOrDefault(u => u.Id == user.Id); if (oldUser is null) { return(ErrorResult .NotFound($"A User with the ID '{oldUser.Id}' could not be found on this TeamCloud Instance.") .ActionResult()); } if (oldUser.IsAdmin() && !user.IsAdmin() && teamCloudInstance.Users.Count(u => u.IsAdmin()) == 1) { 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()); } var command = new OrchestratorTeamCloudUserUpdateCommand(CurrentUser, user); var commandResult = await orchestrator .InvokeAsync(command) .ConfigureAwait(false); if (commandResult.Links.TryGetValue("status", out var statusUrl)) { return(StatusResult .Accepted(commandResult.CommandId.ToString(), statusUrl, commandResult.RuntimeStatus.ToString(), commandResult.CustomStatus) .ActionResult()); } throw new Exception("This shouldn't happen, but we need to decide to do when it does."); }
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)); }
public async Task <IActionResult> PutMe([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) .ToActionResult()); } var me = await userService .CurrentUserAsync() .ConfigureAwait(false); if (me is null) { return(ErrorResult .NotFound($"A User matching the current authenticated user was not found in this TeamCloud instance.") .ToActionResult()); } if (!me.Id.Equals(user.Id, StringComparison.OrdinalIgnoreCase)) { return(ErrorResult .BadRequest(new ValidationError { Field = "id", Message = $"User's id does match the id of the current authenticated user." }) .ToActionResult()); } if (me.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) .ToActionResult()); } } if (!me.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." }) .ToActionResult()); } var currentUserForCommand = await userService .CurrentUserAsync() .ConfigureAwait(false); me.PopulateFromExternalModel(user); var command = new OrchestratorTeamCloudUserUpdateCommand(currentUserForCommand, me); return(await orchestrator .InvokeAndReturnActionResultAsync <UserDocument, User>(command, Request) .ConfigureAwait(false)); }