306 lines
10 KiB
PHP
306 lines
10 KiB
PHP
<?php
|
|
/*
|
|
* Este archivo es parte de Nabu.
|
|
*
|
|
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
|
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
|
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
|
* (a su elección) cualquier versión posterior.
|
|
*
|
|
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
|
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
|
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
|
* Licencia Pública General de GNU Affero para obtener más detalles.
|
|
*
|
|
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
|
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
defined('NABU') || exit();
|
|
|
|
require_once 'models/profilesModel.php';
|
|
|
|
class profilesController {
|
|
private const limit = 10;
|
|
|
|
// Renderiza la página de perfil de un usuario.
|
|
static public function profile() {
|
|
$validations = new validations(NABU_ROUTES['home']);
|
|
|
|
// Valida los parámetros de la URL.
|
|
$data = $validations -> validate($_GET, array(
|
|
array('field' => 'user', 'min_length' => 1, 'max_length' => 255)
|
|
));
|
|
|
|
$profilesModel = new profilesModel();
|
|
|
|
// Obtiene los datos de perfil del usuario.
|
|
$profile = $profilesModel -> get_profile('username', $data['user']);
|
|
|
|
if (empty($profile))
|
|
utils::redirect(NABU_ROUTES['home']);
|
|
|
|
// Obtiene el número total de artículos publicados.
|
|
$total = $profilesModel -> count_articles($profile['id']);
|
|
|
|
$view = NABU_ROUTES['profile'] . '&user=' . urlencode($profile['username']);
|
|
|
|
$pagination = utils::pagination($total, self::limit, $view);
|
|
|
|
// Obtiene los artículos publicados por el usuario.
|
|
$articles = $profilesModel -> get_articles(self::limit, $pagination['accumulation'], $profile['id']);
|
|
|
|
$page = $pagination['page'];
|
|
|
|
unset($profilesModel, $total, $pagination);
|
|
|
|
$isMyProfile = false;
|
|
|
|
if (isset($_SESSION['user']))
|
|
if ($_SESSION['user']['username'] == $profile['username'])
|
|
$isMyProfile = true;
|
|
|
|
// Escapa los caracteres del nombre completo y el apodo a HTML5.
|
|
$profile['name'] = utils::escape($profile['name']);
|
|
$profile['username'] = utils::escape($profile['username']);
|
|
|
|
// Define la URL completa de la foto y fondo de perfil.
|
|
$profile['avatar'] = utils::url_image('avatar', $profile['avatar']);
|
|
$profile['background'] = utils::url_image('background', $profile['background']);
|
|
|
|
if (empty($profile['description']))
|
|
$profile['description'] = NABU_DEFAULT['description'];
|
|
|
|
$profile['description'] = utils::escape($profile['description']);
|
|
|
|
require_once 'views/pages/profile.php';
|
|
}
|
|
|
|
// Renderiza la página de edición de perfil
|
|
// y actualiza los datos de perfil de un usuario con el método POST.
|
|
static public function edit_profile() {
|
|
utils::check_session(NABU_ROUTES['home']);
|
|
|
|
$profilesModel = new profilesModel();
|
|
|
|
// Obtiene los datos de perfil del usuario de sesión.
|
|
$profile = $profilesModel -> get_profile('id', $_SESSION['user']['id']);
|
|
|
|
if (empty($profile))
|
|
utils::redirect(NABU_ROUTES['logout']);
|
|
|
|
// Renderiza la página de edición del perfil.
|
|
if (empty($_POST['edit-profile-form'])) {
|
|
unset($profilesModel);
|
|
|
|
$profile['avatar'] = utils::url_image('avatar', $profile['avatar']);
|
|
$profile['background'] = utils::url_image('background', $profile['background']);
|
|
|
|
if (empty($profile['description']))
|
|
$profile['description'] = '';
|
|
|
|
$token = csrf::generate();
|
|
$messages = messages::get();
|
|
|
|
require_once 'views/pages/edit-profile.php';
|
|
|
|
exit();
|
|
}
|
|
|
|
csrf::validate($_POST['csrf']);
|
|
|
|
$view = NABU_ROUTES['edit-profile'];
|
|
|
|
$validations = new validations($view);
|
|
|
|
$form = array_merge($_POST, $_FILES);
|
|
|
|
// Valida el formulario de edición del perfil.
|
|
$data = $validations -> validate($form, array(
|
|
array('field' => 'avatar', 'type' => 'image', 'optional' => true),
|
|
array('field' => 'background', 'type' => 'image', 'optional' => true),
|
|
array('field' => 'description', 'trim_all' => true, 'min_length' => 1, 'max_length' => 255, 'optional' => true),
|
|
array('field' => 'name', 'trim_all' => true, 'min_length' => 5, 'max_length' => 255, 'optional' => true),
|
|
array('field' => 'username', 'trim' => true, 'min_length' => 1, 'max_length' => 255, 'optional' => true, 'not_spaces' => true),
|
|
array('field' => 'password', 'min_length' => 6, 'max_length' => 255, 'not_spaces' => true, 'optional' => true, 'equal' => $_POST['confirm-password'])
|
|
));
|
|
|
|
if (empty($data))
|
|
utils::redirect($view);
|
|
|
|
require_once 'models/usersModel.php';
|
|
|
|
$update = array();
|
|
|
|
// Valida si hay cambios en el nombre del usuario.
|
|
if (isset($data['name']))
|
|
if ($data['name'] != $profile['name']) {
|
|
$update['name'] = $data['name'];
|
|
|
|
messages::add('Tu nombre se ha actualizado correctamente');
|
|
}
|
|
|
|
// Valida si hay cambios en el apodo del usuario.
|
|
if (isset($data['username']))
|
|
if ($data['username'] != $profile['username']) {
|
|
$usersModel = new usersModel();
|
|
|
|
$user = $usersModel -> get_user('username', $data['username']);
|
|
|
|
$success = 'Tu apodo se ha actualizado correctamente';
|
|
$exists = 'Por favor define un apodo diferente';
|
|
|
|
// Valida si el apodo es único.
|
|
if (empty($user)) {
|
|
$update['username'] = $data['username'];
|
|
|
|
messages::add($success);
|
|
}
|
|
else {
|
|
// Valida si es una cuenta inactiva.
|
|
if (empty($user['activated']) && !empty($user['expiration'])) {
|
|
// Valida si la autenticación está expirada.
|
|
if (time() > $user['expiration']) {
|
|
$usersModel -> delete_user($user['id']);
|
|
|
|
$update['username'] = $data['username'];
|
|
|
|
messages::add($success);
|
|
}
|
|
else
|
|
messages::add($exists);
|
|
}
|
|
else
|
|
messages::add($exists);
|
|
}
|
|
|
|
unset($usersModel, $user);
|
|
}
|
|
|
|
// Valida si hay cambios en la contraseña del usuario.
|
|
if (isset($data['password'])) {
|
|
$update['password'] = password_hash($data['password'], PASSWORD_DEFAULT, array('cost' => 12));
|
|
|
|
messages::add('Tu contraseña se ha actualizado correctamente');
|
|
}
|
|
|
|
// Actualiza los datos del usuario en la base de datos.
|
|
if (!empty($update)) {
|
|
$usersModel = new usersModel();
|
|
|
|
$usersModel -> update_user($profile['id'], $update);
|
|
|
|
unset($usersModel);
|
|
|
|
// Actualiza la variable de sesión.
|
|
if (isset($update['username']))
|
|
$_SESSION['user']['username'] = $update['username'];
|
|
|
|
$update = array();
|
|
}
|
|
|
|
// Valida si hay cambios en la descripción del perfil.
|
|
if (empty($data['description'])) {
|
|
if (isset($profile['description'])) {
|
|
$update['description'] = null;
|
|
|
|
messages::add('Tu descripción se ha actualizado correctamente');
|
|
}
|
|
}
|
|
else {
|
|
if ($data['description'] != $profile['description']) {
|
|
$update['description'] = $data['description'];
|
|
|
|
messages::add('Tu descripción se ha actualizado correctamente');
|
|
}
|
|
}
|
|
|
|
// Valida si hay cambios en la foto de perfil.
|
|
if (isset($data['avatar'])) {
|
|
$update['avatar'] = utils::update_image('profilesModel', 'avatar', $profile['avatar'], $data['avatar']);
|
|
|
|
if ($update['avatar'] === false) {
|
|
messages::add('¡Lo sentimos mucho! 😞, por el momento no podemos actualizar tu foto de perfil');
|
|
|
|
unset($update['avatar']);
|
|
}
|
|
else
|
|
messages::add('Tu foto de perfil se ha actualizado correctamente');
|
|
}
|
|
|
|
// Valida si hay cambios en el fondo de perfil.
|
|
if (isset($data['background'])) {
|
|
$update['background'] = utils::update_image('profilesModel', 'background', $profile['background'], $data['background']);
|
|
|
|
if ($update['background'] === false) {
|
|
messages::add('¡Lo sentimos mucho! 😞, por el momento no podemos actualizar tu fondo de perfil');
|
|
|
|
unset($update['background']);
|
|
}
|
|
else
|
|
messages::add('El fondo de tu perfil se ha actualizado correctamente');
|
|
}
|
|
|
|
// Actualiza los datos de perfil de un usuario en la base de datos.
|
|
if (!empty($update))
|
|
$profilesModel -> update_profile($profile['id'], $update);
|
|
|
|
utils::redirect($view);
|
|
}
|
|
|
|
// Renderiza la página para eliminar una cuenta de usuario
|
|
// y elimina la cuenta de un usuario con el método POST.
|
|
static public function delete_profile() {
|
|
utils::check_session(NABU_ROUTES['home']);
|
|
|
|
$view = NABU_ROUTES['delete-profile'];
|
|
|
|
// Renderiza la página para eliminar una cuenta de usuario.
|
|
if (empty($_POST['confirm-password-form'])) {
|
|
$token = csrf::generate();
|
|
$messages = messages::get();
|
|
|
|
require_once 'views/pages/confirm-password.php';
|
|
|
|
exit();
|
|
}
|
|
|
|
csrf::validate($_POST['csrf']);
|
|
|
|
$validations = new validations($view);
|
|
|
|
// Valida el formulario para confirmar la contraseña del usuario.
|
|
$data = $validations -> validate($_POST, array(
|
|
array('field' => 'password', 'min_length' => 6, 'max_length' => 255, 'not_spaces' => true, 'equal' => $_POST['confirm-password'])
|
|
));
|
|
|
|
$profilesModel = new profilesModel();
|
|
|
|
// Obtiene los datos de perfil del usuario.
|
|
$profile = $profilesModel -> get_profile('id', $_SESSION['user']['id']);
|
|
|
|
if (empty($profile))
|
|
utils::redirect(NABU_ROUTES['logout']);
|
|
|
|
// Valida la contraseña del usuario.
|
|
if (!password_verify($data['password'], $profile['password'])) {
|
|
messages::add('La contraseña es incorrecta');
|
|
utils::redirect($view);
|
|
}
|
|
|
|
// Elimina la foto de perfil.
|
|
utils::remove_image('avatar', $profile['avatar']);
|
|
|
|
// Elimina el fondo de perfil.
|
|
utils::remove_image('background', $profile['background']);
|
|
|
|
// Elimina el perfil y desactiva la cuenta del usuario.
|
|
$profilesModel -> delete_profile($profile['id']);
|
|
|
|
utils::redirect(NABU_ROUTES['logout']);
|
|
}
|
|
|
|
static public function favorites() {
|
|
//
|
|
}
|
|
}
|