feat(ST-l9kkxh2m): CLI-script scripts/create-admin.ts voor admin-bootstrap

- Maakt user aan als die niet bestaat, anders upgrade bestaande user
- Upsert ADMIN in user_roles (idempotent)
- Helder foutbericht als argumenten ontbreken (process.exit(1))
- package.json scripts: "create-admin": "tsx scripts/create-admin.ts"
This commit is contained in:
Scrum4Me Agent 2026-05-05 14:34:10 +02:00
parent a19ae89e37
commit b760ec625e
2 changed files with 59 additions and 0 deletions

View file

@ -15,6 +15,7 @@
"db:erd": "prisma generate", "db:erd": "prisma generate",
"db:erd:watch": "chokidar \"prisma/schema.prisma\" -c \"npm run db:erd\"", "db:erd:watch": "chokidar \"prisma/schema.prisma\" -c \"npm run db:erd\"",
"db:insert-milestone": "tsx scripts/insert-milestone.ts", "db:insert-milestone": "tsx scripts/insert-milestone.ts",
"create-admin": "tsx scripts/create-admin.ts",
"seed": "prisma db seed", "seed": "prisma db seed",
"docs:index": "node scripts/generate-docs-index.mjs", "docs:index": "node scripts/generate-docs-index.mjs",
"docs:check-links": "node scripts/check-doc-links.mjs", "docs:check-links": "node scripts/check-doc-links.mjs",

58
scripts/create-admin.ts Normal file
View file

@ -0,0 +1,58 @@
// Maak een admin-user aan of upgrade een bestaande user naar ADMIN-rol.
//
// Gebruik:
// npx tsx scripts/create-admin.ts <username> <password>
import { PrismaClient } from '@prisma/client'
import { Pool } from 'pg'
import { PrismaPg } from '@prisma/adapter-pg'
import * as bcrypt from 'bcryptjs'
import * as dotenv from 'dotenv'
import * as path from 'path'
const root = path.resolve(__dirname, '..')
dotenv.config({ path: path.join(root, '.env.local'), override: true })
dotenv.config({ path: path.join(root, '.env') })
const [username, password] = process.argv.slice(2)
if (!username || !password) {
console.error('Usage: npx tsx scripts/create-admin.ts <username> <password>')
process.exit(1)
}
const url = process.env.DIRECT_URL || process.env.DATABASE_URL
if (!url) {
console.error('Fout: DATABASE_URL is niet ingesteld.')
process.exit(1)
}
const pool = new Pool({ connectionString: url })
const adapter = new PrismaPg(pool)
const prisma = new PrismaClient({ adapter })
async function main() {
let user = await prisma.user.findUnique({ where: { username } })
if (!user) {
const password_hash = await bcrypt.hash(password, 12)
user = await prisma.user.create({ data: { username, password_hash } })
console.log(`Gebruiker '${username}' aangemaakt.`)
} else {
console.log(`Gebruiker '${username}' gevonden — rol wordt geüpgraded.`)
}
await prisma.userRole.upsert({
where: { user_id_role: { user_id: user.id, role: 'ADMIN' } },
create: { user_id: user.id, role: 'ADMIN' },
update: {},
})
console.log(`Admin-rol toegewezen aan '${username}'.`)
}
main()
.catch((err) => {
console.error('Fout:', err.message)
process.exit(1)
})
.finally(() => prisma.$disconnect())