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:
parent
a19ae89e37
commit
b760ec625e
2 changed files with 59 additions and 0 deletions
|
|
@ -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
58
scripts/create-admin.ts
Normal 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())
|
||||||
Loading…
Add table
Add a link
Reference in a new issue