diff --git a/docs/widgets/services/tandoor.md b/docs/widgets/services/tandoor.md new file mode 100644 index 000000000..134bc8fd7 --- /dev/null +++ b/docs/widgets/services/tandoor.md @@ -0,0 +1,15 @@ +--- +title: Tandoor +description: Tandoor Widget Configuration +--- + +Generate a user API key under `Settings > API > Generate`. For the token's scope, use `read`. + +Allowed fields: `["users", "recipes", "keywords"]`. + +```yaml +widget: + type: tandoor + url: http://tandoor-frontend.host.or.ip + key: tandoor-api-token +``` diff --git a/public/locales/en/common.json b/public/locales/en/common.json index b040e1fd3..00279dec6 100644 --- a/public/locales/en/common.json +++ b/public/locales/en/common.json @@ -858,5 +858,10 @@ "movies": "Movies", "tags": "Tags", "oCount": "O Count" + }, + "tandoor": { + "users": "Users", + "recipes": "Recipes", + "keywords": "Keywords" } } diff --git a/src/utils/proxy/handlers/credentialed.js b/src/utils/proxy/handlers/credentialed.js index 02338b828..de2111b12 100644 --- a/src/utils/proxy/handlers/credentialed.js +++ b/src/utils/proxy/handlers/credentialed.js @@ -29,7 +29,9 @@ export default async function credentialedProxyHandler(req, res, map) { } else if (widget.type === "gotify") { headers["X-gotify-Key"] = `${widget.key}`; } else if ( - ["authentik", "cloudflared", "ghostfolio", "mealie", "tailscale", "pterodactyl"].includes(widget.type) + ["authentik", "cloudflared", "ghostfolio", "mealie", "tailscale", "tandoor", "pterodactyl"].includes( + widget.type, + ) ) { headers.Authorization = `Bearer ${widget.key}`; } else if (widget.type === "truenas") { diff --git a/src/widgets/components.js b/src/widgets/components.js index 8b9c277d1..06502982c 100644 --- a/src/widgets/components.js +++ b/src/widgets/components.js @@ -101,6 +101,7 @@ const components = { stash: dynamic(() => import("./stash/component")), strelaysrv: dynamic(() => import("./strelaysrv/component")), tailscale: dynamic(() => import("./tailscale/component")), + tandoor: dynamic(() => import("./tandoor/component")), tautulli: dynamic(() => import("./tautulli/component")), tdarr: dynamic(() => import("./tdarr/component")), traefik: dynamic(() => import("./traefik/component")), diff --git a/src/widgets/tandoor/component.jsx b/src/widgets/tandoor/component.jsx new file mode 100644 index 000000000..40d2b88e1 --- /dev/null +++ b/src/widgets/tandoor/component.jsx @@ -0,0 +1,32 @@ +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 { widget } = service; + + const { data: spaceData, error: spaceError } = useWidgetAPI(widget, "space"); + const { data: keywordData, error: keywordError } = useWidgetAPI(widget, "keyword"); + + if (spaceError || keywordError) { + const finalError = spaceError ?? keywordError; + return ; + } + + if (!spaceData || !keywordData) { + return ( + + + + + + ); + } + return ( + + + + + + ); +} diff --git a/src/widgets/tandoor/widget.js b/src/widgets/tandoor/widget.js new file mode 100644 index 000000000..90eaa6d33 --- /dev/null +++ b/src/widgets/tandoor/widget.js @@ -0,0 +1,17 @@ +import credentialedProxyHandler from "utils/proxy/handlers/credentialed"; + +const widget = { + api: "{url}/api/{endpoint}/", + proxyHandler: credentialedProxyHandler, + + mappings: { + space: { + endpoint: "space", + }, + keyword: { + endpoint: "keyword", + }, + }, +}; + +export default widget; diff --git a/src/widgets/widgets.js b/src/widgets/widgets.js index 11cc8af93..477f4ca9c 100644 --- a/src/widgets/widgets.js +++ b/src/widgets/widgets.js @@ -93,6 +93,7 @@ import speedtest from "./speedtest/widget"; import stash from "./stash/widget"; import strelaysrv from "./strelaysrv/widget"; import tailscale from "./tailscale/widget"; +import tandoor from "./tandoor/widget"; import tautulli from "./tautulli/widget"; import tdarr from "./tdarr/widget"; import traefik from "./traefik/widget"; @@ -207,6 +208,7 @@ const widgets = { stash, strelaysrv, tailscale, + tandoor, tautulli, tdarr, traefik,