md с api, подправил запросы
This commit is contained in:
1 parent
cee1ed8bb7
commit
5451970f02
3 files changed
+157
-9
No files matched your search
+148
-7
@@ -1,17 +1,158 @@
|
|||||||
# React + TypeScript + Vite
|
# API
|
||||||
|
|
||||||
## fetchCategories:
|
## Категории
|
||||||
|
|
||||||
* get запрос по /api/categories
|
### Получение всех категорий
|
||||||
|
**Запрос:** `GET /api/categories`
|
||||||
|
|
||||||
* возвращает массив объектов типа Category
|
**Получаю:**
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"name": "для внутренней канализации",
|
||||||
|
"image": "/images/hghfghgd.jpg",
|
||||||
|
"atributes": [
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"name": "цвет",
|
||||||
|
"vals": [
|
||||||
|
{ "id": 1001, "val": "оранжевый" },
|
||||||
|
{ "id": 1002, "val": "серый" },
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"name": "размер",
|
||||||
|
"vals": [
|
||||||
|
{ "id": 2001, "val": "..." },
|
||||||
|
{ "id": 2002, "val": "...." },
|
||||||
|
{ "id": 2003, "val": "...." }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"name": "кол-во в упаковке",
|
||||||
|
"vals": [
|
||||||
|
{ "id": 2001, "val": "2" },
|
||||||
|
{ "id": 2002, "val": "4" },
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"name": "для внешней канализации",
|
||||||
|
"image": "/images/sfjsjsjf.jpg",
|
||||||
|
"atributes": [
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"name": "цвет",
|
||||||
|
"vals": [
|
||||||
|
{ "id": 1001, "val": "оранжевый" },
|
||||||
|
{ "id": 1002, "val": "серый" },
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"name": "размер",
|
||||||
|
"vals": [
|
||||||
|
{ "id": 2001, "val": "..." },
|
||||||
|
{ "id": 2002, "val": "...." },
|
||||||
|
{ "id": 2003, "val": "...." }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"name": "кол-во в упаковке",
|
||||||
|
"vals": [
|
||||||
|
{ "id": 2001, "val": "2" },
|
||||||
|
{ "id": 2002, "val": "4" },
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Товары (Products)
|
||||||
|
|
||||||
## fetchProductsByCategory
|
### Получение товаров по id категории с фильтрацией
|
||||||
|
**Запрос:** `GET /products`
|
||||||
|
|
||||||
* параметры: categoryId, page = 1, limit = 9, filters: string | number | (string | number)[]
|
**Параметры запроса (Query Parameters):**
|
||||||
|
|
||||||
* ожидаю: { items: Product[], total: number, page: number, limit: number } Сериализация превратит это в query-параметры
|
| Параметр | Тип | Обязательный | Описание | Пример |
|
||||||
|
|----------|-----|--------------|----------|---------|
|
||||||
|
| `categoryId` | number | Да | ID категории | `categoryId=1` |
|
||||||
|
| `page` | number | Нет | Номер страницы (по умолчанию 1) | `page=2` |
|
||||||
|
| `limit` | number | Нет | Количество товаров на странице (по умолчанию 9) | `limit=12` |
|
||||||
|
| `filters` | object | Нет | Фильтры по атрибутам | `size=110х2,2х500&color=оранжевый` |
|
||||||
|
|
||||||
|
**Примеры запросов:**
|
||||||
|
|
||||||
|
1. **Базовый запрос:**
|
||||||
|
```
|
||||||
|
GET /products?categoryId=1&page=1&limit=9
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **С фильтрами (одиночные значения):**
|
||||||
|
```
|
||||||
|
GET /products?categoryId=1&page=1&limit=9&size=110х2,2х500&color=оранжевый
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **С фильтрами (массив значений):**
|
||||||
|
```
|
||||||
|
GET /products?categoryId=1&page=1&limit=9&size=110х2,2х500,110х2,2х1500&color=серый
|
||||||
|
```
|
||||||
|
|
||||||
|
**Получаю:**
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"id": 101,
|
||||||
|
"name": "Труба ПВХ",
|
||||||
|
"description": "бля бля",
|
||||||
|
"price": 799,
|
||||||
|
"categoryId": 1,
|
||||||
|
"images": ["/images/s23-1.jpg", "/images/s23-2.jpg"],
|
||||||
|
"attributes": {
|
||||||
|
"color": "серый",
|
||||||
|
"amount": "4",
|
||||||
|
"size": "110х2,2х500"
|
||||||
|
},
|
||||||
|
"inStock": true,
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"total": 45,
|
||||||
|
"page": 1,
|
||||||
|
"limit": 9
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Получение товаров по id
|
||||||
|
**Запрос:** `GET/product/fetchById`
|
||||||
|
|
||||||
|
**Параметры запроса:**
|
||||||
|
- `id` (path parameter) - уникальный идентификатор товара
|
||||||
|
|
||||||
|
**Пример запроса:**
|
||||||
|
```
|
||||||
|
GET /api/products/101
|
||||||
|
```
|
||||||
|
|
||||||
|
**Получаю:**
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"id": 101,
|
||||||
|
"name": "ПВХ труба",
|
||||||
|
"description": "бля бля",
|
||||||
|
"price": 799,
|
||||||
|
"categoryId": 1,
|
||||||
|
"images": [
|
||||||
|
"/images/s23-1.jpg",
|
||||||
|
"/images/s23-2.jpg",
|
||||||
|
"/images/s23-3.jpg"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -5,7 +5,7 @@ import axios from "axios";
|
|||||||
export const fetchCategories = createAsyncThunk<Category[]>(
|
export const fetchCategories = createAsyncThunk<Category[]>(
|
||||||
"categories/fetchCategories",
|
"categories/fetchCategories",
|
||||||
async () => {
|
async () => {
|
||||||
const res = await axios.get("/api/categories");
|
const res = await axios.get<Category[]>("/api/categories");
|
||||||
return res.data;
|
return res.data;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -11,6 +11,13 @@ interface FetchParams {
|
|||||||
filters?: Record<string, string | number | (string | number)[]>;
|
filters?: Record<string, string | number | (string | number)[]>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface FetchResponce{
|
||||||
|
items: Product[],
|
||||||
|
total: number,
|
||||||
|
page: number,
|
||||||
|
limit: number,
|
||||||
|
}
|
||||||
|
|
||||||
export const fetchProductsByCategory = createAsyncThunk(
|
export const fetchProductsByCategory = createAsyncThunk(
|
||||||
"products/fetchByCategory",
|
"products/fetchByCategory",
|
||||||
async (params: FetchParams) => {
|
async (params: FetchParams) => {
|
||||||
@@ -26,7 +33,7 @@ export const fetchProductsByCategory = createAsyncThunk(
|
|||||||
else qp.append(k, String(v));
|
else qp.append(k, String(v));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
const res = await client.get(`/products?${qp.toString()}`);
|
const res = await client.get<FetchResponce>(`/products?${qp.toString()}`);
|
||||||
// ожидаем { items: Product[], total: number, page: number, limit: number }
|
// ожидаем { items: Product[], total: number, page: number, limit: number }
|
||||||
return res.data;
|
return res.data;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user