Files
web_work/database/migrations/apply_migration.php
kirill.khorkov 547c561ed0 Added
2026-01-03 21:55:16 +03:00

146 lines
5.7 KiB
PHP
Executable File
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.
#!/usr/bin/env php
<?php
/**
* Migration Application Script
* Applies the reviews system migration to the database
*
* Usage: php apply_migration.php
*/
// Определяем пути
define('ROOT_PATH', dirname(__DIR__, 2));
define('MIGRATION_FILE', __DIR__ . '/add_reviews_system.sql');
// Подключаем автозагрузчик
require_once ROOT_PATH . '/app/Core/Database.php';
use App\Core\Database;
echo "\n";
echo "========================================\n";
echo " Применение миграции: Reviews System \n";
echo "========================================\n\n";
// Проверяем наличие файла миграции
if (!file_exists(MIGRATION_FILE)) {
echo "✗ ОШИБКА: Файл миграции не найден: " . MIGRATION_FILE . "\n\n";
exit(1);
}
echo "→ Файл миграции найден: " . basename(MIGRATION_FILE) . "\n";
// Читаем SQL из файла
$sql = file_get_contents(MIGRATION_FILE);
if (empty($sql)) {
echo "✗ ОШИБКА: Файл миграции пуст\n\n";
exit(1);
}
echo "→ SQL загружен, размер: " . strlen($sql) . " байт\n";
// Подключаемся к базе данных
try {
echo "→ Подключение к базе данных...\n";
$db = Database::getInstance();
$connection = $db->getConnection();
echo "✓ Подключение успешно\n";
} catch (Exception $e) {
echo "✗ ОШИБКА подключения: " . $e->getMessage() . "\n\n";
exit(1);
}
// Выполняем миграцию
// Не используем транзакцию, т.к. SQL файл содержит IF NOT EXISTS для идемпотентности
try {
echo "\n→ Выполнение миграции...\n";
// Выполняем весь SQL файл за один раз
// PostgreSQL обработает все команды, включая DO блоки и CREATE OR REPLACE
$connection->exec($sql);
echo "✓ Миграция успешно выполнена\n";
} catch (Exception $e) {
// Проверяем, не является ли это ошибкой "уже существует"
$errorMsg = $e->getMessage();
if (strpos($errorMsg, 'already exists') !== false ||
strpos($errorMsg, 'does not exist') !== false) {
echo "⚠ Часть объектов уже существует (это нормально для повторного запуска)\n";
echo "✓ Миграция продолжена\n";
} else {
echo "✗ ОШИБКА выполнения миграции:\n";
echo $errorMsg . "\n\n";
echo "💡 Попробуйте выполнить SQL вручную через psql или GUI клиент\n\n";
exit(1);
}
}
// Проверяем результат
echo "\n→ Проверка результата...\n";
try {
// Проверяем таблицу reviews
$result = $connection->query("SELECT COUNT(*) FROM information_schema.tables WHERE table_name = 'reviews'");
$exists = $result->fetchColumn() > 0;
if ($exists) {
echo " ✓ Таблица 'reviews' создана\n";
// Получаем структуру таблицы
$columns = $connection->query("SELECT column_name FROM information_schema.columns WHERE table_name = 'reviews'")->fetchAll(PDO::FETCH_COLUMN);
echo " Колонки: " . implode(', ', $columns) . "\n";
} else {
echo " ✗ Таблица 'reviews' не найдена\n";
}
// Проверяем новые поля в products
$result = $connection->query("SELECT column_name FROM information_schema.columns WHERE table_name = 'products' AND column_name IN ('rating', 'review_count')");
$productColumns = $result->fetchAll(PDO::FETCH_COLUMN);
if (in_array('rating', $productColumns)) {
echo " ✓ Поле 'rating' добавлено в таблицу 'products'\n";
}
if (in_array('review_count', $productColumns)) {
echo " ✓ Поле 'review_count' добавлено в таблицу 'products'\n";
}
// Проверяем функции
$result = $connection->query("SELECT COUNT(*) FROM pg_proc WHERE proname = 'update_product_rating'");
$functionExists = $result->fetchColumn() > 0;
if ($functionExists) {
echo " ✓ Функция 'update_product_rating' создана\n";
}
// Проверяем триггеры
$result = $connection->query("SELECT COUNT(*) FROM pg_trigger WHERE tgname LIKE '%review%'");
$triggerCount = $result->fetchColumn();
if ($triggerCount > 0) {
echo " ✓ Триггеры созданы (количество: $triggerCount)\n";
}
} catch (Exception $e) {
echo "Не удалось проверить результат: " . $e->getMessage() . "\n";
}
echo "\n========================================\n";
echo " ✓ МИГРАЦИЯ УСПЕШНО ПРИМЕНЕНА! \n";
echo "========================================\n\n";
echo "Что дальше:\n";
echo "1. Откройте любую страницу товара в каталоге\n";
echo "2. Войдите как обычный пользователь (не админ)\n";
echo "3. Оставьте тестовый отзыв с оценкой\n";
echo "4. Проверьте, что рейтинг обновился\n\n";
echo "API endpoints:\n";
echo "- POST /reviews - создание отзыва\n";
echo "- POST /reviews/{id} - обновление отзыва\n";
echo "- POST /reviews/{id}/delete - удаление отзыва\n";
echo "- GET /reviews/product/{id} - получение отзывов\n\n";
exit(0);