js/teams-webhook/teams-webhook.js (80 lines of code) (raw):
// To send a webhook in Teams channel for issue tracking
const TEAMS_WEBHOOK_URL = '<REPLACE-WITH-YOUR-WEBHOOK-URL>';
var http = require('@jetbrains/youtrack-scripting-api/http');
var entities = require('@jetbrains/youtrack-scripting-api/entities');
exports.rule = entities.Issue.onChange({
title: 'Notify-teams',
guard: (ctx) => {
return ctx.issue.becomesReported || ctx.issue.becomesResolved || ctx.issue.becomesUnresolved;
},
action: (ctx) => {
const issue = ctx.issue;
const issueLink = '<' + issue.url + '|' + issue.id + '>';
let message; let isNew;
if (issue.becomesReported) {
message = 'Created: ';
isNew = true;
} else if (issue.becomesResolved) {
message = 'Resolved: ';
isNew = false;
} else if (issue.becomesUnresolved) {
message = 'Reopened: ';
isNew = false;
}
message += issue.summary;
let changedByTitle = '';
let changedByName = '';
if (isNew) {
changedByTitle = 'Created By';
changedByName = issue.reporter.fullName;
} else {
changedByTitle = 'Updated By';
changedByName = issue.updatedBy.fullName;
}
const payload = {
'@type': 'MessageCard',
'@context': 'http://schema.org/extensions',
'themeColor': issue.fields.Priority.backgroundColor || '#edb431',
'summary': message,
'sections': [
{
'activityTitle': issueLink,
'activitySubtitle': message,
'facts': [
{
'name': 'State',
'value': issue.fields.State.name
},
{
'name': 'Priority',
'value': issue.fields.Priority.name
},
{
'name': 'Assignee',
'value': issue.fields.Assignee ? issue.fields.Assignee.fullName : ''
},
{
'name': changedByTitle,
'value': changedByName
}
]
}
]
};
const connection = new http.Connection(TEAMS_WEBHOOK_URL, null, 2000);
const response = connection.postSync('', null, JSON.stringify(payload));
if (!response.isSuccess) {
console.warn('Failed to post notification to Teams. Details: ' + response.toString());
}
},
requirements: {
Priority: {
type: entities.EnumField.fieldType
},
State: {
type: entities.State.fieldType
},
Assignee: {
type: entities.User.fieldType
}
}
});