← back to Nineoh Guide

db/review.mjs

41 lines

// Human content-review workflow for the AI-drafted recaps + bios.
//   node db/review.mjs status            → counts by review status
//   node db/review.mjs read <season>     → print a season's recaps to read
//   node db/review.mjs ok-recaps <season> → mark that season's recaps 'reviewed'
//   node db/review.mjs ok-bios           → mark all bios 'reviewed'
// Nothing here is destructive; it only flips the *_status gate columns.
import pg from "pg";

const DATABASE_URL =
  process.env.DATABASE_URL ?? "postgresql://localhost/nineoh_guide?host=/tmp";
const pool = new pg.Pool({ connectionString: DATABASE_URL });
const [cmd, arg] = process.argv.slice(2);

if (cmd === "status") {
  const r = await pool.query(`select recap_status, count(*) from episodes group by 1 order by 1`);
  const b = await pool.query(`select bio_status, count(*) from cast_people group by 1 order by 1`);
  console.log("Recaps:"); console.table(r.rows);
  console.log("Bios:"); console.table(b.rows);
} else if (cmd === "read") {
  const s = Number(arg);
  const { rows } = await pool.query(
    `select episode_number, title, summary_short_original
       from episodes where season_number=$1 order by episode_number`,
    [s]
  );
  for (const e of rows) console.log(`\nS${s}E${e.episode_number} · ${e.title}\n  ${e.summary_short_original ?? "(no recap)"}`);
} else if (cmd === "ok-recaps") {
  const s = Number(arg);
  const r = await pool.query(
    `update episodes set recap_status='reviewed' where season_number=$1 and recap_status='ai-draft'`,
    [s]
  );
  console.log(`Season ${s}: ${r.rowCount} recaps marked reviewed.`);
} else if (cmd === "ok-bios") {
  const r = await pool.query(`update cast_people set bio_status='reviewed' where bio_status='ai-draft'`);
  console.log(`${r.rowCount} bios marked reviewed.`);
} else {
  console.log("usage: node db/review.mjs status | read <season> | ok-recaps <season> | ok-bios");
}
await pool.end();