- Исправлено выпадающее меню профиля (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-эндпоинтах
110 lines
3.8 KiB
PHP
110 lines
3.8 KiB
PHP
<?php
|
||
/**
|
||
* Простой раннер миграций для PostgreSQL
|
||
* Запуск: php migrations/migrate.php
|
||
*/
|
||
|
||
// Подключаем конфиг базы данных
|
||
require_once __DIR__ . '/../config/database.php';
|
||
|
||
echo "===========================================\n";
|
||
echo " AETERNA - Система миграций базы данных\n";
|
||
echo "===========================================\n\n";
|
||
|
||
try {
|
||
$db = Database::getInstance()->getConnection();
|
||
echo "[OK] Подключение к базе данных успешно\n\n";
|
||
|
||
// 1. Создаем таблицу для отслеживания миграций
|
||
$db->exec("
|
||
CREATE TABLE IF NOT EXISTS migrations (
|
||
id SERIAL PRIMARY KEY,
|
||
filename VARCHAR(255) NOT NULL UNIQUE,
|
||
applied_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||
)
|
||
");
|
||
echo "[OK] Таблица migrations готова\n";
|
||
|
||
// 2. Получаем список уже примененных миграций
|
||
$stmt = $db->query("SELECT filename FROM migrations ORDER BY filename");
|
||
$applied = $stmt->fetchAll(PDO::FETCH_COLUMN);
|
||
echo "[INFO] Уже применено миграций: " . count($applied) . "\n\n";
|
||
|
||
// 3. Сканируем папку на SQL-файлы
|
||
$migrationFiles = glob(__DIR__ . '/*.sql');
|
||
sort($migrationFiles);
|
||
|
||
$newMigrations = 0;
|
||
|
||
foreach ($migrationFiles as $file) {
|
||
$filename = basename($file);
|
||
|
||
// Пропускаем seed_data.sql - он запускается отдельно
|
||
if ($filename === 'seed_data.sql') {
|
||
continue;
|
||
}
|
||
|
||
// Проверяем, была ли миграция уже применена
|
||
if (in_array($filename, $applied)) {
|
||
echo "[SKIP] $filename (уже применена)\n";
|
||
continue;
|
||
}
|
||
|
||
// Применяем миграцию
|
||
echo "[RUN] Применяю $filename... ";
|
||
|
||
$sql = file_get_contents($file);
|
||
|
||
try {
|
||
$db->exec($sql);
|
||
|
||
// Записываем в таблицу миграций
|
||
$stmt = $db->prepare("INSERT INTO migrations (filename) VALUES (?)");
|
||
$stmt->execute([$filename]);
|
||
|
||
echo "OK\n";
|
||
$newMigrations++;
|
||
} catch (PDOException $e) {
|
||
echo "ОШИБКА!\n";
|
||
echo " Причина: " . $e->getMessage() . "\n";
|
||
echo "\n[!] Миграция остановлена из-за ошибки\n";
|
||
exit(1);
|
||
}
|
||
}
|
||
|
||
echo "\n-------------------------------------------\n";
|
||
|
||
if ($newMigrations > 0) {
|
||
echo "[SUCCESS] Применено новых миграций: $newMigrations\n";
|
||
} else {
|
||
echo "[INFO] Все миграции уже применены\n";
|
||
}
|
||
|
||
// 4. Спрашиваем про seed_data
|
||
$seedFile = __DIR__ . '/seed_data.sql';
|
||
if (file_exists($seedFile)) {
|
||
echo "\n[?] Хотите загрузить начальные данные (seed_data.sql)?\n";
|
||
echo " Запустите: php migrations/migrate.php --seed\n";
|
||
|
||
if (isset($argv[1]) && $argv[1] === '--seed') {
|
||
echo "\n[RUN] Загружаю seed_data.sql... ";
|
||
try {
|
||
$sql = file_get_contents($seedFile);
|
||
$db->exec($sql);
|
||
echo "OK\n";
|
||
} catch (PDOException $e) {
|
||
echo "ОШИБКА: " . $e->getMessage() . "\n";
|
||
}
|
||
}
|
||
}
|
||
|
||
echo "\n===========================================\n";
|
||
echo " Миграции завершены!\n";
|
||
echo "===========================================\n";
|
||
|
||
} catch (PDOException $e) {
|
||
echo "[ERROR] Ошибка подключения к БД: " . $e->getMessage() . "\n";
|
||
exit(1);
|
||
}
|
||
|