Renombrar clases y controladores
This commit is contained in:
@@ -0,0 +1,474 @@
|
||||
<?php
|
||||
require_once __DIR__ . '/../includes/conexionBD.php';
|
||||
|
||||
class Usuario
|
||||
{
|
||||
private ?int $idUsuario;
|
||||
private string $nombreUsuario;
|
||||
private string $contrasena;
|
||||
private string $email;
|
||||
private ?string $avatar;
|
||||
private ?string $cookie;
|
||||
private int $aciertos;
|
||||
private int $victorias;
|
||||
private int $derrotas;
|
||||
|
||||
public function __construct(
|
||||
string $nombreUsuario = "",
|
||||
string $contrasena = "",
|
||||
string $email = "",
|
||||
?string $avatar = null,
|
||||
?string $cookie = null,
|
||||
int $aciertos = 0,
|
||||
int $victorias = 0,
|
||||
int $derrotas = 0,
|
||||
?int $idUsuario = null
|
||||
) {
|
||||
$this->idUsuario = $idUsuario;
|
||||
$this->nombreUsuario = $nombreUsuario;
|
||||
$this->contrasena = $contrasena;
|
||||
$this->email = $email;
|
||||
$this->avatar = $avatar;
|
||||
$this->cookie = $cookie;
|
||||
$this->aciertos = $aciertos;
|
||||
$this->victorias = $victorias;
|
||||
$this->derrotas = $derrotas;
|
||||
}
|
||||
|
||||
public function getIdUsuario(): ?int
|
||||
{
|
||||
return $this->idUsuario;
|
||||
}
|
||||
|
||||
public function getNombreUsuario(): string
|
||||
{
|
||||
return $this->nombreUsuario;
|
||||
}
|
||||
public function setNombreUsuario(string $nombreUsuario): void
|
||||
{
|
||||
$this->nombreUsuario = $nombreUsuario;
|
||||
}
|
||||
|
||||
public function getContrasena(): string
|
||||
{
|
||||
return $this->contrasena;
|
||||
}
|
||||
public function setContrasena(string $contrasena): void
|
||||
{
|
||||
$this->contrasena = $contrasena;
|
||||
}
|
||||
|
||||
public function getEmail(): string
|
||||
{
|
||||
return $this->email;
|
||||
}
|
||||
public function setEmail(string $email): void
|
||||
{
|
||||
$this->email = $email;
|
||||
}
|
||||
|
||||
public function getAvatar(): ?string
|
||||
{
|
||||
return $this->avatar;
|
||||
}
|
||||
public function setAvatar(?string $avatar): void
|
||||
{
|
||||
$this->avatar = $avatar;
|
||||
}
|
||||
|
||||
public function getCookie(): ?string
|
||||
{
|
||||
return $this->cookie;
|
||||
}
|
||||
public function setCookie(?string $cookie): void
|
||||
{
|
||||
$this->cookie = $cookie;
|
||||
}
|
||||
|
||||
public function getAciertos(): int
|
||||
{
|
||||
return $this->aciertos;
|
||||
}
|
||||
public function setAciertos(int $aciertos): void
|
||||
{
|
||||
$this->aciertos = $aciertos;
|
||||
}
|
||||
|
||||
public function getVictorias(): int
|
||||
{
|
||||
return $this->victorias;
|
||||
}
|
||||
public function setVictorias(int $victorias): void
|
||||
{
|
||||
$this->victorias = $victorias;
|
||||
}
|
||||
|
||||
public function getDerrotas(): int
|
||||
{
|
||||
return $this->derrotas;
|
||||
}
|
||||
public function setDerrotas(int $derrotas): void
|
||||
{
|
||||
$this->derrotas = $derrotas;
|
||||
}
|
||||
|
||||
public function registrar()
|
||||
{
|
||||
$conexion = conexionBD();
|
||||
|
||||
if (is_array($conexion)) {
|
||||
return $conexion;
|
||||
}
|
||||
|
||||
try {
|
||||
$sql = "INSERT INTO usuario (nombreUsuario, contrasena, email, avatar, cookie, aciertos, victorias, derrotas)
|
||||
VALUES (:nombre, :pass, :email, :avatar, :cookie, :aciertos, :victorias, :derrotas)";
|
||||
$stmt = $conexion->prepare($sql);
|
||||
|
||||
$passHash = password_hash($this->contrasena, PASSWORD_BCRYPT);
|
||||
|
||||
$stmt->execute([
|
||||
':nombre' => $this->nombreUsuario,
|
||||
':pass' => $passHash,
|
||||
':email' => $this->email,
|
||||
':avatar' => $this->avatar,
|
||||
':cookie' => $this->cookie,
|
||||
':aciertos' => $this->aciertos,
|
||||
':victorias' => $this->victorias,
|
||||
':derrotas' => $this->derrotas
|
||||
]);
|
||||
|
||||
$this->idUsuario = (int)$conexion->lastInsertId();
|
||||
|
||||
return [
|
||||
'exito' => 'Usuario registrado correctamente',
|
||||
'exito_tecnico' => $this->idUsuario
|
||||
];
|
||||
} catch (PDOException $error) {
|
||||
return [
|
||||
'error' => 'Ocurrió un error al registrar el usuario.',
|
||||
'error_tecnico' => $error->getMessage()
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
public static function buscarPorId($id)
|
||||
{
|
||||
$conexion = conexionBD();
|
||||
|
||||
if (is_array($conexion)) {
|
||||
return $conexion;
|
||||
}
|
||||
|
||||
try {
|
||||
$sql = "SELECT * FROM usuario WHERE idUsuario = :id";
|
||||
$stmt = $conexion->prepare($sql);
|
||||
$stmt->execute([':id' => $id]);
|
||||
|
||||
$datos = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
if ($datos) {
|
||||
return new Usuario(
|
||||
$datos['nombreUsuario'],
|
||||
$datos['contrasena'],
|
||||
$datos['email'],
|
||||
$datos['avatar'],
|
||||
$datos['cookie'],
|
||||
(int)$datos['aciertos'],
|
||||
(int)$datos['victorias'],
|
||||
(int)$datos['derrotas'],
|
||||
(int)$datos['idUsuario']
|
||||
);
|
||||
}
|
||||
|
||||
return [
|
||||
'error' => 'No se encontró ningún usuario con ese ID.'
|
||||
];
|
||||
} catch (PDOException $error) {
|
||||
return [
|
||||
'error' => 'Ocurrió un error al buscar el usuario.',
|
||||
'error_tecnico' => $error->getMessage()
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
public static function buscarPorEmail($email)
|
||||
{
|
||||
$conexion = conexionBD();
|
||||
|
||||
if (is_array($conexion)) {
|
||||
return $conexion;
|
||||
}
|
||||
|
||||
try {
|
||||
$sql = "SELECT * FROM usuario WHERE email = :email";
|
||||
$stmt = $conexion->prepare($sql);
|
||||
$stmt->execute([':email' => $email]);
|
||||
|
||||
$datos = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
if ($datos) {
|
||||
return new Usuario(
|
||||
$datos['nombreUsuario'],
|
||||
$datos['contrasena'],
|
||||
$datos['email'],
|
||||
$datos['avatar'],
|
||||
$datos['cookie'],
|
||||
(int)$datos['aciertos'],
|
||||
(int)$datos['victorias'],
|
||||
(int)$datos['derrotas'],
|
||||
(int)$datos['idUsuario']
|
||||
);
|
||||
}
|
||||
|
||||
return null; // No existe usuario con ese email
|
||||
|
||||
} catch (PDOException $error) {
|
||||
return [
|
||||
'error' => 'Ocurrió un error al buscar el usuario por email.',
|
||||
'error_tecnico' => $error->getMessage()
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
public static function login($email, $contrasena)
|
||||
{
|
||||
$usuario = self::buscarPorEmail($email);
|
||||
|
||||
// El usuario no existe
|
||||
if (!($usuario instanceof Usuario)) {
|
||||
|
||||
// Limpiamos posibles datos de sesión anteriores
|
||||
unset($_SESSION['idUsuario']);
|
||||
unset($_SESSION['email']);
|
||||
unset($_SESSION['nombreUsuario']);
|
||||
unset($_SESSION['avatar']);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
// Comprobamos la contraseña
|
||||
if (password_verify($contrasena, $usuario->getContrasena())) {
|
||||
|
||||
// Usuario validado correctamente
|
||||
$_SESSION['idUsuario'] = $usuario->getIdUsuario();
|
||||
$_SESSION['email'] = $usuario->getEmail();
|
||||
$_SESSION['nombreUsuario'] = $usuario->getNombreUsuario();
|
||||
$_SESSION['avatar'] = $usuario->getAvatar();
|
||||
|
||||
// Devolvemos el usuario como hasta ahora
|
||||
return $usuario;
|
||||
}
|
||||
|
||||
// Contraseña incorrecta
|
||||
unset($_SESSION['idUsuario']);
|
||||
unset($_SESSION['email']);
|
||||
unset($_SESSION['nombreUsuario']);
|
||||
unset($_SESSION['avatar']);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
// Cookies
|
||||
|
||||
public static function guardarCookieToken($idUsuario, $token)
|
||||
{
|
||||
$conexion = conexionBD();
|
||||
if (is_array($conexion)) return false;
|
||||
|
||||
try {
|
||||
$sql = "UPDATE usuario SET cookie = :token WHERE idUsuario = :id";
|
||||
$stmt = $conexion->prepare($sql);
|
||||
return $stmt->execute([
|
||||
':token' => $token,
|
||||
':id' => $idUsuario
|
||||
]);
|
||||
} catch (PDOException $e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static function buscarPorCookie($token)
|
||||
{
|
||||
if (empty($token)) return null;
|
||||
|
||||
$conexion = conexionBD();
|
||||
if (is_array($conexion)) return null;
|
||||
|
||||
try {
|
||||
$sql = "SELECT * FROM usuario WHERE cookie = :token AND cookie IS NOT NULL";
|
||||
$stmt = $conexion->prepare($sql);
|
||||
$stmt->execute([':token' => $token]);
|
||||
|
||||
$datos = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
if ($datos) {
|
||||
return new Usuario(
|
||||
$datos['nombreUsuario'],
|
||||
$datos['contrasena'],
|
||||
$datos['email'],
|
||||
$datos['avatar'],
|
||||
$datos['cookie'],
|
||||
(int)$datos['aciertos'],
|
||||
(int)$datos['victorias'],
|
||||
(int)$datos['derrotas'],
|
||||
(int)$datos['idUsuario']
|
||||
);
|
||||
}
|
||||
return null;
|
||||
} catch (PDOException $e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
public function cambiarNombre($nuevoNombre)
|
||||
{
|
||||
$conexion = conexionBD();
|
||||
|
||||
if (is_array($conexion)) {
|
||||
return $conexion;
|
||||
}
|
||||
|
||||
try {
|
||||
|
||||
$sql = "UPDATE usuario
|
||||
SET nombreUsuario = :nombre
|
||||
WHERE idUsuario = :id";
|
||||
|
||||
$stmt = $conexion->prepare($sql);
|
||||
|
||||
$stmt->execute([
|
||||
':nombre' => $nuevoNombre,
|
||||
':id' => $this->idUsuario
|
||||
]);
|
||||
|
||||
// Actualizamos también el objeto actual
|
||||
$this->nombreUsuario = $nuevoNombre;
|
||||
|
||||
return [
|
||||
'exito' => 'Nombre actualizado correctamente.'
|
||||
];
|
||||
} catch (PDOException $error) {
|
||||
|
||||
return [
|
||||
'error' => 'Ocurrió un error al actualizar el nombre.',
|
||||
'error_tecnico' => $error->getMessage()
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
public function cambiarAvatar($archivo)
|
||||
{
|
||||
$carpeta = __DIR__ . '/../img/avatars/';
|
||||
|
||||
// Creamos la carpeta si no existe
|
||||
if (!is_dir($carpeta)) {
|
||||
mkdir($carpeta, 0755, true);
|
||||
}
|
||||
|
||||
// Obtenemos la extensión según el tipo MIME
|
||||
$tipo = mime_content_type($archivo['tmp_name']);
|
||||
|
||||
$extensiones = [
|
||||
'image/jpeg' => 'jpg',
|
||||
'image/png' => 'png',
|
||||
'image/gif' => 'gif',
|
||||
'image/webp' => 'webp'
|
||||
];
|
||||
|
||||
if (!isset($extensiones[$tipo])) {
|
||||
|
||||
return [
|
||||
'error' => 'Formato de imagen no permitido.'
|
||||
];
|
||||
}
|
||||
|
||||
$extension = $extensiones[$tipo];
|
||||
|
||||
// Nombre único para evitar conflictos
|
||||
$nombreArchivo = 'avatar_' . $this->idUsuario . '.' . $extension;
|
||||
|
||||
$rutaCompleta = $carpeta . $nombreArchivo;
|
||||
|
||||
// Guardamos la imagen
|
||||
if (!move_uploaded_file($archivo['tmp_name'], $rutaCompleta)) {
|
||||
|
||||
return [
|
||||
'error' => 'No se pudo guardar la imagen.'
|
||||
];
|
||||
}
|
||||
|
||||
// Ruta que utilizará el HTML
|
||||
$rutaAvatar = 'img/avatars/' . $nombreArchivo;
|
||||
|
||||
$conexion = conexionBD();
|
||||
|
||||
if (is_array($conexion)) {
|
||||
return $conexion;
|
||||
}
|
||||
|
||||
try {
|
||||
|
||||
$sql = "UPDATE usuario
|
||||
SET avatar = :avatar
|
||||
WHERE idUsuario = :id";
|
||||
|
||||
$stmt = $conexion->prepare($sql);
|
||||
|
||||
$stmt->execute([
|
||||
':avatar' => $rutaAvatar,
|
||||
':id' => $this->idUsuario
|
||||
]);
|
||||
|
||||
// Actualizamos también el objeto actual
|
||||
$this->avatar = $rutaAvatar;
|
||||
|
||||
return [
|
||||
'exito' => 'Avatar actualizado correctamente.',
|
||||
'avatar' => $rutaAvatar
|
||||
];
|
||||
} catch (PDOException $error) {
|
||||
|
||||
return [
|
||||
'error' => 'Ocurrió un error al actualizar el avatar.',
|
||||
'error_tecnico' => $error->getMessage()
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
public static function obtenerRanking($limite = 10)
|
||||
{
|
||||
try {
|
||||
$conexion = conexionBD();
|
||||
|
||||
if (is_array($conexion)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
|
||||
$sql = "SELECT
|
||||
idUsuario,
|
||||
nombreUsuario,
|
||||
avatar,
|
||||
aciertos,
|
||||
victorias,
|
||||
derrotas,
|
||||
CASE
|
||||
WHEN (victorias + derrotas) > 0
|
||||
THEN ROUND((victorias / (victorias + derrotas)) * 100, 0)
|
||||
ELSE 0
|
||||
END AS porcentajeVictoria
|
||||
FROM usuario
|
||||
ORDER BY victorias DESC, aciertos DESC
|
||||
LIMIT " . (int)$limite;
|
||||
|
||||
$stmt = $conexion->prepare($sql);
|
||||
$stmt->execute();
|
||||
return $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
} catch (PDOException $e) {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user