Listo (Ctrl + Enter para ejecutar) Bootcamp Fullstack »
app.js
Tab = 4 espacios
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
Vista Previa
Consola Virtual JavaScript