mirror of
https://github.com/samsonjs/spirit-tracker.git
synced 2026-03-25 09:25:51 +00:00
fiX: 4 real this time
This commit is contained in:
parent
5dd38fe6be
commit
af949cbf89
8 changed files with 30 additions and 30 deletions
|
|
@ -197,7 +197,7 @@ async function scanCategoryBCLAjax(ctx, prevDb, report) {
|
||||||
ctx.logger.warn(`${ctx.catPrefixOut} | BCL browse fetch failed: ${e?.message || e}`);
|
ctx.logger.warn(`${ctx.catPrefixOut} | BCL browse fetch failed: ${e?.message || e}`);
|
||||||
|
|
||||||
const discovered = new Map();
|
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);
|
const dbObj = buildDbObject(ctx, merged);
|
||||||
writeJsonAtomic(ctx.dbFile, dbObj);
|
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)` : ""}`);
|
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);
|
const dbObj = buildDbObject(ctx, merged);
|
||||||
writeJsonAtomic(ctx.dbFile, dbObj);
|
writeJsonAtomic(ctx.dbFile, dbObj);
|
||||||
|
|
|
||||||
|
|
@ -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.`);
|
ctx.logger.warn(`${ctx.catPrefixOut} | BSW missing collectionId; defaulting to 1 page with 0 items.`);
|
||||||
|
|
||||||
const discovered = new Map();
|
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);
|
const dbObj = buildDbObject(ctx, merged);
|
||||||
writeJsonAtomic(ctx.dbFile, dbObj);
|
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)` : ""}`);
|
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);
|
const dbObj = buildDbObject(ctx, merged);
|
||||||
writeJsonAtomic(ctx.dbFile, dbObj);
|
writeJsonAtomic(ctx.dbFile, dbObj);
|
||||||
|
|
|
||||||
|
|
@ -287,7 +287,7 @@ async function scanCategoryCoop(ctx, prevDb, report) {
|
||||||
ctx.logger.ok(`${ctx.catPrefixOut} | Unique products: ${discovered.size}`);
|
ctx.logger.ok(`${ctx.catPrefixOut} | Unique products: ${discovered.size}`);
|
||||||
|
|
||||||
const { merged, newItems, updatedItems, removedItems, restoredItems } =
|
const { merged, newItems, updatedItems, removedItems, restoredItems } =
|
||||||
mergeDiscoveredIntoDb(prevDb, discovered);
|
mergeDiscoveredIntoDb(prevDb, discovered, { storeLabel: ctx.store.name });
|
||||||
|
|
||||||
const dbObj = buildDbObject(ctx, merged);
|
const dbObj = buildDbObject(ctx, merged);
|
||||||
writeJsonAtomic(ctx.dbFile, dbObj);
|
writeJsonAtomic(ctx.dbFile, dbObj);
|
||||||
|
|
|
||||||
|
|
@ -240,7 +240,7 @@ async function scanCategoryCraftCellars(ctx, prevDb, report) {
|
||||||
|
|
||||||
ctx.logger.ok(`${ctx.catPrefixOut} | Unique products (this run): ${discovered.size}`);
|
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);
|
const dbObj = buildDbObject(ctx, merged);
|
||||||
writeJsonAtomic(ctx.dbFile, dbObj);
|
writeJsonAtomic(ctx.dbFile, dbObj);
|
||||||
|
|
|
||||||
|
|
@ -253,7 +253,7 @@ async function scanCategoryLegacyLiquor(ctx, prevDb, report) {
|
||||||
cursor = next;
|
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);
|
const dbObj = buildDbObject(ctx, merged);
|
||||||
writeJsonAtomic(ctx.dbFile, dbObj);
|
writeJsonAtomic(ctx.dbFile, dbObj);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -433,7 +433,7 @@ async function scanCategoryStrath(ctx, prevDb, report) {
|
||||||
|
|
||||||
ctx.logger.ok(`${ctx.catPrefixOut} | Unique products (this run): ${discovered.size}`);
|
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);
|
const dbObj = buildDbObject(ctx, merged);
|
||||||
writeJsonAtomic(ctx.dbFile, dbObj);
|
writeJsonAtomic(ctx.dbFile, dbObj);
|
||||||
|
|
|
||||||
|
|
@ -327,7 +327,7 @@ async function discoverAndScanCategory(ctx, prevDb, report) {
|
||||||
|
|
||||||
logger.ok(`${ctx.catPrefixOut} | Unique products (this run): ${discovered.size}${dups ? ` (${dups} dups)` : ""}`);
|
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);
|
const dbObj = buildDbObject(ctx, merged);
|
||||||
writeJsonAtomic(ctx.dbFile, dbObj);
|
writeJsonAtomic(ctx.dbFile, dbObj);
|
||||||
|
|
|
||||||
|
|
@ -11,27 +11,27 @@ function normImg(v) {
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function dbStoreLabel(prevDb) {
|
||||||
|
return String(prevDb?.storeLabel || prevDb?.store || "").trim();
|
||||||
|
}
|
||||||
|
|
||||||
function isRealSku(v) {
|
function isRealSku(v) {
|
||||||
return Boolean(normalizeCspc(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 merged = new Map(prevDb.byUrl);
|
||||||
|
|
||||||
const newItems = [];
|
const newItems = [];
|
||||||
|
|
@ -117,7 +117,7 @@ function mergeDiscoveredIntoDb(prevDb, discovered) {
|
||||||
if (!prev) {
|
if (!prev) {
|
||||||
const now = {
|
const now = {
|
||||||
...nowRaw,
|
...nowRaw,
|
||||||
sku: normalizeSkuForDb(prevDb, nowRaw.sku, { storeLabel: itemStoreLabel(prevDb, nowRaw), url }),
|
sku: normalizeSkuForDb(nowRaw.sku, url),
|
||||||
img: normImg(nowRaw.img),
|
img: normImg(nowRaw.img),
|
||||||
removed: false,
|
removed: false,
|
||||||
};
|
};
|
||||||
|
|
@ -131,8 +131,8 @@ function mergeDiscoveredIntoDb(prevDb, discovered) {
|
||||||
const now = {
|
const now = {
|
||||||
...nowRaw,
|
...nowRaw,
|
||||||
sku:
|
sku:
|
||||||
normalizeSkuForDb(prevDb, nowRaw.sku, { storeLabel: itemStoreLabel(prevDb, nowRaw), url }) ||
|
normalizeSkuForDb(nowRaw.sku, url) ||
|
||||||
normalizeSkuForDb(prevDb, prev.sku, { storeLabel: itemStoreLabel(prevDb, prev), url: prev.url }),
|
normalizeSkuForDb(prev.sku, prev.url),
|
||||||
img: normImg(nowRaw.img) || normImg(prev.img),
|
img: normImg(nowRaw.img) || normImg(prev.img),
|
||||||
removed: false,
|
removed: false,
|
||||||
};
|
};
|
||||||
|
|
@ -150,9 +150,9 @@ function mergeDiscoveredIntoDb(prevDb, discovered) {
|
||||||
const prevPrice = normPrice(prev.price);
|
const prevPrice = normPrice(prev.price);
|
||||||
const nowPrice = normPrice(nowRaw.price);
|
const nowPrice = normPrice(nowRaw.price);
|
||||||
|
|
||||||
const prevSku = normalizeSkuForDb(prevDb, prev.sku, { storeLabel: itemStoreLabel(prevDb, prev), url: prev.url });
|
const prevSku = normalizeSkuForDb(prev.sku, prev.url);
|
||||||
const nowSku = normalizeSkuForDb(prevDb, nowRaw.sku, { storeLabel: itemStoreLabel(prevDb, nowRaw), url }) || prevSku;
|
const nowSku = normalizeSkuForDb(nowRaw.sku, url) || prevSku;
|
||||||
|
|
||||||
const prevImg = normImg(prev.img);
|
const prevImg = normImg(prev.img);
|
||||||
let nowImg = normImg(nowRaw.img);
|
let nowImg = normImg(nowRaw.img);
|
||||||
if (!nowImg) nowImg = prevImg;
|
if (!nowImg) nowImg = prevImg;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue