56 lines
1.8 KiB
JavaScript
56 lines
1.8 KiB
JavaScript
#!/usr/bin/env node
|
|
// ─────────────────────────────────────────────────────────────
|
|
// bin/invite.js — add / remove / list invites.
|
|
//
|
|
// Usage:
|
|
// npm run invite -- add someone@example.com
|
|
// npm run invite -- remove someone@example.com
|
|
// npm run invite -- list
|
|
//
|
|
// Or directly:
|
|
// node bin/invite.js add someone@example.com
|
|
// ─────────────────────────────────────────────────────────────
|
|
import { q } from '../src/db.js';
|
|
|
|
const [, , cmd, arg] = process.argv;
|
|
const EMAIL_RE = /^[^@\s]+@[^@\s]+\.[^@\s]+$/;
|
|
|
|
function help() {
|
|
console.log('Usage:');
|
|
console.log(' invite add <email>');
|
|
console.log(' invite remove <email>');
|
|
console.log(' invite list');
|
|
process.exit(1);
|
|
}
|
|
|
|
switch (cmd) {
|
|
case 'add': {
|
|
if (!arg || !EMAIL_RE.test(arg)) help();
|
|
const email = arg.trim().toLowerCase();
|
|
q.upsertInvite.run(email, Date.now(), 'cli');
|
|
console.log(`Invited ${email}`);
|
|
break;
|
|
}
|
|
case 'remove': {
|
|
if (!arg || !EMAIL_RE.test(arg)) help();
|
|
const email = arg.trim().toLowerCase();
|
|
const result = q.deleteInvite.run(email);
|
|
console.log(result.changes > 0 ? `Removed ${email}` : `No invite for ${email}`);
|
|
break;
|
|
}
|
|
case 'list': {
|
|
const rows = q.listInvites.all();
|
|
if (rows.length === 0) {
|
|
console.log('(no invites)');
|
|
} else {
|
|
for (const r of rows) {
|
|
const d = new Date(r.invited_at).toISOString().slice(0, 10);
|
|
console.log(` ${d} ${r.email}${r.invited_by ? ` (by ${r.invited_by})` : ''}`);
|
|
}
|
|
console.log(`\n${rows.length} invite${rows.length === 1 ? '' : 's'} total.`);
|
|
}
|
|
break;
|
|
}
|
|
default:
|
|
help();
|
|
}
|