146 lines
5.7 KiB
PHP
Executable File
146 lines
5.7 KiB
PHP
Executable File
#!/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);
|
||
|