← back to Dw Sku Integrity

maharam-real-code-gen.mjs

45 lines

#!/usr/bin/env node
// TK-10900 Maharam real-code recovery. Reads canonical blank rows + local
// maharam_catalog, fetches vendor product pages with local Chrome ($0), and
// emits GATED plans only for unique content matches whose published code agrees
// with the URL color number. Never writes a database and never mints a code.

import { execFileSync } from 'node:child_process';
import { createRequire } from 'node:module';
import { mkdirSync, writeFileSync } from 'node:fs';
import { join } from 'node:path';
import { norm, scrubTitle, stripVendor } from './match-helpers.mjs';
import { publishedCodes } from './maharam-real-code-helpers.mjs';

const require = createRequire(import.meta.url);
const { chromium } = require('/Users/macstudio3/Projects/Designer-Wallcoverings/DW-Programming/ImportNewSkufromURL/node_modules/playwright');
const US='\x1f', RS='\x1e';
const run=(cmd,sql)=>execFileSync(cmd[0],[...cmd.slice(1),'-tA','-F',US,'-R',RS],{input:sql,encoding:'utf8',maxBuffer:1<<30}).split(RS).map(x=>x.replace(/\n$/,'')).filter(Boolean).map(x=>x.split(US));
const esc=(v)=>String(v).replace(/'/g,"''");
const OUT=process.argv.includes('--out') ? process.argv[process.argv.indexOf('--out')+1] : join(process.cwd(),'apply-plans-maharam-real');
const CONC=Math.max(1,Math.min(8,Number(process.env.MAHARAM_CONCURRENCY||4)));

console.error('[maharam] reading local catalog');
const catalog=run(['psql','-h','/tmp','-d','dw_unified'],"SELECT pattern_name,color_name,product_url FROM maharam_catalog WHERE product_url IS NOT NULL AND btrim(product_url)<>''");
const byKey=new Map();
for(const [pattern,color,url] of catalog){const k=scrubTitle(norm(pattern)+' '+norm(color)); if(!byKey.has(k))byKey.set(k,new Set()); byKey.get(k).add(url);}
console.error(`[maharam] catalog rows ${catalog.length}; reading canonical blanks`);
const shops=run(['ssh','root@45.61.58.125','psql','dw_unified'],"SELECT shopify_id,title FROM shopify_products WHERE vendor='Maharam' AND lower(coalesce(status,''))='active' AND (dw_sku IS NULL OR btrim(dw_sku)='')");
const targets=[]; const review=[];
for(const [id,title] of shops){const k=scrubTitle(stripVendor(title,'Maharam')); const urls=[...(byKey.get(k)||[])]; if(urls.length===1)targets.push({id,title,url:urls[0]}); else review.push({id,title,key:k,reason:urls.length?'ambiguous_url':'no_catalog_url',urls});}

console.error(`[maharam] canonical blanks ${shops.length}; unique URL targets ${targets.length}; review ${review.length}`);
const browser=await chromium.launch({headless:true,executablePath:'/Applications/Google Chrome.app/Contents/MacOS/Google Chrome'});
let cursor=0; const found=[];
async function worker(){while(cursor<targets.length){const n=cursor++; const t=targets[n]; if(n%100===0)console.error(`[maharam] fetch ${n}/${targets.length}`); const page=await browser.newPage(); try{await page.goto(t.url,{waitUntil:'domcontentloaded',timeout:60000}); await page.waitForTimeout(1200); const body=await page.locator('body').innerText(); const { codes, urlColor, valid }=publishedCodes(body,t.url); if(valid.length===1)found.push({...t,code:valid[0]}); else review.push({...t,reason:'published_code_not_unique',codes,urlColor});}catch(e){review.push({...t,reason:'fetch_error',error:String(e.message||e)});}finally{await page.close();}}
}
await Promise.all(Array.from({length:CONC},worker)); await browser.close();
found.sort((a,b)=>a.id.localeCompare(b.id)); mkdirSync(OUT,{recursive:true});
const header='-- GATED -- TK-10900 Maharam vendor-published real codes; no mint.\n';
writeFileSync(join(OUT,'apply.sql'),header+found.map(x=>`UPDATE shopify_products SET dw_sku='${esc(x.code)}' WHERE shopify_id='${esc(x.id)}' AND (dw_sku IS NULL OR btrim(dw_sku)='');`).join('\n')+'\n');
writeFileSync(join(OUT,'undo.sql'),header+found.map(x=>`UPDATE shopify_products SET dw_sku=NULL WHERE shopify_id='${esc(x.id)}' AND dw_sku='${esc(x.code)}';`).join('\n')+'\n');
writeFileSync(join(OUT,'restore-map.json'),JSON.stringify(found.map(x=>({shopify_id:x.id,title:x.title,source_url:x.url,column:'dw_sku',old:null,new:x.code})),null,2)+'\n');
writeFileSync(join(OUT,'review-queue.json'),JSON.stringify(review,null,2)+'\n');
const summary={ticket:'TK-10900',vendor:'Maharam',canonical_blank:shops.length,unique_catalog_url:targets.length,recovered:found.length,review:review.length,concurrency:CONC,cost_usd:0,note:'NOTHING executed; GATED plan only'};
writeFileSync(join(OUT,'SUMMARY.json'),JSON.stringify(summary,null,2)+'\n'); console.log(JSON.stringify(summary,null,2));