Платформа YouGile. Создание расширений
Описание платформы
YouGile Платформа это механизм расширений, позволяющий изменять и дополнять функциональность системы без изменения исходного кода продукта.
Расширения доступны в коробочной версии на тарифе Платформа.
Разрабатывать и тестировать расширения можно бесплатно, скачав дистрибутив YouGile.
Основные возможности платформы:
- выполнение пользовательского JavaScript-кода
- расширение интерфейса (UI)
- выполнение серверной логики
- использование REST API YouGile
- обработка событий системы (webhooks)
Как это работает
Работа расширений основана на встраивании JavaScript-кода в клиентскую и серверную части системы YouGile.
YouGile предоставляет собственный API для удобной разработки расширений. При этом разработчику доступны и стандартные возможности JavaScript:
- в браузере - для UI-скриптов
- в среде Node.js — для серверных скриптов
Для создания расширения требуется только:
- дистрибутив YouGile
- любой текстовый редактор
Создание простого расширения занимает около 3 минут и не требует предварительной подготовки: Видео с примером создания расширения.
Готовое расширение можно сохранить в виде ZIP-архива и загрузить в коробочную версию YouGile.
Возможности расширений
С помощью расширений можно:
- изменять поведение существующих интерфейсов YouGile с использованием JavaScript
- создавать новые элементы и сценарии работы интерфейса
- выполнять собственный JavaScript-код на стороне сервера YouGile и изменять бизнес-логику системы
- использовать все возможности REST API YouGile из серверных скриптов
В дистрибутив YouGile уже включены все необходимые библиотеки для разработки расширений и установка дополнительных зависимостей не требуется.
Во время разработки расширения все изменения автоматически применяются в запущенной коробке YouGile, что позволяет сразу видеть результат работы кода.
Базовое расширение
Рекомендуем ознакомиться с 3-х минутным видео по созданию расширения.
Установка и запуск коробки YouGile
- Скачайте последнюю версию дистрибутива YouGile
- Распакуйте архив
- Запустите исполняемый файл
server(рекомендуется запускать из терминала для просмотра логов) - В браузере откройте указанный адрес mainPageUrl (по умолчанию):
http://localhost:8001 - Создайте учётную запись администратора и выполните вход в систему
Создание расширения
-
Перейдите в каталог:
extensions -
Скопируйте папку
example-extensionв эту же директорию. -
Внутри папки уже находятся:
- файл
manifest.json - два JavaScript-скрипта, которые используются расширением
- файл
-
Любая папка внутри каталога
extensionsсчитается расширением, если в ней присутствует файлmanifest.json.
Включение расширения в интерфейсе
-
Откройте интерфейс YouGile в браузере:
http://localhost:8001 -
Перейдите в раздел Моя компания - Расширения
-
В списке расширений должна появиться новая запись с названием Пример расширения
-
Включите расширение
-
После включения появится уведомление с текстом:
Example extension!
Внесение изменений в расширение
Открытие проекта
Откройте папку расширения в любом редакторе кода, например:
- Visual Studio Code
- WebStorm
- Atom
- Sublime Text
- Notepad++
- Vim
Изменение manifest.json
- Откройте файл
manifest.json - Измените значение поля
name - Сохраните файл — название расширения в списке расширений обновится автоматически
Изменение UI-скрипта
-
В файле
manifest.jsonв полеuiуказан файлui.js -
Этот файл загружается в пользовательский интерфейс
-
Откройте
ui.jsи измените текст:Example extension!на любой другой.
-
Сохраните файл, после этого расширение автоматически перезапустится, и в интерфейсе появится новое уведомление.
Изменение server-скрипта
- В файле
manifest.jsonв полеserviceуказан файлservice.js - Этот скрипт выполняется на сервере
- В примере скрипт выводит текст
Helloв лог сервера - Измените текст и сохраните файл
- В терминале, где запущен сервер YouGile, появится сообщение с новым значением
Ниже в этой инструкции приведена основная документация по платформе YouGile, включая описание возможностей API для клиентских и серверных скриптов. Для освоения платформы можно последовательно изучать документацию и обучающие видео, либо сразу приступать к экспериментам, ориентируясь на подсказки и автодополнение в редакторе кода. Готовое расширение можно упаковать в ZIP-архив и загрузить в другую коробочную версию YouGile через интерфейс в разделе Моя компания - Расширения
Структура расширения
Пример структуры расширения:
extensions/
└── my-extension/
├── manifest.json
├── service-one.js
├── service-two.js
├── ui-one.js
├── ui-two.js
├── util.js
├── some-folder/
│ └── example.js
├── node_modules/
└── public/
├── image.png
└── media/
├── icon.svg
└── media.mp4
Расширение YouGile представляет собой каталог, в котором обязательно должен присутствовать файл manifest.json. Наличие этого файла является обязательным условием для распознавания каталога как расширения.
Внутри расширения могут находиться скрипты двух типов:
- UI-скрипты выполняются в пользовательском интерфейсе YouGile
- Service-скрипты выполняются на сервере YouGile
Каталог node_modules/ используется для подключения сторонних библиотек в серверных скриптах. Для этого в расширении можно создать файл package.json и установить необходимые зависимости с помощью npm. Установленные библиотеки будут доступны только для service-скриптов и не загружаются в интерфейс.
При необходимости в расширение можно добавить каталог public. Файлы, размещённые в этом каталоге, становятся доступными пользователям по прямому URL, например:
mainPageUrl/extension/my-extension/.../image.png
В скриптах расширения поддерживается использование require для импорта других файлов расширения и внешних библиотек.
Пример manifest.json:
{
"name": "Интеграция с Телеграм",
"description": "Расширение позволяет <b>синхронизировать</b> групповой чат с группой в телеграм. Для каждого группового чата можно создать бота, который будет передавать сообщения в группу и в YouGile, а также присылать ответы из группы",
"image": "/extensions/telegram-bot/media/icon.svg",
"ui": ["index.ui.js", "two.ui.js", "util.js", "some-folder/example.js"],
"service": "one.service.js"
}
Если расширение включено, то js-файлы, которые указаны в ui, запускаются в интерфейсе пользователя при входе в компанию. На сервере, где развернут YouGile, запускаются service-скрипты.
Service-скрипты и ui-скрипты
Возможности service-скриптов
У service-скриптов помимо обычных возможностей и библиотек, которые присутствуют в node, есть доступ к библиотеке yougile:
const yougile = require('yougile')
// в yougile.Company – находятся данные о компании, в которой запущено расширение
const {name, companyId} = yougile.Company
// yougile.conf – хранит настройки сервера YouGile, которые указываются в conf.json
const conf = yougile.conf
Библиотека yougile позволяет работать с возможностями REST API:
// отправить сообщение от лица системного пользователя
// см. https://yougile.com/api-v2#/operations/ChatMessageController_sendMessage
yougile.Api.post(`/chats/${taskId}/messages`, {
text: 'Привет!',
textHtml: '<p>Привет!</p>',
label: 'Упоминание'
})
Также библиотека yougile позволяет подписываться на события в системе (webhooks):
const yougile = require('yougile')
// подписка на событие с установкой обработчика в скрипте
// внешний endpoint, который принимает данные не нужен
yougile.Api.setupEventCallback({
event: 'task-moved',
handler: data => {
// эта функция будет вызываться, когда будет перемещена
// какая-либо задача в компании, где включено расширение,
// перемещение должно быть в другую колонку
// data - содержит информацию о перемещённой задаче
console.log('Task was moved', data)
}
})
Описание событий в REST API можно изучить по ссылке: https://yougile.com/api-v2#/operations/WebhookController_create
Обратите внимание: отсутствует использование некоторых нативных методов node. Это связано это с тем, что не все методы node попадают в бинарный файл. Например, для использования
fetchнеобходимо использоватьconst fetch = require('node-fetch').
Возможности ui-скриптов
UI-скрипты запускаются в браузере и десктоп-приложении YouGile. Для работы с интерфейсом системы, наравне со многими стандартными возможностями javascript, доступна библиотека yougile-ui.
// при подключении библиотеки
// новые методы добавляются в глобальное пространство имён
require('yougile-ui')
// показать сообщение об ошибке
Notifier.error('Hello!')
Cписок возможностей такой же, как и в конфигураторе YouGile.
В интерфейсе YouGile есть встроенный редактор, который позволяет быстро проверить работу небольших ui-скриптов.го можно вызвать сочетанием клавиш Ctrl+˜ . В правой части этого интерфейса есть список всех методов, которые доступны в ui-скриптах, также в редакторе можно попробовать данные методы.
Взаимодействие между ui- и service-скриптами
UI-скрипты поддерживают механизм взаимодействия с серверными (service) скриптами. В service-скрипте можно определить функции, которые затем могут быть вызваны из ui-скриптов.
Пример определения функции на стороне service-скрипта:
const yougile = require('yougile')
const Service = yougile.Service
// userId передаётся всегда – это id пользователя
// у которого вызвался метод (в этих примерах userId не используется)
Service.serverTime = ({userId}) => {
return Date.now()
}
Service.addTwoNumbers = ({userId, args}) => {
const [a, b] = args
return a + b
}
На стороне ui-скрипта:
equire('yougile-ui')
const time = await Service.serverTime()
console.log('Server time is', time)
const sum = await Service.addTwoNumbers(1, 2)
console.log(sum, 'must be equal to', 3)
Хранение публичных данных в ui- и service-скриптах
На клиенте:
const data = await Service.getData()
Service.setData({...})
На сервере:
const yougile = require('yougile')
const data = await yougile.Service.getData()
await yougile.Service.setData({...})
Хранение непубличных данных в service-скриптах
На клиенте методы Service.getPrivateData(), Service.setPrivateData() недоступны. На сервере используем:
const yougile = require('yougile')
// получаем непубличные данные
const data = await yougile.Service.getPrivateData()
// сохраняем непубличные данные
await yougile.Service.setPrivateData({token: '...'})
Расположение данных
Публичные данные хранятся по пути ./database/$companyId/$extension-name.json. Приватные данные хранятся по пути ./database/$companyId/$extension-name-private.json
Получить путь до базы данных:
const {DataService} = require('yougile')
DataService.getDatabasePath()
Библиотека yougile
Данная библиотека yougile используется только в service-скриптах. Из yougile может быть сделан импорт следующего:
- Api - необходим для REST Api вызовов, также можно подписаться на вебхуки
yougile(методsubscribe) или подписаться на свои кастомные вебхуки (методsetupCustomWebhook) - Company - хранит имя компании и
companyId - Service - необходим для взаимодействия клиент/сервер и получения/сохранения данных
- conf - хранит основную конфигурацию yougile
- extension - имя расширения
- mainDir - путь до папки yougile
Библиотека yougile-ui декларирует типы для конфигуратора, в ней содержится более полное описание некоторых сигнатур методов.
Пример расширения
Для старта разработки расширения вы можете воспользоваться примером расширения. Находится он по пути ./example-extension.
В примере есть запросы к REST API, подписка на событие перемещения задачи (перемещение не должно быть внутри столбца), обмен данными между сервером и клиентом, пример взаимодействия с публичными и приватными данными.
Для того чтобы пример появился в списке расширений, папку ./example-extension нужно скопировать в папку ./extensions
Установка расширения
Расширение можно установить двумя способами:
-
Установить через архив (поддерживаются zip архивы). Для того чтобы установить, нужно заархивировать папку расширения в zip архив, перейти в Моя компания - Расширения и внизу нажать на кнопку Установить. Через 5-10 секунд Ваше расширение появится в списке расширений. Расширение установится в папку
./extensions -
Поместить папку с расширением в папку
./extensions
Расширения запускаются через 15 секунд после старта сервера. Иногда требуется перезагрузить страницу, чтобы клиентский код расширения появился в браузере.