1
0
Files
TaskBoard/backend/app/class/enity/class_user.php
Falknat a9c146b192 Развитие бека
1. Создание БД
2. Создание бека
3. Пока создали класс юзера
2026-01-11 17:48:05 +07:00

188 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_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];
}
}
?>