Add /api/allWakaValues

Just a little experiment to see this working in prod! I don't have permission to actually use this data yet, or a UI for it, just mostly want to see it hooked up to the Sheets API correctly and check the prod cache behavior.
This commit is contained in:
Emi Matchu 2021-04-01 21:57:57 -07:00
parent 5cd6fac052
commit 3bd5be03c7

58
api/allWakaValues.js Normal file
View file

@ -0,0 +1,58 @@
const beeline = require("honeycomb-beeline")({
writeKey: process.env["HONEYCOMB_WRITE_KEY"],
dataset:
process.env["NODE_ENV"] === "production"
? "Dress to Impress (2020)"
: "Dress to Impress (2020, dev)",
serviceName: "impress-2020-gql-server",
});
import fetch from "node-fetch";
async function handle(req, res) {
let itemValues;
try {
itemValues = await loadWakaValues();
} catch (e) {
console.error(e);
res.setHeader("Content-Type", "text/plain");
res.status(500).send("Error loading Waka data from Google Sheets API");
return;
}
// Cache for 1 minute, and immediately serve stale data for a day after.
// This should keep it fast and responsive, and stay well within our API key
// limits. (This will cause the client to send more requests than necessary,
// but the CDN cache should generally respond quickly with a small 304 Not
// Modified, unless the data really did change.)
res.setHeader(
"Cache-Control",
"public, max-age=3600, stale-while-revalidate=86400"
);
return res.send(itemValues);
}
async function loadWakaValues() {
const wakaJson = await fetch(
`https://sheets.googleapis.com/v4/spreadsheets/` +
`1DRMrniTSZP0sgZK6OAFFYqpmbT6xY_Ve_i480zghOX0/values/NC%20Values` +
`?fields=values&key=${encodeURIComponent(process.env["GOOGLE_API_KEY"])}`
).then((res) => res.json());
// Get the rows from the JSON response - skipping the first-row headers.
const rows = wakaJson.values.slice(1);
// Reformat the rows as a map from item name to value. We offer the item data
// as an object with a single field `value` for extensibility, but we omit
// the spreadsheet columns that we don't use on DTI, like Notes.
const itemValues = {};
for (const [itemName, value] of rows) {
itemValues[itemName] = { value };
}
return itemValues;
}
export default async (req, res) => {
beeline.withTrace({ name: "allWakaValues" }, () => handle(req, res));
};