← back to Designer Wallcoverings
TK-11047 sync Carnegie Terrain A7 specs canary
7564cd40b9675b6bc2e74635ccfeb41cdeabd2df · 2026-08-31 13:15:40 -0700 · Steve
Files touched
A scripts/carnegie-spec-canary.mjs
Diff
commit 7564cd40b9675b6bc2e74635ccfeb41cdeabd2df
Author: Steve <steve@designerwallcoverings.com>
Date: Mon Aug 31 13:15:40 2026 -0700
TK-11047 sync Carnegie Terrain A7 specs canary
---
scripts/carnegie-spec-canary.mjs | 31 +++++++++++++++++++++++++++++++
1 file changed, 31 insertions(+)
diff --git a/scripts/carnegie-spec-canary.mjs b/scripts/carnegie-spec-canary.mjs
new file mode 100644
index 00000000..30cb6106
--- /dev/null
+++ b/scripts/carnegie-spec-canary.mjs
@@ -0,0 +1,31 @@
+#!/usr/bin/env node
+// TK-11047 canary: canonical dw_unified first, then Shopify. One explicit product.
+import fs from 'node:fs';
+import { execFileSync } from 'node:child_process';
+const ROOT='/Users/macstudio3/Projects/Designer-Wallcoverings';
+const env=Object.fromEntries(fs.readFileSync(ROOT+'/.env','utf8').split('\n').filter(x=>x.includes('=')).map(x=>{const i=x.indexOf('=');return[x.slice(0,i).trim(),x.slice(i+1).trim()]}));
+const token=env.SHOPIFY_ADMIN_TOKEN||env.SHOPIFY_ADMIN_ACCESS_TOKEN, domain=env.SHOPIFY_STORE_DOMAIN||'designer-laboratory-sandbox.myshopify.com';
+if(!token)throw new Error('missing Shopify token');
+const id=process.argv[2]||'7925801418803', gid=`gid://shopify/Product/${id}`;
+const US='\x1f'; const psql=(cmd,sql)=>execFileSync(cmd[0],[...cmd.slice(1),'-tA','-F',US],{input:sql,encoding:'utf8',maxBuffer:1<<24}).trim().split(US);
+const row=psql(['ssh','root@45.61.58.125','psql','dw_unified'],`SELECT title,product_type FROM shopify_products WHERE shopify_id='${gid}'`);
+if(!row[0])throw new Error('canonical product not found');
+const m=row[0].match(/^Carnegie\s+(.+)\s+([A-Za-z]\d+)$/); if(!m)throw new Error(`unsupported title shape: ${row[0]}`);
+const q=s=>String(s).replace(/'/g,"''");
+const cat=psql(['psql','-h','/tmp','-d','dw_unified'],`SELECT mfr_sku,product_url,body_html,specs::text FROM carnegie_catalog WHERE lower(pattern_name)=lower('${q(m[1])}') AND lower(color_number)=lower('${q(m[2])}') AND lower(product_type)=lower('${q(row[1])}') LIMIT 2`);
+if(!cat[0]||!cat[3])throw new Error('unique manufacturer spec row not found');
+const specs=JSON.parse(cat[3]); const cleanDesc=(cat[2]||'').replace(/<style[\s\S]*?<\/style>/gi,'').trim();
+const lis=Object.entries(specs).filter(([,v])=>String(v).trim()).map(([k,v])=>`<li><strong>${k}:</strong> ${String(v).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>')}</li>`).join('');
+const html=`${cleanDesc}<h3>Manufacturer Specifications</h3><ul>${lis}</ul><p><a href="${cat[1]}" rel="noopener" target="_blank">Manufacturer product page</a></p>`;
+const meta={manufacturer:'Carnegie',manufacturer_sku:cat[0],source_url:cat[1],specs};
+const payload=JSON.stringify({html,meta}); const b64=Buffer.from(payload).toString('base64');
+const sql=`CREATE TABLE IF NOT EXISTS carnegie_spec_restore_20260831 AS SELECT * FROM shopify_products WITH NO DATA; INSERT INTO carnegie_spec_restore_20260831 SELECT * FROM shopify_products WHERE shopify_id='${gid}' AND NOT EXISTS (SELECT 1 FROM carnegie_spec_restore_20260831 WHERE shopify_id='${gid}'); UPDATE shopify_products SET mfr_sku='${q(cat[0])}', body_html=convert_from(decode('${b64}','base64'),'UTF8')::jsonb->>'html', metafields=coalesce(metafields,'{}'::jsonb)||jsonb_build_object('manufacturer_specs',(convert_from(decode('${b64}','base64'),'UTF8')::jsonb->'meta'),'manufacturer_product_url','${q(cat[1])}') WHERE shopify_id='${gid}';`;
+execFileSync('ssh',['root@45.61.58.125','psql','dw_unified'],{input:sql,stdio:['pipe','inherit','inherit']});
+const headers={'X-Shopify-Access-Token':token,'Content-Type':'application/json'};
+const before=await fetch(`https://${domain}/admin/api/2024-10/products/${id}.json`,{headers}).then(r=>r.json());
+fs.writeFileSync(`${ROOT}/data/carnegie-spec-canary-${id}-restore.json`,JSON.stringify(before,null,2));
+const put=await fetch(`https://${domain}/admin/api/2024-10/products/${id}.json`,{method:'PUT',headers,body:JSON.stringify({product:{id:Number(id),body_html:html,metafields:[{namespace:'custom',key:'manufacturer_specs',type:'json',value:JSON.stringify(meta)}]}})});
+const out=await put.json(); if(!put.ok)throw new Error(`Shopify ${put.status}: ${JSON.stringify(out)}`);
+const verify=await fetch(`https://${domain}/admin/api/2024-10/products/${id}.json`,{headers}).then(r=>r.json());
+const result={ticket:'TK-11047',id,gid,title:row[0],mfr_sku:cat[0],source_url:cat[1],spec_keys:Object.keys(specs),canonical_written:true,shopify_status:put.status,body_match:verify.product?.body_html===html,body_length:verify.product?.body_html?.length||0};
+fs.writeFileSync(`${ROOT}/data/carnegie-spec-canary-${id}-result.json`,JSON.stringify(result,null,2)); console.log(JSON.stringify(result,null,2));
← 4fc99fff auto-data-snapshot: 2026-08-31T13:13:14 (2 data files) — dat
·
back to Designer Wallcoverings
·
TK-11047 add verified Carnegie spec bulk runner 23131e83 →