Исправление багов авторизации, корзины и админки

- Исправлено выпадающее меню профиля (hover-баг с margin-top)
- Исправлена авторизация: правильные пути к API (api/auth.php)
- Исправлены ссылки на админку (admin/index.php вместо admin_panel.php)
- Исправлены пути API корзины в catalog.php и checkout.php
- Добавлена форма добавления/редактирования товаров в админке
- Исправлены кнопки +/- в корзине (улучшена обработка AJAX)
- Исправлена регистрация: правильные пути и обработка boolean в PostgreSQL
- Добавлена миграция для назначения прав админа пользователю admin@mail.ru
- Удален тестовый блок 'Быстрый вход' для неавторизованных пользователей
- Улучшена обработка ошибок во всех API-эндпоинтах
This commit is contained in:
kirill.khorkov
2025-12-16 02:58:44 +03:00
parent 3f257120fa
commit 29b9aaac50
388 changed files with 15312 additions and 3220 deletions

148
public/includes/auth.php Normal file
View File

@@ -0,0 +1,148 @@
<?php
/**
* Функции авторизации для AETERNA
*/
require_once __DIR__ . '/../config/database.php';
/**
* Авторизация пользователя
*/
function loginUser(string $email, string $password): array {
$db = Database::getInstance()->getConnection();
try {
$stmt = $db->prepare("
SELECT user_id, email, password_hash, full_name, phone, city, is_admin, is_active
FROM users WHERE email = ?
");
$stmt->execute([$email]);
$user = $stmt->fetch();
if (!$user) {
return ['success' => false, 'message' => 'Пользователь не найден'];
}
if (!$user['is_active']) {
return ['success' => false, 'message' => 'Аккаунт заблокирован'];
}
if (!password_verify($password, $user['password_hash'])) {
return ['success' => false, 'message' => 'Неверный пароль'];
}
// Сохраняем в сессию
$_SESSION['user_id'] = $user['user_id'];
$_SESSION['user_email'] = $user['email'];
$_SESSION['full_name'] = $user['full_name'];
$_SESSION['user_phone'] = $user['phone'] ?? '';
$_SESSION['user_city'] = $user['city'] ?? '';
$_SESSION['isLoggedIn'] = true;
$_SESSION['isAdmin'] = (bool)$user['is_admin'];
$_SESSION['login_time'] = time();
// Обновляем время последнего входа
$updateStmt = $db->prepare("UPDATE users SET last_login = CURRENT_TIMESTAMP WHERE user_id = ?");
$updateStmt->execute([$user['user_id']]);
return ['success' => true, 'user' => $user];
} catch (PDOException $e) {
return ['success' => false, 'message' => 'Ошибка базы данных'];
}
}
/**
* Регистрация нового пользователя
*/
function registerUser(array $data): array {
$db = Database::getInstance()->getConnection();
$email = trim($data['email'] ?? '');
$password = $data['password'] ?? '';
$fullName = trim($data['full_name'] ?? '');
$phone = trim($data['phone'] ?? '');
$city = trim($data['city'] ?? '');
// Валидация
if (empty($email) || empty($password) || empty($fullName)) {
return ['success' => false, 'message' => 'Заполните все обязательные поля'];
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
return ['success' => false, 'message' => 'Некорректный email'];
}
if (strlen($password) < 6) {
return ['success' => false, 'message' => 'Пароль должен содержать минимум 6 символов'];
}
try {
// Проверяем существование пользователя
$checkStmt = $db->prepare("SELECT user_id FROM users WHERE email = ?");
$checkStmt->execute([$email]);
if ($checkStmt->fetch()) {
return ['success' => false, 'message' => 'Пользователь с таким email уже существует'];
}
// Создаем пользователя
$passwordHash = password_hash($password, PASSWORD_DEFAULT);
$stmt = $db->prepare("
INSERT INTO users (email, password_hash, full_name, phone, city, is_active)
VALUES (?, ?, ?, ?, ?, TRUE)
RETURNING user_id
");
$stmt->execute([$email, $passwordHash, $fullName, $phone, $city]);
$userId = $stmt->fetchColumn();
// Автоматически авторизуем
$_SESSION['user_id'] = $userId;
$_SESSION['user_email'] = $email;
$_SESSION['full_name'] = $fullName;
$_SESSION['user_phone'] = $phone;
$_SESSION['user_city'] = $city;
$_SESSION['isLoggedIn'] = true;
$_SESSION['isAdmin'] = false;
$_SESSION['login_time'] = time();
return ['success' => true, 'user_id' => $userId];
} catch (PDOException $e) {
return ['success' => false, 'message' => 'Ошибка базы данных: ' . $e->getMessage()];
}
}
/**
* Выход пользователя
*/
function logoutUser(): void {
$_SESSION = [];
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
session_destroy();
}
/**
* Проверка является ли пользователь администратором
*/
function checkAdminAccess(): bool {
if (!isset($_SESSION['isLoggedIn']) || $_SESSION['isLoggedIn'] !== true) {
return false;
}
if (!isset($_SESSION['isAdmin']) || $_SESSION['isAdmin'] !== true) {
return false;
}
return true;
}