File: /var/www/limestate-api/Models/User.php
<?php
class User extends Db_Model
{
const DEFAULT_GROUP = 4;
static $table_name = 'users';
static $table_relations = 'todo_user_relations';
static $table_groups_relations = 'todo_groups_relations';
static $roleId = 0;
static $login = 'guest';
private static $user;
static $role;
static $userColor = array();
static $colors = array(
'ff3065', '2abb9f', '9e61b6', 'b24d7d', 'e75555', '30bde6', '3052e6', '7930e6', '30e63d', '9be630'
);
/** @deprecated @var array – levels-roles */
static $roles = array(
'0' => 'Гости',
'1' => 'Суперадминистраторы',
'2' => 'Администраторы',
'3' => 'Пользователи'
);
static $bands = array(
'Клиент' => 'Клиент',
'Менеджер' => 'Менеджер',
'Менеджер клиента' => 'Менеджер клиента',
'Партнёр' => 'Партнёр',
'Поставщик' => 'Поставщик',
'Разработчик' => 'Разработчик',
'Финансист' => 'Финансист'
);
public static function auth($email, $password, $longSession = false)
{
if ( $user = User::findUser($email, $password)) {
$sid = md5($user->email . 'salt' . $user->password . 'salt');
$token = Token::generateToken($user->id);
if ($longSession) {
setcookie('sid', $sid, time() + 60*60*24*7);
} else {
setcookie('sid', $sid, time() + 60*60*24*1);
}
$_SESSION['user'] = serialize($user);
return $token;
} else {
return false;
}
}
public static function countReferral($userId = false)
{
if (!$userId) {
$user = User::getUser();
$userId = $user->id;
}
return self::$db->select('COUNT(id)')->from(self::$table_name)->where('referer = ?', $userId)->fetchOne();
}
public static function getReferrals($userId = false)
{
if (!$userId) {
$user = User::getUser();
$userId = $user->id;
}
return self::$db->select('id, name')->from(self::$table_name)->where('referer = ?', $userId)->fetchAll();
}
public static function restoreSession()
{
if (empty($_COOKIE['sid'])) return false;
$sid = $_COOKIE['sid'];
$user = User::$db->select()->from(self::$table_name)->where('sid = ?', $sid)->fetchRow();
if ($user) {
$_SESSION['user'] = serialize($user);
Core::redirect($_SERVER['HTTP_REFERER']);
} else {
return false;
}
}
public static function remove($id)
{
return self::$db->update(self::$table_name, array(
'deleted' => 1,
'activated' => 0
), array(
'id' => $id
));
}
/**
* Обновляет данные о пользователе
*
* @param $data — параметры пользователя
* @param $where — идентификатор пользователя
* @return int
*/
public static function updateUserData($data, $where)
{
$data = (array) $data;
foreach ($data as $key => $value) {
if (is_null($value)) unset($data[$key]);
}
return self::update($data, $where);
}
public static function create($data, $returning = false)
{
return parent::create($data, $returning
);
}
public static function getGroups($user_id = false)
{
if (!$user_id) $user_id = User::getUser()->id;
return self::$db->select('group_id')->from('todo_groups_relations')->where('user_id = ?', $user_id)->fetchCol();
}
public static function getHome()
{
return Acl::$homePages[self::$user->level];
}
/**
* Устанавливает или доабвляет группы пользователю
*
* @param $userId — идентификатор пользователя
* @param $groupIds — список идентификаторов групп или одной группы
* @param bool $only — удалить предыдущие вхождения
*
* @return bool — результат операции
*/
public static function setUserGroups($userId, $groupIds, $only = false)
{
try {
self::$db->begin();
if ($only) {
self::$db->delete('todo_groups_relations', array(
'user_id' => $userId
));
}
if (is_array($groupIds)) {
foreach ($groupIds as $groupId) {
$sql = "REPLACE INTO `todo_groups_relations` (`user_id`, `group_id`) VALUES (" . $userId . ", " . $groupId . ") ";
self::$db->query($sql);
}
} else if (in_numeric($groupIds)) {
$sql = "REPLACE INTO `todo_groups_relations` (`user_id`, `group_id`) VALUES (" . $userId . ", " . $groupIds . ") ";
self::$db->query($sql);
}
self::$db->commit();
} catch(Exception $e) {
self::$db->rollback();
return false;
}
return true;
}
/**
* Возвращает список идентификаторов групп пользователя
*
* @param $userId — идентификатор пользователя
*
* @return array – список идентификаторов групп пользователя
*/
public static function getUserGroups($userId = false)
{
if (!$userId) {
$user = User::getUser();
$userId = $user->id;
}
return self::$db->select('group_id')->from('todo_groups_relations')->where('user_id = ?', $userId)->fetchCol();
}
public static function randomPassword() {
$alphabet = "abcdefghijklmnopqrstuwxyzABCDEFGHIJKLMNOPQRSTUWXYZ0123456789";
$pass = '';
for ($i = 0; $i < 8; $i++) {
$n = rand(0, mb_strlen($alphabet)-1);
$pass .= $alphabet[$n];
}
return $pass;
}
public static function passwordRecovery($email = false)
{
$newPassword = self::randomPassword();
$hash = password_hash($newPassword, PASSWORD_BCRYPT);
User::$db->update(User::$table_name, [ 'password' => $hash ], [ 'email' => $email ]);
$data['status'] = 'success';
$data['msg'] = '<strong>Отлично.</strong> Новый пароль выслан вам на почту.';
$message = 'Ваш новый пароль: '. $newPassword;
Mail::send($email, 'Восстановление пароля ', $message);
}
public static function findUser($email, $password)
{
$user = self::findUser_byEmail($email);
if ($user && password_verify($password, $user->password)) {
return $user;
} else {
return false;
}
}
public static function findUser_byEmail($email)
{
return self::$db->select('*')
->from(self::$table_name)
->where('email = ?', $email)
->fetchRow();
}
/**
* Возвращает объект текущего пользователя
*
* @return object — объект текущего пользователя
*/
public static function getUser()
{
return self::$user;
}
/**
* Возвращает идентификатор текущего пользователя
*
* @return int — идентификатор текущего пользователя
*/
public static function getUserId()
{
return isset(self::$user->id) ? self::$user->id : 0;
}
public static function init()
{
if (isset($_SESSION['user'])) {
$user = (object)unserialize($_SESSION['user']);
self::$user = $user;
self::$roleId = $user->level;
self::$login = $user->login;
self::$role = $user->level;
User::updateLastLogin();
} else {
User::restoreSession();
$user = (object) array(
'level' => 0,
'role' => 'guest',
'login' => 'guest'
);
self::$user = $user;
self::$roleId = $user->level;
self::$login = $user->login;
self::$role = $user->level;
}
}
/**
* Проверяет зарегистрирован-ли данный email в системе
*
* @param $email – Email пользователя
* @return bool – зарегистрирован или нет данный email
*/
public static function isEmailRegistered($email)
{
return (bool) User::$db->select('COUNT(id)')
->from(self::$table_name)
->where('email = ?', $email)
->fetchOne();
}
/**
* Регистрирует пользователя в системе
*
* @param $userData – данные пользователя
* @param bool $auth — автоматически авторизоваться под пользователем
* @return mixed — данные авторизации
*/
public static function signUp($userData, $auth = true)
{
$userData['password'] = password_hash($userData['password'], PASSWORD_BCRYPT);
$userId = User::create( $userData );
if ($auth) {
return self::auth( $userData['email'], $userData['password']);
} else {
return $userId;
}
}
/**
* Возращает входит-ли текущий пользователь в список ролей
*
* @param int|array $roles — список ролей или одна роль
* @return bool
*/
public static function isRole($roles)
{
if (is_array($roles)) {
return in_array(self::$role, $roles);
} else {
return self::$role == $roles;
}
}
public static function isLogged()
{
return self::$roleId != 0;
}
}