rhombus-node-mcp
Version:
MCP server for Rhombus API
66 lines (65 loc) • 3.06 kB
JavaScript
import { postApi } from "../network/network.js";
import { getAccessControlledDoors, getAudioGateways, getBadgeReaders, getButtons, getCameraList, getDoorbellCameras, getDoorSensors, getEnvironmentalGateways, getEnvironmentalSensors, getKeypads, getMotionSensors, } from "./get-entity-tool-api.js";
async function getDeviceFeatures(deviceUuid, requestModifiers, sessionId) {
const response = await postApi({
route: "/feature/getDeviceFeatures",
body: { deviceUuid },
modifiers: requestModifiers,
sessionId,
});
if (response.error || !response.features) {
return null;
}
return {
assignedLicense: response.features.assignedLicense,
featureMap: response.features.featureMap,
};
}
export async function getAllEntities(deviceUuids, timeZone, tempUnit, requestModifiers, sessionId) {
const promises = [
getCameraList(requestModifiers, sessionId),
getDoorbellCameras(requestModifiers, sessionId),
getBadgeReaders(requestModifiers, sessionId),
getAccessControlledDoors(requestModifiers, sessionId),
getAudioGateways(timeZone, requestModifiers, sessionId),
getDoorSensors(requestModifiers, sessionId),
getEnvironmentalSensors(timeZone, tempUnit, requestModifiers, sessionId),
getMotionSensors(requestModifiers, sessionId),
getButtons(timeZone, requestModifiers, sessionId),
getKeypads(requestModifiers, sessionId),
getEnvironmentalGateways(timeZone, requestModifiers, sessionId),
];
const responses = await Promise.all(promises);
// Filter each response to only include devices with matching UUIDs and fetch device features
for (let i = 0; i < responses.length; i++) {
const response = responses[i];
// Look through keys and find any with an array
for (const key of Object.keys(response)) {
const value = response[key];
if (Array.isArray(value)) {
// Filter to only include devices with matching UUIDs
const filteredDevices = value.filter((item) => {
return deviceUuids.includes(item.uuid);
});
// Fetch device features for each filtered device
const devicesWithFeatures = await Promise.all(filteredDevices.map(async (device) => {
const features = await getDeviceFeatures(device.uuid, requestModifiers, sessionId);
return {
...device,
...(features && {
assignedLicense: features.assignedLicense,
featureMap: features.featureMap,
}),
};
}));
response[key] = devicesWithFeatures;
response[`${key}Count`] = devicesWithFeatures.length;
}
}
}
const result = {};
for (const response of responses) {
Object.assign(result, response);
}
return result;
}