← 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"