private async Task <SaveUsersChangesResult> IsProfileChangeSavable(UserProfileModel model, AspNetUser aspNetUser)
        {
            User user = aspNetUser.Users.First();

            UserProfileChangedData changedProperties = await GetChangedPropertiesList(model, aspNetUser, user);

            if (!changedProperties.IsEmailValid)
            {
                return new SaveUsersChangesResult(false)
                       {
                           MailInvalid = true
                       }
            }
            ;

            if (changedProperties.ChangedProperties.Any())
            {
                bool isChangesSaved = await SaveUsersChanges(changedProperties.ChangedValues, user.Id);

                return(new SaveUsersChangesResult(isChangesSaved, changedProperties.ChangedProperties));
            }

            if (changedProperties.IsTagsUpdated)
            {
                Log.Info(LogTag.PostProfile_TagsOnly, Request, new { userId = user.Id, model });
                return(new SaveUsersChangesResult(true));
            }

            Log.Info(LogTag.PostProfile_NoChange, Request, new { userId = user.Id, model });
            return(new SaveUsersChangesResult(false));
        }
        private async Task <UserProfileChangedData> GetChangedPropertiesList(UserProfileModel model, AspNetUser identityUser, User userData)
        {
            var changedValues     = new UsersChanges();
            var changedProperties = new List <string>();

            if (model.Email != identityUser.Email)
            {
                if (await UpdateUserEmailAsync(model.Email))
                {
                    changedValues.Email = identityUser.Email;
                    changedProperties.Add(nameof(identityUser.Email));
                }
                else
                {
                    return new UserProfileChangedData {
                               IsEmailValid = false
                    }
                }
            }
            ;

            if (model.BirthYear != userData.BirthYear)
            {
                changedValues.BirthYear = userData.BirthYear;    changedProperties.Add(nameof(userData.BirthYear));
            }
            if (model.BirthMonth != userData.BirthMonth)
            {
                changedValues.BirthMonth = userData.BirthMonth;   changedProperties.Add(nameof(userData.BirthMonth));
            }
            if (model.Country != userData.CountryId)
            {
                changedValues.Country = userData.CountryId;    changedProperties.Add(nameof(userData.CountryId));
            }
            if (model.Location != userData.Location)
            {
                changedValues.Location = userData.Location;     changedProperties.Add(nameof(userData.Location));
            }
            if (model.Knows != userData.KnowsId)
            {
                changedValues.KnowsId = userData.KnowsId;      changedProperties.Add(nameof(userData.KnowsId));
            }
            if (model.Knows2 != userData.Knows2Id)
            {
                changedValues.Knows2Id = userData.Knows2Id;     changedProperties.Add(nameof(userData.Knows2Id));
            }
            if (model.Knows2 != userData.Knows3Id)
            {
                changedValues.Knows2Id = userData.Knows2Id;     changedProperties.Add(nameof(userData.Knows3Id));
            }
            if (model.Learns != userData.LearnsId)
            {
                changedValues.LearnsId = userData.LearnsId;     changedProperties.Add(nameof(userData.LearnsId));
            }
            if (model.Learns2 != userData.Learns2Id)
            {
                changedValues.Learns2Id = userData.Learns2Id;    changedProperties.Add(nameof(userData.Learns2Id));
            }
            if (model.Learns3 != userData.Learns3Id)
            {
                changedValues.Learns3Id = userData.Learns3Id;    changedProperties.Add(nameof(userData.Learns3Id));
            }
            if (model.Introduction != userData.Introduction)
            {
                changedValues.Introduction = userData.Introduction; changedProperties.Add(nameof(userData.Introduction));
            }

            bool isTagsNeedToUpdate = CheckUpdatedTags(model, userData);

            UserProfileChangedData changedData = new UserProfileChangedData {
                ChangedProperties = changedProperties,
                IsTagsUpdated     = isTagsNeedToUpdate
            };

            if (changedData.ChangedProperties.Count > 0)
            {
                changedData.ChangedValues = changedValues;
            }
            return(changedData);
        }