Exemple #1
0
        /// <summary>
        ///     Returns explicitly defined permissions for a user group for any number of nodes
        /// </summary>
        /// <param name="groupIds">
        ///     The group ids to lookup permissions for
        /// </param>
        /// <param name="entityIds"></param>
        /// <returns></returns>
        /// <remarks>
        ///     This method will not support passing in more than 2000 group IDs when also passing in entity IDs.
        /// </remarks>
        public EntityPermissionCollection GetPermissionsForEntities(int[] groupIds, params int[] entityIds)
        {
            var result = new EntityPermissionCollection();

            if (entityIds.Length == 0)
            {
                foreach (IEnumerable <int> group in groupIds.InGroupsOf(Constants.Sql.MaxParameterCount))
                {
                    Sql <ISqlContext> sql = Sql()
                                            .SelectAll()
                                            .From <UserGroup2NodeDto>()
                                            .LeftJoin <UserGroup2NodePermissionDto>().On <UserGroup2NodeDto, UserGroup2NodePermissionDto>(
                        (left, right) => left.NodeId == right.NodeId && left.UserGroupId == right.UserGroupId)
                                            .Where <UserGroup2NodeDto>(dto => group.Contains(dto.UserGroupId));

                    List <UserGroup2NodePermissionDto> permissions =
                        AmbientScope.Database.Fetch <UserGroup2NodePermissionDto>(sql);
                    foreach (EntityPermission permission in ConvertToPermissionList(permissions))
                    {
                        result.Add(permission);
                    }
                }
            }
            else
            {
                foreach (IEnumerable <int> group in entityIds.InGroupsOf(Constants.Sql.MaxParameterCount -
                                                                         groupIds.Length))
                {
                    Sql <ISqlContext> sql = Sql()
                                            .SelectAll()
                                            .From <UserGroup2NodeDto>()
                                            .LeftJoin <UserGroup2NodePermissionDto>().On <UserGroup2NodeDto, UserGroup2NodePermissionDto>(
                        (left, right) => left.NodeId == right.NodeId && left.UserGroupId == right.UserGroupId)
                                            .Where <UserGroup2NodeDto>(dto =>
                                                                       groupIds.Contains(dto.UserGroupId) && group.Contains(dto.NodeId));

                    List <UserGroup2NodePermissionDto> permissions =
                        AmbientScope.Database.Fetch <UserGroup2NodePermissionDto>(sql);
                    foreach (EntityPermission permission in ConvertToPermissionList(permissions))
                    {
                        result.Add(permission);
                    }
                }
            }

            return(result);
        }
        /// <summary>
        /// Returns explicitly defined permissions for a user group for any number of nodes
        /// </summary>
        /// <param name="groupIds">
        /// The group ids to lookup permissions for
        /// </param>
        /// <param name="entityIds"></param>
        /// <returns></returns>
        /// <remarks>
        /// This method will not support passing in more than 2000 group Ids
        /// </remarks>
        public EntityPermissionCollection GetPermissionsForEntities(int[] groupIds, params int[] entityIds)
        {
            var result = new EntityPermissionCollection();

            foreach (var groupOfGroupIds in groupIds.InGroupsOf(2000))
            {
                //copy local
                var localIds = groupOfGroupIds.ToArray();

                if (entityIds.Length == 0)
                {
                    var sql = Sql()
                              .SelectAll()
                              .From <UserGroup2NodePermissionDto>()
                              .Where <UserGroup2NodePermissionDto>(dto => localIds.Contains(dto.UserGroupId));
                    var permissions = AmbientScope.Database.Fetch <UserGroup2NodePermissionDto>(sql);
                    foreach (var permission in ConvertToPermissionList(permissions))
                    {
                        result.Add(permission);
                    }
                }
                else
                {
                    //iterate in groups of 2000 since we don't want to exceed the max SQL param count
                    foreach (var groupOfEntityIds in entityIds.InGroupsOf(2000))
                    {
                        var ids = groupOfEntityIds;
                        var sql = Sql()
                                  .SelectAll()
                                  .From <UserGroup2NodePermissionDto>()
                                  .Where <UserGroup2NodePermissionDto>(dto => localIds.Contains(dto.UserGroupId) && ids.Contains(dto.NodeId));
                        var permissions = AmbientScope.Database.Fetch <UserGroup2NodePermissionDto>(sql);
                        foreach (var permission in ConvertToPermissionList(permissions))
                        {
                            result.Add(permission);
                        }
                    }
                }
            }

            return(result);
        }
