165 lines
6.4 KiB
Markdown
165 lines
6.4 KiB
Markdown
# Миграции базы данных
|
||
|
||
## Применение миграции для системы отзывов
|
||
|
||
Эта миграция добавляет полноценную систему отзывов с рейтингом (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
|
||
|