Написание ролевого приложения

Введение

Ролевым приложением называют web-приложение, которое можно установить в домен системы «Era», создав объект типа roleapp и загрузив в него файл архива.
Ролевое приложение может иметь связанный с ним служебный сценарий, код которого указан в roleapp entity в поле svcscriptcode.
Запуск связанного служебного сценария происходит через выполнение запроса /exec.
В данной статье описан сам файл ролевого приложения, его значимые элементы, а также видный снаружи результат установки ролевого приложения.

Файл ролевого приложения

Ролевое приложение представляет из себя zip-архив, который будет распакован на сервере при установке.
При этом архив должен содержать файл roleapp.json на верхнем уровне.

├── assets
│   └── img
│   └── desktop.svg
├── css
│   └── jsoneditor.min.css
├── index.html
├── js
│   ├── aes-js.js
│   ├── base64.js
│   ├── jquery-3.1.1.min.js
│   └── jsoneditor.min.js
├── monitor.js
└── roleapp.json

Файл roleapp.json в корне архива содержит описание приложения. Как правило все файлы приложения находятся также в корне архива (index.html и другие).

roleapp.json

Должен быть валидным json файлом, размер которого не превышает 10Kb. Все поля опциональные. Минимальный json может быть пустым объектом ({}).

{
  "name": "Roleapp Sample", (1)
  "description": "Monitor (old) as RoleApp description", (2)
  "order": 5000, (3)
  "fa-icon": "fa-paw" (4)
  "icon": "assets/img/desktop.svg" (5)
}
1 name – название ролевого приложения. Значение поля будет использовано для названия ролевого приложения в списке если администратор оставил поле "title" объекта ролевого приложения пустым. Тип поля строка, иначе значение будет проигнорированно.
2 description – описание ролевого приложения, идёт напрямую в /rest/v1/iam/sessions/current. Тип поля строка, иначе значение будет проигнорированно.
3 order – порядок ролевого приложения при сортировке для отображения в списке. Администратор может принудительно его задать в поле ext.order объекта roleapp, чтобы заменить значение из roleapp.json.
4 fa-icon – имя класса иконки Font Awesome.
5 icon – путь до иконки для списка приложений относительно папки ролевого приложения.

Есть возможность указать подпапку внутри архива в качестве папки с web-документами (по-умолчанию будет использован весь архив от корня). Если roleapp.json содержит поле "folder", то в результате по url’у установленного приложения будет доступен не корень архива, а эта подпапка (в url не появляется).
Таким образом, разницу между режимом по-умолчанию и режимом с подпапкой можно проследить на примере roleapp.json: в режиме по-умолчанию файл становится доступным по http: /app/folder/roleapp.json но в режиме с подпапкой он оказывается не виден.

Пример:

├── dist
│   └── index.html
└── roleapp.json

{
  "name": "Def roleapp",
  "order": 5000,
  "fa-icon": "fa-folder-open",
  "folder": "dist"
}

Установка ролевого приложения

После установки ролевого приложения оно появляется в списке приложений если проходит все этапы фильтрации. Фильтруются приложения по следующему правилу:

  • пользователь должен иметь хотя бы одну роль из списка ролей приложения (поле "roles" объекта roleapp) - задаются администратором.

Результат установки

Приложение становится доступным по URL указанном в выдаче /rest/v1/iam/sessions/current, например /app/folder/ и при таком запросе будет отдаваться содержимое index.html (только корень приложения).

Здесь нужно понимать, что URL установки не известен автору приложения заранее, ведь folder определяется администратором в момент установки. Таким образом администратор имеет возможность установить, например, разные версии ролевого приложения в разные папки и пользоваться ими одновременно.

Следствием вышесказанного является необходимость ссылаться на ресурсы ролевого приложения по относительным путям, например:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>API Monitor</title>
<link rel="stylesheet" href="css/jsoneditor.min.css">
<script src="js/jsoneditor.min.js"></script>
<script src="js/jquery-3.1.1.min.js"></script>
<script src="js/aes-js.js"></script>
<script src="js/base64.js"></script>
<script src="monitor.js"></script>

Где ресурсы будут загружаться из папок /app/folder/css/, /app/folder/js/ и т.д. или как /app/folder/monitor.js из папки ролевого приложения, что является стандартной работой браузера.

С другой стороны, применяя javascript очень легко динамически узнать путь установки ролевого приложения при загрузке страницы (из переменной window.location.pathname), например:

<html>
<body>
<h1>Role Application "Def2".<h1>
<div id="abc"></div>
<script>
console.log('1');
(function() {
var path = window.location.pathname;
console.log('path = ', path);
document.getElementById('abc').innerHTML = path;
})();
console.log('2');
</script>
</body>
</html>