← back to Dw Signup Fulfillment
scripts/archive-majilite-dupes.js
34 lines
#!/usr/bin/env node
'use strict';
// Archive the 2 duplicate Majilite listings (the 23:06 double-publish ghosts) on the LIVE
// DW store, keeping the compliant 17:17 originals. Verified by /yoloforever cycle 1 + Cody:
// KEEP majilite-shimmer-mist (7916899303475, compliant)
// ARCH majilite-shimmer-mist-600088 (7917049086003, NO mfr metafield, dup)
// KEEP majilite-nuance-pebble (7916899467315, compliant)
// ARCH majilite-nuance-pebble-600090 (7917049118771, NO mfr metafield, dup)
// Reversible: set status back to 'active' to un-archive. Cost: $0 (2 status writes).
// Run: node ~/Projects/dw-signup-fulfillment/scripts/archive-majilite-dupes.js
const fs = require('fs');
const os = require('os');
const env = fs.readFileSync(os.homedir() + '/Projects/secrets-manager/.env', 'utf8');
const tok = (env.match(/^SHOPIFY_ADMIN_TOKEN=(.+)$/m) || [])[1]?.trim().replace(/^["']|["']$/g, '');
if (!tok) { console.error('NO SHOPIFY_ADMIN_TOKEN'); process.exit(1); }
const SHOP = 'designer-laboratory-sandbox.myshopify.com', VER = '2024-10';
const DUPES = [
{ id: '7917049086003', handle: 'majilite-shimmer-mist-600088' },
{ id: '7917049118771', handle: 'majilite-nuance-pebble-600090' },
];
(async () => {
for (const d of DUPES) {
const r = await fetch(`https://${SHOP}/admin/api/${VER}/products/${d.id}.json`, {
method: 'PUT',
headers: { 'X-Shopify-Access-Token': tok, 'Content-Type': 'application/json' },
body: JSON.stringify({ product: { id: Number(d.id), status: 'archived' } }),
signal: AbortSignal.timeout(30000),
});
const j = await r.json().catch(() => ({}));
console.log(`${d.handle} (${d.id}) → HTTP ${r.status} · status=${j?.product?.status || JSON.stringify(j).slice(0, 120)}`);
}
console.log('💰 $0 (2 Shopify status writes). Re-run dw-golive-gate-canary to confirm the red clears.');
})();