Deluge поддерживает типы данных, условия, циклы, функции и операторы возврата, сравнимые с C++, Python, Java, JavaScript и Swift. Далее подробно рассматриваются основы Deluge.
Типы данных
Deluge поддерживает типы text, number, boolean, map и collection и встроенные функции для каждого. В редакторе Deluge введите точку после переменной, чтобы увидеть доступные встроенные функции.
Текст (Text)
myText = "Hello World!";
Встроенные функции Text доступны здесь.
Число (Number)
number = -123.4;
Встроенные функции Number доступны здесь.
Логический (Boolean)
result = true;
result = false;
Дата и время (Date/Time)
Позволяет хранить дату и время в переменной. Встроенные функции добавляют дни, месяцы, время и другое.
Для преобразования стандартного формата даты в другой используйте синтаксис:
date='1-Jan-1990 20:50:36';
newDate = date.toTime().toString("yyyy-MM-dd'__Hello__'HH:mm:ss");
В этом примере newDate равно 1990-01-01__Hello__20:50:36.
Для преобразования времени в миллисекунды:
date='1-Jan-1990 20:50:36';
timeInMs = date.toTime().toLong();
В этом примере timeInMs равно 631255836000.
Другие встроенные функции Date-Time доступны здесь.
Словарь (Map)
Map хранит пары ключ — значение, как показано ниже:
userEmail = {"john":"john@manageengine.com", "peter":"peter@manageengine.com"};
userEmail.put("Andrew", "andrew@manageengine.com"); //a key-value pair will be added.
emailOfJohn = userEmail.get("john"); //value of 'emailOfJohn' will be 'john@manageengine.com'.
Также можно сначала объявить переменную, затем задать значение.
userEmail = map();
userEmail.put("john","john@manageengine.com");
emailOfJohn = userEmail.get("john");
Коллекция (Collection)
Collection хранит массив данных; также можно хранить пары ключ — значение. Синтаксис:
userNames = {"john", "peter"};
Также можно сначала объявить переменную, затем задать значение.
userNames = Collection();
userNames.put("john");
userNames.put("peter");
Для перебора Collection используйте 'for each', как показано ниже:
for each <myvariable> in <collection>
{
}
Пример
userNames = {"john","peter"};
for each name in userNames{
info "Name is" + name;
}
После отладки получен следующий ответ:
Name is john
Name is peter
Встроенные функции Collection доступны здесь.
Преобразование типов
Deluge предоставляет функции преобразования переменной из одного типа в другой.
Рассмотрим получение месяца как числа из строки dateInCalendar.
dateInCalendar = '01/02/2000';
monthAsString =
dateInCalendar.subString(3,5);
monthAsNumber =
monthAsString.toNumber();
info monthAsNumber;
После отладки получен следующий ответ:
2
Другие функции преобразования типов доступны здесь.
Условие
Deluge поддерживает if и else if со следующим синтаксисом:
if ( <expression> )
{
}
else if ( <expression> )
{
}
else
{
}
Пример
a=10;
b=20;
c=30;
if( a > b && a > c){
info "a is big";
}
else if ( b > c && b >a ){
info "b is big";
}
else{
info "c is big";
}
После отладки приведённого кода получен следующий ответ:
c is big
Вызовы API через Deluge
Deluge позволяет легко вызывать API сторонних приложений из ServiceDesk Plus.
REST API ServiceDesk Plus позволяет выполнять все операции веб-клиента. О доступных API и их структуре см. документацию V3 API в приложении: Admin >> General >> API.
Вызовы API внутри ServiceDesk Plus
Для вызовов внутри ServiceDesk Plus используйте синтаксис:
response = invokeurl
[
url: "http://servername:portnumber/api/v3/<....>"
type: POST\GET\PUT\DELETE
parameters: {"input_data":<INPUT_DATA>,"TECHNICIAN_KEY":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","PORTALID":<HELPDESKID>}
];
Примеры вызовов API
1. Получение списка заявок ИТ-службы поддержки
resp = invokeurl
[
url: "http://servername:portnumber/api/v3/requests"
type:GET
parameters: {"TECHNICIAN_KEY":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","PORTALID":<HELPDESKID>}
];
2. Получение первых 50 созданных в приложении открытых заявок
resp = invokeurl
[
url: "http://servername:portnumber/api/v3/requests"
type:GET
parameters: {"input_data":{"list_info":{"row_count":"50","search_criteria":{"field":"status.name","condition":"is","value":"Open"}}},"TECHNICIAN_KEY":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","PORTALID":<HELPDESKID>}
];
3. Создание заявки с темой 'New Issue'
resp = invokeurl
[
url: "http://servername:portnumber/api/v3/requests"
type: POST
parameters: {"input_data":{"request":{"subject":"new issue"}},"TECHNICIAN_KEY":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","PORTALID":helpdeskID}
];
Ответ API в переменной resp имеет формат JSON, поскольку V3 API ServiceDesk Plus возвращает JSON. Далее resp используется как обычная переменная. Ответ API нужно обрабатывать как Map.
Задачи интеграции
Задачи интеграции — стандартные функции Deluge, упрощающие взаимодействие с API.
Раньше invokeURL отправлял в ServiceDesk Plus внешние HTTP-запросы, как стороннее приложение. Задачи интеграции выполняют вызовы внутри приложения встроенными методами, без ручного создания HTTP-соединений и прохождения сетевого уровня.
Поддерживаемые модули: пользовательские модули веб-вкладок с включёнными функциями, заявки, проблемы, изменения, проекты и релизы.
Синтаксис
Синтаксис задачи интеграции:
Автодополнение редактора Deluge предлагает соответствующие сущности и действия при вводе.
Структура параметров:
|
Элемент |
Описание |
|
* |
Обозначает обязательные параметры синтаксиса. |
|
<portal_short_name> |
Короткое имя экземпляра, к данным модуля которого требуется доступ или изменение. Подробнее. |
|
<entity> |
Имя модуля для доступа или изменения данных. Для вложенной сущности укажите иерархию с именами родительских сущностей через точки. |
|
<action> |
Операция над сущностью, например create, update или get. |
|
<parameters> |
Значения параметров действия через запятую. Укажите все параметры; для необязательных используйте NULL. |
|
ТИП ОПЕРАЦИИ |
СТРУКТУРА ПАРАМЕТРОВ |
|
HTTP POST |
sdp.<entity>.<action>( inputData, portalID, <connection> ); Example: sdp.requests.add(input_data, 901, "admin" );
sdp.<parent_entity>.<entity>.<action>( parentURL, inputData, portalID, <connection> ); Example: sdp.cm_cm1s.cm_custom_sub_entities.add("/cm_cm1s/1", input_data, null, "sdpop" );
sdp.<poral_short_name>.<entity>.<action> ( inputData, <connection> ); Example: sdp.hr.cm_custom_records.add(inputData , "admin" );
sdp.<poral_short_name>.<parent_entity>.<entity>.<action>( parentURL, inputData, <connection> ); Example: sdp.as1.changes.tasks.comments.add("/changes/100000012/tasks/100000066" , inputData, "admin" ); |
|
HTTP PUT |
sdp.<entity>.<action>( entityID, inputData, portalID, <connection> ); Example: sdp.releases.assign(100000087, inputData, 301, "admin_integ" );
sdp.<parent_entity>.<entity>.<action>( parentURL, entityID, inputData, portalID, <connection> ); Example: sdp.projects.members.edit("/projects/3", ids, inputData, 1, "admin_integ" );
sdp.<poral_short_name>.<entity>.<action> ( entityID, inputData, <connection> ); Example: sdp.hr.changes.close_change(200000009, inputData, "admin_integ" );
sdp.<poral_short_name>.<parent_entity>.<entity>.<action>( parentURL, entityID, inputData, <connection> ); Example: sdp.fh.problems.tasks.mark("/problems/100000004", 100000001, inputData, "admin_integ" ); |
|
HTTP DELETE |
sdp.<entity>.<action>( entityID, portalID, <connection> ); Example: sdp.requests.move_to_trash(IDs, null, "admin_integ" );
sdp.<parent_entity>.<entity>.<action>( parentURL, entityID, portalID, <connection> ); Example: sdp.problems.tasks.comments.delete("/problems/100000001/tasks/100000001", 11, 301, "admin" );
sdp.<poral_short_name>.<entity>.<action> ( entityID, <connection> ); Example: sdp.bla.cm_cm1s.delete(100000001, "admin_integ" );
sdp.<poral_short_name>.<parent_entity>.<entity>.<action>( parentURL, entityID, <connection> ); Example: sdp.fh.releases.tasks.delete("/releases/100000004", 100000001, "admin_integ" ); |
|
ВСПОМОГАТЕЛЬНЫЕ ОПЕРАЦИИ GET |
sdp.<entity>.<action>( entityID, inputData, portalID, <connection> ); Example: sdp.requests.get_approval_notification_content(1, null, null, "sdpop" );
sdp.<parent_entity>.<entity>.<action>( parentURL, entityID, inputData, portalID, <connection> ); Example : sdp.projects.milestones.tasks.worklogs.get_time_spent("/projects/300000004/milestones/300000003/tasks/3000000010", 300000001, inputData, 901, "admin_integ" );
sdp.<poral_short_name>.<entity>.<action> ( entityID, inputData, <connection> ); Example: sdp.hr.changes.get_permissions(100000001, null, "sdpop" );
sdp.<poral_short_name>.<parent_entity>.<entity>.<action>( parentURL, entityID, inputData, <connection> ); Example: sdp.fh.requests.worklogs.summary("/requests/300000003", 300000045, null, "admin_integ" ); |
|
ПОЛУЧЕНИЕ ОДНОЙ СУЩНОСТИ |
sdp.<entity>.get( entityID, portalID, <connection> ); Example : sdp.requests.get(300000045, 901, "admin" );
sdp.<parent_entity>.<entity>.get( parentURL, entityID, portalID, <connection> ); Example : sdp.projects.members.get("/projects/3", 5, 1, "admin_integ" );
sdp.<poral_short_name>.<entity>.get( entityID, <connection> ); Example : sdp.bla.cm_cm1s.get(100000001, "admin_integ" );
sdp.<poral_short_name>.<parent_entity>.<entity>.get( parentURL, entityID, <connection> ); Example : sdp.fh.requests.worklogs.get("/requests/300000003", 300000045, "admin_integ" ); |
|
ПОЛУЧЕНИЕ СПИСКА |
sdp.<entity>.get_list( inputData, portalID, <connection> ); Example : sdp.requests.get(inputData, 901, "admin" );
sdp.<parent_entity>.<entity>.get_list( parentURL, inputData, portalID, <connection> ); Example: sdp.projects.members.get("/projects/3", null, 1, "admin_integ" );
sdp.<poral_short_name>.<entity>.get_list( inputData, <connection> )
sdp.<poral_short_name>.<parent_entity>.<entity>.get_list( parentURL, inputData, <connection> ); Example : sdp.fh.requests.worklogs.get("/requests/300000003", inputData, "admin_integ" ); |
Синтаксис параметров
|
Параметр |
Тип |
Описание |
|
parentURL |
Текст (Text) |
Сведения о родительской сущности в URL без /api/v3 и конечной точки самой сущности. Пример: для https://zylker.com/api/v3/requests/1/tasks/1 параметр parentURL может быть /requests/1. |
|
entityID |
Число, список (Number, List) |
ID сущности, над которой выполняется действие. |
|
portalID |
Число (Number) |
Используйте параметр, если имя портала не указано в синтаксисе. В подсказках перечислены все доступные пользователю порталы. Retired и порталы с истёкшими лицензиями не показываются. Используйте Null или 1 для IT-портала и соответствующие ID для остальных. Вызовы API возможны между порталами. |
|
inputData |
JSON, Map |
Входные данные в JSON. |
|
connection |
Текст (Text) |
Имя ссылки соединения. Соединения можно создавать, аутентифицировать и управлять ими прямо со страницы функций через Manage в подсказках либо кнопку Connections в правом верхнем углу. |
Вызовы API внешних приложений
Для вызовов внешних приложений используйте следующий синтаксис:
resp = invokeurl[ url: <URL> type: <GET|POST|PUT|DELETE|PATCH> parameters: <PARAMETERS> headers: <HEADERS> files: <FILE_NAME>connection: <CONNECTIONS>];
Заполните сведения функции по следующим указаниям:
<URL>: Provide your API URL.
<PARAMETERS>: Specify the parameters of your API.
<HEADERS>: Provide the authorization details of the third-party application. For example, if your API accepts 'authtoken', then provide the authtoken generated for the third party application.
<FILE_NAME>: If you are triggering an API to submit a file (received from another API's response), specify the file name in this space.
<CONNECTIONS>: Select stored authorization details instead of hard-coding the credentials. You can also create and manage connections directly from the Custom Function :
* Для создания соединения нажмите Manage или Connections.
* Для существующего соединения нажмите <connection> и выберите его из подсказок.
