// src/services/phoneDeviceBuilder.js // // Thin wrapper for phone data rich/build shape for the phone store dashboard. // Delegates to collectPhoneStatus (which already does Webex phones/DECT + Meraki attach + relevant ports). // Adds optional Meraki topology for viz mirroring the AV dashboard. // Keeps backward compat for the /phonestatus command (which uses collect directly). import { collectPhoneStatus } from './phoneService.js'; import { getMerakiTopology } from '../integrations/meraki/devices.js'; import { logger } from '../utils/logger.js'; export async function buildPhoneDevices(storeNumber) { logger('phone:builder', `Building phone devices for store ${storeNumber} (rich shape for dashboard)`, 'debug'); try { const data = await collectPhoneStatus(storeNumber); // Fetch topology (linkLayer) for rich dashboard viz, similar to AV. // Use networkId from the meraki enrichment if present. let merakiTopology = null; const networkId = data.meraki?.networkId || (data.meraki?.network && data.meraki.network.id); if (networkId) { try { merakiTopology = await getMerakiTopology(networkId); logger('phone:builder', `Fetched Meraki topology for network ${networkId}: ${merakiTopology?.nodes?.length || 0} nodes`, 'debug'); } catch (topoErr) { logger('phone:builder', `Failed to fetch Meraki topology: ${topoErr.message}`, 'warn'); merakiTopology = { nodes: [], links: [], errors: [topoErr.message] }; } } const result = { success: true, storeNumber: String(storeNumber), ...data, merakiTopology, deviceCount: (data.phones?.data?.length || 0) + (data.dectBasestations?.length || 0), lastUpdated: new Date().toISOString() }; logger('phone:builder', `Phone build complete for store ${storeNumber} (${result.deviceCount} devices)`); return result; } catch (err) { logger('phone:builder', `Phone build failed for store ${storeNumber}: ${err.message}`, 'error'); throw err; } } export default buildPhoneDevices;