public static PSADGroup ToPSADGroup(this ADGroup group)
        {
            var adGroup = new PSADGroup()
            {
                DisplayName     = group.DisplayName,
                SecurityEnabled = group.SecurityEnabled,
                Type            = group.ObjectType,
                MailNickname    = group.Mail
            };

            return((PSADGroup)AssignObjectId(adGroup, group.ObjectId));
        }
        public static PSADObject ToPSADObject(this AADObject obj)
        {
            if (obj == null)
            {
                throw new ArgumentNullException();
            }

            if (obj.ObjectType == typeof(User).Name)
            {
                var adUser = new PSADUser()
                {
                    DisplayName       = obj.DisplayName,
                    Type              = obj.ObjectType,
                    UserPrincipalName = obj.UserPrincipalName
                };

                return(AssignObjectId(adUser, obj.ObjectId));
            }
            else if (obj.ObjectType == "Group")
            {
                var adGroup = new PSADGroup()
                {
                    DisplayName     = obj.DisplayName,
                    Type            = obj.ObjectType,
                    SecurityEnabled = obj.SecurityEnabled,
                    MailNickname    = obj.Mail
                };
                return(AssignObjectId(adGroup, obj.ObjectId));
            }
            else if (obj.ObjectType == typeof(ServicePrincipal).Name)
            {
                var adSp = new PSADServicePrincipal()
                {
                    DisplayName           = obj.DisplayName,
                    Type                  = obj.ObjectType,
                    ServicePrincipalNames = obj.ServicePrincipalNames.ToArray()
                };

                return(AssignObjectId(adSp, obj.ObjectId));
            }
            else
            {
                var adObj = new PSADObject()
                {
                    DisplayName = obj.DisplayName,
                    Type        = obj.ObjectType
                };

                return(AssignObjectId(adObj, obj.ObjectId));
            }
        }
        public IEnumerable <PSADGroup> FilterGroups(ADObjectFilterOptions options, ulong first = ulong.MaxValue, ulong skip = 0)
        {
            if (!string.IsNullOrEmpty(options.Id))
            {
                try
                {
                    // use GetObjectsByObjectId to handle Redirects in the CSP scenario
                    PSADGroup group = this.GetObjectsByObjectId(new List <string> {
                        options.Id
                    }).FirstOrDefault() as PSADGroup;
                    if (group != null)
                    {
                        return(new List <PSADGroup> {
                            group
                        });
                    }
                }
                catch { /* The group does not exist, ignore the exception */ }
            }
            else
            {
                Rest.Azure.OData.ODataQuery <ADGroup> odataQuery = null;
                if (options.Mail != null)
                {
                    odataQuery = new Rest.Azure.OData.ODataQuery <ADGroup>(g => g.Mail == options.Mail);
                }
                else
                {
                    if (!string.IsNullOrEmpty(options.SearchString) && options.SearchString.EndsWith("*"))
                    {
                        options.SearchString = options.SearchString.TrimEnd('*');
                        odataQuery           = new Rest.Azure.OData.ODataQuery <ADGroup>(g => g.DisplayName.StartsWith(options.SearchString));
                    }
                    else
                    {
                        odataQuery = new Rest.Azure.OData.ODataQuery <ADGroup>(g => g.DisplayName == options.SearchString);
                    }
                }

                return(new GenericPageEnumerable <ADGroup>(
                           delegate()
                {
                    return GraphClient.Groups.List(odataQuery);
                }, GraphClient.Groups.ListNext, first, skip).Select(g => g.ToPSADGroup()));
            }

            return(new List <PSADGroup>());
        }
        public List <PSADGroup> FilterGroups(ADObjectFilterOptions options)
        {
            List <PSADGroup> groups = new List <PSADGroup>();

            if (!string.IsNullOrEmpty(options.Id))
            {
                try
                {
                    // use GetObjectsByObjectId to handle Redirects in the CSP scenario
                    PSADGroup group = this.GetObjectsByObjectId(new List <string> {
                        options.Id
                    }).FirstOrDefault() as PSADGroup;
                    if (group != null)
                    {
                        groups.Add(group);
                    }
                }
                catch { /* The group does not exist, ignore the exception */ }
            }
            else
            {
                IPage <ADGroup> result = null;
                Rest.Azure.OData.ODataQuery <ADGroup> odataQuery = null;

                if (options.Paging)
                {
                    if (string.IsNullOrEmpty(options.NextLink))
                    {
                        if (options.Mail != null)
                        {
                            odataQuery = new Rest.Azure.OData.ODataQuery <ADGroup>(g => g.Mail == options.Mail);
                        }
                        else
                        {
                            odataQuery = new Rest.Azure.OData.ODataQuery <ADGroup>(g => g.DisplayName.StartsWith(options.SearchString));
                        }

                        result = GraphClient.Groups.List(odataQuery);
                    }
                    else
                    {
                        result = GraphClient.Groups.ListNext(options.NextLink);
                    }

                    groups.AddRange(result.Select(g => g.ToPSADGroup()));
                    options.NextLink = result.NextPageLink;
                }
                else
                {
                    if (options.Mail != null)
                    {
                        odataQuery = new Rest.Azure.OData.ODataQuery <ADGroup>(g => g.Mail == options.Mail);
                    }
                    else
                    {
                        odataQuery = new Rest.Azure.OData.ODataQuery <ADGroup>(g => g.DisplayName.StartsWith(options.SearchString));
                    }

                    result = GraphClient.Groups.List(odataQuery.ToString());
                    groups.AddRange(result.Select(g => g.ToPSADGroup()));

                    while (!string.IsNullOrEmpty(result.NextPageLink))
                    {
                        result = GraphClient.Groups.ListNext(result.NextPageLink);
                        groups.AddRange(result.Select(g => g.ToPSADGroup()));
                    }
                }
            }

            return(groups);
        }