...
Ролевой пользователь — это группа пользователей, привязанная к проекту (например, Архитекторы, ГИПы, Инженеры и т.д.).
3. В ТЭ "Ролевой пользователь" есть обязательный атрибут Lookup-атрибут со ссылкой на реестр проектов/, где задается состав ролевой группы на проекте.
...
1. Алгоритм пересчета при изменении составов ролевых пользователей в проекте: .
- для Для заданного ID проекта и ID атрибута ищем элементы в user_group_membership, где project соответствует проекту и group_list содержит измененную группу;:
| Code Block | ||
|---|---|---|
| ||
SELECT FROM public.user_group_membership
WHERE project = *ID проекта* AND group_list *содержит измененную группу* |
- Далее затем аналогично обновляем scope_read по проекту и principal_access_list:
| Code Block | ||
|---|---|---|
| ||
SELECT FROM public.scope_read WHERE project = *ID проекта* AND principal_access_list *содержит измененную группу* |
2. Алгоритм выбора элементов с проверкой прав на чтение:.
выбираем Выбираем документы с присоединенными путями и фильтруем по scope_read, используя пересечение access_list с группами текущего пользователя:
| Code Block | ||
|---|---|---|
| ||
SELECT FROM public.document d INNER JOIN public.list_item_path lip on (d.id = lip.id) INNER JOIN public.scope_read sr on (lip.scope_read = sr.id) WHERE sr.access_list && *массив групп в которые входит текущий пользователь* |
3. Алгоритм поиска по Lookup-атрибутам:.
выбор Выбор документов через соответствующий поиск по Lookup (ugm.field соответствует нужному Lookup) с учетом группы доступа пользователя:
| Code Block | ||
|---|---|---|
| ||
SELECT FROM public.document d INNER JOIN public.list_item_path lip on (d.id = lip.id) INNER JOIN public.user_group_membership ugm on (ugm.source = d.id AND ugm.field = *ID лукапа* ) WHERE ugm.principal_list && *массив групп в которые входит текущий пользователь* |