collabSupport/commands/jiraTicket.js
Joseph McQueen 1117be40cc Format chat footers in DISPLAY_TIMEZONE instead of UTC.
Docker hosts default to UTC, so bare toLocaleTimeString() showed
wrong "Last checked" times in avstatus and other commands. Add
formatDisplayTime() (default America/New_York, overridable via
DISPLAY_TIMEZONE) and use it across renderers and command footers.
2026-07-21 14:41:26 -04:00

60 lines
No EOL
2.3 KiB
JavaScript

// src/commands/jiraTicket.js
import jira from '../integrations/jira/JiraClient.js';
import { summarizeJiraTicket } from '../services/jiraSummarizer.js';
import { logger } from '../utils/logger.js';
import { getStatusEmoji, calculateDaysOpen } from '../services/jiraService.js';
import { formatDisplayTime } from '../utils/time.js';
export async function handleJiraTicket(bot, trigger) {
logger('jira:ticket', 'Handler entered', 'debug');
// Support both Webex (args) and HTTP (query) calls
const query = trigger.query || {};
const args = trigger.args || [];
// Get ticket key from args or query param
const key = (args[0] || query.key || query.ticket || query.id || '')
.trim()
.toUpperCase();
if (!key || !/^[A-Z]+-\d+$/.test(key)) {
const usage = '**Jira Ticket Usage:**\n' +
'`/jiraTicket SS-3029` → Fetch ticket with AI summary\n\n' +
'Also works via HTTP: `?key=SS-3029`';
await bot.say('markdown', usage);
return;
}
logger('jira:ticket', `Fetching ticket ${key}`, 'debug');
try {
const ticket = await jira.getTicket(key);
const aiSummary = await summarizeJiraTicket(ticket).catch(() =>
"**Reported Problem:** No details available.\n**Steps Taken:** No information recorded.\n**Final Resolution:** No resolution documented."
);
const fields = ticket.fields || {};
const statusEmoji = getStatusEmoji(fields.status?.name);
const component = fields.components?.[0]?.name || '—';
const assignee = fields.assignee?.displayName || '**Unassigned**';
const days = calculateDaysOpen(fields.created, fields.resolved || fields.updated);
let reply = `**${key}** - ${fields.summary || '—'}\n\n`;
reply += `${aiSummary}\n\n`;
reply += `${statusEmoji} **Status:** ${fields.status?.name || '—'} • Component: ${component}\n`;
reply += `Assigned: ${assignee} • Open for: ${days} days\n\n`;
reply += `\n*Last checked: ${formatDisplayTime()}*`;
await bot.say('markdown', reply.trim());
logger('jira:ticket', `Successfully returned ticket ${key}`, 'debug');
} catch (err) {
logger('jira:ticket', `Error fetching ticket ${key}: ${err.message}`, 'error');
await bot.say('markdown', `❌ Error retrieving ticket **${key}**: ${err.message}`);
}
}
// (helpers imported from jiraService for DRY / consistency)