← back to Trademarks Copyright

scripts/backfill-drops.ts

42 lines

#!/usr/bin/env tsx
/**
 * Backfill a few historical drops so the archive has substance for new visitors.
 * Safe to re-run — composer uses freshCandidates() which skips items already in drops.
 */

import { composeDropForDate } from "../src/lib/drops";
import { query } from "../src/lib/db";
import { pool } from "../src/lib/db";

const BACKFILL_DAYS = 3; // past days to compose, counting backwards from yesterday

async function main() {
  for (let i = 1; i <= BACKFILL_DAYS; i++) {
    const d = new Date();
    d.setDate(d.getDate() - i);
    const iso = d.toISOString().slice(0, 10);

    const { rows: exists } = await query<{ id: number }>(
      `SELECT id FROM drops WHERE drop_date = $1`, [iso]
    );
    if (exists.length) {
      console.log(`[backfill] ${iso} already has drop #${exists[0].id}, skipping`);
      continue;
    }
    try {
      const r = await composeDropForDate({ date: d, itemsPerDrop: 10 });
      // Mark as sent so public archive shows it.
      await query(
        `UPDATE drops SET status='sent', sent_at = $1 WHERE id = $2`,
        [d, r.dropId]
      );
      console.log(`[backfill] ${iso} → drop #${r.dropId}  "${r.subject}"  items=${r.items}`);
    } catch (e) {
      console.warn(`[backfill] ${iso} failed: ${(e as Error).message}`);
    }
  }
  await pool.end();
}

main().catch((e) => { console.error("FATAL", e); process.exit(1); });