# Миграции базы данных

## Применение миграции для системы отзывов

Эта миграция добавляет полноценную систему отзывов с рейтингом (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

