diff --git a/src/stores/bcl.js b/src/stores/bcl.js index 09dc6ce..92fc840 100644 --- a/src/stores/bcl.js +++ b/src/stores/bcl.js @@ -197,7 +197,7 @@ async function scanCategoryBCLAjax(ctx, prevDb, report) { ctx.logger.warn(`${ctx.catPrefixOut} | BCL browse fetch failed: ${e?.message || e}`); const discovered = new Map(); - const { merged, newItems, updatedItems, removedItems, restoredItems } = mergeDiscoveredIntoDb(prevDb, discovered); + const { merged, newItems, updatedItems, removedItems, restoredItems } = mergeDiscoveredIntoDb(prevDb, discovered, { storeLabel: ctx.store.name }); const dbObj = buildDbObject(ctx, merged); writeJsonAtomic(ctx.dbFile, dbObj); @@ -271,7 +271,7 @@ async function scanCategoryBCLAjax(ctx, prevDb, report) { ctx.logger.ok(`${ctx.catPrefixOut} | Unique products (this run): ${discovered.size}${dups ? ` (${dups} dups)` : ""}`); - const { merged, newItems, updatedItems, removedItems, restoredItems } = mergeDiscoveredIntoDb(prevDb, discovered); + const { merged, newItems, updatedItems, removedItems, restoredItems } = mergeDiscoveredIntoDb(prevDb, discovered, { storeLabel: ctx.store.name }); const dbObj = buildDbObject(ctx, merged); writeJsonAtomic(ctx.dbFile, dbObj); diff --git a/src/stores/bsw.js b/src/stores/bsw.js index deedaa2..3c3936f 100644 --- a/src/stores/bsw.js +++ b/src/stores/bsw.js @@ -248,7 +248,7 @@ async function scanCategoryBSWAlgolia(ctx, prevDb, report) { ctx.logger.warn(`${ctx.catPrefixOut} | BSW missing collectionId; defaulting to 1 page with 0 items.`); const discovered = new Map(); - const { merged, newItems, updatedItems, removedItems, restoredItems } = mergeDiscoveredIntoDb(prevDb, discovered); + const { merged, newItems, updatedItems, removedItems, restoredItems } = mergeDiscoveredIntoDb(prevDb, discovered, { storeLabel: ctx.store.name }); const dbObj = buildDbObject(ctx, merged); writeJsonAtomic(ctx.dbFile, dbObj); @@ -327,7 +327,7 @@ async function scanCategoryBSWAlgolia(ctx, prevDb, report) { ctx.logger.ok(`${ctx.catPrefixOut} | Unique products (this run): ${discovered.size}${dups ? ` (${dups} dups)` : ""}`); - const { merged, newItems, updatedItems, removedItems, restoredItems } = mergeDiscoveredIntoDb(prevDb, discovered); + const { merged, newItems, updatedItems, removedItems, restoredItems } = mergeDiscoveredIntoDb(prevDb, discovered, { storeLabel: ctx.store.name }); const dbObj = buildDbObject(ctx, merged); writeJsonAtomic(ctx.dbFile, dbObj); diff --git a/src/stores/coop.js b/src/stores/coop.js index 226a231..fb6f6e0 100644 --- a/src/stores/coop.js +++ b/src/stores/coop.js @@ -287,7 +287,7 @@ async function scanCategoryCoop(ctx, prevDb, report) { ctx.logger.ok(`${ctx.catPrefixOut} | Unique products: ${discovered.size}`); const { merged, newItems, updatedItems, removedItems, restoredItems } = - mergeDiscoveredIntoDb(prevDb, discovered); + mergeDiscoveredIntoDb(prevDb, discovered, { storeLabel: ctx.store.name }); const dbObj = buildDbObject(ctx, merged); writeJsonAtomic(ctx.dbFile, dbObj); diff --git a/src/stores/craftcellars.js b/src/stores/craftcellars.js index 70c4cac..98e0a28 100644 --- a/src/stores/craftcellars.js +++ b/src/stores/craftcellars.js @@ -240,7 +240,7 @@ async function scanCategoryCraftCellars(ctx, prevDb, report) { ctx.logger.ok(`${ctx.catPrefixOut} | Unique products (this run): ${discovered.size}`); - const { merged, newItems, updatedItems, removedItems, restoredItems } = mergeDiscoveredIntoDb(prevDb, discovered); + const { merged, newItems, updatedItems, removedItems, restoredItems } = mergeDiscoveredIntoDb(prevDb, discovered, { storeLabel: ctx.store.name }); const dbObj = buildDbObject(ctx, merged); writeJsonAtomic(ctx.dbFile, dbObj); diff --git a/src/stores/legacyliquor.js b/src/stores/legacyliquor.js index c914ce3..db57a89 100644 --- a/src/stores/legacyliquor.js +++ b/src/stores/legacyliquor.js @@ -253,7 +253,7 @@ async function scanCategoryLegacyLiquor(ctx, prevDb, report) { cursor = next; } - const { merged, newItems, updatedItems, removedItems, restoredItems } = mergeDiscoveredIntoDb(prevDb, discovered); + const { merged, newItems, updatedItems, removedItems, restoredItems } = mergeDiscoveredIntoDb(prevDb, discovered, { storeLabel: ctx.store.name }); const dbObj = buildDbObject(ctx, merged); writeJsonAtomic(ctx.dbFile, dbObj); diff --git a/src/stores/strath.js b/src/stores/strath.js index 8530d11..1fe6c32 100644 --- a/src/stores/strath.js +++ b/src/stores/strath.js @@ -433,7 +433,7 @@ async function scanCategoryStrath(ctx, prevDb, report) { ctx.logger.ok(`${ctx.catPrefixOut} | Unique products (this run): ${discovered.size}`); - const { merged, newItems, updatedItems, removedItems, restoredItems } = mergeDiscoveredIntoDb(prevDb, discovered); + const { merged, newItems, updatedItems, removedItems, restoredItems } = mergeDiscoveredIntoDb(prevDb, discovered, { storeLabel: ctx.store.name }); const dbObj = buildDbObject(ctx, merged); writeJsonAtomic(ctx.dbFile, dbObj); diff --git a/src/tracker/category_scan.js b/src/tracker/category_scan.js index cbcdaef..73b5872 100644 --- a/src/tracker/category_scan.js +++ b/src/tracker/category_scan.js @@ -327,7 +327,7 @@ async function discoverAndScanCategory(ctx, prevDb, report) { logger.ok(`${ctx.catPrefixOut} | Unique products (this run): ${discovered.size}${dups ? ` (${dups} dups)` : ""}`); - const { merged, newItems, updatedItems, removedItems, restoredItems } = mergeDiscoveredIntoDb(prevDb, discovered); + const { merged, newItems, updatedItems, removedItems, restoredItems } = mergeDiscoveredIntoDb(prevDb, discovered, { storeLabel: ctx.store.name }); const dbObj = buildDbObject(ctx, merged); writeJsonAtomic(ctx.dbFile, dbObj); diff --git a/src/tracker/merge.js b/src/tracker/merge.js index 018ef27..22fbf2e 100644 --- a/src/tracker/merge.js +++ b/src/tracker/merge.js @@ -11,27 +11,27 @@ function normImg(v) { return s; } +function dbStoreLabel(prevDb) { + return String(prevDb?.storeLabel || prevDb?.store || "").trim(); +} + function isRealSku(v) { return Boolean(normalizeCspc(v)); } -function dbStoreLabel(prevDb) { - return String(prevDb?.storeLabel || prevDb?.store || "").trim(); -} -function itemStoreLabel(prevDb, it) { - return String(it?.storeLabel || it?.store || dbStoreLabel(prevDb)).trim(); -} + +function mergeDiscoveredIntoDb(prevDb, discovered, { storeLabel } = {}) { + const effectiveStoreLabel = String(storeLabel || dbStoreLabel(prevDb)).trim(); + if (!effectiveStoreLabel) { + throw new Error( + "mergeDiscoveredIntoDb: missing storeLabel; refusing to generate synthetic SKUs with fallback 'store'" + ); + } + function normalizeSkuForDb(raw, url) { + return normalizeSkuKey(raw, { storeLabel: effectiveStoreLabel, url }); + } -function normalizeSkuForDb(prevDb, raw, { storeLabel, url } = {}) { - const lab = String(storeLabel || dbStoreLabel(prevDb)).trim(); - // IMPORTANT: if we still don't have a label, don't accidentally use "store" - // (but in practice dbStoreLabel(prevDb) should always exist) - return normalizeSkuKey(raw, { storeLabel: lab, url }); -} - - -function mergeDiscoveredIntoDb(prevDb, discovered) { const merged = new Map(prevDb.byUrl); const newItems = []; @@ -117,7 +117,7 @@ function mergeDiscoveredIntoDb(prevDb, discovered) { if (!prev) { const now = { ...nowRaw, - sku: normalizeSkuForDb(prevDb, nowRaw.sku, { storeLabel: itemStoreLabel(prevDb, nowRaw), url }), + sku: normalizeSkuForDb(nowRaw.sku, url), img: normImg(nowRaw.img), removed: false, }; @@ -131,8 +131,8 @@ function mergeDiscoveredIntoDb(prevDb, discovered) { const now = { ...nowRaw, sku: - normalizeSkuForDb(prevDb, nowRaw.sku, { storeLabel: itemStoreLabel(prevDb, nowRaw), url }) || - normalizeSkuForDb(prevDb, prev.sku, { storeLabel: itemStoreLabel(prevDb, prev), url: prev.url }), + normalizeSkuForDb(nowRaw.sku, url) || + normalizeSkuForDb(prev.sku, prev.url), img: normImg(nowRaw.img) || normImg(prev.img), removed: false, }; @@ -150,9 +150,9 @@ function mergeDiscoveredIntoDb(prevDb, discovered) { const prevPrice = normPrice(prev.price); const nowPrice = normPrice(nowRaw.price); - const prevSku = normalizeSkuForDb(prevDb, prev.sku, { storeLabel: itemStoreLabel(prevDb, prev), url: prev.url }); - const nowSku = normalizeSkuForDb(prevDb, nowRaw.sku, { storeLabel: itemStoreLabel(prevDb, nowRaw), url }) || prevSku; - + const prevSku = normalizeSkuForDb(prev.sku, prev.url); + const nowSku = normalizeSkuForDb(nowRaw.sku, url) || prevSku; + const prevImg = normImg(prev.img); let nowImg = normImg(nowRaw.img); if (!nowImg) nowImg = prevImg;