jiraCloud/services/approvalCards.js
jmcqueen 0b056739e9 Add modular Jira-to-Webex approvals service with Docker deployment.
Stabilize logging, correlation IDs, service-account Jira auth, and direct approver reminder DMs while splitting the monolith into focused modules with Compose-based deployment.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-17 08:34:47 -04:00

122 lines
6.2 KiB
JavaScript

export function buildChangeApproval(jiraTicket, log) {
return new Promise(function (resolve) {
let cardText = '';
cardText += `[${jiraTicket.issue.key}](https://aeo.atlassian.net/servicedesk/customer/portal/135/${jiraTicket.issue.key}) - ${jiraTicket.issue.fields.status.name}\n`;
if (jiraTicket.issue.fields.customfield_10010) {
if (jiraTicket.issue.fields.customfield_10010.errorMessage) {
cardText += `**Request Type:** ${jiraTicket.issue.fields.customfield_10010.errorMessage}\n`;
} else {
cardText += `**Request Type:** ${jiraTicket.issue.fields.customfield_10010.requestType.name}\n`;
}
}
cardText += `**Summary:** ${jiraTicket.issue.fields.summary}\n`;
let detailText = '';
detailText += `**Description:** ${jiraTicket.issue.fields.description}\n`;
detailText += '**Details:**\n';
if (jiraTicket.issue.fields.customfield_10010) { detailText += ` - **Type:** ${jiraTicket.issue.fields.customfield_10010.requestType.name}\n`; }
if (jiraTicket.issue.fields.customfield_10080) { detailText += ` - **Risk:** ${jiraTicket.issue.fields.customfield_10080.value}\n`; }
if (jiraTicket.issue.fields.customfield_10004) { detailText += ` - **Impact:** ${jiraTicket.issue.fields.customfield_10004.value}\n`; }
if (jiraTicket.issue.fields.customfield_10256) { detailText += ` - **Business Impact:** ${jiraTicket.issue.fields.customfield_10256}\n`; }
if (jiraTicket.issue.fields.customfield_10252) { detailText += ` - **Business Justification:** ${jiraTicket.issue.fields.customfield_10252}\n`; }
if (jiraTicket.issue.fields.customfield_10257) {
const changeDate = new Date(jiraTicket.issue.fields.customfield_10257).toLocaleDateString();
const changeTime = new Date(jiraTicket.issue.fields.customfield_10257).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', hour12: true });
detailText += `**Implementation Date:** ${changeDate} ${changeTime}\n`;
}
let assignmentText = '';
if (jiraTicket.issue.fields.reporter) { assignmentText += `**Reporter:** ${jiraTicket.issue.fields.reporter.displayName}\n`; }
if (jiraTicket.issue.fields.customfield_10302) { assignmentText += `**Implementer:** ${jiraTicket.issue.fields.customfield_10302.displayName}\n`; }
const requestCard = {
type: 'AdaptiveCard',
$schema: 'http://adaptivecards.io/schemas/adaptive-card.json',
version: '1.2',
body: [
{ type: 'TextBlock', text: cardText.trim(), wrap: true },
{ type: 'TextBlock', wrap: true, text: detailText.trim(), separator: true },
{ type: 'TextBlock', text: assignmentText.trim(), wrap: true, separator: true },
],
actions: [
{
type: 'Action.OpenUrl',
title: 'Open Request',
url: `https://aeo.atlassian.net/servicedesk/customer/portal/135/${jiraTicket.issue.key}`,
},
{
type: 'Action.Submit',
title: 'Remove Card',
style: 'destructive',
data: { cardType: 'requestApproval', action: 'removeCard' },
},
],
};
let requestText = cardText;
requestText += `---\n${detailText}`;
requestText += `---\n${assignmentText}`;
log.logDebug('buildChangeApproval', `Built card for ${jiraTicket.issue.key}`);
resolve({ card: requestCard, message: requestText });
});
}
export function buildRequestApproval(jiraTicket) {
return new Promise(function (resolve) {
let cardText = '';
cardText += `[${jiraTicket.issue.key}](https://aeo.atlassian.net/servicedesk/customer/portal/135/${jiraTicket.issue.key}) - ${jiraTicket.issue.fields.status.name}\n`;
if (jiraTicket.issue.fields.customfield_10010) {
if (jiraTicket.issue.fields.customfield_10010.errorMessage) {
cardText += `**Request Type:** ${jiraTicket.issue.fields.customfield_10010.errorMessage}\n`;
} else {
cardText += `**Request Type:** ${jiraTicket.issue.fields.customfield_10010.requestType.name}\n`;
}
}
cardText += `**Summary:** ${jiraTicket.issue.fields.summary}\n`;
let detailText = '';
detailText += '**Details:**\n';
if (jiraTicket.issue.fields.customfield_10314) {
detailText += ` - **Person:** ${jiraTicket.issue.fields.customfield_10346}, ${jiraTicket.issue.fields.customfield_10314}`;
if (jiraTicket.issue.fields.customfield_10310) { detailText += ` (${jiraTicket.issue.fields.customfield_10310.value})`; }
detailText += '\n';
}
if (jiraTicket.issue.fields.customfield_10318) { detailText += ` - **Position:** ${jiraTicket.issue.fields.customfield_10318}\n`; }
let assignmentText = '';
assignmentText += `**Reporter:** ${jiraTicket.issue.fields.reporter.displayName}\n`;
const requestCard = {
type: 'AdaptiveCard',
$schema: 'http://adaptivecards.io/schemas/adaptive-card.json',
version: '1.2',
body: [
{ type: 'TextBlock', text: cardText.trim(), wrap: true },
{ type: 'TextBlock', wrap: true, text: detailText.trim(), separator: true },
{ type: 'TextBlock', text: assignmentText.trim(), wrap: true, separator: true },
],
actions: [
{
type: 'Action.OpenUrl',
title: 'Open Request',
url: `https://aeo.atlassian.net/servicedesk/customer/portal/135/${jiraTicket.issue.key}`,
},
{
type: 'Action.Submit',
title: 'Remove Card',
style: 'destructive',
data: { cardType: 'requestApproval', action: 'removeCard' },
},
],
};
let requestText = cardText;
requestText += `---\n${detailText}`;
requestText += `---\n${assignmentText}`;
resolve({ card: requestCard, message: requestText });
});
}