← back to Dw Pairs Well
tools/live-link-check.sh
44 lines
#!/usr/bin/env bash
# Live-link guarantee check: for N random ACTIVE+published heroes, pull /api/pairs and
# /api/similar (clip engines active) from a pairs-well instance and HEAD every suggested
# /products/<handle> against the LIVE store. Any non-200 is a FAIL.
# Usage: BASE=http://127.0.0.1:9821 STORE=https://designerwallcoverings.com N=5 bash tools/live-link-check.sh
set -u
BASE="${BASE:-http://127.0.0.1:9821}"
STORE="${STORE:-https://designerwallcoverings.com}"
N="${N:-5}"
HEROES=$(psql -d dw_unified -h /tmp -tA -c "
SELECT dw_sku FROM (
SELECT DISTINCT dw_sku FROM shopify_products
WHERE status='ACTIVE' AND online_store_published IS TRUE
AND handle IS NOT NULL AND dw_sku IS NOT NULL AND tags IS NOT NULL AND image_url IS NOT NULL
) x ORDER BY md5(dw_sku) LIMIT $N;")
total=0; bad=0
for SKU in $HEROES; do
for EP in "pairs?dw_sku=$SKU&limit=8" "similar?dw_sku=$SKU&engine=clip&limit=8"; do
URLS=$(curl -s --max-time 20 "$BASE/api/$EP" | python3 -c "
import sys, json
try: d = json.load(sys.stdin)
except Exception: sys.exit(0)
for p in d.get('pairs', d.get('similar', [])) or []:
u = p.get('url') or ''
if u: print(u)")
for U in $URLS; do
total=$((total+1))
CODE=$(curl -s -o /dev/null -w '%{http_code}' --max-time 15 -L -A 'Mozilla/5.0 (link-audit)' "$STORE$U")
if [ "$CODE" = "429" ]; then # store rate-limit, not a dead link — back off and retry once
sleep 12
CODE=$(curl -s -o /dev/null -w '%{http_code}' --max-time 15 -L -A 'Mozilla/5.0 (link-audit)' "$STORE$U")
fi
if [ "$CODE" != "200" ]; then
bad=$((bad+1)); echo "FAIL $CODE $STORE$U (hero $SKU via ${EP%%\?*})"
fi
sleep 0.7 # stay under Shopify's throttle
done
done
done
echo "checked $total suggested links · $bad broken"
[ "$bad" -eq 0 ] && echo "LINK GUARANTEE: PASS" || echo "LINK GUARANTEE: FAIL"