Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions workers/lib/constants.js
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down
51 changes: 51 additions & 0 deletions workers/lib/server/handlers/pdu.layout.handlers.js
Original file line number Diff line number Diff line change
@@ -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
}
4 changes: 3 additions & 1 deletion workers/lib/server/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -58,7 +59,8 @@ function routes (ctx) {
...energyRoutes(ctx),
...workOrdersRoutes(ctx),
...sparePartsRoutes(ctx),
...workOrderFilesRoutes(ctx)
...workOrderFilesRoutes(ctx),
...pduLayoutRoutes(ctx)
]
}

Expand Down
37 changes: 37 additions & 0 deletions workers/lib/server/routes/pdu.layout.routes.js
Original file line number Diff line number Diff line change
@@ -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
)
}
]
Loading