← back to Fm Wallpaper Sync

run.sh

53 lines

#!/bin/zsh
# Nightly FileMaker WALLPAPER -> postgres refresh (1am via launchd).
# 1) pull live FM  2) rebuild fm_wallpaper_live + fill-merge fmpro/master_fmpro
# 3) regenerate the missing-from-FM audit CSV  4) write heartbeat.
set -uo pipefail
DIR="$HOME/Projects/fm-wallpaper-sync"
CSV="/tmp/fm_wallpaper_full.csv"
AUDIT_DIR="$HOME/Desktop/fm-wallpaper-audit"
NODE="/opt/homebrew/bin/node"
PSQL="/opt/homebrew/opt/postgresql@16/bin/psql"; [ -x "$PSQL" ] || PSQL="$(command -v psql)"
PG=(-h 127.0.0.1 -U dw_admin -d dw_unified)
TS="$(date +%Y%m%d)"; LOG="$DIR/logs/sync-$TS.log"
mkdir -p "$DIR/logs" "$AUDIT_DIR"
exec >>"$LOG" 2>&1
echo "===== $(date) START ====="
fail(){ echo "FAILED: $1"; print -r -- "{\"ok\":false,\"stage\":\"$1\",\"at\":\"$(date -u +%FT%TZ)\"}" > "$DIR/latest.json"; exit 1; }

echo "-- pull"
$NODE "$DIR/sync.mjs" "$CSV" || fail pull
[ -s "$CSV" ] || fail pull_empty

echo "-- build+merge"
sed "s#__CSV__#$CSV#g" "$DIR/build.sql" | $PSQL "${PG[@]}" -f - || fail build

echo "-- regenerate audit CSV"
$PSQL "${PG[@]}" -c "\COPY (
  WITH act AS (
    SELECT dw_sku, substring(dw_sku from '^[A-Z]+') fm_series, substring(dw_sku from '[0-9]+\$') fm_js_pattern,
           mfr_sku fm_mfr_pattern, vendor, title, product_type, raw_sku, price, cost, handle, shopify_id,
           created_at_shopify, image_url
    FROM (
      SELECT substring(upper(regexp_replace(coalesce(variant_sku,sku),'[^A-Za-z0-9]','','g')) from '^[A-Z]+[0-9]+') dw_sku,
             coalesce(variant_sku,sku) raw_sku, coalesce(nullif(mfr_sku,''),'') mfr_sku,
             coalesce(vendor,supplier_name,'') vendor, coalesce(nullif(title,''),pattern_name,'') title,
             coalesce(product_type,'') product_type, price, cost, handle, shopify_id, created_at_shopify, image_url,
             row_number() OVER (PARTITION BY substring(upper(regexp_replace(coalesce(variant_sku,sku),'[^A-Za-z0-9]','','g')) from '^[A-Z]+[0-9]+')
                                ORDER BY created_at_shopify DESC NULLS LAST) rn
      FROM shopify_products WHERE status='ACTIVE' AND coalesce(variant_sku,sku) IS NOT NULL
    ) x WHERE rn=1 AND dw_sku IS NOT NULL AND dw_sku<>''
  )
  SELECT a.dw_sku, a.fm_series, a.fm_js_pattern, a.fm_mfr_pattern, a.vendor, a.title, a.product_type,
         a.raw_sku, a.price, a.cost, a.handle, a.shopify_id, a.created_at_shopify, a.image_url
  FROM act a WHERE NOT EXISTS (SELECT 1 FROM fm_wallpaper_live f WHERE f.combo_sku=a.dw_sku)
  ORDER BY a.vendor, a.dw_sku
) TO '$AUDIT_DIR/MISSING_from_FM_wallpaper_ALL.csv' WITH (FORMAT csv, HEADER true)" || fail audit_export

LIVE=$($PSQL "${PG[@]}" -tAc "SELECT count(*) FROM fm_wallpaper_live")
MISS=$(wc -l < "$AUDIT_DIR/MISSING_from_FM_wallpaper_ALL.csv" | tr -d ' '); MISS=$((MISS-1))
FMPRO=$($PSQL "${PG[@]}" -tAc "SELECT count(*) FROM fmpro")
print -r -- "{\"ok\":true,\"at\":\"$(date -u +%FT%TZ)\",\"live_distinct_combosku\":$LIVE,\"fmpro_rows\":$FMPRO,\"missing_from_fm\":$MISS}" > "$DIR/latest.json"
echo "-- done live=$LIVE fmpro=$FMPRO missing=$MISS"
echo "===== $(date) OK ====="