5.7 KiB
5.7 KiB
Руководство по использованию
Быстрый старт
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 настроен для безопасных кросс-доменных запросов