Exemple #3
0
        /// <summary>
        /// Returns explicitly defined permissions for a user group for any number of nodes
        /// </summary>
        /// <param name="groupIds">
        /// The group ids to lookup permissions for
        /// </param>
        /// <param name="entityIds"></param>
        /// <returns></returns>
        /// <remarks>
        /// This method will not support passing in more than 2000 group IDs when also passing in entity IDs.
        /// </remarks>
        public EntityPermissionCollection GetPermissionsForEntities(int[] groupIds, params int[] entityIds)
        {
            var result = new EntityPermissionCollection();

            if (entityIds.Length == 0)
            {
                foreach (var group in groupIds.InGroupsOf(Constants.Sql.MaxParameterCount))
                {
                    var sql = Sql()
                              .SelectAll()
                              .From <UserGroup2NodePermissionDto>()
                              .Where <UserGroup2NodePermissionDto>(dto => group.Contains(dto.UserGroupId));

                    var permissions = AmbientScope.Database.Fetch <UserGroup2NodePermissionDto>(sql);
                    foreach (var permission in ConvertToPermissionList(permissions))
                    {
                        result.Add(permission);
                    }
                }
            }
            else
            {
                foreach (var group in entityIds.InGroupsOf(Constants.Sql.MaxParameterCount - groupIds.Length))
                {
                    var sql = Sql()
                              .SelectAll()
                              .From <UserGroup2NodePermissionDto>()
                              .Where <UserGroup2NodePermissionDto>(dto => groupIds.Contains(dto.UserGroupId) && group.Contains(dto.NodeId));

                    var permissions = AmbientScope.Database.Fetch <UserGroup2NodePermissionDto>(sql);
                    foreach (var permission in ConvertToPermissionList(permissions))
                    {
                        result.Add(permission);
                    }
                }
            }

            return(result);
        }
        private static EntityPermissionCollection ConvertToPermissionList(IEnumerable <UserGroup2NodePermissionDto> result)
        {
            var permissions     = new EntityPermissionCollection();
            var nodePermissions = result.GroupBy(x => x.NodeId);

            foreach (var np in nodePermissions)
            {
                var userGroupPermissions = np.GroupBy(x => x.UserGroupId);
                foreach (var permission in userGroupPermissions)
                {
                    var perms = permission.Select(x => x.Permission).Distinct().ToArray();
                    permissions.Add(new EntityPermission(permission.Key, np.Key, perms));
                }
            }

            return(permissions);
        }
        /// <summary>
        /// Gets explicit and default permissions (if requested) permissions for the group for specified entities
        /// </summary>
        /// <param name="groups"></param>
        /// <param name="fallbackToDefaultPermissions">If true will include the group's default permissions if no permissions are explicitly assigned</param>
        /// <param name="nodeIds">Array of entity Ids, if empty will return permissions for the group for all entities</param>
        public EntityPermissionCollection GetPermissions(IReadOnlyUserGroup[] groups, bool fallbackToDefaultPermissions, params int[] nodeIds)
        {
            if (groups == null)
            {
                throw new ArgumentNullException(nameof(groups));
            }

            var groupIds            = groups.Select(x => x.Id).ToArray();
            var explicitPermissions = GetPermissions(groupIds, nodeIds);
            var result = new EntityPermissionCollection(explicitPermissions);

            // If requested, and no permissions are assigned to a particular node, then we will fill in those permissions with the group's defaults
            if (fallbackToDefaultPermissions)
            {
                //if no node ids are passed in, then we need to determine the node ids for the explicit permissions set
                nodeIds = nodeIds.Length == 0
                    ? explicitPermissions.Select(x => x.EntityId).Distinct().ToArray()
                    : nodeIds;

                //if there are still no nodeids we can just exit
                if (nodeIds.Length == 0)
                {
                    return(result);
                }

                foreach (var group in groups)
                {
                    foreach (var nodeId in nodeIds)
                    {
                        // TODO: We could/should change the EntityPermissionsCollection into a KeyedCollection and they key could be
                        // a struct of the nodeid + groupid so then we don't actually allocate this class just to check if it's not
                        // going to be included in the result!

                        var defaultPermission = new EntityPermission(group.Id, nodeId, group.Permissions.ToArray(), isDefaultPermissions: true);
                        //Since this is a hashset, this will not add anything that already exists by group/node combination
                        result.Add(defaultPermission);
                    }
                }
            }

            return(result);
        }
    private static EntityPermissionCollection ConvertToPermissionList(
        IEnumerable <UserGroup2NodePermissionDto> result)
    {
        var permissions = new EntityPermissionCollection();
        IEnumerable <IGrouping <int, UserGroup2NodePermissionDto> > nodePermissions = result.GroupBy(x => x.NodeId);

        foreach (IGrouping <int, UserGroup2NodePermissionDto> np in nodePermissions)
        {
            IEnumerable <IGrouping <int, UserGroup2NodePermissionDto> > userGroupPermissions =
                np.GroupBy(x => x.UserGroupId);
            foreach (IGrouping <int, UserGroup2NodePermissionDto> permission in userGroupPermissions)
            {
                var perms = permission.Select(x => x.Permission).Distinct().ToArray();

                // perms can contain null if there are no permissions assigned, but the node is chosen in the UI.
                permissions.Add(new EntityPermission(permission.Key, np.Key, perms.WhereNotNull().ToArray()));
            }
        }

        return(permissions);
    }