← 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); });