diff --git a/src/stores/tudor.js b/src/stores/tudor.js index 54f41bc..7e19ce8 100644 --- a/src/stores/tudor.js +++ b/src/stores/tudor.js @@ -156,7 +156,6 @@ const PRODUCTS_QUERY = ` $isStaffPick: Boolean, $pageCursor: String, $pageLimit: Int, - $pointsMin: Int, $priceMin: Float, $priceMax: Float, $quantityMin: Float, diff --git a/tools/dedupe_skulinks.js b/tools/dedupe_skulinks.js new file mode 100644 index 0000000..e0110dd --- /dev/null +++ b/tools/dedupe_skulinks.js @@ -0,0 +1,39 @@ +#!/usr/bin/env node + +const fs = require("fs"); +const path = require("path"); + +const DB_DIR = path.join(__dirname, "data/db"); +const LINKS_FILE = path.join(__dirname, "data/sku_links.json"); + +// collect all valid SKUs from db files +const validSkus = new Set(); + +for (const file of fs.readdirSync(DB_DIR)) { + if (!file.endsWith(".json")) continue; + const data = JSON.parse(fs.readFileSync(path.join(DB_DIR, file), "utf8")); + if (!Array.isArray(data.items)) continue; + for (const item of data.items) { + if (item.sku) validSkus.add(String(item.sku)); + } +} + +// load links +const linksData = JSON.parse(fs.readFileSync(LINKS_FILE, "utf8")); +const originalCount = linksData.links.length; + +// keep only links where BOTH skus exist +linksData.links = linksData.links.filter( + ({ fromSku, toSku }) => + validSkus.has(String(fromSku)) && validSkus.has(String(toSku)) +); + +// write back in place +fs.writeFileSync( + LINKS_FILE, + JSON.stringify(linksData, null, 2) + "\n" +); + +console.log( + `Pruned ${originalCount - linksData.links.length} invalid links` +); diff --git a/tools/discover_bad_skus.js b/tools/discover_bad_skus.js new file mode 100644 index 0000000..8e97e85 --- /dev/null +++ b/tools/discover_bad_skus.js @@ -0,0 +1,40 @@ +#!/usr/bin/env node + +const fs = require("fs"); +const path = require("path"); + +const DB_DIR = path.join(__dirname, "data/db"); +const LINKS_FILE = path.join(__dirname, "data/sku_links.json"); + +const includeKegNCork = process.argv.includes("--include-kegncork"); +const includeLinked = process.argv.includes("--include-linked"); + +// load linked SKUs +const linkedSkus = new Set(); +if (!includeLinked && fs.existsSync(LINKS_FILE)) { + const { links } = JSON.parse(fs.readFileSync(LINKS_FILE, "utf8")); + for (const { fromSku, toSku } of links) { + linkedSkus.add(String(fromSku)); + linkedSkus.add(String(toSku)); + } +} + +for (const file of fs.readdirSync(DB_DIR)) { + if (!file.endsWith(".json")) continue; + + if (!includeKegNCork && file.startsWith("kegncork__")) continue; + + const data = JSON.parse(fs.readFileSync(path.join(DB_DIR, file), "utf8")); + if (!Array.isArray(data.items)) continue; + + for (const { sku, url } of data.items) { + if ( + typeof sku === "string" && + sku.startsWith("u:") && + url && + (includeLinked || !linkedSkus.has(String(sku))) + ) { + console.log(url); + } + } +}