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,164 @@
# Миграции базы данных
## Применение миграции для системы отзывов
Эта миграция добавляет полноценную систему отзывов с рейтингом (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
<?php
require_once __DIR__ . '/../../app/Core/Database.php';
use App\Core\Database;
$sql = file_get_contents(__DIR__ . '/add_reviews_system.sql');
try {
$db = Database::getInstance();
$db->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