// src/commands/phoneStatus.js // // Chat + HTTP entry point for /phonestatus. The heavy rendering lives in // services/renderers/phoneStatusRenderer.js so the Jira poller can emit // the same markdown (see services/jiraPollerService.js). This handler // stays thin: parse args, call the collector, hand data to the renderer, // respond. import { collectPhoneStatus } from '../services/phoneService.js'; import { renderPhoneStatusMarkdown } from '../services/renderers/phoneStatusRenderer.js'; import { logger } from '../utils/logger.js'; export async function handlePhoneStatus(bot, trigger) { logger('phone:status', 'Handler entered', 'debug'); // Support both Webex (args) and HTTP (query) calls const query = trigger.query || {}; const args = trigger.args || []; let storeNum = args[0]?.trim() || query.storeNum || query.store || query.s; const isDetailed = (args[1]?.toLowerCase() === 'detailed') || (query.mode === 'detailed') || (query.detailed === 'true' || query.detailed === true); if (!storeNum || !/^\d{2,4}$/.test(storeNum)) { const errorMsg = 'Please provide a 2–4 digit store number.\n' + 'Example: `/phonestatus 782` (or `detailed` / `?detailed=true` for more; includes Meraki links) or `https://.../phonestatus?storeNum=782`'; await bot.say('markdown', errorMsg); return; } logger('phone:status', `Collecting phone status for store ${storeNum}`, 'debug'); try { const data = await collectPhoneStatus(storeNum); if (!data) throw new Error('collectPhoneStatus returned undefined'); // JSON alt-output path (kept in the handler because it bypasses // markdown rendering entirely — no shared renderer applies). if (query.format === 'json' || (args[1] && args[1].toLowerCase() === 'json')) { const jsonPayload = { store: storeNum, mainNumber: data.locationMainNumber, timezone: (data.telephonyProfile && data.telephonyProfile.timeZone) || null, person: data.person ? { displayName: data.person.displayName, phoneNumbers: data.person.phoneNumbers } : null, timestamp: new Date().toISOString(), }; await bot.say('markdown', '```json\n' + JSON.stringify(jsonPayload, null, 2) + '\n```'); return; } const reply = renderPhoneStatusMarkdown(data, { storeNum, detailed: isDetailed, footer: true, }); await bot.say('markdown', reply || 'No data available.'); } catch (err) { logger('phone:status', `Error collecting phone status for store ${storeNum}: ${err.message}`, 'error'); await bot.say('markdown', `Error collecting phone status: ${err.message}`); } }