Раздача прав доступа на группы и подгруппы статей в базе знаний.

Задача следующая: при настройке прав доступа на группу статей в базе знаний, раздавать те же права на все подгруппы в ней (а так же все статьи им соответствующие).
Замещать модуль Rights или RightUtilities (и создать свой сервис, унаследовавшись от RightsHelper) не хочется, т.к. при его изменении в последующих обновлениях пришлось бы постоянно переписывать замещающий модуль.
Лучшим решением казались триггеры в БД на INSERT для таблицы [SysKnowledgeBaseFolderRight]. Я использовал два курсора (один вложен в другой) для перебора записанных строк, и подгрупп для каждой группы. Но если уровень подгрупп больше 1, триггер не отработает т.к. пытается по сути объявить курсор, который уже объявлен.
Да и каким образом с помощью триггера раздавать права на статьи в группах не имею представления.
Есть ли еще варианты, или все-таки придется замещать модуль Rights (RightUtilities)?

Нравится

2 комментария

Примерный(костыльный вариант):
1) расковырять схему Rights. В методе onSaveClick

RightUtilities.applyChanges({
	"recordRights": changedRights,
	"record": {
		entitySchemaName: this.get("entitySchemaName"),
		primaryColumnValue: this.get("primaryColumnValue")
	}
}, this.onChangesApplied, this);

т.е у нас есть список прав, название схемы с фильтрами в entitySchemaName, id фильтра в primaryColumnValue.
По идее, если entitySchemaName === "KnowledgeBaseFolder", то запускаем свою логику по изменению прав записей
2) Выбираем из KnowledgeBaseFolder вложенные папки, где ParentId = Id главной папки, получаем коллекцию, бежим по каждой записи
3) Для каждого элемента вставляем/удаляем запись в таблицу SysKnowledgeBaseFolderRight. Значения берем из переменной changedRights с п1.

Для записей еще жестче:
п1. такой же
2) Выбираем из KnowledgeBaseFolder фильтр по id, который мы знаем из предыдущего пункта, нужна колонка SearchData. Там лежит мусор) Весь вопрос как этот хлам преобразовать в сериализованый(или нет) фильтр.
3) Выбираем из KnowledgeBase все записи с фильтром из п2, получаем коллекцию, бежим по каждому элементу коллекции.
4) Для каждого элемента из базы знаний вставляем/удаляем запись в таблицу SysKnowledgeBaseRight. Значения берем из переменной changedRights с п1.

как-то так :smile:

upd. Только что проверил, в п2. берем entity по id, потом

var folderFilter = Terrasoft.deserialize(result.entity.values.SearchData);

все. получаем фильтр, который надо наложить на выборку из KnowledgeBase

Спасибо за ответ :smile:
В принципе я, не найдя другого решения, делаю примерно тоже самое. Заместил модуль RightUtilities, в котором меняю вызываемый сервис на свой в методе callServiceMethod, если вызывается метод "ApplyChanges".
Далее уже на сервере проверяю имя схемы, и если это KnowledgeBaseFolder - рекурсивно прохожусь по всем подпапкам раздавая права, а также выбираю фильтры у каждой, десериализуя их и раздавая права на статьи.
Старался максимально вынести функционал на сервер. Таким образом при обновлении версии/билда если изменится RightUtilities - придется добавить в него всего одну строку. А на сервере я создаю экземпляр класса RightsHelper и вызываю у него метод ApplyChanges, как это делается в базовом RightsService (что в принципе устойчиво к обновлениям).

Показать все комментарии