private async Task FindDuplicateScimObjects <T>(ScimClient scimClient, List <string> attributes, string attribute) where T : Collabco.Myday.Scim.Core.Model.Resource { var errorCount = 0; var totalObjectCount = 0; var startIndex = 1; var attributeUpper = attribute.First().ToString().ToUpper() + attribute.Substring(1); System.Reflection.PropertyInfo prop = typeof(T).GetProperty(attributeUpper); Collabco.Myday.Scim.v2.Model.ScimListResponse2 <T> resultsPage = null; while (resultsPage == null || resultsPage.TotalResults > totalObjectCount) { resultsPage = await Policy .Handle <Exception>(e => !(e is ArgumentNullException || e is ArgumentException)) .WaitAndRetryAsync( DecorrelatedJitter(5, TimeSpan.FromSeconds(2), TimeSpan.FromSeconds(30)), (exception, timeSpan, context) => { errorCount++; UpdateErrorCount(errorCount); Debug.WriteLine($"Scim search error: {exception.Message}"); } ) .ExecuteAsync(() => { return(scimClient.Search <T>( new Collabco.Myday.Scim.Query.ScimQueryOptions { Attributes = attributes, StartIndex = startIndex, // SortBy = "meta.created", // SortOrder = Collabco.Myday.Scim.Core.Model.SortOrder.Ascending, Count = 100 } )); }); totalObjectCount += resultsPage.Resources.Count(); startIndex += resultsPage.ItemsPerPage; foreach (var currentObject in resultsPage.Resources) { var propertyValue = (String)prop.GetValue(currentObject); if (string.IsNullOrEmpty(propertyValue)) { Debug.WriteLine($"Property does not exist, most likely a local user/group: " + currentObject.Id); continue; } if (results.TryGetValue(propertyValue.ToLowerInvariant(), out Collabco.Myday.Scim.Core.Model.Resource existingObject)) { if (SuperceedsExistingObject(existingObject, currentObject)) { results[propertyValue.ToLowerInvariant()] = currentObject; duplicateObjectIds.Add(existingObject.Id); } else { duplicateObjectIds.Add(currentObject.Id); } } else { results[propertyValue.ToLowerInvariant()] = currentObject; } } UpdateDuplicateCounts(totalObjectCount); } }
private async Task FindDuplicateScimGroups(ScimClient scimClient) { var totalGroupCount = 0; Collabco.Myday.Scim.v2.Model.ScimListResponse2 <Collabco.Myday.Scim.v2.Model.ScimGroup2> groupsPage = null; var startIndex = 1; while (groupsPage == null || groupsPage.TotalResults > totalGroupCount) { groupsPage = await scimClient.Search <Collabco.Myday.Scim.v2.Model.ScimGroup2>( new Collabco.Myday.Scim.Query.ScimQueryOptions { Attributes = new List <string> { "id", "externalId", "meta.created", "meta.lastModified" }, StartIndex = startIndex, //SortBy = "meta.created", //SortOrder = Collabco.Myday.Scim.Core.Model.SortOrder.Ascending } ); totalGroupCount += groupsPage.Resources.Count(); startIndex += groupsPage.ItemsPerPage; foreach (var group in groupsPage.Resources.Where(g => !string.IsNullOrEmpty(g.ExternalId))) { if (groups.ContainsKey(group.ExternalId)) { duplicateGroupIds.Add(group.Id); } else { groups.Add(group.ExternalId, group); } } UpdateDuplicateCounts(totalGroupCount); } }
private async Task FindDuplicateScimUsers(ScimClient scimClient) { var errorCount = 0; var totalUserCount = 0; Collabco.Myday.Scim.v2.Model.ScimListResponse2 <Collabco.Myday.Scim.v2.Model.ScimUser2> usersPage = null; var startIndex = 1; while (usersPage == null || usersPage.TotalResults > totalUserCount) { usersPage = await Policy .Handle <Exception>(e => !(e is ArgumentNullException || e is ArgumentException)) .WaitAndRetryAsync( DecorrelatedJitter(5, TimeSpan.FromSeconds(2), TimeSpan.FromSeconds(30)), (exception, timeSpan, context) => { errorCount++; UpdateErrorCount(errorCount); Debug.WriteLine($"Scim search error: {exception.Message}"); } ) .ExecuteAsync(() => { return(scimClient.Search <Collabco.Myday.Scim.v2.Model.ScimUser2>( new Collabco.Myday.Scim.Query.ScimQueryOptions { Attributes = new List <string> { "id", "externalId", "meta.created", "meta.lastModified" }, StartIndex = startIndex, //SortBy = "meta.created", // SortOrder = Collabco.Myday.Scim.Core.Model.SortOrder.Ascending, Count = 100 } )); }); totalUserCount += usersPage.Resources.Count(); startIndex += usersPage.ItemsPerPage; foreach (var user in usersPage.Resources.Where(g => !string.IsNullOrEmpty(g.ExternalId))) { if (users.TryGetValue(user.ExternalId, out Collabco.Myday.Scim.v2.Model.ScimUser2 existingUser)) { if (SuperceedsExistingUser(existingUser, user)) { users[user.ExternalId] = user; duplicateUserIds.Add(existingUser.Id); } else { duplicateUserIds.Add(user.Id); } } else { users[user.ExternalId] = user; } } UpdateDuplicateCounts(totalUserCount); } }