diff --git a/buscadorSala.php b/buscadorSala.php index 5d1c20a..6c0b7b2 100644 --- a/buscadorSala.php +++ b/buscadorSala.php @@ -7,6 +7,7 @@ Trivial - Lobby + diff --git a/clases/ClaseEquipoxUsuario.php b/clases/ClaseEquipoxUsuario.php index 326397c..bdd556f 100644 --- a/clases/ClaseEquipoxUsuario.php +++ b/clases/ClaseEquipoxUsuario.php @@ -61,16 +61,16 @@ class EquipoxUsuario } } public function obtenerSalaUsuario($idUsuario) -{ - $conexion = conexionBD(); + { + $conexion = conexionBD(); - if (is_array($conexion)) { - return $conexion; - } + if (is_array($conexion)) { + return $conexion; + } - try { + try { - $sql = " + $sql = " SELECT exu.idEquipo, exp.idPartida @@ -84,41 +84,40 @@ class EquipoxUsuario LIMIT 1 "; - $consulta = $conexion->prepare($sql); + $consulta = $conexion->prepare($sql); - $consulta->bindParam( - ':idUsuario', - $idUsuario, - PDO::PARAM_INT - ); + $consulta->bindParam( + ':idUsuario', + $idUsuario, + PDO::PARAM_INT + ); - $consulta->execute(); + $consulta->execute(); - $resultado = $consulta->fetch(PDO::FETCH_ASSOC); + $resultado = $consulta->fetch(PDO::FETCH_ASSOC); - if (!$resultado) { + if (!$resultado) { + + return [ + 'asociado' => false + ]; + } return [ - 'asociado' => false + 'asociado' => true, + 'idEquipo' => $resultado['idEquipo'], + 'idPartida' => $resultado['idPartida'] + ]; + } catch (PDOException $error) { + + return [ + 'error' => 'Ocurrió un error al obtener la sala del usuario.', + 'error_tecnico' => $error->getMessage() ]; } - - return [ - 'asociado' => true, - 'idEquipo' => $resultado['idEquipo'], - 'idPartida' => $resultado['idPartida'] - ]; - - } catch (PDOException $error) { - - return [ - 'error' => 'Ocurrió un error al obtener la sala del usuario.', - 'error_tecnico' => $error->getMessage() - ]; } -} -public static function salirDeSala($idUsuario) + public static function salirDeSala($idUsuario) { $conexion = conexionBD(); @@ -127,21 +126,190 @@ public static function salirDeSala($idUsuario) } try { - $sql = "DELETE FROM equipoxusuario WHERE idUsuario = :idUsuario"; + + // 1. Averiguamos el equipo y la partida del usuario + $sql = " + SELECT exu.idEquipo, exp.idPartida, p.idUsuario AS idHost FROM equipoxusuario exu INNER JOIN equipoxpartida exp ON exu.idEquipo = exp.idEquipo INNER JOIN partida p ON exp.idPartida = p.idPartida WHERE exu.idUsuario = :idUsuario LIMIT 1"; + $consulta = $conexion->prepare($sql); - $consulta->bindParam(':idUsuario', $idUsuario, PDO::PARAM_INT); + $consulta->bindParam( + ':idUsuario', + $idUsuario, + PDO::PARAM_INT + ); $consulta->execute(); + $datosSala = $consulta->fetch(PDO::FETCH_ASSOC); + + // El usuario no pertenece a ninguna sala + if (!$datosSala) { + return [ + 'error' => 'No perteneces a ninguna sala.' + ]; + } + + $idEquipo = (int)$datosSala['idEquipo']; + $idPartida = (int)$datosSala['idPartida']; + $idHost = (int)$datosSala['idHost']; + + // Comenzamos una transacción + $conexion->beginTransaction(); + + /* + * 2. Comprobamos si quien abandona es el HOST + */ + if ($idUsuario === $idHost) { + + /* + * Obtenemos todos los equipos pertenecientes + * a esta partida. + */ + $sqlEquipos = " + SELECT idEquipo + FROM equipoxpartida + WHERE idPartida = :idPartida + "; + + $consultaEquipos = $conexion->prepare($sqlEquipos); + $consultaEquipos->bindParam( + ':idPartida', + $idPartida, + PDO::PARAM_INT + ); + $consultaEquipos->execute(); + + $equipos = $consultaEquipos->fetchAll(PDO::FETCH_COLUMN); + + /* + * 3. Eliminamos los jugadores de esos equipos + * de la tabla equipoxusuario. + */ + if (!empty($equipos)) { + + $placeholders = implode( + ',', + array_fill(0, count($equipos), '?') + ); + + $sqlUsuarios = " + DELETE FROM equipoxusuario + WHERE idEquipo IN ($placeholders) + "; + + $consultaUsuarios = $conexion->prepare($sqlUsuarios); + $consultaUsuarios->execute($equipos); + } + + /* + * 4. Eliminamos las relaciones + * entre equipos y partida. + */ + $sqlEquipoxPartida = " + DELETE FROM equipoxpartida + WHERE idPartida = :idPartida + "; + + $consultaEquipoxPartida = $conexion->prepare( + $sqlEquipoxPartida + ); + + $consultaEquipoxPartida->bindParam( + ':idPartida', + $idPartida, + PDO::PARAM_INT + ); + + $consultaEquipoxPartida->execute(); + + /* + * 5. Eliminamos los equipos. + * + * Los equipos ya no tienen relaciones con + * usuarios ni con la partida. + */ + if (!empty($equipos)) { + + $placeholders = implode( + ',', + array_fill(0, count($equipos), '?') + ); + + $sqlEliminarEquipos = " + DELETE FROM equipo + WHERE idEquipo IN ($placeholders) + "; + + $consultaEliminarEquipos = + $conexion->prepare($sqlEliminarEquipos); + + $consultaEliminarEquipos->execute($equipos); + } + + /* + * 6. Finalmente eliminamos la partida. + */ + $sqlPartida = " + DELETE FROM partida + WHERE idPartida = :idPartida + "; + + $consultaPartida = $conexion->prepare($sqlPartida); + + $consultaPartida->bindParam( + ':idPartida', + $idPartida, + PDO::PARAM_INT + ); + + $consultaPartida->execute(); + + // Todo ha ido correctamente + $conexion->commit(); + + return [ + 'exito' => true, + 'salaEliminada' => true, + 'mensaje' => 'La sala ha sido eliminada correctamente.' + ]; + } + + /* + * 7. Si NO es el host, simplemente abandona + * su relación con el equipo. + */ + $sqlSalir = " + DELETE FROM equipoxusuario + WHERE idUsuario = :idUsuario + "; + + $consultaSalir = $conexion->prepare($sqlSalir); + + $consultaSalir->bindParam( + ':idUsuario', + $idUsuario, + PDO::PARAM_INT + ); + + $consultaSalir->execute(); + + $conexion->commit(); + return [ 'exito' => true, - 'mensaje' => 'Usuario eliminado de la sala correctamente.' + 'salaEliminada' => false, + 'mensaje' => 'Has abandonado la sala correctamente.' ]; } catch (PDOException $error) { + + // Si había una transacción activa, la deshacemos + if ($conexion->inTransaction()) { + $conexion->rollBack(); + } + return [ - 'error' => 'Ocurrió un error al salir de la sala.', + 'error' => 'Ocurrió un error al abandonar la sala.', 'error_tecnico' => $error->getMessage() ]; } } - } diff --git a/js/buscadorSala.js b/js/buscadorSala.js index b6773b4..857aae5 100644 --- a/js/buscadorSala.js +++ b/js/buscadorSala.js @@ -130,7 +130,7 @@ function mostrarSala(partida, equipos, jugadores) { esHost ? "jugador-host" : "" }">
- ${esHost ? "👑" : "👤"} + ${esHost ? '' : ''} ${escapeHTML(jugador.nombreUsuario)}
@@ -181,7 +181,7 @@ function mostrarSala(partida, equipos, jugadores) { botonIniciarHTML = ` - 🎮 ¡Iniciar Partida! + ¡Iniciar Partida! `; }