← back to Flock Fix Viewer

material.mjs

25 lines

import fs from 'fs'; import os from 'os'; import path from 'path';
const SHOP='designer-laboratory-sandbox.myshopify.com';
const TOKEN=fs.readFileSync('./.token','utf8').trim();
const API=`https://${SHOP}/admin/api/2024-10`, H={'X-Shopify-Access-Token':TOKEN,'Content-Type':'application/json'};
const gql=async(q,v={})=>(await (await fetch(`${API}/graphql.json`,{method:'POST',headers:H,body:JSON.stringify({query:q,variables:v})})).json());
const sleep=ms=>new Promise(r=>setTimeout(r,ms));
const KEYS=['st. moritz','st moritz','madison','empire','griffons','zodiac','art deco fans','art deco','lattice','grille','medallions'];
const isAstek=s=>KEYS.some(k=>(s||'').toLowerCase().includes(k));
let cur=null,all=[];
const Q=`query($c:String){products(first:100,query:"vendor:'Phillipe Romano' (tag:'Flock Velvet' OR title:flock OR handle:flock)",after:$c){pageInfo{hasNextPage endCursor}edges{node{id handle title status variants(first:6){edges{node{title price}}}}}}}`;
do{const r=await gql(Q,{c:cur});const p=r?.data?.products;if(!p)break;all=all.concat(p.edges);cur=p.pageInfo.hasNextPage?p.pageInfo.endCursor:null;}while(cur);
let done=0;
for(const e of all){const n=e.node;
  if(n.status==='ARCHIVED')continue;
  const priced=n.variants.edges.map(x=>x.node).some(v=>!/sample/i.test(v.title||'')&&parseFloat(v.price)>10);
  if(!priced||!(isAstek(n.handle)||isAstek(n.title)))continue;
  const mf=[{ownerId:n.id,namespace:'custom',key:'material',type:'multi_line_text_field',value:'Flock Velvet'},
            {ownerId:n.id,namespace:'global',key:'Material',type:'single_line_text_field',value:'Flock Velvet'}];
  const r=await gql('mutation($mf:[MetafieldsSetInput!]!){metafieldsSet(metafields:$mf){userErrors{field message}}}',{mf});
  const errs=r?.data?.metafieldsSet?.userErrors;
  if(errs&&errs.length){console.log('FAIL',n.handle,JSON.stringify(errs));continue;}
  done++;
}
console.log('Material set on',done,'Astek flock products');