17 lines
1.1 KiB
JavaScript
17 lines
1.1 KiB
JavaScript
// Sage, 2026-10-21: read-only. Prints id, done, title, the last update and the description as plain text for the
|
|
// given P19 tasks, with the sync key. Writes nothing. Prints no secret.
|
|
// Usage: node read-tasks.mjs https://tasks.woltje.com SYNC_TOKEN_FILE ID...
|
|
import { readFileSync } from "node:fs";
|
|
const [ORIGIN, SYNC, ...IDS] = process.argv.slice(2);
|
|
if (!/^https:\/\/tasks\.woltje\.com$/.test(ORIGIN)) throw new Error("tasks.woltje.com only");
|
|
const sync = readFileSync(SYNC, "utf8").trim();
|
|
const text = (h) => (h ?? "").replace(/<\/p>|<br\s*\/?>|<\/li>/g, "\n").replace(/<[^>]+>/g, "").replace(/</g, "<").replace(/>/g, ">").replace(/&/g, "&").trim();
|
|
for (const id of IDS) {
|
|
const r = await fetch(`${ORIGIN}/api/v2/tasks/${id}`, { headers: { Authorization: `Bearer ${sync}` }, redirect: "error" });
|
|
const j = await r.json().catch(() => null);
|
|
if (r.status !== 200 || j?.project_id !== 19) { console.log(`== ${id}: status ${r.status}, not P19`); continue; }
|
|
const out = `== ${id} done=${j.done} updated=${j.updated}\n${j.title}\n${text(j.description)}\n`;
|
|
if (out.includes(sync)) throw new Error("secret in output");
|
|
console.log(out);
|
|
}
|