См. также 3-х минутное видео создания расширения
Установка и запуск коробки YouGile
Создание расширения
example-extension в папку extensionsmanifest.json с описанием расширения и 2 скрипта, которые запускаются в расширенииextensions считается расширением если в ней есть файл manifest.jsonВнесение изменений в расширение
manifest.json поменяйте поле name и посмотрите, что после сохранения название в списке расширений изменилось.manifest.json в поле ui написано ui.js – этот файл загружается в интерфейсе, попробуйте поменять в нём слово 'Example extension!' на другое и после сохранения расширение перезапустится и вы увидите новый текст в уведомлении.service указано значение service.js – это скрипт, который запускается на сервере в примере он выводит слово Hello в логе сервера, это можно увидеть в терминале при запуске расширения.Что дальше?
Расширение -- это папка в которой обязательно должен быть файл manifest.json.
Также внутри могут находиться скрипты 2-х типов: скрипты, которые выполняются в интерфейсе и скрипты, которые выполняются на сервере.
Папка node_modules/ позволяет использовать сторонние библиотеки для service скриптов.
То есть можно создать package.json и установить сторонние библиотеки через npm в node_modules – эти библиотеки будут доступны только для service скриптов.
Также можно добавить папку public, файлы которой будут доступны пользователям, напр.: <адрес коробки>/extension/telegram-bot/image.png
В скриптах можно использовать require для импорта других файлов и библиотек.
/telegram-bot
Пример 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 запускаются в интерфейсе пользователя при входе в компанию, где это расширение включено. На данный момент import/require в 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.subscribe({
event: 'task-moved',
handler: data => {
// эта функция будет вызываться, когда будет перемещена
// какая-либо задача в компании, где включено расширение,
// перемещение должно быть в другую колонку
// data - содержит информацию о перемещённой задаче
console.log('Task was moved', data)
}
})
Описание всех событий в REST API можно найти здесь
Есть определенные нюансы в использовании нативных методов node, некоторые из них отсутствуют (связано это с тем, что не все методы node попадают в бинарник), например, для использования fetch нужно использовать const fetch = require('node-fetch').
ui скрипты запускаются в браузере и десктоп-приложении YouGile.
В них доступны многие стандартные возможности javascript, но также для работы с интерфейсом системы
доступна библиотека yougile-ui.
// при подключении библиотеки
// новые методы добавляются в глобальное пространство имён
require('yougile-ui')
// показать сообщение об ошибке
Notifier.error('Hello!')
Список всех возможностей такой же, как и в конфигураторе YouGile, здесь можно посмотреть небольшую инструкцию https://yougile.com/media/docs/yougile-api-manual.pdf
В интерфейсе YouGile встроен редактор, который позволяет быстро проверить работу небольших
ui скриптов – его можно вызвать сочетанием клавиш Ctrl+˜ (ctrl и тильда, на macos тоже 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 скрипта:
require('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 может быть сделан импорт следующего:
Api - необходим для REST Api вызовов, также можно подписаться на вебхуки yougile (метод subscribe) или подписаться на свои кастомные вебхуки (метод subscribeCustomWebhook)
Company - хранит имя компании и companyId
Service - необходим для взаимодействия клиент/сервер и получения/сохранения данных
conf - хранит основной конфиг yougile
extension - имя расширения
mainDir - путь до папки yougile
Для старта разработки расширения Вы можете воспользоваться примером расширения. Находится он по пути ./example-extension.
В примере есть запросы к REST API, подписка на событие перемещения задачи (перемещение не должно быть внутри столбца), обмен данными между сервером и клиентом, пример взаимодействия с публичными и приватными данными.
Для того чтобы пример появился в списке расширений, папку ./example-extension нужно скопировать в папку ./extensions
Расширение можно установить двумя способами
Установить через архив (поддерживаются zip архивы). Для того чтобы установить - нужно заархивировать папку расширения в zip архив -> перейти в 'Моя компания' -> 'Расширения' -> и внизу нажать на кнопку 'Установить'. Через 5-10 секунд Ваше расширение появится в списке расширений. Расширение установится в папку ./extensions
Поместить папку с расширением в папку ./extensions
На данный момент расширения занимают память, 250 Мб в режиме работы и 450 Мб в момент запуска одного расширения на одну компанию. В ближайшем будущем мы пофиксим это, но нужно учесть, что каждое запущенное расширение даже не в основной компании занимает 450 Мб при запуске сервера и когда память заканчивается, то приложение работает со сбоями. В ближайших релизах пофиксим это.
Расширения запускаются через 15 секунд после старта сервера. Иногда требуется перезагрузить страницу, чтобы клиентский код расширения появился в браузере.
Примеры скриптов конфигуратора
Документация конфигуратора - можно вызвать сочетанием клавиш Ctrl+˜ (ctrl и тильда, на macos тоже ctrl).
В правой части этого интерфейса есть список всех методов, которые доступны в ui скриптах и в этом редакторе сразу можно попробовать эти методы. (На данный момент в библиотеке yougile-ui более полное описание некоторых сигнатур методов для конфигуратора)
Библиотека yougile-ui - декларации типов для конфигуратора
Библиотека yougile - библиотека для работы серверных скриптов