Initial commit

This commit is contained in:
Rafael Dias Martins
2026-08-31 14:10:20 -03:00
commit 8fcb5aac66
454 changed files with 60207 additions and 0 deletions
+141
View File
@@ -0,0 +1,141 @@
#!/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);