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;
}
}