64 lines
2.2 KiB
JavaScript
64 lines
2.2 KiB
JavaScript
// 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 <email> <user|admin>
|
|
|
|
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 <email> <user|admin>");
|
|
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);
|
|
});
|