# Миграции базы данных ## Применение миграции для системы отзывов Эта миграция добавляет полноценную систему отзывов с рейтингом (1-5 звезд) для товаров. ### Что добавляется: 1. **Новая таблица `reviews`** с полями: - `review_id` - уникальный идентификатор отзыва - `product_id` - связь с товаром - `user_id` - связь с пользователем - `rating` - оценка от 1 до 5 - `comment` - текст отзыва - `is_approved` - статус модерации - `created_at`, `updated_at` - временные метки 2. **Обновление таблицы `products`**: - `rating` - средний рейтинг товара (автоматически рассчитывается) - `review_count` - количество отзывов (автоматически обновляется) 3. **Триггеры и функции PostgreSQL**: - Автоматическое обновление рейтинга товара при добавлении/изменении/удалении отзыва - Автоматическое обновление `updated_at` при изменении отзыва ### Инструкция по применению: #### Способ 1: Через командную строку PostgreSQL ```bash # Подключитесь к базе данных psql -h 185.130.224.177 -p 5481 -U admin -d postgres # Выполните миграцию \i /path/to/cite_practica1/database/migrations/add_reviews_system.sql # Проверьте, что таблица создана \dt reviews # Проверьте структуру таблицы \d reviews # Проверьте новые поля в таблице products \d products ``` #### Способ 2: Через DBeaver или другой GUI-клиент 1. Откройте файл `add_reviews_system.sql` 2. Скопируйте весь SQL-код 3. Вставьте в окно SQL-редактора вашего клиента 4. Выполните скрипт #### Способ 3: Через PHP скрипт (если есть доступ к серверу) Создайте временный файл `apply_migration.php`: ```php getConnection()->exec($sql); echo "✓ Миграция успешно применена!\n"; } catch (Exception $e) { echo "✗ Ошибка: " . $e->getMessage() . "\n"; } ``` Затем выполните: ```bash php apply_migration.php ``` ### Проверка установки: После применения миграции выполните следующие SQL-запросы для проверки: ```sql -- Проверка таблицы reviews SELECT * FROM reviews LIMIT 1; -- Проверка новых полей в products SELECT product_id, name, rating, review_count FROM products LIMIT 5; -- Проверка триггеров SELECT tgname FROM pg_trigger WHERE tgrelid = 'reviews'::regclass; -- Проверка функций SELECT proname FROM pg_proc WHERE proname LIKE '%review%' OR proname LIKE '%rating%'; ``` ### Тестирование системы отзывов: 1. **Откройте страницу любого товара** в каталоге 2. **Убедитесь, что видна секция "Отзывы о товаре"** с формой для добавления отзыва 3. **Оставьте тестовый отзыв**: - Выберите рейтинг (1-5 звезд) - Напишите комментарий - Нажмите "Отправить отзыв" 4. **Проверьте, что**: - Отзыв появился в списке - Рейтинг товара обновился - Количество отзывов увеличилось ### API endpoints для отзывов: - `POST /reviews` - создание отзыва - `POST /reviews/{id}` - обновление отзыва - `POST /reviews/{id}/delete` - удаление отзыва - `GET /reviews/product/{id}` - получение отзывов товара (AJAX) - `POST /reviews/{id}/toggle-approval` - модерация отзыва (только для админов) ### Права доступа: - **Обычные пользователи**: могут оставлять, редактировать и удалять свои отзывы - **Администраторы**: - НЕ могут оставлять отзывы - Могут удалять любые отзывы - Могут модерировать отзывы (одобрять/отклонять) ### Ограничения: - Один пользователь может оставить только один отзыв на товар - Рейтинг обязателен (от 1 до 5) - Комментарий опционален, максимум 1000 символов - Администраторы не могут оставлять отзывы ### Откат миграции (если нужно): ```sql -- ВНИМАНИЕ: это удалит все отзывы! DROP TRIGGER IF EXISTS trigger_review_delete_update_product_rating ON reviews; DROP TRIGGER IF EXISTS trigger_review_insert_update_product_rating ON reviews; DROP TRIGGER IF EXISTS trigger_reviews_updated_at ON reviews; DROP FUNCTION IF EXISTS trigger_update_product_rating(); DROP FUNCTION IF EXISTS update_product_rating(INTEGER); DROP FUNCTION IF EXISTS update_reviews_updated_at(); DROP TABLE IF EXISTS reviews CASCADE; -- Удаление полей из products (опционально) ALTER TABLE products DROP COLUMN IF EXISTS rating; ALTER TABLE products DROP COLUMN IF EXISTS review_count; ``` ### Поддержка: Если возникли проблемы с миграцией: 1. Проверьте права доступа к базе данных 2. Убедитесь, что используется PostgreSQL 10+ 3. Проверьте логи ошибок PostgreSQL 4. Убедитесь, что таблицы `users` и `products` существуют --- **Дата создания**: 2026-01-03 **Версия**: 1.0 **Автор**: AI Assistant