1
0
Files
TaskBoard/backend/app/class/enity/class_user.php
Falknat 456876f837 Обновление бека+фронт
MVP версия - которая уже готова к работе
2026-01-12 01:11:32 +07:00

189 lines
6.0 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
class Account extends BaseEntity {
protected $db_name = 'accounts';
protected $db_name_session = 'accounts_session';
// Переменные свойств объекта
public $id_department;
public $name;
public $username;
public $password;
public $avatar_url;
public $telegram;
// Валидация данных при создании аккаунта
protected function validate() {
$this->error_message = [];
if (!$this->name) {
$this->addError('name', 'Имя не может быть пустым');
}
if (!$this->username) {
$this->addError('username', 'Логин не может быть пустым');
}
if ($this->username && Database::get($this->db_name, ['id'], ['username' => $this->username])) {
$this->addError('username', 'Пользователь с таким логином уже существует');
}
if (!$this->password) {
$this->addError('password', 'Пароль не может быть пустым');
}
return $this->getErrors();
}
// Создание нового аккаунта
public function create() {
// Валидация данных
if ($errors = $this->validate()) {
return $errors;
}
// Вставляем в БД
Database::insert($this->db_name, [
'id_department' => $this->id_department,
'name' => $this->name,
'username' => $this->username,
'password' => $this->password,
'avatar_url' => $this->avatar_url,
'telegram' => $this->telegram
]);
return ['success' => true];
}
// Получение всех пользователей
public function getAll() {
return Database::select($this->db_name, [
'id',
'id_department',
'name',
'username',
'avatar_url',
'telegram'
]);
}
// Создание сессии для пользователя
public function create_session($name_account, $password) {
// Получаем полные данные аккаунта по переданному имени аккаунта
$account = Database::get($this->db_name, '*', ['username' => $name_account]);
if (!$account) {
$this->addError('username', 'Пользователь не найден');
return $this->getErrors();
}
if ($account['password'] !== $password) {
$this->addError('password', 'Неверный пароль');
return $this->getErrors();
}
$keycookies = $name_account . "_" . bin2hex(random_bytes(32));
$week_seconds = 604800; // 1 неделя в секундах
$data_closed = date('Y-m-d H:i:s', time() + $week_seconds);
Database::insert($this->db_name_session, [
'id_accounts' => $account['id'],
'keycookies' => $keycookies,
'data_create' => date('Y-m-d H:i:s'),
'data_closed' => $data_closed,
'ip_address' => $_SERVER['REMOTE_ADDR'],
'user_agent' => $_SERVER['HTTP_USER_AGENT']
]);
// Устанавливаем cookie
setcookie('session', $keycookies, [
'expires' => time() + $week_seconds,
'path' => '/',
'httponly' => true,
'samesite' => 'Lax'
]);
return [
'success' => true,
'keycookies' => $keycookies
];
}
// Проверка сессии и получение данных пользователя
public function check_session($keycookies) {
// Проверяем, что сессия не пустая
if (!$keycookies) {
$this->addError('session', 'Сессия не указана');
return $this->getErrors();
}
// Ищем сессию
$session = Database::get($this->db_name_session, '*', [
'keycookies' => $keycookies,
'data_closed[>]' => date('Y-m-d H:i:s')
]);
// Проверяем, что сессия не пустая
if (!$session) {
$this->addError('session', 'Сессия не найдена или истекла');
return $this->getErrors();
}
// Получаем данные пользователя
$user = Database::get($this->db_name, [
'id_department',
'name',
'username',
'avatar_url',
'telegram'
], [
'id' => $session['id_accounts']
]);
if (!$user) {
$this->addError('user', 'Пользователь не найден');
return $this->getErrors();
}
return [
'success' => true,
'user' => $user
];
}
// Удаление всех сессий пользователя (logout)
public function logout($keycookies) {
// Проверяем, что сессия не пустая
if (!$keycookies) {
$this->addError('session', 'Сессия не указана');
return $this->getErrors();
}
// Получаем сессию чтобы узнать id пользователя
$session = Database::get($this->db_name_session, ['id_accounts'], [
'keycookies' => $keycookies
]);
if (!$session) {
$this->addError('session', 'Сессия не найдена');
return $this->getErrors();
}
// Удаляем все сессии этого пользователя
Database::delete($this->db_name_session, [
'id_accounts' => $session['id_accounts']
]);
// Удаляем cookie
setcookie('session', '', [
'expires' => time() - 3600,
'path' => '/'
]);
return ['success' => true];
}
}
?>