OfficeTicTacToe.ViewModels.UserViewModel.UpdateUsersFromGraphAsync C# (CSharp) Method

UpdateUsersFromGraphAsync() static private method

static private UpdateUsersFromGraphAsync ( List users, CancellationToken token ) : Task
users List
token System.Threading.CancellationToken
return Task
        internal static async Task UpdateUsersFromGraphAsync(List<UserViewModel> users, CancellationToken token)
        {
            var usersNotUpdated = new List<UserViewModel>();
            var groups = new List<IReadOnlyQueryableSet<Microsoft.Graph.IUser>>();

            // Check if the user already exists
            foreach (var uvm in users)
            {
                if (!uvm.IsLoadedFromGraph)
                    usersNotUpdated.Add(uvm);
            }

            for (int i = 0; i < usersNotUpdated.Count; i = i + 5)
            {
                IReadOnlyQueryableSet<Microsoft.Graph.IUser> usersTask = null;
                if (i + 4 < usersNotUpdated.Count)
                {
                    var email1 = usersNotUpdated[i].Email;
                    var email2 = usersNotUpdated[i + 1].Email;
                    var email3 = usersNotUpdated[i + 2].Email;
                    var email4 = usersNotUpdated[i + 3].Email;
                    var email5 = usersNotUpdated[i + 4].Email;
                    usersTask = graph.Users.Where(u => u.Mail == email1 || u.UserPrincipalName == email1
                                                    || u.Mail == email2 || u.UserPrincipalName == email2
                                                    || u.Mail == email3 || u.UserPrincipalName == email3
                                                    || u.Mail == email4 || u.UserPrincipalName == email4
                                                    || u.Mail == email5 || u.UserPrincipalName == email5);

                }
                else if (i + 3 < usersNotUpdated.Count)
                {
                    var email1 = usersNotUpdated[i].Email;
                    var email2 = usersNotUpdated[i + 1].Email;
                    var email3 = usersNotUpdated[i + 2].Email;
                    var email4 = usersNotUpdated[i + 3].Email;
                    usersTask = graph.Users.Where(u => u.Mail == email1 || u.UserPrincipalName == email1
                                                    || u.Mail == email2 || u.UserPrincipalName == email2
                                                    || u.Mail == email3 || u.UserPrincipalName == email3
                                                    || u.Mail == email4 || u.UserPrincipalName == email4);

                }
                else if (i + 2 < usersNotUpdated.Count)
                {
                    var email1 = usersNotUpdated[i].Email;
                    var email2 = usersNotUpdated[i + 1].Email;
                    var email3 = usersNotUpdated[i + 2].Email;
                    usersTask = graph.Users.Where(u => u.Mail == email1 || u.UserPrincipalName == email1
                                                    || u.Mail == email2 || u.UserPrincipalName == email2
                                                    || u.Mail == email3 || u.UserPrincipalName == email3);

                }
                else if (i + 1 < usersNotUpdated.Count)
                {
                    var email1 = usersNotUpdated[i].Email;
                    var email2 = usersNotUpdated[i + 1].Email;
                    usersTask = graph.Users.Where(u => u.Mail == email1 || u.UserPrincipalName == email1
                                                    || u.Mail == email2 || u.UserPrincipalName == email2);

                }
                else if (i < usersNotUpdated.Count)
                {
                    var email1 = usersNotUpdated[i].Email;
                    usersTask = graph.Users.Where(u => u.Mail == email1 || u.UserPrincipalName == email1);
                }

                groups.Add(usersTask);

            }
            //var po = new ParallelOptions() { CancellationToken = token, TaskScheduler = uiScheduler };

            foreach (var usersTask in groups)
            {
                if (token.IsCancellationRequested)
                    return;

                var allusers = new List<Microsoft.Graph.IUser>();

                try
                {
                    var usersPaged = await usersTask.ExecuteAsync();

                    allusers.AddRange(usersPaged.CurrentPage.ToList());

                    while (usersPaged.MorePagesAvailable)
                    {
                        usersPaged = await usersPaged.GetNextPageAsync();
                        allusers.AddRange(usersPaged.CurrentPage.ToList());
                    }

                    if (token.IsCancellationRequested)
                        return;

                }
                catch (Exception)
                {
                    return;
                }

                foreach (var user in allusers)
                {
                    UserViewModel uvm = usersNotUpdated.First(u => u.UserPrincipalName == user.Mail);

                    uvm.Name = user.DisplayName;
                    uvm.UserPrincipalName = user.UserPrincipalName;
                    uvm.Email = user.Mail;
                    uvm.Id = user.Id;
                    uvm.FirstName = user.GivenName;

                    if (string.IsNullOrEmpty(uvm.FirstName))
                        uvm.FirstName = uvm.Name.Split(' ').Length > 1 ? uvm.Name.Split(' ')[0] : uvm.Name;

                    uvm.IsLoadedFromGraph = true;

                    if (token.IsCancellationRequested)
                        return;

                }

            };

            // for users not found
            foreach (var uvm in users)
            {
                if (!uvm.IsLoadedFromGraph)
                    uvm.IsLoadedFromGraph = true;
            }
        }