Работа с пользователями и группами

Часто бывает необходимо в процессе получать или изменять данные групп и объектов пользователей. В этой статье описаны часто используемые скрипты для работы с пользователями и группами.

Получение объекта пользователя

Получить объект пользователя и работать с полями профиля пользователя, а также использовать методы работы над объектом пользователя, можно с помощью метода UserItemRef.fetch.

    if (Context.data.user) {
        // Получаем данные о пользователе с помощью метода .fetch()
        const userData = await Context.data.user.fetch();
    
        // Присваиваем переменной типа "Дата" дату рождения пользователя
        Context.data.birthDate = userData.data.birthDate;
    }

Как найти пользователя через Search

Найти нужного пользователя и записать его в переменную можно с помощью метода Users.search

С помощью объекта Users.search можно запросить

  • количество результатов по фильтру Search.count;
  • первый результат по фильтру Search.first;
  • страницу результатов по фильтру Search.all; Для постраничного запроса можно использовать методы
  • Search.from для задания того, сколько элементов от начала надо пропустить;
  • Search.size для задания размеров страницы (максимально допустимый размер страницы 10000, по умолчанию — 10);
  • Search.sort для задания сортировки выборки;

Фильтр можно задать через метод Search.where.

Например, если нужно найти пользователя по его электронной почте:

    /* Находим нужного пользователя и записываем в переменную с помощью метода .search()
    с указанием фильтра .where()*/
    
    Context.data.user = await System.users.search().where(f => f.email.eq('admin@mail.com')).first();

Блокировка/разблокировка пользователей

С помощью сценария можно заблокировать (UserItemRef.block) или разблокировать (UserItemRef.unblock) пользователя. Например, блокировку пользователя можно включить в бизнес-процесс увольнения сотрудника.

async function blockUser(): Promise<void> {
    // запрашивать объект пользователя для блокировки не требуется
    if (Context.data.user) {
        Context.data.user.block();
    }
}

Получение руководителей пользователя

Запросить руководителя пользователя можно с помощью метода UserItemRef.getChiefs.

    /* Получаем массив данных,
    в котором записаны все руководители пользователя по иерархии из оргструктуры */
    const chiefs = await ViewContext.data.user!.getChiefs();
    
    // Выносим на форму непосредственного руководителя - первый элемент массива руководителей
    ViewContext.data.superviser = chiefs[0];

Работа с должностями пользователя

Получить список должностей пользователя и снять его с определенной должности можно с помощью методов UserItem.positions и UserItem.removeFromPosition.

    const user = await Context.data.user.fetch();
    // Получаем должности пользователя
    const positions = await user.positions();
    // Находим нужную должность
    const requiredPosition = positions.find(p => p.data.name === "Начальник отдела маркетинга");
    // Обрабатываем ошибку, если должность не найдена
    if(!requiredPosition) {
        throw new Error ('position not found');
    }
    // Снимаем пользователя с должности
    user.removeFromPosition(requiredPosition!);
    // Сохраняем объект пользователя
    await user.save();

Создание пользователя (приглашение в скрипте), изменение данных и сохранение

Для этого используем объект [[System]]. Для отправки приглашения новому пользователю, необходимо его инициализировать:

    let user = System.users.create();
    
    // Заполняем поля пользователя: 
    user.data.email = "example@example.com";
    user.data.fullname = {
        lastname: "Иванов",
        firstname: "Иван",
        middlename: "Иванович"
    };
    
    // Сохраняем объект пользователя
    await user.save();

Найти группу через Search

Найти все группы

async function userMethods(): Promise<void> {

    // Присваиваем переменной все группы в системе
    const group = await System.userGroups.search().size(10000).all();
}

Найти группу «Внешние пользователи»

async function userMethods(): Promise<void> {

    // Присваиваем переменной группу "Внешние пользователи"
    const group = await System.userGroups.search().where(f => f.__name.like('Внешние пользователи')).first();
}

Методы StringFieldOperand.like и StringFieldOperand.like используются для фильтрации по строковому полю коллекции.

Получить всех пользователей группы и проверить, входит ли конкретный пользователь в группу

Если необходимо, например, отображать виджет только если пользователь входит в определенную группу, можно использовать методы UserGroupItem.users и array.some().

    // Получаем текущего пользователя
    const currUser = await System.users.getCurrentUser();
    // Ищем нужную группу
    const allowedGroup = await System.userGroups.search().where(a => a.__name.like('Внешние пользователи')).first();
    // Получаем пользователей из группы с помощью метода .users()
    const usersInAllowedGroup = await allowedGroup!.users();
    // Проверяем, входит ли текущий пользователь в полученный список
    if(usersInAllowedGroup.some(user => user.id === currUser.id)) {
        ViewContext.data.hideWidget = false;
    }

Как получить должности/родительские группы/подгруппы

Следующие методы возвращают в результате массивы.

parentGroups Метод UserGroupItem.parentGroups позволяет получить список групп, в которые входит выбранная группа.

const parentGroups = await group.parentGroups();

positions Метод UserGroupItem.positions позволяет получить список должностей группы пользователей.

const groupName = 'Администраторы раздела';
const group = await System.userGroups.search().where(g => g.__name.eq(groupName)).first();
const positions = await group.positions();

subGroups Метод UserGroupItem.subGroups возвращает все подгруппы.

const parentGroups = await group.subGroups();

Как изменить данные группы и сохранить её

Метод UserGroupItem.save позволяет сохранить элемент пользовательской группы. После изменений в группе нужно сохранить элемент группы пользователей.

await NeededGroup.save();