Files
web_work/database/migrations/README.md
kirill.khorkov 547c561ed0 Added
2026-01-03 21:55:16 +03:00

165 lines
6.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Миграции базы данных
## Применение миграции для системы отзывов
Эта миграция добавляет полноценную систему отзывов с рейтингом (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