← back to Shopify Sample Shipping

raise-band.mjs

24 lines

import {query} from './query.mjs';
import fs from 'node:fs';
const PROFILE='gid://shopify/DeliveryProfile/29033627699';
const NEW_CAP='45';
// 1) locate the free method + its condition ids + owning lg/zone
const rq=`query($id:ID!){deliveryProfile(id:$id){profileLocationGroups{locationGroup{id} locationGroupZones(first:20){nodes{zone{id name} methodDefinitions(first:30){nodes{id name methodConditions{id operator conditionCriteria{__typename ... on MoneyV2{amount}}}}}}}}}}`;
const d=await query(rq,{id:PROFILE});
let m=null,lg=null,zone=null;
for(const g of d.deliveryProfile.profileLocationGroups)for(const z of g.locationGroupZones.nodes){if(z.zone.name!=='Domestic')continue;for(const md of z.methodDefinitions.nodes){if(md.name==='Free Shipping (No Tracking)'){m=md;lg=g.locationGroup.id;zone=z.zone.id;}}}
if(!m){console.log('ABORT: free method not found');process.exit(1);}
const oldConds=m.methodConditions.map(c=>c.id);
fs.writeFileSync(new URL('./verification/raise-band-snapshot.json',import.meta.url),JSON.stringify({at:new Date().toISOString(),profile:PROFILE,lg,zone,method:m},null,2)+'\n');
console.log('current conditions:',m.methodConditions.map(c=>`${c.operator} $${c.conditionCriteria?.amount}`).join(' & '));
const mut=`mutation($id:ID!,$profile:DeliveryProfileInput!){deliveryProfileUpdate(id:$id,profile:$profile){profile{id} userErrors{field message}}}`;
// 2) delete old conditions (max 2 per method; must clear before adding)
const rm=await query(mut,{id:PROFILE,profile:{conditionsToDelete:oldConds}});
if(rm.deliveryProfileUpdate.userErrors.length){console.log('DELETE ERR',JSON.stringify(rm.deliveryProfileUpdate.userErrors));process.exit(1);}
// 3) add new $0-$45 band
const add=await query(mut,{id:PROFILE,profile:{locationGroupsToUpdate:[{id:lg,zonesToUpdate:[{id:zone,methodDefinitionsToUpdate:[{id:m.id,priceConditionsToCreate:[
  {operator:'GREATER_THAN_OR_EQUAL_TO',criteria:{amount:'0',currencyCode:'USD'}},
  {operator:'LESS_THAN_OR_EQUAL_TO',criteria:{amount:NEW_CAP,currencyCode:'USD'}}]}]}]}]}});
if(add.deliveryProfileUpdate.userErrors.length){console.log('ADD ERR',JSON.stringify(add.deliveryProfileUpdate.userErrors));process.exit(1);}
console.log('band raised to $0-$'+NEW_CAP);