// 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'; 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: ${new Date().toLocaleTimeString()}*`; 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)