JavaScript - определение функциональных групп и организационных юнитов для текущего пользователя.

Версия приложения 7.8

Тривиальнейшая для любой многопользовательской системы задача:
"Разграничивать UI функциональность на основе принадлежности текущего пользователя к группе/роли и т.д."
Как правило в системах имеется API/функционал для получения/проверки этой информации.
Как быть с BPMOnline и кодом исполняющимся в клиентских схемах (JavaScript).
Пример юзкейса: Показывать кнопку только пользователям одного OU или FU, а стало быть осуществлять проверку при инициализации по данным текущего юзера.

Все что пока что удалось найти это:

this.Terrasoft.SysValue


Из этого объекта можем получить ряд информации, на любом этапе выполнения кода.
PS: В исходных кодах (Правда 7.9, возможно в 7.8 - еще не было) обнаружено также частое использование
Terrasoft.CurrentUser
// его свойств userType, contactId и т.д.

Но в моем случае он постоянно undefined

Далее в исходниках и на этом форуме пытался найти функционал который так или иначе использует значения Id-шника пользователя для получения списка его OU и FU
Я прямо таки вижу какой ни будь

Terrasoft.util.getUserOrganizationUnits(UserId);
Terrasoft.util.getUserFunctionalityUnits(UserId);

Но ничего подобного найти пока не удается.
Неужели действительно вспомогательных средств для определения Организационных юнитов и Функциональных ролей текущего пользователя, да и пользователя в принципе в системе не предусмотрено, и единственный способ это ESQ-запрос в соответствующие таблицы БД ?

Нравится

6 комментариев

Здравствуйте, Илья.

Получить 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 собирать, но это подзапросы (тяжело по перфомансу и все таки наверное это частный случай) в текущем варианте вытягиваются данные по прямому родителю - обычно этого достаточно.

в отдельной теме разместил обновленный вариант миксина.

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