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

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

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

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

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

Поиск пользователей

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

С помощью UserSearch можно запросить:

  • количество результатов по фильтру 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();

Поиск групп пользователей

Найти все группы можно с помощью метода UserGroups.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 используется для фильтрации по строковому полю коллекции.

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

Если необходимо, например, отображать виджет только для пользователей, входящих в определенную группу, можно использовать методы 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;
    }

Получение должностей, родительских групп, подгрупп

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

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

const parentGroups = await group.parentGroups();

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

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

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

const parentGroups = await group.subGroups();

Удаление участника группы

Удалить пользователя, элемент оргструктуры или другую группу из списка участников группы, можно измененив значение поля subOrgunitIds.

// находим группу, из которой необходимо удалить участника
const group = await System.userGroups.search()
    .where(f => f.__id.eq('3624ea4d-9d14-50df-a5ef-05f740e3ac55'))
    .first();
// находим пользователя, которого необходимо удалить из группы
const user = await System.users.search().where(f => f.email.eq('dugaev@example.com')).first();
if (group && user && group.data.subOrgunitIds && group.data.subOrgunitIds.length > 0) {
    let allIds = group.data.subOrgunitIds;
    // определяем индекс пользователя в массиве subOrgunitIds
    const index = allIds.findIndex(f => f == user.id);
    // выходим из функции, если пользователь не найден в массиве
    if (index == -1) {
        return;
    }
    // удаляем пользователя из массива
    allIds.splice(index, 1);
    group.data.subOrgunitIds = allIds;
    await group.save();
}

Изменение данных и сохранение группы

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

await NeededGroup.save();