← back to Novasuede Min Fix
Add revert.mjs (one-click undo of TK-11082 Novasuede min change)
048dc11834714156af5f7fa5059f4eb759c353d2 · 2026-09-01 13:38:29 -0700 · vp-dw-commerce
Files touched
Diff
commit 048dc11834714156af5f7fa5059f4eb759c353d2
Author: vp-dw-commerce <steve@designerwallcoverings.com>
Date: Tue Sep 1 13:38:29 2026 -0700
Add revert.mjs (one-click undo of TK-11082 Novasuede min change)
---
revert.mjs | 28 ++++++++++++++++++++++++++++
1 file changed, 28 insertions(+)
diff --git a/revert.mjs b/revert.mjs
new file mode 100644
index 0000000..a71894d
--- /dev/null
+++ b/revert.mjs
@@ -0,0 +1,28 @@
+import fs from 'fs';
+const env=fs.readFileSync(process.env.HOME+'/Projects/secrets-manager/.env','utf8');
+const get=k=>(env.match(new RegExp('^'+k+'=(.*)$','m'))||[])[1];
+const TOKEN=get('SHOPIFY_ADMIN_TOKEN');
+const API='https://designer-laboratory-sandbox.myshopify.com/admin/api/2024-10/graphql.json';
+const changes=JSON.parse(fs.readFileSync(new URL('./restore-map.json',import.meta.url)));
+async function gql(q,v={}){const r=await fetch(API,{method:'POST',headers:{'X-Shopify-Access-Token':TOKEN,'Content-Type':'application/json'},body:JSON.stringify({query:q,variables:v})});return r.json();}
+const SET=`mutation($mf:[MetafieldsSetInput!]!){metafieldsSet(metafields:$mf){userErrors{field message}}}`;
+const DEL=`mutation($mf:[MetafieldIdentifierInput!]!){metafieldsDelete(metafields:$mf){deletedMetafields{key} userErrors{field message}}}`;
+let restored=0,deleted=0,err=0;
+for(const c of changes){
+ // product-level
+ if(c.prodMin_change){
+ if(c.prodMin_old===null||c.prodMin_old===undefined){
+ const r=await gql(DEL,{mf:[{ownerId:c.productId,namespace:'global',key:'v_prods_quantity_order_min'}]}); if(r?.data?.metafieldsDelete?.userErrors?.length){err++} else deleted++;
+ } else {
+ const r=await gql(SET,{mf:[{ownerId:c.productId,namespace:'global',key:'v_prods_quantity_order_min',type:'single_line_text_field',value:String(c.prodMin_old)}]}); if(r?.data?.metafieldsSet?.userErrors?.length){err++} else restored++;
+ }
+ }
+ if(c.perYardMin_change){
+ if(c.perYardMin_old===null||c.perYardMin_old===undefined){
+ const r=await gql(DEL,{mf:[{ownerId:c.perYardVariantId,namespace:'custom',key:'v_prod_quantity_order_min'}]}); if(r?.data?.metafieldsDelete?.userErrors?.length){err++} else deleted++;
+ } else {
+ const r=await gql(SET,{mf:[{ownerId:c.perYardVariantId,namespace:'custom',key:'v_prod_quantity_order_min',type:'single_line_text_field',value:String(c.perYardMin_old)}]}); if(r?.data?.metafieldsSet?.userErrors?.length){err++} else restored++;
+ }
+ }
+}
+console.log('REVERT complete. restored:',restored,' deleted(back-to-absent):',deleted,' errors:',err);
← 8e34d01 Novasuede per-yard min->5: restore-map + apply/verify script
·
back to Novasuede Min Fix
·
Add variant-reorder default-selection fix (Per Yard first) + 440cd92 →