Перейти к содержанию

Мигратор ролей#

Для синхронизации ролей из библиотек и проектов был разработан Мигратор ролей. Этот функционал позволяет определить в библиотеках роли, необходимые для работы библиотеки на проекте, а затем удобно синхронизировать их на проекте, исключая необходимость ручного создания и вложения ролей.

Определение в библиотеке#

Для начала необходимо создать файл source/roles.json в проекте библиотеки. Этот файл должен содержать описание ролей в формате JSON. Каждая роль представляется объектом, где ключ — это название роли, а значение — объект с описанием роли и вложенными ролями. Рекомендуется описывать роли по порядку: сперва сама роль, а затем роль, где данная роль является вложенной.

source/roles.json
{
    "role1": {
        "description": "Роль 1",
        "nested": []
    },
    "role2": {
    "description": "Роль 2",
        "nested": ["role1"]
    }
}
{
    "admin_role": {
        "description": "Основная роль администратора системы",
        "nested": []
    },
    "user_manager": {
        "description": "Роль для управления пользователями",
        "nested": ["admin_role"]
    },
    "content_editor": {
        "description": "Роль для редактирования контента",
        "nested": ["admin_role"]
    }
}

Определение в проекте#

Чтобы мигратор ролей работал корректно, необходимо создать файл source/roles.js. Данный файл является обычным JavaScript файлом, который должен возвращать массив объектов с ролями. Каждый элемент массива представляет собой объект, в котором на верхнем уровне указаны модуль или проект, откуда берутся роли. Значением этого объекта является описание ролей, аналогичное тому, что представлено в файле roles.json. Допускается любая предобработка данного массива, включая фильтрацию, удаление и добавление ролей.

В качестве примера, в данном файле модуль или проект называется current_project. Внутри этого объекта описана роль super1, которая имеет следующее описание: 'роль super1'.

Пример файла roles.js
    const coreRoles = require('ecosoft-lexema8/lib/roles.json');

    module.exports = [
        coreRoles,
        {
            current_project: {
                super1: {
                    description: 'роль super1'
                }
            }
        }
    ];

Миграция#

Пользователь нажимает кнопку Загрузить на экранной форме. В этот момент происходит считывание данных из файлов roles.json и roles.js, и все роли загружаются в таблицу на форме. В таблице отображаются названия ролей, их описания, вложенные роли и источник. Работа производится по аналогии с Обновлением БД.

Загрузка#

При загрузке отображаются только те роли, которые необходимо создать или обновить: 1. Роль отсутствует в БД. 2. Признак Sync у роли равен false. 3. Набор вложенных ролей в БД и в файлах отличается.

Создание#

Если пользователь выбрал действие создания, начинается процесс создания ролей. В этом случае происходит следующее:

  1. Проверка вложенных ролей: Система проверяет наличие всех вложенных ролей для каждой создаваемой роли.
  2. Создание записи: Для каждой роли, которая должна быть создана, система создает новую запись в базе данных.
  3. Вкладывание вложенных ролей: В процессе создания вложенные роли вкладываются в создаваемую.
  4. Обновление признака Sync: У созданных ролей признак проставляется Sync со значенеим true, что указывает на то, что роль была успешно создана и синхронизирована.

Обновление#

Если пользователь выбрал действие обновления для существующих ролей, начинается процедура обновления. В этом случае происходит следующее:

  1. Проверка вложенных ролей: Система проверяет наличие всех вложенных ролей для каждой обновляемой роли.
  2. Поиск существующих записей: Система ищет существующие записи для каждой выбранной роли.
  3. Обновление информации: Если запись найдена, происходит обновление информации о роли, включая описание и вложенные роли.
  4. Обновление признака Sync: В процессе обновления также обновляется признак Sync, который устанавливается в значение true, указывая на то, что роль была успешно обновлена.

Таким образом, проверка наличия всех вложенных ролей является критически важной для обеих операций, обеспечивая целостность данных и предотвращая ошибки в процессе создания и обновления ролей.

Обработка ошибок#

Если в процессе миграции возникают ошибки (например, отсутствуют вложенные роли), информация об этом отображается в столбце Сообщение. Это позволяет быстро идентифицировать и исправить проблемы.

Примечания#

  • Если Мигратор ролей не нужен на проекте, файл roles.js можно оставить пустым, чтобы избежать ошибок при запуске проекта.
  • Если роль фигурирует в нескольких библиотеках, вложенные роли являются пересечением всех вложенных ролей, где эта роль описана.
  • Роли обновляются без учета регистра. Например, если в БД уже есть роль в верхнем регистре, а в библиотеке эта же роль фигурирует в нижнем, будет найдена уже созданная роль и обновлена.