Exemplo n.º 1
0
        /// <summary>
        /// Updates the given user.
        /// </summary>
        public async Task <bool> UpdateUserAsync(
            User user,
            string confirmationUrlBuilder,
            IModelErrorCollection modelErrors)
        {
            var existingUser = await _dbContext.Users
                               .Include(u => u.ClassroomMemberships)
                               .ThenInclude(cm => cm.Classroom)
                               .Include(u => u.AdditionalContacts)
                               .SingleAsync(u => u.Id == user.Id);

            bool updatedEmail = false;

            if (user.GitHubLogin != existingUser.GitHubLogin)
            {
                if (!await _gitHubUserClient.DoesUserExistAsync(user.GitHubLogin))
                {
                    modelErrors.AddError("GitHubLogin", "The GitHub username does not exist.");
                    return(false);
                }

                if (existingUser.ClassroomMemberships != null)
                {
                    foreach (var membership in existingUser.ClassroomMemberships)
                    {
                        var orgName = membership.Classroom.GitHubOrganization;

                        var team = await _gitHubTeamClient.GetTeamAsync
                                   (
                            orgName,
                            membership.GitHubTeam
                                   );

                        await _gitHubTeamClient.InviteUserToTeamAsync
                        (
                            orgName,
                            team,
                            user.GitHubLogin
                        );

                        await _gitHubTeamClient.RemoveUserFromTeamAsync
                        (
                            orgName,
                            team,
                            existingUser.GitHubLogin
                        );

                        membership.InGitHubOrganization = false;
                    }
                }

                existingUser.GitHubLogin = user.GitHubLogin;
            }

            if (user.PublicName != existingUser.PublicName)
            {
                existingUser.PublicName = user.PublicName;
            }

            if (user.EmailAddress != existingUser.EmailAddress)
            {
                existingUser.EmailAddress          = user.EmailAddress;
                existingUser.EmailAddressConfirmed = false;
                existingUser.EmailConfirmationCode = GenerateEmailConfirmationCode();

                updatedEmail = true;
            }

            foreach (var additionalContact in existingUser.AdditionalContacts.ToList())
            {
                var modifiedContact = user.AdditionalContacts
                                      ?.SingleOrDefault(ac => ac.Id == additionalContact.Id);
                if (modifiedContact != null)
                {
                    additionalContact.LastName     = modifiedContact.LastName;
                    additionalContact.FirstName    = modifiedContact.FirstName;
                    additionalContact.EmailAddress = modifiedContact.EmailAddress;
                }
                else
                {
                    existingUser.AdditionalContacts.Remove(additionalContact);
                }
            }

            if (user.AdditionalContacts != null)
            {
                foreach (var potentialNewContact in user.AdditionalContacts)
                {
                    if (!existingUser.AdditionalContacts.Any(ac => ac.Id == potentialNewContact.Id))
                    {
                        existingUser.AdditionalContacts.Add(potentialNewContact);
                    }
                }
            }

            await _dbContext.SaveChangesAsync();

            if (updatedEmail)
            {
                await SendUserInvitationMailAsync(existingUser, confirmationUrlBuilder);
            }

            return(true);
        }