142 lines
3.7 KiB
JavaScript
142 lines
3.7 KiB
JavaScript
#!/usr/bin/env node
|
|
/**
|
|
* Script para criar usuário administrador
|
|
*
|
|
* Uso:
|
|
* node scripts/create-admin.js [username] [password] [email] [fullName]
|
|
*
|
|
* Exemplo:
|
|
* node scripts/create-admin.js admin admin1234 [email protected] "Administrador"
|
|
*/
|
|
|
|
import bcrypt from "bcryptjs";
|
|
import mongoose from "mongoose";
|
|
import dotenv from "dotenv";
|
|
import { fileURLToPath } from 'url';
|
|
import { dirname, join } from 'path';
|
|
|
|
const __filename = fileURLToPath(import.meta.url);
|
|
const __dirname = dirname(__filename);
|
|
|
|
function normalizeName(value) {
|
|
if (!value || typeof value !== "string") return "";
|
|
return value
|
|
.normalize("NFD")
|
|
.replace(/[\u0300-\u036f]/g, "")
|
|
.toLowerCase()
|
|
.replace(/\s+/g, " ")
|
|
.trim();
|
|
}
|
|
|
|
// Carregar .env do diretório raiz
|
|
dotenv.config({ path: join(__dirname, '../.env') });
|
|
|
|
const MONGODB_URI = process.env.MONGODB_URI || process.env.MONGO_URI || "mongodb://localhost:27017/course-plat";
|
|
|
|
// Schema do User (replicado para não depender do Next.js)
|
|
const UserSchema = new mongoose.Schema({
|
|
username: {
|
|
type: String,
|
|
required: true,
|
|
unique: true,
|
|
trim: true,
|
|
lowercase: true,
|
|
},
|
|
passwordHash: {
|
|
type: String,
|
|
required: true,
|
|
},
|
|
email: {
|
|
type: String,
|
|
unique: true,
|
|
sparse: true,
|
|
trim: true,
|
|
lowercase: true,
|
|
},
|
|
fullName: {
|
|
type: String,
|
|
required: true,
|
|
trim: true,
|
|
},
|
|
dateOfBirth: {
|
|
type: Date,
|
|
required: true,
|
|
},
|
|
roles: {
|
|
type: [String],
|
|
enum: ["student", "parent", "guardian", "teacher", "admin"],
|
|
required: true,
|
|
default: ["student"],
|
|
},
|
|
guardiansAccounts: [{
|
|
type: mongoose.Schema.Types.ObjectId,
|
|
ref: "User",
|
|
}],
|
|
wardAccounts: [{
|
|
type: mongoose.Schema.Types.ObjectId,
|
|
ref: "User",
|
|
}],
|
|
createdAt: { type: Date, default: Date.now },
|
|
modifiedAt: { type: Date, default: Date.now },
|
|
}, {
|
|
collection: 'users' // Garantir que use a coleção correta
|
|
});
|
|
|
|
async function createAdmin(username, password, email, fullName) {
|
|
try {
|
|
console.log("Conectando ao MongoDB...");
|
|
console.log(`URI: ${MONGODB_URI.replace(/:[^:@]*@/, ':****@')}`);
|
|
await mongoose.connect(MONGODB_URI);
|
|
console.log("✓ Conectado!");
|
|
|
|
const User = mongoose.model('User', UserSchema);
|
|
|
|
const existingUser = await User.findOne({ username });
|
|
if (existingUser) {
|
|
// Adiciona role admin ao usuário existente
|
|
await User.updateOne(
|
|
{ username },
|
|
{ $addToSet: { roles: "admin" } }
|
|
);
|
|
console.log(`✓ Usuário "${username}" atualizado com role admin!`);
|
|
} else {
|
|
// Cria novo usuário admin
|
|
const passwordHash = await bcrypt.hash(password, 10);
|
|
await User.create({
|
|
username,
|
|
passwordHash,
|
|
email,
|
|
fullName,
|
|
dateOfBirth: new Date("1990-01-01"),
|
|
roles: ["admin"],
|
|
});
|
|
console.log(`✓ Usuário admin "${username}" criado com sucesso!`);
|
|
console.log(` Email: ${email}`);
|
|
console.log(` Senha: ${password}`);
|
|
}
|
|
|
|
// Verificar
|
|
const user = await User.findOne({ username });
|
|
console.log(`\nRoles atuais: ${user.roles.join(", ")}`);
|
|
|
|
} catch (error) {
|
|
console.error("Erro ao criar admin:", error);
|
|
process.exit(1);
|
|
} finally {
|
|
await mongoose.disconnect();
|
|
}
|
|
}
|
|
|
|
// Args da linha de comando ou valores padrão
|
|
const args = process.argv.slice(2);
|
|
const username = normalizeName(args[0] || "admin").replace(/\s+/g, "");
|
|
const password = args[1] || "admin1234";
|
|
const email = args[2] || "[email protected]";
|
|
const fullName = normalizeName(args[3] || "Administrador");
|
|
|
|
console.log(`\nCriando admin: ${username}`);
|
|
console.log(`Senha: ${password}`);
|
|
console.log(`Email: ${email}\n`);
|
|
|
|
createAdmin(username, password, email, fullName);
|