diff --git a/workers/lib/constants.js b/workers/lib/constants.js index bb16add..a69f2b1 100644 --- a/workers/lib/constants.js +++ b/workers/lib/constants.js @@ -132,6 +132,7 @@ const ENDPOINTS = { SETTINGS: '/auth/settings', WORKER_CONFIG: '/auth/worker-config', THING_CONFIG: '/auth/thing-config', + PDU_LAYOUT: '/auth/pdu-layout', // WebSocket endpoint WEBSOCKET: '/ws', diff --git a/workers/lib/server/handlers/pdu.layout.handlers.js b/workers/lib/server/handlers/pdu.layout.handlers.js new file mode 100644 index 0000000..9cf32ab --- /dev/null +++ b/workers/lib/server/handlers/pdu.layout.handlers.js @@ -0,0 +1,51 @@ +'use strict' + +// Group sites store their layout in the Siemens DCS worker config. +const GROUP_SITE_WORKER_TYPE = 'dcs-siemens' +const GROUP_SITE_LAYOUT_KEY = 'group' +const GROUP_SITE_TYPE = 'group' + +// requestDataMap returns array-per-ork of array-per-rack; find the config carrying the layout. +function findConfigWithLayout (res) { + const flat = [] + const walk = (v) => { + if (Array.isArray(v)) { + v.forEach(walk) + } else if (v && typeof v === 'object') { + flat.push(v) + } + } + walk(res) + return flat.find((c) => c && c.pduGridLayout) +} + +// Returns a device/container type's static PDU grid layout from worker config. +async function getPduLayout (ctx, req) { + const { type } = req.query + const isGroupSite = type === GROUP_SITE_TYPE + + const workerType = isGroupSite ? GROUP_SITE_WORKER_TYPE : type + const layoutKey = isGroupSite ? GROUP_SITE_LAYOUT_KEY : type + + const res = await ctx.dataProxy.requestDataMap('getWrkConf', { type: workerType }) + const config = findConfigWithLayout(res) + const layout = config && config.pduGridLayout && config.pduGridLayout[layoutKey] + + if (!layout) { + throw new Error('ERR_PDU_LAYOUT_NOT_FOUND') + } + + if (isGroupSite) { + const id = req.query.container ? req.query.container.split('-')[1] : '1' + return { + type, + layout: layout.map((item) => ({ ...item, pdu: item.pdu.replace('X', id) })) + } + } + + return { type, layout } +} + +module.exports = { + getPduLayout +} diff --git a/workers/lib/server/index.js b/workers/lib/server/index.js index 13de83e..4ef2110 100644 --- a/workers/lib/server/index.js +++ b/workers/lib/server/index.js @@ -26,6 +26,7 @@ const energyRoutes = require('./routes/energy.routes') const workOrdersRoutes = require('./routes/work.orders.routes') const sparePartsRoutes = require('./routes/spare.parts.routes') const workOrderFilesRoutes = require('./routes/work.order.files.routes') +const pduLayoutRoutes = require('./routes/pdu.layout.routes') /** * Collect all routes into a flat array for server injection. @@ -58,7 +59,8 @@ function routes (ctx) { ...energyRoutes(ctx), ...workOrdersRoutes(ctx), ...sparePartsRoutes(ctx), - ...workOrderFilesRoutes(ctx) + ...workOrderFilesRoutes(ctx), + ...pduLayoutRoutes(ctx) ] } diff --git a/workers/lib/server/routes/pdu.layout.routes.js b/workers/lib/server/routes/pdu.layout.routes.js new file mode 100644 index 0000000..42819b7 --- /dev/null +++ b/workers/lib/server/routes/pdu.layout.routes.js @@ -0,0 +1,37 @@ +'use strict' + +const { ENDPOINTS, HTTP_METHODS } = require('../../constants') +const { getPduLayout } = require('../handlers/pdu.layout.handlers') +const { createCachedAuthRoute } = require('../lib/routeHelpers') + +module.exports = (ctx) => [ + { + method: HTTP_METHODS.GET, + url: ENDPOINTS.PDU_LAYOUT, + schema: { + querystring: { + type: 'object', + properties: { + type: { + type: 'string', + description: "Device/container type, e.g. 'container-bd-d40-m30', 'container-as-hk3', or 'group'" + }, + container: { + type: 'string', + description: "Group-site container id (used to substitute the layout's 'X' placeholder)" + }, + overwriteCache: { + type: 'boolean' + } + }, + required: ['type'] + } + }, + ...createCachedAuthRoute( + ctx, + (req) => ['pdu-layout', req.query.type, req.query.container], + ENDPOINTS.PDU_LAYOUT, + getPduLayout + ) + } +]