From beca91b71e45f6280ef3a1dc04d4d0c959d9fcaa Mon Sep 17 00:00:00 2001 From: Ryan Gates <67442967+gatesry@users.noreply.github.com> Date: Mon, 30 Dec 2024 18:44:25 -0500 Subject: [PATCH] Add Hoarder service widget Add a new service widget for Hoarder to the homepage. --- src/pages/api/widgets/hoarder.js | 3 ++ src/widgets/hoarder/component.jsx | 35 +++++++++++++++++++ src/widgets/hoarder/proxy.js | 56 +++++++++++++++++++++++++++++++ src/widgets/hoarder/widget.js | 17 ++++++++++ src/widgets/widgets.js | 2 ++ 5 files changed, 113 insertions(+) create mode 100644 src/pages/api/widgets/hoarder.js create mode 100644 src/widgets/hoarder/component.jsx create mode 100644 src/widgets/hoarder/proxy.js create mode 100644 src/widgets/hoarder/widget.js diff --git a/src/pages/api/widgets/hoarder.js b/src/pages/api/widgets/hoarder.js new file mode 100644 index 00000000..816bec1d --- /dev/null +++ b/src/pages/api/widgets/hoarder.js @@ -0,0 +1,3 @@ +import hoarderProxyHandler from "src/widgets/hoarder/proxy"; + +export default hoarderProxyHandler; diff --git a/src/widgets/hoarder/component.jsx b/src/widgets/hoarder/component.jsx new file mode 100644 index 00000000..7c28981f --- /dev/null +++ b/src/widgets/hoarder/component.jsx @@ -0,0 +1,35 @@ +import { useTranslation } from "next-i18next"; + +import Container from "components/services/widget/container"; +import Block from "components/services/widget/block"; +import useWidgetAPI from "utils/proxy/use-widget-api"; + +export default function Component({ service }) { + const { t } = useTranslation(); + + const { widget } = service; + + const { data: bookmarksData, error: bookmarksError } = useWidgetAPI(widget, "bookmarks"); + const { data: notesData, error: notesError } = useWidgetAPI(widget, "notes"); + + if (bookmarksError || notesError) { + const finalError = bookmarksError ?? notesError; + return ; + } + + if (!bookmarksData || !notesData) { + return ( + + + + + ); + } + + return ( + + + + + ); +} diff --git a/src/widgets/hoarder/proxy.js b/src/widgets/hoarder/proxy.js new file mode 100644 index 00000000..92cc22d6 --- /dev/null +++ b/src/widgets/hoarder/proxy.js @@ -0,0 +1,56 @@ +import { httpProxy } from "utils/proxy/http"; +import { formatApiCall } from "utils/proxy/api-helpers"; +import getServiceWidget from "utils/config/service-helpers"; +import createLogger from "utils/logger"; +import widgets from "widgets/widgets"; + +const proxyName = "hoarderProxyHandler"; +const logger = createLogger(proxyName); + +async function retrieveFromAPI(url, key) { + const headers = { + "content-type": "application/json", + Authorization: `Bearer ${key}`, + }; + + const [status, , data] = await httpProxy(url, { headers }); + + if (status !== 200) { + throw new Error(`Error getting data from Hoarder: ${status}. Data: ${data.toString()}`); + } + + return JSON.parse(Buffer.from(data).toString()); +} + +export default async function hoarderProxyHandler(req, res) { + const { group, service, endpoint, index } = req.query; + + if (!group || !service) { + logger.debug("Invalid or missing service '%s' or group '%s'", service, group); + return res.status(400).json({ error: "Invalid proxy service type" }); + } + + const widget = await getServiceWidget(group, service, index); + + if (!widget) { + logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group); + return res.status(400).json({ error: "Invalid proxy service type" }); + } + + if (!widget.key) { + logger.debug("Invalid or missing key for service '%s' in group '%s'", service, group); + return res.status(400).json({ error: "Missing widget key" }); + } + + const apiURL = widgets[widget.type].api; + + try { + const url = new URL(formatApiCall(apiURL, { endpoint, ...widget })); + const data = await retrieveFromAPI(url, widget.key); + + return res.status(200).send(data); + } catch (e) { + if (e) logger.error(e); + return res.status(500).send({ error: { message: e.message } }); + } +} diff --git a/src/widgets/hoarder/widget.js b/src/widgets/hoarder/widget.js new file mode 100644 index 00000000..e5427210 --- /dev/null +++ b/src/widgets/hoarder/widget.js @@ -0,0 +1,17 @@ +import hoarderProxyHandler from "./proxy"; + +const widget = { + api: "{url}/api/{endpoint}", + proxyHandler: hoarderProxyHandler, + + mappings: { + bookmarks: { + endpoint: "bookmarks", + }, + notes: { + endpoint: "notes", + }, + }, +}; + +export default widget; diff --git a/src/widgets/widgets.js b/src/widgets/widgets.js index 9d4bb935..cbfaa218 100644 --- a/src/widgets/widgets.js +++ b/src/widgets/widgets.js @@ -130,6 +130,7 @@ import xteve from "./xteve/widget"; import urbackup from "./urbackup/widget"; import romm from "./romm/widget"; import zabbix from "./zabbix/widget"; +import hoarder from "./hoarder/widget"; const widgets = { adguard, @@ -267,6 +268,7 @@ const widgets = { whatsupdocker, xteve, zabbix, + hoarder, }; export default widgets;