// Set a user's access role ("user" or "admin") by email. // // Usage (PowerShell): // $env:PB_URL="http://10.2.1.10:8027" // $env:PB_ADMIN_EMAIL="admin@carcontrole.local" // $env:PB_ADMIN_PASSWORD="..." // node scripts/set-role.mjs const PB_URL = (process.env.PB_URL || "http://10.2.1.10:8027").replace(/\/+$/, ""); const ADMIN_EMAIL = process.env.PB_ADMIN_EMAIL; const ADMIN_PASSWORD = process.env.PB_ADMIN_PASSWORD; const [, , email, role] = process.argv; if (!ADMIN_EMAIL || !ADMIN_PASSWORD) { console.error("Set PB_ADMIN_EMAIL and PB_ADMIN_PASSWORD."); process.exit(1); } if (!email || !role || !["user", "admin"].includes(role)) { console.error("Usage: node scripts/set-role.mjs "); process.exit(1); } async function authenticate() { for (const ep of [ "/api/collections/_superusers/auth-with-password", "/api/admins/auth-with-password", ]) { const res = await fetch(PB_URL + ep, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ identity: ADMIN_EMAIL, password: ADMIN_PASSWORD }), }); if (res.ok) return (await res.json()).token; } throw new Error("Admin authentication failed."); } async function main() { console.log(`Connecting to ${PB_URL} ...`); const token = await authenticate(); const q = new URLSearchParams({ filter: `email='${email.replace(/'/g, "")}'`, perPage: "1" }); const res = await fetch(`${PB_URL}/api/collections/users/records?${q}`, { headers: { Authorization: token }, }); if (!res.ok) throw new Error(`lookup failed: ${res.status} ${await res.text()}`); const items = (await res.json()).items || []; if (items.length === 0) throw new Error(`no user with email ${email}`); const upd = await fetch(`${PB_URL}/api/collections/users/records/${items[0].id}`, { method: "PATCH", headers: { "Content-Type": "application/json", Authorization: token }, body: JSON.stringify({ role }), }); if (!upd.ok) throw new Error(`update failed: ${upd.status} ${await upd.text()}`); console.log(`✓ ${email} role set to "${role}"`); } main().catch((err) => { console.error("\nFailed:", err.message); process.exit(1); });