Skip to content

Dashboards (BI) ​

Сервис бизнес-аналитики (BI) и интерактивных визуализаций данных: создание дашбордов организации и пространств, настраиваемая Grafana-подобная сетка (24 колонки) на базе angular-gridster2, изолированные iframe-виджеты с безопасным обменом данными через @leggnom/data-bridge, выполнение параметризованных запросов JSON QuerySpec к физическим таблицам Data Tables (и наборам данных Data Catalog), а также расширяемость через защищенные .usint пакеты виджетов.

Порты ​

ПортНазначение
8113HTTP REST (PM2 dev)
18113Docker host
  • БД: dashboards_db (PostgreSQL)
  • Gateway: /proxy/dashboards/...

Архитектура и поток данных ​

  1. Дашборды могут иметь область видимости org (общие для организации, space_id IS NULL, секция dashboards) или space (внутри пространства, space_id, секция space_dashboards).
  2. Каждый дашборд содержит панели с координатами сетки {x, y, w, h}, источником данных (data_table или data_catalog), спецификацией запроса QuerySpec и визуальными параметрами visual.
  3. Виджеты загружаются внутри песочницы <iframe> (sandbox allow-scripts allow-forms).
  4. Вся коммуникация между хостом Angular и iframe виджета осуществляется через протокол @leggnom/data-bridge:
    • Хост отправляет событие init с конфигурацией visual, locale, theme и query.
    • Виджет отправляет событие query с возможным фильтром/оверлеем.
    • Хост запрашивает бэкенд POST /api/v1/panels/:id/query или POST /api/v1/query/preview.
    • Бэкенд валидирует параметры, выполняет безопасный параметризованный SQL к таблице Data Tables и возвращает нормализованный QueryResult.

JSON QuerySpec контракт ​

Запрос от виджета/панели описывается безопасной структурой без произвольного SQL:

json
{
  "select": [
    { "field": "category" },
    { "field": "amount", "agg": "sum", "as": "total" }
  ],
  "filters": [
    { "field": "status", "op": "eq", "value": "paid" }
  ],
  "filter_mode": "and",
  "group_by": ["category"],
  "order_by": [
    { "field": "total", "dir": "desc" }
  ],
  "limit": 1000,
  "offset": 0
}

Поддерживаемые операции ​

  • Агрегации (agg): sum, avg, min, max, count, count_distinct.
  • Операторы фильтрации (op): eq, ne, gt, gte, lt, lte, contains, in, is_null, is_not_null.

Формат ответа (QueryResult) ​

json
{
  "columns": [
    { "name": "category", "type": "string" },
    { "name": "total", "type": "number" }
  ],
  "rows": [
    ["Электроника", 125000],
    ["Мебель", 45000]
  ],
  "row_count": 2,
  "truncated": false
}

API ​

МетодПутьОписание
GET/api/v1/dashboardsСписок дашбордов (scope, space_id)
POST/api/v1/dashboardsСоздание дашборда
GET/api/v1/dashboards/:idПолучение дашборда и его панелей
PATCH/api/v1/dashboards/:idОбновление дашборда
DELETE/api/v1/dashboards/:idУдаление дашборда
GET/api/v1/dashboards/:id/panelsСписок панелей дашборда
POST/api/v1/dashboards/:id/panelsСоздание панели
GET/api/v1/panels/:idПолучение панели
PATCH/api/v1/panels/:idОбновление координат сетки/запроса/оформления панели
DELETE/api/v1/panels/:idУдаление панели
POST/api/v1/panels/:id/queryВыполнение запроса панели с объединением фильтров
POST/api/v1/query/previewПредпросмотр выполнения запроса по источнику
GET/api/v1/widgetsСписок доступных виджетов
GET/api/v1/widgets/:slugИнформация о виджете
GET/api/v1/widgets/:slug/files/*filepathРаздача статических файлов виджета
GET/api/v1/widget-packsСписок установленных пакетов виджетов
POST/api/v1/widget-packs/importИмпорт пакета виджетов (.usint или .zip)
DELETE/api/v1/widget-packs/:idУдаление пакета виджетов

Пакеты виджетов (.usint) ​

Пакеты виджетов упаковываются по стандарту USINT1 (AES-GCM шифрование с ключом INTEGRATION_PACK_KEY):

  • Максимальный размер пакета: 32 MiB.
  • В составе пакета: manifest.yaml (описание пакета, виджетов, схем visual_schema и подсказок query_hints) и каталоги виджетов со статическими файлами (index.html, скрипты, стили).
  • CLI-утилита сервиса:
    bash
    # Запаковать директорию с виджетами в .usint
    ./bin/cli pack seal packs/pack-core-charts -o pack-core-charts.usint
    
    # Проверить содержимое запечатанного пакета
    ./bin/cli pack open pack-core-charts.usint

SDK разработчика виджетов ​

Для создания кастомных виджетов используется npm-библиотека @leggnom/unishift-widget (в репозитории libs/unishift-widget):

  • Автоматически настраивает двусторонний мост через @leggnom/data-bridge.
  • Предоставляет строгие TypeScript-типы для QuerySpec, QueryResult, VisualSchema.
  • Включает готовый стартовый шаблон на Vite (templates/vite-widget).

Переменные окружения ​

ПеременнаяПо умолчаниюОписание
PORT8113HTTP порт сервиса
DB_NAMEdashboards_dbИмя базы данных
INTEGRATION_PACK_KEY-Ключ шифрования AES-GCM для .usint пакетов
SPACES_SERVICE_URLhttp://localhost:8092URL сервиса Spaces для проверки доступа
DATA_TABLES_SERVICE_URLhttp://localhost:8105URL сервиса Data Tables для выполнения запросов
DATA_CATALOG_SERVICE_URLhttp://localhost:8109URL сервиса Data Catalog
ASSETS_DIR./data/widgetsДиректория распакованных статических файлов виджетов