Files
2025-12-07 13:34:02 +03:00

5.7 KiB
Raw Permalink Blame History

Руководство по использованию

Быстрый старт

1. Установка зависимостей

npm install

###2. Настройка базы данных

Создайте базу данных PostgreSQL:

CREATE DATABASE shop_platform;

Выполните SQL скрипты:

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:

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. Запуск сервера

npm run dev

Использование API

Получить список товаров

curl http://localhost:3000/products

Получить товар по ID

curl http://localhost:3000/products/1

Создать товар

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
  }'

Получить категории

curl http://localhost:3000/categories

Работа с DAO

Пример использования ProductDAO

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

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 класс

// 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. Создайте схемы валидации

// 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. Создайте роуты

// 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. Зарегистрируйте роуты

// 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 документация

После запуска сервера откройте в браузере:

Здесь вы найдете интерактивную документацию API с возможностью тестирования запросов.

Обработка ошибок

Все ошибки автоматически обрабатываются и возвращаются в формате:

{
  "success": false,
  "error": "Описание ошибки"
}

Безопасность

  • Все запросы валидируются через схемы
  • Rate limiting ограничивает количество запросов
  • Helmet защищает от распространенных уязвимостей
  • CORS настроен для безопасных кросс-доменных запросов