impress-2020/server/loaders.js
2020-04-22 12:01:05 -07:00

30 lines
810 B
JavaScript

const DataLoader = require("dataloader");
async function loadItems(db, ids) {
const qs = ids.map((_) => "?").join(",");
const [rows, _] = await db.execute(
`SELECT * FROM items WHERE id IN (${qs})`,
ids
);
return rows;
}
const buildItemTranslationLoader = (db) =>
new DataLoader(async (itemIds) => {
const qs = itemIds.map((_) => "?").join(",");
const [rows, _] = await db.execute(
`SELECT * FROM item_translations WHERE item_id IN (${qs}) AND locale = "en"`,
itemIds
);
const rowsByItemId = new Map(rows.map((row) => [row.item_id, row]));
return itemIds.map(
(itemId) =>
rowsByItemId.get(itemId) ||
new Error(`could not find translation for item ${itemId}`)
);
});
module.exports = { loadItems, buildItemTranslationLoader };