From 926d3d5103fdebf7cc2817a5dbc52b809ac5e556 Mon Sep 17 00:00:00 2001 From: Karl Hudgell Date: Mon, 14 Apr 2025 20:17:42 +0100 Subject: [PATCH] pre-commit fixes --- src/widgets/portainer/component.jsx | 4 +- src/widgets/portainer/proxy.js | 176 ++++++++++++++-------------- src/widgets/portainer/widget.js | 6 +- 3 files changed, 91 insertions(+), 95 deletions(-) diff --git a/src/widgets/portainer/component.jsx b/src/widgets/portainer/component.jsx index 01274719..53e2baba 100644 --- a/src/widgets/portainer/component.jsx +++ b/src/widgets/portainer/component.jsx @@ -28,7 +28,7 @@ export default function Component({ service }) { // containersData can be itself an error object e.g. if environment fails return ; } - + return ( @@ -36,4 +36,4 @@ export default function Component({ service }) { ); -} \ No newline at end of file +} diff --git a/src/widgets/portainer/proxy.js b/src/widgets/portainer/proxy.js index c4db529a..b1d368b8 100644 --- a/src/widgets/portainer/proxy.js +++ b/src/widgets/portainer/proxy.js @@ -1,8 +1,8 @@ /* eslint-disable no-underscore-dangle */ -import { formatApiCall } from "utils/proxy/api-helpers"; -import { httpProxy } from "utils/proxy/http"; import getServiceWidget from "utils/config/service-helpers"; import createLogger from "utils/logger"; +import { formatApiCall } from "utils/proxy/api-helpers"; +import { httpProxy } from "utils/proxy/http"; import widgets from "widgets/widgets"; const proxyName = "portainerProxyHandler"; @@ -10,110 +10,106 @@ const proxyName = "portainerProxyHandler"; const logger = createLogger(proxyName); async function getWidget(req) { - const { group, service } = req.query; - if (!group || !service) { - logger.debug("Invalid or missing service '%s' or group '%s'", service, group); - return null; - } - const widget = await getServiceWidget(group, service); - if (!widget) { - logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group); - return null; - } - return widget; + const { group, service } = req.query; + if (!group || !service) { + logger.debug("Invalid or missing service '%s' or group '%s'", service, group); + return null; + } + const widget = await getServiceWidget(group, service); + if (!widget) { + logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group); + return null; + } + return widget; } - async function getAllEnvIds(widget) { - const api = widgets?.[widget.type]?.api; - if (!api) { - return [403, null]; - } - const endpoint = 'endpoints' + const api = widgets?.[widget.type]?.api; + if (!api) { + return [403, null]; + } + const endpoint = "endpoints"; + let url = new URL(formatApiCall(api, { endpoint, ...widget })); + let [status, contentType, data] = await httpProxy(url, { + method: "GET", + headers: { + "Content-Type": "application/json", + "x-api-key": widget.key, + }, + }); + + if (status !== 200) { + logger.error("HTTP %d communicating with NextPVR. Data: %s", status, data.toString()); + return [status, data]; + } + let dataAsJson; + try { + const dataDecoded = data.toString(); + dataAsJson = JSON.parse(dataDecoded); + } catch (e) { + logger.error("Error decoding NextPVR API data. Data: %s", data.toString()); + return [status, null]; + } + const ids = await dataAsJson.map((item) => item.Id); + + return ids; +} + +async function getAllContainers(ids, widget) { + let items = []; + const api = widgets?.[widget.type]?.api; + if (!api) { + return [403, null]; + } + for (let i = 0; i < ids.length; i++) { + const endpoint = "endpoints/" + ids[i] + "/docker/containers/json?all=1"; let url = new URL(formatApiCall(api, { endpoint, ...widget })); let [status, contentType, data] = await httpProxy(url, { - method: "GET", - headers: { - "Content-Type": "application/json", - 'x-api-key': widget.key, - } + method: "GET", + headers: { + "Content-Type": "application/json", + "x-api-key": widget.key, + }, }); if (status !== 200) { - logger.error("HTTP %d communicating with NextPVR. Data: %s", status, data.toString()); - return [status, data]; + logger.error("HTTP %d communicating with NextPVR. Data: %s", status, data.toString()); + return [status, data]; } let dataAsJson; try { - const dataDecoded = data.toString(); - dataAsJson = JSON.parse(dataDecoded); + const dataDecoded = data.toString(); + dataAsJson = JSON.parse(dataDecoded); + items.push(dataAsJson); } catch (e) { - logger.error("Error decoding NextPVR API data. Data: %s", data.toString()); - return [status, null]; + logger.error("Error decoding NextPVR API data. Data: %s", data.toString()); + return [status, null]; } - const ids = await dataAsJson.map(item => item.Id); - - return ids; -} - - -async function getAllContainers(ids, widget) { - let items = [] - const api = widgets?.[widget.type]?.api; - if (!api) { - return [403, null]; - } - for (let i = 0; i < ids.length; i++) { - const endpoint = "endpoints/" + ids[i] + "/docker/containers/json?all=1" - let url = new URL(formatApiCall(api, { endpoint, ...widget })); - let [status, contentType, data] = await httpProxy(url, { - method: "GET", - headers: { - "Content-Type": "application/json", - 'x-api-key': widget.key, - } - }); - - if (status !== 200) { - logger.error("HTTP %d communicating with NextPVR. Data: %s", status, data.toString()); - return [status, data]; - } - let dataAsJson; - try { - const dataDecoded = data.toString(); - dataAsJson = JSON.parse(dataDecoded); - items.push(dataAsJson) - } catch (e) { - logger.error("Error decoding NextPVR API data. Data: %s", data.toString()); - return [status, null]; - } - } - return items.flat(); + } + return items.flat(); } export default async function portainerProxyHandler(req, res) { - try { - const widget = await getWidget(req); - let ids + try { + const widget = await getWidget(req); + let ids; - if (('env' in widget)) { - ids = [widget.env]; - } else { - ids = await getAllEnvIds(widget); - } - const data = await getAllContainers(ids, widget); - - const containerList = Object.values(data); - - const running = containerList.filter((c) => c.State === "running").length; - const stopped = containerList.filter((c) => c.State === "exited").length; - const total = containerList.length; - - return res.status(200).send({ running, stopped, total }); - - } catch (error) { - console.error("portainerProxyHandler error:", error); - return res.status(500).send({ error: "Internal Server Error" }); + if ("env" in widget) { + ids = [widget.env]; + } else { + ids = await getAllEnvIds(widget); } -} + const data = await getAllContainers(ids, widget); + const containerList = Object.values(data); + + const running = containerList.filter((c) => c.State === "running").length; + const stopped = containerList.filter((c) => c.State === "exited").length; + const total = containerList.length; + + return res.status(200).send({ running, stopped, total }); + } catch (error) { + console.error("portainerProxyHandler error:", error); + return res.status(500).send({ error: "Internal Server Error" }); + } +} diff --git a/src/widgets/portainer/widget.js b/src/widgets/portainer/widget.js index 6b55c896..51015132 100644 --- a/src/widgets/portainer/widget.js +++ b/src/widgets/portainer/widget.js @@ -6,9 +6,9 @@ const widget = { mappings: { "docker/containers/json": { - endpoint: "endpoints/{env}/docker/containers/json" - } + endpoint: "endpoints/{env}/docker/containers/json", + }, }, }; -export default widget; \ No newline at end of file +export default widget;