private static IReadOnlyCollection <PermissionType> RecursiveUpdateCurrentUserPermissionTypes(UserToken userToken, EntityToken entityToken, IEnumerable <UserPermissionDefinition> userPermissionDefinitions, HashSet <EntityTokenPair> alreadyProcessedTokens)
{
IReadOnlyCollection <PermissionType> cached = PermissionTypeFacadeCaching.GetUserPermissionTypes(userToken, entityToken);
if (cached != null)
{
return(cached);
}
UserPermissionDefinition userPermissionDefinition = userPermissionDefinitions
.Where(f => entityToken.EqualsWithVersionIgnore(f.EntityToken)).SingleOrDefaultOrException("More then one UserPermissionDefinition for the same entity token");
var thisPermisstionTypes = new List <PermissionType>();
if (userPermissionDefinition != null)
{
thisPermisstionTypes.AddRange(userPermissionDefinition.PermissionTypes);
}
if (thisPermisstionTypes.Count > 0)
{
thisPermisstionTypes = thisPermisstionTypes.Distinct().ToList();
if (thisPermisstionTypes.Contains(PermissionType.ClearPermissions))
{
thisPermisstionTypes = new List <PermissionType>();
}
PermissionTypeFacadeCaching.SetUserPermissionTypes(userToken, entityToken, thisPermisstionTypes);
// Local defined permission overrules all other permissions
return(thisPermisstionTypes);
}
// Call resursively on all parents
List <EntityToken> parentEntityTokens = ParentsFacade.GetAllParents(entityToken);
IEnumerable <PermissionType> parentsPermisstionTypes = new List <PermissionType>();
foreach (EntityToken parentEntityToken in parentEntityTokens)
{
EntityTokenPair pair = new EntityTokenPair(entityToken, parentEntityToken);
if (alreadyProcessedTokens.Contains(pair) == false)
{
alreadyProcessedTokens.Add(pair);
IEnumerable <PermissionType> thisParentPermisstionTypes = RecursiveUpdateCurrentUserPermissionTypes(userToken, parentEntityToken, userPermissionDefinitions, alreadyProcessedTokens);
parentsPermisstionTypes = parentsPermisstionTypes.Concat(thisParentPermisstionTypes);
}
}
List <PermissionType> permisstionTypes = parentsPermisstionTypes.Distinct().ToList();
PermissionTypeFacadeCaching.SetUserPermissionTypes(userToken, entityToken, permisstionTypes);
return(permisstionTypes);
}