#!/usr/bin/env node "use strict"; const Database = require("better-sqlite3"); const path = require("path"); const crypto = require("crypto"); const DB_PATH = path.resolve(__dirname, "../data/data.db"); function callDb(fn) { const db = new Database(DB_PATH, { fileMustExist: true }); try { fn(db); } finally { db.close(); } } function gen(bytes) { return crypto.randomBytes(bytes).toString("hex"); } /** * adduser */ function addUser(args) { const [userName, source] = args; if (!userName || !source) { console.error("usage: adduser "); process.exit(1); } callDb((db) => { const res = db .prepare( ` INSERT INTO users ( user_name, user_source, user_status, user_created_at ) VALUES (?, ?, 1, ?) `, ) .run(userName, source, Date.now()); console.log("user_id:", res.lastInsertRowid); }); } /** * genkey */ function genKey(args) { const [userName] = args; callDb((db) => { const user = db .prepare(`SELECT user_id FROM users WHERE user_name = ?`) .get(userName); if (!user) { console.error("user not found"); process.exit(1); } const apiKey = gen(24); // 48 hex chars const apiSecret = gen(48); // 96 hex chars db.prepare( ` UPDATE users SET user_api_key = ?, user_api_secret = ? WHERE user_id = ? `, ).run(apiKey, apiSecret, user.user_id); console.log("api_key:", apiKey); console.log("api_secret:", apiSecret); }); } /** * disable */ function disableUser(args) { const [userName] = args; callDb((db) => { db.prepare( ` UPDATE users SET user_status = 0 WHERE user_name = ? `, ).run(userName); console.log("user disabled:", userName); }); } /** * list */ function listUser(args) { const [userName] = args; callDb((db) => { const user = db .prepare( ` SELECT user_id, user_name, user_source, user_status, user_api_key, user_created_at FROM users WHERE user_name = ? `, ) .get(userName); if (!user) { console.log("user not found"); return; } console.log(user); }); } /* ======================== */ const argv = process.argv.slice(2); const cmd = argv[0]; const args = argv.slice(1); switch (cmd) { case "adduser": addUser(args); break; case "genkey": genKey(args); break; case "disable": disableUser(args); break; case "list": listUser(args); break; default: console.error("Unknown command"); console.error("Commands: adduser | genkey | disable | list"); process.exit(1); }