This commit is contained in:
kirill.khorkov
2026-01-03 21:55:16 +03:00
parent 8682d4ade1
commit 547c561ed0
5 changed files with 749 additions and 0 deletions

View File

@@ -0,0 +1,145 @@
#!/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);