534c20a45d
He modificado salirDeSala() de ClaseEquipoxUsuario.php
270 lines
8.9 KiB
PHP
270 lines
8.9 KiB
PHP
<?php
|
|
require_once __DIR__ . '/../includes/conexionBD.php';
|
|
|
|
|
|
class EquipoxUsuario
|
|
{
|
|
public $idEquipoxUsuario;
|
|
public $idUsuario;
|
|
public $idEquipo;
|
|
|
|
public function __construct($idEquipoxUsuario = null, $idUsuario = null, $idEquipo = null)
|
|
{
|
|
$this->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()
|
|
];
|
|
}
|
|
}
|
|
}
|