#!/usr/bin/env php 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);