private async Task ImportUsers(IReadOnlyDictionary <string, string> publicIds, CancellationToken cancellationToken) { await foreach (var googleUser in Google.GetUsersAsync(cancellationToken)) { if (string.IsNullOrEmpty(googleUser.OrgUnitPath)) { Logger.LogDebug("Skipping user '{UserId}' with missing organization unit.", googleUser.Id); continue; } if (IgnoreOrgUnitPaths.Contains(googleUser.OrgUnitPath)) { Logger.LogDebug("Skipping user '{UserId}' in {OrgUnitPath} organization unit.", googleUser.Id, googleUser.OrgUnitPath); continue; } var user = await Context.Users.FirstOrDefaultAsync(x => x.Id.Equals(googleUser.Id), cancellationToken); if (user is null) { user = new User { Id = googleUser.Id }; await Context.Users.AddAsync(user, cancellationToken); } user.Email = googleUser.PrimaryEmail; user.GivenName = googleUser.Name.GivenName; user.FamilyName = googleUser.Name.FamilyName; user.FullName = googleUser.Name.FullName; user.OrganizationUnitPath = googleUser.OrgUnitPath; user.PhoneNumber = NormalizePhoneNumber(googleUser.Phones); if (publicIds.TryGetValue(googleUser.Id, out var publicId)) { user.CloudinaryPublicId = publicId; } } var count = await Context.SaveChangesAsync(cancellationToken); Logger.LogInformation("Imported {UserCount} user(s) from Google.", count); }