82 lines
1.7 KiB
JavaScript
82 lines
1.7 KiB
JavaScript
const postgres = require("postgres");
|
|
const { hash } = require("bcryptjs");
|
|
const crypto = require("node:crypto");
|
|
|
|
async function main() {
|
|
const connectionString = requireEnv("DATABASE_URL");
|
|
|
|
if (!connectionString) {
|
|
throw new Error("DATABASE_URL is required");
|
|
}
|
|
|
|
const email = (
|
|
process.env.SUPER_ADMIN_EMAIL || "superadmin@training-system.local"
|
|
)
|
|
.trim()
|
|
.toLowerCase();
|
|
const name = "Super Admin".trim();
|
|
const password = "SuperAdmin123!".trim();
|
|
|
|
if (password.length < 8) {
|
|
throw new Error("SUPER_ADMIN_PASSWORD must be at least 8 characters");
|
|
}
|
|
|
|
const sql = postgres(connectionString, { prepare: false });
|
|
|
|
try {
|
|
const passwordHash = await hash(password, 10);
|
|
const existingUser = await sql`
|
|
select id
|
|
from users
|
|
where email = ${email}
|
|
limit 1
|
|
`;
|
|
|
|
if (existingUser.length > 0) {
|
|
await sql`
|
|
update users
|
|
set
|
|
name = ${name},
|
|
password_hash = ${passwordHash},
|
|
system_role = 'super_admin',
|
|
is_active = true,
|
|
updated_at = now()
|
|
where id = ${existingUser[0].id}
|
|
`;
|
|
|
|
console.log(`Updated existing super admin: ${email}`);
|
|
return;
|
|
}
|
|
|
|
const userId = crypto.randomUUID();
|
|
|
|
await sql`
|
|
insert into users (
|
|
id,
|
|
name,
|
|
email,
|
|
password_hash,
|
|
system_role,
|
|
is_active
|
|
)
|
|
values (
|
|
${userId},
|
|
${name},
|
|
${email},
|
|
${passwordHash},
|
|
'super_admin',
|
|
true
|
|
)
|
|
`;
|
|
|
|
console.log(`Created super admin: ${email}`);
|
|
} finally {
|
|
await sql.end({ timeout: 1 });
|
|
}
|
|
}
|
|
|
|
main().catch((error) => {
|
|
console.error("Failed to seed super admin.", error);
|
|
process.exitCode = 1;
|
|
});
|