← back to Hollywood Import

hollywood-remap-dump.mjs

56 lines

// TK-10679 Phase 2 — READ-ONLY raw dump of every AFFECTED Hollywood product, so we can
// score recovery tiers (variant-clean / metafield-clean / staging-join / truly-held) offline.
// Writes NOTHING to Shopify. Output: remap-affected-raw.json
import { gql } from '/Users/macstudio3/.claude/skills/dw-hollywood-sku-canary/shopify.mjs';
import { FABRICATED } from '/Users/macstudio3/.claude/skills/dw-hollywood-sku-canary/lib.mjs';
import { writeFileSync } from 'node:fs';

const VENDOR = 'Hollywood Wallcoverings';
const PAGE = `query($cursor:String){
  products(first:50, query:"vendor:\\"${VENDOR}\\"", after:$cursor){
    pageInfo{ hasNextPage endCursor }
    nodes{
      id handle title status
      mfG: metafield(namespace:"global", key:"dw_sku"){ value }
      mfD: metafield(namespace:"dwc",    key:"dw_sku"){ value }
      mfC: metafield(namespace:"custom", key:"dw_sku"){ value }
      pat: metafield(namespace:"dwc",    key:"pattern_name"){ value }
      col: metafield(namespace:"dwc",    key:"color_name"){ value }
      mom: metafield(namespace:"dwc",    key:"momentum_sku"){ value }
      man: metafield(namespace:"dwc",    key:"manufacturer_sku"){ value }
      variants(first:20){ nodes{ sku } }
    }
  }
}`;
const sleep = ms => new Promise(r => setTimeout(r, ms));
const isFab = s => !!s && FABRICATED.test(s);
const baseOf = sku => (sku || '').replace(/-(sample|yard|roll)$/i, '');

const rows = [];
let cursor = null, scanned = 0;
while (true) {
  let res;
  for (let a = 0; ; a++) {
    try { res = await gql(PAGE, { cursor }); break; }
    catch (e) { if (/THROTTLED|throttle/i.test(e.message) && a < 8) { await sleep(2000 * (a + 1)); continue; } throw e; }
  }
  for (const p of res.data.products.nodes) {
    scanned++;
    const vbases = [...new Set(p.variants.nodes.map(v => baseOf(v.sku)).filter(Boolean))];
    const mfVals = { global: p.mfG?.value || null, dwc: p.mfD?.value || null, custom: p.mfC?.value || null };
    const anyFab = isFab(mfVals.global) || isFab(mfVals.dwc) || isFab(mfVals.custom) || vbases.some(isFab);
    if (!anyFab) continue;
    rows.push({
      id: p.id, handle: p.handle, title: p.title,
      mf: mfVals, vbases,
      pat: p.pat?.value || null, col: p.col?.value || null,
      mom: p.mom?.value || null, man: p.man?.value || null,
    });
  }
  if (!res.data.products.pageInfo.hasNextPage) break;
  cursor = res.data.products.pageInfo.endCursor;
  await sleep(300);
}
writeFileSync(new URL('./remap-affected-raw.json', import.meta.url).pathname, JSON.stringify(rows, null, 1));
console.log(`scanned=${scanned} affected=${rows.length} -> remap-affected-raw.json`);