1
// 1. Roles del Sistema Inmutables (Sellados con freeze)
const ROLES = Object.freeze({
ADMIN: "administrador",
ESTUDIANTE: "estudiante",
DOCENTE: "docente"
});
// 2. Clases Especializadas de Usuario
class UsuarioBase {
#id;
constructor(id, nombre, email, rol, permisos) {
this.#id = id;
this.nombre = nombre;
this.email = email;
this.rol = rol;
// Congelamos la lista de permisos para que nadie pueda inyectar privilegios
this.permisos = Object.freeze([...permisos]);
}
tienePermiso(permiso) {
return this.permisos.includes(permiso);
}
obtenerPerfil() {
return `[#${this.#id}] ${this.nombre} (${this.rol.toUpperCase()}) | Permisos: [${this.permisos.join(", ")}]`;
}
}
// 3. Patrón Factory (Factoría Centralizada)
class UsuarioFactory {
static #contadorId = 1;
static crearUsuario(tipo, nombre, email) {
const id = UsuarioFactory.#contadorId++;
switch (tipo.toLowerCase()) {
case 'admin':
return new UsuarioBase(
id,
nombre,
email,
ROLES.ADMIN,
['leer', 'crear', 'editar', 'eliminar', 'configurar_sistema']
);
case 'docente':
return new UsuarioBase(
id,
nombre,
email,
ROLES.DOCENTE,
['leer', 'crear', 'editar', 'calificar']
);
case 'estudiante':
return new UsuarioBase(
id,
nombre,
email,
ROLES.ESTUDIANTE,
['leer', 'enviar_tareas']
);
default:
throw new Error(`Tipo de usuario desconocido: ${tipo}`);
}
}
}
// ==========================================
// PRUEBA EN EL SANDBOX
// ==========================================
console.log("=== CREACIÓN DE USUARIOS VÍA FACTORY ===");
const admin = UsuarioFactory.crearUsuario('admin', 'Carlos Mendoza', '[email protected]');
const profe = UsuarioFactory.crearUsuario('docente', 'Valeria Torres', '[email protected]');
const alumno = UsuarioFactory.crearUsuario('estudiante', 'Mateo Silva', '[email protected]');
console.log(admin.obtenerPerfil());
console.log(profe.obtenerPerfil());
console.log(alumno.obtenerPerfil());
console.log("\n=== COMPROBACIÓN DE PERMISOS ===");
console.log("¿El alumno puede eliminar?:", alumno.tienePermiso('eliminar')); // false
console.log("¿El admin puede configurar el sistema?:", admin.tienePermiso('configurar_sistema')); // true
console.log("\n=== PRUEBA DE INMUTABILIDAD CON OBJECT.FREEZE ===");
// Intento de mutar la lista de permisos congelada:
try {
alumno.permisos.push('eliminar'); // Fallará porque el array está congelado
} catch (e) {
console.log("✔ Intento de inyectar permisos bloqueado por Object.freeze():", e.message);
}
console.log("Permisos del alumno intactos:", alumno.permisos);
Haz clic para editar este código