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>
50 lines
No EOL
2 KiB
JavaScript
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; |