2020-04-22 12:00:52 -07:00
|
|
|
const DataLoader = require("dataloader");
|
|
|
|
|
2020-04-22 11:51:36 -07:00
|
|
|
async function loadItems(db, ids) {
|
|
|
|
const qs = ids.map((_) => "?").join(",");
|
|
|
|
const [rows, _] = await db.execute(
|
|
|
|
`SELECT * FROM items WHERE id IN (${qs})`,
|
|
|
|
ids
|
|
|
|
);
|
2020-04-22 14:55:12 -07:00
|
|
|
const entities = rows.map(normalizeProperties);
|
|
|
|
return entities;
|
2020-04-22 11:51:36 -07:00
|
|
|
}
|
|
|
|
|
2020-04-22 12:00:52 -07:00
|
|
|
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
|
|
|
|
);
|
2020-04-22 14:55:12 -07:00
|
|
|
const entities = rows.map(normalizeProperties);
|
2020-04-22 11:51:36 -07:00
|
|
|
|
2020-04-22 14:55:12 -07:00
|
|
|
const entitiesByItemId = new Map(entities.map((e) => [e.itemId, e]));
|
2020-04-22 12:00:52 -07:00
|
|
|
|
|
|
|
return itemIds.map(
|
|
|
|
(itemId) =>
|
2020-04-22 14:55:12 -07:00
|
|
|
entitiesByItemId.get(itemId) ||
|
2020-04-22 12:00:52 -07:00
|
|
|
new Error(`could not find translation for item ${itemId}`)
|
|
|
|
);
|
|
|
|
});
|
2020-04-22 11:51:36 -07:00
|
|
|
|
2020-04-22 14:55:12 -07:00
|
|
|
function normalizeProperties(row) {
|
|
|
|
const normalizedRow = {};
|
|
|
|
for (const [key, value] of Object.entries(row)) {
|
|
|
|
const normalizedKey = key.replace(/_([a-z])/gi, (m) => m[1].toUpperCase());
|
|
|
|
normalizedRow[normalizedKey] = value;
|
|
|
|
}
|
|
|
|
return normalizedRow;
|
|
|
|
}
|
|
|
|
|
2020-04-22 12:00:52 -07:00
|
|
|
module.exports = { loadItems, buildItemTranslationLoader };
|