Carpeta controllers

This commit is contained in:
Axel Axt
2026-08-04 19:20:18 -03:00
parent f13321f90c
commit 24ae0e327f
14 changed files with 6971 additions and 0 deletions
+386
View File
@@ -0,0 +1,386 @@
<?php
// Validacion de token
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!isset($_POST['csrf_token']) || !hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) { // Recorre todos los caracteres (siempre) y retorna true or false
$_SESSION['flash_error'] = 'Acción inválida.';
header('Location: index.php?opt=inicio_operador');
exit;
}
}
// Requiere modelo de usuario
require_once __DIR__ . '/../models/usuarioModel.php';
$usuariomodel = new usuarioModel();
// Validar sesión
if (!isset($_SESSION['user'])) {
header("Location: index.php?opt=login_operador");
exit;
}
$user = $_SESSION['user']; // Defino el array del usuario dentro de una variable
$rol = $user['rol']; // Defino el rol dentro de la variable
$esAdmin = ($rol === 'admin'); // Variable booleana, true = admin
$opt = $_GET['opt'] ?? null;
// Manejo de opciones enviadas por URL
switch ($opt) {
// USUARIO REQUIERE SUS DATOS, O ADMIN BUSCA EDITAR UNO
case 'datos_usuario':
$idEditar = null;
$idEditar = (int) ($_GET['id'] ?? $user['id']);
if ($idEditar <= 0) {
header("Location: index.php?opt=usuarios");
exit;
}
// Buscamos el usuario en la base mediante el ID
$usuario = $usuariomodel->obtenerPorId($idEditar);
if (!$usuario) {
$_SESSION['flash_error'] = "No se encontró el usuario.";
header("Location: index.php?opt=usuarios"); // Si no se encontró al usuario se redirige a la lista de usuarios
exit;
}
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
if ($esAdmin) {
$return = 'inicio_admin';
} else {
$return = 'inicio_operador';
}
$_SESSION['return_opt'] = $_GET['from'] ?? "$return";
$return = $_SESSION['return_opt'];
ob_start();
require __DIR__ . '/../views/usuarios/datosUsuarioView.php';
return ob_get_clean();
}
// En caso de modificar datos de un usuario
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// Si no es admin no puede editar usuarios
if (!$esAdmin) {
header("Location: index.php?opt=home_operador");
exit;
}
$nombre = trim($_POST['nombre'] ?? '');
$apellido = trim($_POST['apellido'] ?? '');
$email = trim($_POST['email'] ?? '');
$telefono = trim($_POST['telefono'] ?? '');
$password = trim($_POST['password'] ?? '');
$usuarioInput = $usuario['usuario'] ?? '';
$rol = trim($_POST['rol']) ?? 'operador';
$errores = [];
// Validaciones
if ($nombre === '') {
$errores[] = "El nombre no puede estar vacío.";
} elseif (!preg_match("/^[A-ZÁÉÍÓÚÑ][a-záéíóúñ]+(?: [A-ZÁÉÍÓÚÑ][a-záéíóúñ]+)*$/", $nombre)) {
$errores[] = "El nombre debe comenzar con mayúscula y solo contener letras y espacios.";
} elseif (strlen($nombre) < 2) {
$errores[] = "El nombre debe tener al menos 2 caracteres.";
} elseif (strlen($nombre) > 50) {
$errores[] = "El nombre no puede superar los 50 caracteres.";
}
if ($apellido === '') {
$errores[] = "El apellido no puede estar vacío.";
} elseif (!preg_match("/^[A-ZÁÉÍÓÚÑ][a-záéíóúñ]+(?: [A-ZÁÉÍÓÚÑ][a-záéíóúñ]+)*$/", $apellido)) {
$errores[] = "El apellido debe comenzar con mayúscula y solo contener letras y espacios.";
} elseif (strlen($apellido) < 2) {
$errores[] = "El apellido debe tener al menos 2 caracteres.";
} elseif (strlen($apellido) > 50) {
$errores[] = "El apellido no puede superar los 50 caracteres.";
}
if ($email === '') {
$errores[] = "El email no puede estar vacío.";
} elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$errores[] = "Formato de email inválido.";
} elseif (strlen($email) > 100) {
$errores[] = "El email no puede superar los 100 caracteres.";
}
if ($telefono === '') {
$errores[] = "El teléfono no puede estar vacío.";
} else if (!preg_match('/^[0-9]{10}$/', $telefono)) {
$errores[] = "El teléfono debe tener 10 dígitos.";
}
// Password (si se ingresa)
if (!empty($password)) {
if ($password === '') {
$errores[] = "La contraseña no puede estar vacía.";
} elseif (strpos($password, ' ') !== false) {
$errores[] = "La contraseña no puede contener espacios.";
} elseif (!preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{6,}$/', $password)) {
$errores[] = "La contraseña debe tener al menos una mayúscula, una minúscula y un número, y mínimo 6 caracteres.";
}
}
if (!in_array($rol, ['admin', 'operador'], true)) {
$errores[] = "El rol es incorrecto.";
}
// Un admin no puede modificar su rol
if (($idEditar === $user['id']) && ($rol === 'operador')) {
$_SESSION['flash_error'] = 'No puede modificar su propio rol';
header("Location: index.php?opt=datos_usuario&id=$idEditar&from=usuarios");
exit;
}
if (!empty($errores)) {
$_SESSION['flash_error'] = implode('<br>', $errores); // Se guarda en $_SESSION el error
header("Location: index.php?opt=datos_usuario&id=$idEditar&from=usuarios");
exit;
}
// Verificación de existencia de usuario
if ($usuariomodel->verificarExistencia([
'nombre' => $nombre,
'apellido' => $apellido,
'email' => $email,
'usuario' => $usuarioInput
], $idEditar)) {
$_SESSION['flash_error'] = "El usuario ya existe o el mail ya está registrado.";
header("Location: index.php?opt=datos_usuario&id=$idEditar&from=usuarios");
exit;
}
$guardarData = [
'nombre' => $nombre,
'apellido' => $apellido,
'email' => $email,
'telefono' => $telefono,
'usuario' => $usuarioInput,
'rol' => $rol
];
if (!empty($password)) {
$guardarData['password'] = password_hash($password, PASSWORD_DEFAULT); // Hasheo de contraseña
}
// Actualiza los datos del usuario
if ($usuariomodel->actualizarUsuario($idEditar, $guardarData)) {
$_SESSION['flash_success'] = 'Datos actualizados correctamente.'; // Se guarda en $_SESSION el success
} else {
$_SESSION['flash_error'] = 'No se pudo actualizar los datos.';
}
if ($idEditar === $user['id']) {
$_SESSION['user'] = $usuariomodel->obtenerPorId($idEditar);
}
header("Location: index.php?opt=usuarios");
exit;
}
// LISTAR USUARIOS
case 'usuarios':
if (!$esAdmin) {
header("Location: index.php?opt=home_operador");
exit;
}
// Utilizamos el modelo para obtener la lista completa de usuarios
$usuarios = $usuariomodel->listarUsuarios();
ob_start();
require __DIR__ . '/../views/usuarios/listaUsuariosView.php';
return ob_get_clean();
// CREACIÓN DE NUEVO USUARIO
case 'crear_usuario':
if (!$esAdmin) {
header("Location: index.php?opt=home_operador");
exit;
}
// Se requiere la view del form
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
ob_start();
require __DIR__ . '/../views/usuarios/crearUsuarioView.php';
return ob_get_clean();
}
// Datos recibidos del POST del formulario
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$nombre = trim($_POST['nombre'] ?? '');
$apellido = trim($_POST['apellido'] ?? '');
$email = trim($_POST['email'] ?? '');
$telefono = trim($_POST['telefono'] ?? '');
$usuarioInput = trim($_POST['usuario'] ?? '');
$password = trim($_POST['password'] ?? '');
$rol = trim($_POST['rol']) ?? 'operador';
$errores = [];
// Validaciones
if ($nombre === '') {
$errores[] = "El nombre no puede estar vacío.";
} elseif (!preg_match("/^[A-ZÁÉÍÓÚÑ][a-záéíóúñ]+(?: [A-ZÁÉÍÓÚÑ][a-záéíóúñ]+)*$/", $nombre)) {
$errores[] = "El nombre debe comenzar con mayúscula y solo contener letras y espacios.";
} elseif (strlen($nombre) < 2) {
$errores[] = "El nombre debe tener al menos 2 caracteres.";
} elseif (strlen($nombre) > 50) {
$errores[] = "El nombre no puede superar los 50 caracteres.";
}
if ($apellido === '') {
$errores[] = "El apellido no puede estar vacío.";
} elseif (!preg_match("/^[A-ZÁÉÍÓÚÑ][a-záéíóúñ]+(?: [A-ZÁÉÍÓÚÑ][a-záéíóúñ]+)*$/", $apellido)) {
$errores[] = "El apellido debe comenzar con mayúscula y solo contener letras y espacios.";
} elseif (strlen($apellido) < 2) {
$errores[] = "El apellido debe tener al menos 2 caracteres.";
} elseif (strlen($apellido) > 50) {
$errores[] = "El apellido no puede superar los 50 caracteres.";
}
if ($email === '') {
$errores[] = "El email no puede estar vacío.";
} elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$errores[] = "Formato de email inválido.";
} elseif (strlen($email) > 100) {
$errores[] = "El email no puede superar los 100 caracteres.";
}
if ($telefono === '') {
$errores[] = "El teléfono no puede estar vacío.";
} else if (!preg_match('/^[0-9]{10}$/', $telefono)) {
$errores[] = "El teléfono debe tener 10 dígitos.";
}
if ($usuarioInput === '') {
$errores[] = "El usuario no puede estar vacío.";
} elseif (!preg_match('/^[a-zA-Z0-9._]+$/', $usuarioInput)) {
$errores[] = "El usuario solo puede contener letras, números, puntos y guiones bajos.";
} elseif (strlen($usuarioInput) < 5) {
$errores[] = "El usuario debe tener al menos 5 caracteres.";
} elseif (strlen($usuarioInput) > 30) {
$errores[] = "El usuario no puede superar los 30 caracteres.";
}
if ($password === '') {
$errores[] = "La contraseña no puede estar vacía.";
} elseif (strpos($password, ' ') !== false) {
$errores[] = "La contraseña no puede contener espacios.";
} elseif (!preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{6,}$/', $password)) {
$errores[] = "La contraseña debe tener al menos una mayúscula, una minúscula y un número, y mínimo 6 caracteres.";
}
if (!in_array($rol, ['admin', 'operador'], true)) {
$rol = 'operador';
}
if (!empty($errores)) {
$_SESSION['flash_error'] = implode('<br>', $errores);
header("Location: index.php?opt=crear_usuario");
exit;
}
// Verificación de existencia de usuario
if ($usuariomodel->verificarExistencia([
'nombre' => $nombre,
'apellido' => $apellido,
'email' => $email,
'usuario' => $usuarioInput
])) {
$_SESSION['flash_error'] = "El usuario ya existe o el mail ya está registrado.";
header("Location: index.php?opt=crear_usuario");
exit;
}
// Se llama a la función para crear el usuario
if ($usuariomodel->crearUsuario([
'nombre' => $nombre,
'apellido' => $apellido,
'email' => $email,
'telefono' => $telefono,
'usuario' => $usuarioInput,
'password' => password_hash($password, PASSWORD_DEFAULT),
'rol' => $rol
])) {
$_SESSION['flash_success'] = 'Usuario creado correctamente';
} else {
$_SESSION['flash_error'] = 'Ocurrió un error al crear el usuario.';
}
header("Location: index.php?opt=usuarios");
exit;
}
// ELIMINAR USUARIO (BAJA LÓGICA)
case 'eliminar_usuario':
$idEliminar = $_POST['id'] ?? 0;
if ($idEliminar <= 0) {
header("Location: index.php?opt=usuarios");
exit;
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if ($idEliminar == $user['id']) {
$_SESSION['flash_error'] = "No puede eliminar su usuario.";
header("Location:index.php?opt=usuarios");
exit;
}
if ($usuariomodel->eliminarUsuario($idEliminar)) {
$_SESSION['flash_success'] = "Usuario eliminado correctamente.";
} else {
$_SESSION['flash_error'] = "Ocurrió un error al eliminar el usuario.";
}
header("Location:index.php?opt=usuarios");
exit;
}
// DEFAULT (404)
default:
ob_start();
require __DIR__ . '/../views/404View.php';
return ob_get_clean();
}