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