UNPKG

balena-sdk

Version:
82 lines (81 loc) 3.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.generateCurrentServiceDetails = exports.getCurrentServiceDetailsPineExpand = void 0; // Pine expand options necessary for getting raw service data for a device exports.getCurrentServiceDetailsPineExpand = { image_install: { $select: ['id', 'download_progress', 'status', 'install_date'], $filter: { status: { $ne: 'deleted', }, }, $expand: { installs__image: { $select: ['id'], $expand: { is_a_build_of__service: { $select: ['id', 'service_name'], }, }, }, is_provided_by__release: { $select: ['id', 'commit', 'raw_version'], }, }, }, }; function getSingleInstallSummary(rawData) { const image = rawData.installs__image[0]; const service = image.is_a_build_of__service[0]; const release = rawData.is_provided_by__release[0]; const releaseInfo = { commit: release === null || release === void 0 ? void 0 : release.commit, raw_version: release === null || release === void 0 ? void 0 : release.raw_version, release_id: release === null || release === void 0 ? void 0 : release.id, }; const result = Object.assign(Object.assign(Object.assign({}, rawData), { service_id: service.id, // add this extra property to make grouping the services easier service_name: service.service_name, image_id: image.id }), releaseInfo); if ('installs__image' in result) { delete result.installs__image; } if ('is_provided_by__release' in result) { delete result.is_provided_by__release; } return result; } const generateCurrentServiceDetails = (rawDevice) => { const installs = rawDevice.image_install.map(getSingleInstallSummary); // Essentially a groupBy(installs, 'service_name') // but try making it a bit faster for the sake of large fleets. // Uses Object.create(null) so that there are no inherited properties // which could match service names const currentServicesGroupedByName = Object.create(null); for (const containerWithServiceName of installs) { const { service_name } = containerWithServiceName; let serviceContainerGroup; if (currentServicesGroupedByName[service_name] == null) { serviceContainerGroup = []; currentServicesGroupedByName[service_name] = serviceContainerGroup; } else { serviceContainerGroup = currentServicesGroupedByName[service_name]; } const container = containerWithServiceName; // remove the extra property that we added for the grouping delete container.service_name; serviceContainerGroup.push(container); } for (const serviceName in currentServicesGroupedByName) { if (currentServicesGroupedByName[serviceName]) { currentServicesGroupedByName[serviceName].sort((a, b) => { return b.install_date.localeCompare(a.install_date); }); } } const device = rawDevice; device.current_services = currentServicesGroupedByName; return device; }; exports.generateCurrentServiceDetails = generateCurrentServiceDetails;