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: {
}
});
Please sign in to leave a comment.
Добрый день! Спасибо за ваше сообщение у нас на форуме.
Что касается дублирования сообщений из workflow.check(), то это известная проблема, к сожалению. Вот задача у нас в трекере, подпишитесь, пожалуйста: https://youtrack.jetbrains.com/issue/JT-53080
По поводу того, что HTTP-запрос посылается второй раз - не могли бы вы привести пример вашего правила, где вы наблюдаете такое поведение?
Спасибо.
Добрый день! Спасибо за ответ. Прикладываю код.
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 узнавать?
Добрый день, я прошу прощения за задержку с ответом.
К сожалению, двойной запрос - это следствие все той же проблемы 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