public bool HasSubjectFeatureAccess(long subjectId, long featureId)
{
Feature feature = FeaturesRepo.Get(featureId);
Subject subject = SubjectsRepo.Get(subjectId);
FeaturePermission featurePermission;
if (subject is Group)
{
while (feature != null)
{
featurePermission = GetFeaturePermission(subject.Id, feature.Id);
if (featurePermission != null)
{
return featurePermission.PermissionType == PermissionType.Grant;
}
feature = feature.Parent;
}
return false;
}
if (subject is User)
{
User user = subject as User;
List<long> groupIds = user.Groups.Select(g => g.Id).ToList();
while (feature != null)
{
featurePermission = GetFeaturePermission(subject.Id, feature.Id);
if (featurePermission != null)
{
return featurePermission.PermissionType == PermissionType.Grant;
}
if (ExistsFeaturePermission(groupIds, new[] { feature.Id }, PermissionType.Deny))
{
return false;
}
else
{
if (ExistsFeaturePermission(groupIds, new[] { feature.Id }, PermissionType.Grant))
{
return true;
}
}
feature = feature.Parent;
}
return false;
}
return false;
}