У меня есть график с двумя определениями ребер, например:
isDepartment: [organisation] -> [organisation]
hasAccess: [user] -> [organisation]
Организации вложены в дерево (без циклов). Существует несколько организаций верхнего уровня без каких-либо входящих isDepartment
ребер.
Пользователям предоставляется доступ к одной или нескольким организациям. Это могут быть организации верхнего уровня или организации, расположенные ниже по дереву. Если пользователь имеет доступ к организации, он имеет доступ ко всем дочерним организациям.
Я пытаюсь создать пользовательского посетителя или фильтр, который дает мне все доступные организации для пользователя, включая его путь к корню, а также свойство, доступны они или нет.
Например, возьмем следующую организационную структуру:
- Root A
- Dept. A.1
- Отдел А.2
- Root B
- Dept. B.1
- Отдел Б.2
- Подотдел Б.2.1
- Root C
- Dept. C.1
- Отдел С.2
Теперь возьмем пользователя, у которого есть доступ к Root A
и Dept. B.2
. Я хотел бы создать следующее дерево результатов:
- Root A, accessible: true
- Dept. A.1, accessible: true
- Отдел A.2, доступный: правда
- Root B, accessible: false
- Dept. B.2, accessible: true
- Подотдел B.2.1, доступный: правда
Обратите внимание, что Root C
и Dept. B1
отсутствуют в результате, потому что они недоступны для пользователя, равно как и их дочерние элементы.
Также обратите внимание, что Root B
включено, но помечено как not accessible
. Это связано с тем, что пользователю предоставляется доступ только к дочернему элементу Root B
, но не к самому корню.
Как я могу написать пользовательскую функцию/посетитель/фильтр, который выполнил это?