# Руководство по использованию ## Быстрый старт ### 1. Установка зависимостей ```bash npm install ``` ###2. Настройка базы данных Создайте базу данных PostgreSQL: ```sql CREATE DATABASE shop_platform; ``` Выполните SQL скрипты: ```bash psql -U postgres -d shop_platform -f sql/schema.sql psql -U postgres -d shop_platform -f sql/indexes.sql psql -U postgres -d shop_platform -f sql/triggers.sql psql -U postgres -d shop_platform -f sql/seed_data.sql ``` ### 3. Настройка переменных окружения Создайте файл `.env`: ```env DB_HOST=localhost DB_PORT=5432 DB_NAME=shop_platform DB_USER=postgres DB_PASSWORD=your_password PORT=3000 HOST=0.0.0.0 NODE_ENV=development ``` ### 4. Запуск сервера ```bash npm run dev ``` ## Использование API ### Получить список товаров ```bash curl http://localhost:3000/products ``` ### Получить товар по ID ```bash curl http://localhost:3000/products/1 ``` ### Создать товар ```bash curl -X POST http://localhost:3000/products \ -H "Content-Type: application/json" \ -d '{ "name": "Новый товар", "slug": "new-product", "sku": "SKU-001", "price": 1000, "stock_quantity": 10 }' ``` ### Получить категории ```bash curl http://localhost:3000/categories ``` ## Работа с DAO ### Пример использования ProductDAO ```javascript import { ProductDAO } from './dao/ProductDAO.js'; const productDAO = new ProductDAO(); // Получить товар по ID const product = await productDAO.findById(1); // Получить товары с деталями const products = await productDAO.findAllWithDetails({ limit: 20, offset: 0, categoryId: 1, isFeatured: true }); // Поиск товаров const searchResults = await productDAO.search('телефон', { limit: 10, offset: 0 }); // Создать товар const newProduct = await productDAO.create({ name: 'Новый товар', slug: 'new-product', sku: 'SKU-001', price: 1000, stock_quantity: 10 }); // Обновить товар const updated = await productDAO.update(1, { price: 1200 }); // Удалить товар await productDAO.delete(1); ``` ### Пример использования CategoryDAO ```javascript import { CategoryDAO } from './dao/CategoryDAO.js'; const categoryDAO = new CategoryDAO(); // Получить все категории с иерархией const categories = await categoryDAO.findAllWithHierarchy(); // Получить дерево категорий const tree = await categoryDAO.findTree(); // Получить дочерние категории const children = await categoryDAO.findChildren(1); ``` ## Добавление новых роутов ### 1. Создайте DAO класс ```javascript // src/dao/ReviewDAO.js import { BaseDAO } from './BaseDAO.js'; export class ReviewDAO extends BaseDAO { constructor() { super('reviews'); } async findByProductId(productId) { const query = ` SELECT r.*, u.first_name, u.last_name FROM reviews r JOIN users u ON r.user_id = u.id WHERE r.product_id = $1 AND r.is_approved = TRUE ORDER BY r.created_at DESC `; const result = await this.query(query, [productId]); return result.rows; } } ``` ### 2. Создайте схемы валидации ```javascript // src/schemas/review.schema.js export const reviewSchemas = { createReview: { body: { type: 'object', required: ['product_id', 'rating'], properties: { product_id: { type: 'integer' }, rating: { type: 'integer', minimum: 1, maximum: 5 }, title: { type: 'string' }, comment: { type: 'string' } } } } }; ``` ### 3. Создайте роуты ```javascript // src/routes/reviews.routes.js import { ReviewDAO } from '../dao/ReviewDAO.js'; import { reviewSchemas } from '../schemas/review.schema.js'; export async function reviewRoutes(fastify, options) { const reviewDAO = new ReviewDAO(); fastify.get('/products/:productId/reviews', { schema: { tags: ['reviews'], summary: 'Получить отзывы на товар' } }, async (request, reply) => { const { productId } = request.params; const reviews = await reviewDAO.findByProductId(productId); return { success: true, data: reviews }; }); } ``` ### 4. Зарегистрируйте роуты ```javascript // src/server.js import { reviewRoutes } from './routes/reviews.routes.js'; async function registerRoutes() { await fastify.register(productRoutes); await fastify.register(categoryRoutes); await fastify.register(reviewRoutes); // Добавьте это } ``` ## Swagger документация После запуска сервера откройте в браузере: - http://localhost:3000/docs Здесь вы найдете интерактивную документацию API с возможностью тестирования запросов. ## Обработка ошибок Все ошибки автоматически обрабатываются и возвращаются в формате: ```json { "success": false, "error": "Описание ошибки" } ``` ## Безопасность - Все запросы валидируются через схемы - Rate limiting ограничивает количество запросов - Helmet защищает от распространенных уязвимостей - CORS настроен для безопасных кросс-доменных запросов