idEquipoxUsuario = $idEquipoxUsuario; $this->idUsuario = $idUsuario; $this->idEquipo = $idEquipo; } public function registrarUsuarioEnEquipo() { $conexion = conexionBD(); if (is_array($conexion)) return $conexion; try { $sql = "INSERT INTO equipoxusuario (idUsuario, idEquipo) VALUES (:idUsuario, :idEquipo)"; $consulta = $conexion->prepare($sql); $consulta->bindParam(':idUsuario', $this->idUsuario); $consulta->bindParam(':idEquipo', $this->idEquipo); $consulta->execute(); return [ 'exito' => 'Usuario vinculado al equipo correctamente.', 'exito_tecnico' => $conexion->lastInsertId() ]; } catch (PDOException $error) { return [ 'error' => 'Ocurrió un error al unir al usuario con el equipo.', 'error_tecnico' => $error->getMessage() ]; } } public static function listarUsuariosPorEquipo($idEquipo) { $conexion = conexionBD(); if (is_array($conexion)) return $conexion; try { $sql = "SELECT u.* FROM equipoxusuario exu INNER JOIN usuario u ON exu.idUsuario = u.idUsuario WHERE exu.idEquipo = :idEquipo"; $consulta = $conexion->prepare($sql); $consulta->bindParam(':idEquipo', $idEquipo); $consulta->execute(); return $consulta->fetchAll(PDO::FETCH_ASSOC); } catch (PDOException $error) { return [ 'error' => 'Ocurrió un error al obtener los miembros del equipo.', 'error_tecnico' => $error->getMessage() ]; } } public function obtenerSalaUsuario($idUsuario) { $conexion = conexionBD(); if (is_array($conexion)) { return $conexion; } try { $sql = " SELECT exu.idEquipo, exp.idPartida FROM equipoxusuario exu INNER JOIN equipoxpartida exp ON exu.idEquipo = exp.idEquipo WHERE exu.idUsuario = :idUsuario LIMIT 1 "; $consulta = $conexion->prepare($sql); $consulta->bindParam( ':idUsuario', $idUsuario, PDO::PARAM_INT ); $consulta->execute(); $resultado = $consulta->fetch(PDO::FETCH_ASSOC); if (!$resultado) { return [ 'asociado' => false ]; } 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) { $conexion = conexionBD(); if (is_array($conexion)) { return $conexion; } try { // 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->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. Eliminamos las relaciones * entre preguntas y partida. */ $sqlPartidaxPregunta = "DELETE FROM partidaxpregunta WHERE idPartida = :idPartida"; $consultaPartidaxPregunta = $conexion->prepare($sqlPartidaxPregunta); $consultaPartidaxPregunta->bindParam(':idPartida', $idPartida, PDO::PARAM_INT); $consultaPartidaxPregunta->execute(); /* * 7. 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, '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 abandonar la sala.', 'error_tecnico' => $error->getMessage() ]; } } }