From 4d059d45ef926140af461398ceedd7a6ada6923f Mon Sep 17 00:00:00 2001 From: whidix Date: Sun, 1 Mar 2026 23:38:39 +0100 Subject: [PATCH] feat: add promote admin script to manage user roles --- package.json | 1 + scripts/promote-admin.ts | 55 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 scripts/promote-admin.ts diff --git a/package.json b/package.json index 0038623..4f66a27 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "db:studio": "drizzle-kit studio", "db:import": "npx tsx scripts/import-json.ts", "db:set-daily-mode": "npx tsx scripts/set-daily-mode.ts", + "user:promote-admin": "npx tsx scripts/promote-admin.ts", "auth:schema": "npx @better-auth/cli generate --config src/lib/server/auth.ts --output src/lib/server/db/auth.schema.ts --yes", "scrape": "npx tsx scripts/scrape-onepiece.ts" }, diff --git a/scripts/promote-admin.ts b/scripts/promote-admin.ts new file mode 100644 index 0000000..422d99d --- /dev/null +++ b/scripts/promote-admin.ts @@ -0,0 +1,55 @@ +import { createClient } from '@libsql/client'; +import { drizzle } from 'drizzle-orm/libsql'; +import { eq } from 'drizzle-orm'; +import { user } from '../src/lib/server/db/auth.schema'; + +const DATABASE_URL = process.env.DATABASE_URL || 'file:local.db'; + +function getErrorMessage(error: unknown): string { + return error instanceof Error ? error.message : String(error); +} + +async function promoteAdmin(): Promise { + const email = process.argv[2]?.trim(); + + if (!email) { + console.error('❌ Missing email argument'); + console.error('Usage: npm run user:promote-admin -- '); + process.exit(1); + } + + const client = createClient({ url: DATABASE_URL }); + const db = drizzle(client); + + try { + const existingUsers = await db.select().from(user).where(eq(user.email, email)).limit(1); + const targetUser = existingUsers[0]; + + if (!targetUser) { + console.error(`❌ User not found for email: ${email}`); + process.exit(1); + } + + if (targetUser.isAdmin) { + console.log(`ℹ️ User is already admin: ${targetUser.email}`); + return; + } + + await db + .update(user) + .set({ isAdmin: true }) + .where(eq(user.id, targetUser.id)); + + console.log(`✅ Admin granted to: ${targetUser.email}`); + } catch (error) { + console.error(`❌ Failed to promote admin: ${getErrorMessage(error)}`); + process.exit(1); + } finally { + client.close(); + } +} + +promoteAdmin().catch((error) => { + console.error(getErrorMessage(error)); + process.exit(1); +});