JavaScript - определение функциональных групп и организационных юнитов для текущего пользователя.
Версия приложения 7.8
Тривиальнейшая для любой многопользовательской системы задача:
"Разграничивать UI функциональность на основе принадлежности текущего пользователя к группе/роли и т.д."
Как правило в системах имеется API/функционал для получения/проверки этой информации.
Как быть с BPMOnline и кодом исполняющимся в клиентских схемах (JavaScript).
Пример юзкейса: Показывать кнопку только пользователям одного OU или FU, а стало быть осуществлять проверку при инициализации по данным текущего юзера.
Все что пока что удалось найти это:
Из этого объекта можем получить ряд информации, на любом этапе выполнения кода.
PS: В исходных кодах (Правда 7.9, возможно в 7.8 - еще не было) обнаружено также частое использование
// его свойств userType, contactId и т.д.
Но в моем случае он постоянно undefined
Далее в исходниках и на этом форуме пытался найти функционал который так или иначе использует значения Id-шника пользователя для получения списка его OU и FU
Я прямо таки вижу какой ни будь
Terrasoft.util.getUserFunctionalityUnits(UserId);
Но ничего подобного найти пока не удается.
Неужели действительно вспомогательных средств для определения Организационных юнитов и Функциональных ролей текущего пользователя, да и пользователя в принципе в системе не предусмотрено, и единственный способ это ESQ-запрос в соответствующие таблицы БД ?
Нравится
Здравствуйте, Илья.
Получить Id текущего пользователя возможно следующим кодом:
Terrasoft.core.enums.SysValue.CURRENT_USER.value
Для получения ролей текущего пользователя Вам необходимо выполнить запрос к базе данных.
"Севостьянов Илья Сергеевич" написал:единственный способ это ESQ-запрос в соответствующие таблицы БД ?
Ага. Самое обидное - запрос с коллбэком и приходится каждый раз изворачиваться.
Кстати в приведённом кейсе все относительно легко делается.
А где, в каких таблицах что лежит, что-то я запутался...
SysAdminUnits - содержит в себе и пользователей и орг роли вперемешку.
В каких таблицах соотношение самих пользователей к OU не ясно
Есть некая SysAdminUnitsInRole
Может кто ни будь прояснить:
1) В какой таблице хранятся сами пользователи ?
2) В какой таблице хранятся Организационные юниты ?
3) В какой таблице хранятся Функциональные роли ?
5) В каких таблицах определяется принадлежность пользователя или OU к FR и и т.д.?
Илья, названия таблиц в единственном числе: SysAdminUnit, SysAdminUnitInRole.
SysAdminUnit — хранятся и пользователи, и роли всех видов. Тип записи задаётся числом в поле SysAdminUnitTypeValue. Расшифровку чисел можно посмотреть в таблице SysAdminUnitType. 4 — пользователь, 5 — портальный, 6 — функциональная, 0, 1, 2, 3 — разные организационные.
SysAdminUnitInRole — вхождение пользователей в роли. В записи две ссылки на SysAdminUnit, в полях SysAdminUnitId и SysAdminUnitRoleId указаны, соответственно, пользователь и роль.
Для всех кто будет озадачен этой проблемой, выкладываю решение, чтобы вы не тратили свое драгоценное время.
Миксин-модуль "UserUtilsMixin"
define("UserUtilsMixin", ["UserUtilsMixinResources"], function(resources) { Ext.define("Terrasoft.configuration.mixins.UserUtilsMixin", { "alternateClassName": "Terrasoft.UserUtilsMixin", "getRelAU": function(UserId, callback) { var esq = Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: "SysUserInRole" }); var filter = this.Terrasoft.createColumnFilterWithParameter( this.Terrasoft.ComparisonType.EQUAL, "SysUser", UserId ); esq.filters.addItem(filter); esq.addColumn("SysRole"); esq.addColumn("[SysAdminUnit:Id:SysRole].Name", "AuName"); esq.addColumn("[SysAdminUnit:Id:SysRole].ParentRole", "Parent"); esq.addColumn("[SysAdminUnit:Id:SysRole].[SysAdminUnitType:Value:SysAdminUnitTypeValue].Name", "AuType"); esq.getEntityCollection((function(response) { if (response && response.success) { var resultObject = { FuncRoles: [], OrgUnits: [], Organizations: [] }; response.collection.each(function(item) { var wrapObj = { name: item.values.AuName, id: item.values.SysRole.value, parentAU: item.values.Parent }; var type = item.values.AuType; if (type === "Division") { resultObject.OrgUnits.push(wrapObj); } else if (type === "Функциональная роль") { resultObject.FuncRoles.push(wrapObj); } else if (type === "Organization") { resultObject.Organizations.push(wrapObj); } }); this.callback(resultObject); } }).bind({"callback": callback}), this); } }); });
Расширяет текущий набор методов (схемы куда данный миксин будет подключен), методом
getRelAU (user_id, callback);
user_id - [color=red](String)[/color] [color=green][Обязательный][/color] идентификатор Id пользователя информацию по Административным юнитам которого требуется получить.
callback - [color=red](Function)[/color] [color=green][Обязательный][/color] коллбек, принимающий один аргумент, в котором будет содержаться результирующий объект, см. структуру результирующего объекта далее
пример вызова:
this.getRelAU( Terrasoft.core.enums.SysValue.CURRENT_USER.value, function(result) { console.log(result); } )
Результирующий объект:
в нем "Функциональные роли":
в нем "Организационные юниты":
и "Организации":
Пользуйтесь на здоровье :)
PS: В идеале надо иерархическую информацию полностью до корня по FU и OU собирать, но это подзапросы (тяжело по перфомансу и все таки наверное это частный случай) в текущем варианте вытягиваются данные по прямому родителю - обычно этого достаточно.
в отдельной теме разместил обновленный вариант миксина.