Ejemplo n.º 1
0
        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);
            }
        }