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