pre-commit fixes

This commit is contained in:
Karl Hudgell 2025-04-14 20:17:42 +01:00
parent 6e10127683
commit 926d3d5103
3 changed files with 91 additions and 95 deletions

View File

@ -28,7 +28,7 @@ export default function Component({ service }) {
// containersData can be itself an error object e.g. if environment fails // containersData can be itself an error object e.g. if environment fails
return <Container service={service} error={containersData?.error ?? containersData} />; return <Container service={service} error={containersData?.error ?? containersData} />;
} }
return ( return (
<Container service={service}> <Container service={service}>
<Block label="portainer.running" value={containersData.running} /> <Block label="portainer.running" value={containersData.running} />
@ -36,4 +36,4 @@ export default function Component({ service }) {
<Block label="portainer.total" value={containersData.total} /> <Block label="portainer.total" value={containersData.total} />
</Container> </Container>
); );
} }

View File

@ -1,8 +1,8 @@
/* eslint-disable no-underscore-dangle */ /* 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 getServiceWidget from "utils/config/service-helpers";
import createLogger from "utils/logger"; import createLogger from "utils/logger";
import { formatApiCall } from "utils/proxy/api-helpers";
import { httpProxy } from "utils/proxy/http";
import widgets from "widgets/widgets"; import widgets from "widgets/widgets";
const proxyName = "portainerProxyHandler"; const proxyName = "portainerProxyHandler";
@ -10,110 +10,106 @@ const proxyName = "portainerProxyHandler";
const logger = createLogger(proxyName); const logger = createLogger(proxyName);
async function getWidget(req) { async function getWidget(req) {
const { group, service } = req.query; const { group, service } = req.query;
if (!group || !service) { if (!group || !service) {
logger.debug("Invalid or missing service '%s' or group '%s'", service, group); logger.debug("Invalid or missing service '%s' or group '%s'", service, group);
return null; return null;
} }
const widget = await getServiceWidget(group, service); const widget = await getServiceWidget(group, service);
if (!widget) { if (!widget) {
logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group); logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group);
return null; return null;
} }
return widget; return widget;
} }
async function getAllEnvIds(widget) { async function getAllEnvIds(widget) {
const api = widgets?.[widget.type]?.api; const api = widgets?.[widget.type]?.api;
if (!api) { if (!api) {
return [403, null]; return [403, null];
} }
const endpoint = 'endpoints' 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 url = new URL(formatApiCall(api, { endpoint, ...widget }));
let [status, contentType, data] = await httpProxy(url, { let [status, contentType, data] = await httpProxy(url, {
method: "GET", method: "GET",
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",
'x-api-key': widget.key, "x-api-key": widget.key,
} },
}); });
if (status !== 200) { if (status !== 200) {
logger.error("HTTP %d communicating with NextPVR. Data: %s", status, data.toString()); logger.error("HTTP %d communicating with NextPVR. Data: %s", status, data.toString());
return [status, data]; return [status, data];
} }
let dataAsJson; let dataAsJson;
try { try {
const dataDecoded = data.toString(); const dataDecoded = data.toString();
dataAsJson = JSON.parse(dataDecoded); dataAsJson = JSON.parse(dataDecoded);
items.push(dataAsJson);
} catch (e) { } catch (e) {
logger.error("Error decoding NextPVR API data. Data: %s", data.toString()); logger.error("Error decoding NextPVR API data. Data: %s", data.toString());
return [status, null]; return [status, null];
} }
const ids = await dataAsJson.map(item => item.Id); }
return items.flat();
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();
} }
export default async function portainerProxyHandler(req, res) { export default async function portainerProxyHandler(req, res) {
try { try {
const widget = await getWidget(req); const widget = await getWidget(req);
let ids let ids;
if (('env' in widget)) { if ("env" in widget) {
ids = [widget.env]; ids = [widget.env];
} else { } else {
ids = await getAllEnvIds(widget); 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" });
} }
} 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" });
}
}

View File

@ -6,9 +6,9 @@ const widget = {
mappings: { mappings: {
"docker/containers/json": { "docker/containers/json": {
endpoint: "endpoints/{env}/docker/containers/json" endpoint: "endpoints/{env}/docker/containers/json",
} },
}, },
}; };
export default widget; export default widget;