Esempio n. 1
0
        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.");
        }
Esempio n. 2
0
        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));
        }
Esempio n. 3
0
        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));
        }