collabSupport/services/phoneDeviceBuilder.js
jmcqueen 7dc326c404 Split voice commands into status vs diag and redesign MPP phone output.
Replace /phonestatus follow-ups with /voicestatus, /wanstatus, /phonediag, and /dectdiag; extend /voicediag with relay probes and section-based MPP diagnostics.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-29 13:55:41 -04:00

50 lines
No EOL
2 KiB
JavaScript

// 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 /voicestatus 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;