Skip to content

Commit

Permalink
allow weather apis to use hidden api keys
Browse files Browse the repository at this point in the history
  • Loading branch information
benphelps committed Sep 5, 2022
1 parent 08afa0b commit 5a8defb
Show file tree
Hide file tree
Showing 6 changed files with 61 additions and 12 deletions.
4 changes: 1 addition & 3 deletions src/components/widgets/openweathermap/weather.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,7 @@ import { BiError } from "react-icons/bi";
import Icon from "./icon";

export default function OpenWeatherMap({ options }) {
const { data, error } = useSWR(
`/api/widgets/openweathermap?lat=${options.latitude}&lon=${options.longitude}&apiKey=${options.apiKey}&duration=${options.cache}&units=${options.units}`
);
const { data, error } = useSWR(`/api/widgets/openweathermap?${new URLSearchParams(options).toString()}`);

if (error || data?.cod == 401) {
return (
Expand Down
5 changes: 2 additions & 3 deletions src/components/widgets/weather/weather.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,8 @@ import { BiError } from "react-icons/bi";
import Icon from "./icon";

export default function WeatherApi({ options }) {
const { data, error } = useSWR(
`/api/widgets/weather?lat=${options.latitude}&lon=${options.longitude}&apiKey=${options.apiKey}&duration=${options.cache}`
);
console.log(options);
const { data, error } = useSWR(`/api/widgets/weather?${new URLSearchParams(options).toString()}`);

if (error) {
return (
Expand Down
25 changes: 22 additions & 3 deletions src/pages/api/widgets/openweathermap.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,28 @@
import cachedFetch from "utils/cached-fetch";
import { getSettings } from "utils/config";

export default async function handler(req, res) {
const { lat, lon, apiKey, duration, units } = req.query;
const { latitude, longitude, units, provider, cache } = req.query;
let { apiKey } = req.query;

const api_url = `https://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${lon}&appid=${apiKey}&units=${units}`;
if (!apiKey && !provider) {
return res.status(400).json({ error: "Missing API key or provider" });
}

res.send(await cachedFetch(api_url, duration));
if (!apiKey && provider !== "openweathermap") {
return res.status(400).json({ error: "Invalid provider for endpoint" });
}

if (!apiKey && provider) {
const settings = await getSettings();
apiKey = settings?.providers?.openweathermap;
}

if (!apiKey) {
return res.status(400).json({ error: "Missing API key" });
}

const api_url = `https://api.openweathermap.org/data/2.5/weather?lat=${latitude}&lon=${longitude}&appid=${apiKey}&units=${units}`;

res.send(await cachedFetch(api_url, cache));
}
25 changes: 22 additions & 3 deletions src/pages/api/widgets/weather.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,28 @@
import cachedFetch from "utils/cached-fetch";
import { getSettings } from "utils/config";

export default async function handler(req, res) {
const { lat, lon, apiKey, duration } = req.query;
const { latitude, longitude, provider, cache } = req.query;
let { apiKey } = req.query;

const api_url = `http://api.weatherapi.com/v1/current.json?q=${lat},${lon}&key=${apiKey}`;
if (!apiKey && !provider) {
return res.status(400).json({ error: "Missing API key or provider" });
}

res.send(await cachedFetch(api_url, duration));
if (!apiKey && provider !== "weatherapi") {
return res.status(400).json({ error: "Invalid provider for endpoint" });
}

if (!apiKey && provider) {
const settings = await getSettings();
apiKey = settings?.providers?.weatherapi;
}

if (!apiKey) {
return res.status(400).json({ error: "Missing API key" });
}

const api_url = `http://api.weatherapi.com/v1/current.json?q=${latitude},${longitude}&key=${apiKey}`;

res.send(await cachedFetch(api_url, cache));
}
3 changes: 3 additions & 0 deletions src/skeleton/settings.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
providers:
openweathermap: openweathermapapikey
weatherapi: weatherapiapikey
11 changes: 11 additions & 0 deletions src/utils/config.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
import { join } from "path";
import { existsSync, copyFile } from "fs";
import { promises as fs } from "fs";
import path from "path";
import yaml from "js-yaml";

export default function checkAndCopyConfig(config) {
const configYaml = join(process.cwd(), "config", config);
Expand All @@ -14,3 +17,11 @@ export default function checkAndCopyConfig(config) {
});
}
}

export async function getSettings() {
checkAndCopyConfig("settings.yaml");

const settingsYaml = path.join(process.cwd(), "config", "settings.yaml");
const fileContents = await fs.readFile(settingsYaml, "utf8");
return yaml.load(fileContents);
}

0 comments on commit 5a8defb

Please sign in to comment.