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.
60 lines
No EOL
2.3 KiB
JavaScript
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)
|