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

6.4 KiB
Raw Permalink Blame History

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

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

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

# Подключитесь к базе данных
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
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";
}

Затем выполните:

php apply_migration.php

Проверка установки:

После применения миграции выполните следующие 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 символов
  • Администраторы не могут оставлять отзывы

Откат миграции (если нужно):

-- ВНИМАНИЕ: это удалит все отзывы!
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