Workflow.check

Добрый день.

Вопрос по методу workflow.check 

Когда condition возвращает false, правило срабатывает еще раз. В моём случае дважды посылается HTTP запрос, вместо одного. Можно ли как-нибудь это избежать?

Проверял на "голом" правиле. Выполняется два раза.

Сборка 2020.6.2397


var entities = require('@jetbrains/youtrack-scripting-api/entities');
var workflow = require('@jetbrains/youtrack-scripting-api/workflow');

exports.rule = entities.Issue.onChange({
title: 'Check',
guard: function(ctx) {
return true;
},
action: function(ctx) {
var issue = ctx.issue;
console.log("tada");
workflow.check(false, "tada");
},
requirements: {
}
});
3 comments
Comment actions Permalink
Official comment

Добрый день! Спасибо за ваше сообщение у нас на форуме.

Что касается дублирования сообщений из workflow.check(), то это известная проблема, к сожалению. Вот задача у нас в трекере, подпишитесь, пожалуйста: https://youtrack.jetbrains.com/issue/JT-53080 

По поводу того, что HTTP-запрос посылается второй раз - не могли бы вы привести пример вашего правила, где вы наблюдаете такое поведение?

Спасибо.

Comment actions Permalink

Добрый день! Спасибо за ответ. Прикладываю код.

var entities = require('@jetbrains/youtrack-scripting-api/entities');
var workflow = require('@jetbrains/youtrack-scripting-api/workflow');
const connection = require('./connection-utils');

exports.rule = entities.Issue.onChange({
title: 'Check-work-time',
guard: function(ctx) {
var issue = ctx.issue;
var workItems = ctx.issue.workItems;
return (issue.editedWorkItems.isNotEmpty() || workItems.added.isNotEmpty() || workItems.removed.isNotEmpty());
},

action: function(ctx) {
var issue = ctx.issue;
var workItems = ctx.issue.workItems;
const checkWorkTimeResource = 'hs/ExchangeITIL_YT/CheckWorkTime';

// getting issue BD ID by readeble ID
function getIssueId(ctx) {
const connectionYT = connection.getYtConnection();
const issueId = ctx.issue.id;
const fieldIdParamerts = [];
fieldIdParamerts.push({
name: 'fields',
value: 'id'
});
var responseYT = connectionYT.getSync(`/api/issues/${issueId}`, fieldIdParamerts);
return JSON.parse(responseYT.response).id;
}

const itiliumConnection = connection.getItiliumConnection();
const parameters = [];
parameters.push({
name: 'issueId',
value: getIssueId(ctx)
});
//этот запрос фиксируется два раза на другой стороне
const response = itiliumConnection.getSync(checkWorkTimeResource, parameters);
if (response.code === 200) {
const resObj = JSON.parse(response.response);
workflow.check(resObj.Status === 1, `Трудозатраты в Youtrack и Итилиум не занесены по причине: ${resObj.Comment}`);
} else {
workflow.check(response.code === 500, 'Внутренняя ошибка Итилиум, трудозатраты не будут внесены');
}
},
requirements: {}
});

Есть еще попутный вопрос. Для формирования запроса мне нужен ID issue, как в БД. Его я могу только через REST API узнавать?

 

 

0
Comment actions Permalink

Добрый день, я прошу прощения за задержку с ответом.

К сожалению, двойной запрос - это следствие все той же проблемы https://youtrack.jetbrains.com/issue/JT-53080, из-за нее после сброса по workflow.check условие guard вызывается два раза.

Что касается вашего последнего вопроса: при вызове REST методов вы можете использовать обычный issue ID как вы его видите в интерфейсе, например, JT-53080.

Здесь подробнее про REST API: https://www.jetbrains.com/help/youtrack/incloud/operations-api-issues.html#get-Issue-method

0

Please sign in to leave a comment.