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