Пересобрать проект (если необходимо):
docker-compose build
Запустить оркестр:
docker-compose run
IP-адреса (для Артёма и Дани):
- 10.1.0.100:8002 -- FastAPI
- 127.0.0.1:80 -- ReactJS
- 10.1.0.102:15432 -- pgAdmin 4
- 10.1.0.100:5432 -- postegres
- 10.1.0.103:8080 -- Apache
IP-адреса (для Роберта):
- 127.0.0.1:80 -- сервер ReactJS
- 127.0.0.1:8002 -- сервер FastAPI
- 127.0.0.1:8080 -- сервер Apache (для php)
Данные для БД:
- user: postgres
- password: postgres
- db: logistic
Данные для pgAdmin:
- email: [email protected]
- password: 123456
Коды ответа:
200-- запрос выполнен успешно400-- обращение к несуществующему методу или с некорректными параметрами401-- для выполнения запроса требуется авторизация403-- нет прав для выполнения запроса (напр., пользователь пытается выполнить запрос, доступный только для компании)404-- данные не найдены500-- всё, пока, сервер упал
Запрос:
GET /auth/is_authorized
Ответ:
- Если пользователь не авторизован:
401 Unauthorized
{"details": "Unauthorized"}
- Если пользователь авторизован:
200 OK
{"id": айдишник, "role": роль}
Запрос:
GET /auth/whoami
Ответ:
- Если пользователь не авторизован:
200 OK
{ "role": "guest" }
- Если авторизован клиент:
200 OK
{
"id": айдишник,
"email": "почта",
"role": "client",
"data": {
"name": "имя",
"surname": "фамилия",
"img": "путь к аватарке"
}
}
- Если авторизована компания:
200 OK
{
"id": айдишник,
"email": "почта",
"role": "company",
"data": {
"name": "название",
"img": "путь к аватарке"
}
}
Запрос:
GET /categories/{id}
- Ответ:
200 OK
{
"id": айдишник,
"name": "Название категории",
"icon": true/false
}
- Ответ в случае подачи айдишника несуществующей категории
404 Not found
{
"data": "Категория не существует"
}
- Ответ в случае ошибки иного рода
500 Internal server error
{
"data": "Описание ошибки"
}
Отдаёт массив всех категорий. Запрос:
GET /categories/all
Ответ:
[
{
"id": айдишник, "name": название категории", "icon: true/false
},
...
]
Проверяет, существует ли категория с заданным id Запрос:
GET /categories/exists/{id}
Ответ:
{
"result": true/false
}
Выполняет поиск по имени категории. Запрос:
GET /categories/find/азн
Ответ:
200 OK
[
{
"id": 1,
"name": "Разное",
"icon": false
}
]
Добавляет продукт (метод для компаний). Запрос:
PUT /products/add
{
"name": "Имя продукта (обязательный параметр)",
"price": 300.69,
"amount": 1488
}
Обязательные параметры: name (string, имя продукта), price (double, цена), amount (int, количество) Дополнительные параметры: size (string в формате "5см x 5см x 5см"), img (файл изображения), category (int, id категории)
Ответ:
- id созданного продукта:
200 OK
{ "id": 213 }
- Требуется авторизация
401 Unauthorized
[]
- Недостаточно прав (пользователь является клиентом, а не компанией)
403 Forbidden
[]
Общедоступный метод, возвращает информацию о продукте. Запрос:
GET /products/{id}
Ответ:
200 OK
{
"id": 1,
"company_id": 1,
"name": "Интим",
"price": 300000,
"amount": 0,
"size": "69 см x 300 см x 1488 см",
"img": null,
"category": 1,
"hidden": true,
"rating": null
}
Ответ в случае ошибки:
500 Internal server error
{
"data": "Описание ошибки"
}
Получает список товаров с постраничной пагинацией. К списку каталогов можно применять разнообразные фильтры в виде GET-параметров. Все GET-параметры являются опциональными, по умолчанию выводится первая страница общего каталога со всеми товарами. Запрос:
GET /catalog/search?фильтры
Доступные фильтры:
- company_id - товары конкретной компании
- category - товары конкретной категории
- max_price, min_price - диапазон цен
- max_amount, min_amount - диапазон количества в наличии
- name - название
- page - номер страницы (счёт ведётся с 1)
- per_page - товаров на страницу (в отрезке [1;25])
Ответ:
{
"total_pages": 1,
"total_products": 1,
"result": [
{
"id": 1,
"company_id": 1,
"name": "Интим",
"price": 300000,
"amount": 0,
"size": "69 см x 300 см x 1488 см",
"img": null,
"category": 1,
"hidden": true,
"rating": null
}
]
}
total_pages- всего страницtotal_products- всего найденных товаровresult- массив с товарами (см. /products/{id})
Получает массив городов. Запрос:
GET /cities/all
Ответ:
[
{
"id": 1,
"name": "Абаза",
"arms": "/public/cities/25px-Coat_of_Arms_of_Abaza_%28Khakassia%29.webp"
},
...
]
Выполняет поиск по городам. Запрос:
GET /cities/search
name=атов
Ответ:
200 OK
{
"total_cities": 8,
"result": [
{
"id": 42,
"name": "Ардатов",
"arms": "/public/cities/25px-Coat_of_Arms_of_Ardatov_%282011%29.webp"
},
{
"id": 226,
"name": "Горбатов",
"arms": "/public/cities/25px-Gorbatov_COA_%28Nizhny_Novgorod_Governorate%29_%281781%29.webp"
},
{
"id": 256,
"name": "Далматово",
"arms": "/public/cities/25px-Coat_of_Arms_of_Dalmatovo_%282006%29.webp"
},
{
"id": 372,
"name": "Ипатово",
"arms": "/public/cities/25px-Coat_of_arms_of_Ipatovsky_rayon_%28Stavropol_krai%29.svg.webp"
},
{
"id": 498,
"name": "Красноармейск (Саратовская область)",
"arms": "/public/cities/25px-Coat_of_Arms_of_Krasnoarmeysk_%28Saratov_oblast%29.webp"
},
{
"id": 544,
"name": "Курчатов",
"arms": "/public/cities/25px-Coat_of_Arms_of_Kurchatov_%28Kursk_oblast%29.webp"
},
{
"id": 889,
"name": "Саратов",
"arms": "/public/cities/25px-Coat_of_Arms_of_Saratov.webp"
},
{
"id": 896,
"name": "Сватово",
"arms": "/public/cities/Coat_of_arms_of_Lugansk_People%27s_Republic.svg/261px-Coat_of_arms_of_Lugansk_People%27s_Republic.svg.webp"
}
]
}
Получает информацию о городе по id. Запрос:
GET /ctites/{id}
Ответ:
{
"id": 889,
"name": "Саратов",
"arms": "/public/cities/25px-Coat_of_Arms_of_Saratov.webp"
}
Выполняет поиск по инфраструктуре. Совместимо с пагинацией. Запрос:
GET /infrastructure/
company_id=айдишник_компании
city_id=айдишник_города
page=1
per_page=число_от_1_до_100
Все параметры являются необязательными, но хотя бы один фильтр (company_id или city_id) обязан быть применён.
Ответ:
{
"total_pages": страниц,
"total_found": результатов,
"result": [
{
"company_id": компания,
"city": город,
"storage": true/false,
"dp": true/false
}
]
}
Может быть выполнено только компнаией. Добавляет или удаляет инфраструктуру заданного типа в заданном городе. HTTP-глаголы:
POSTдобавляет инфраструктуруDELETEудаляет инфраструктуру Типы инфраструктуры:storage- складdelivery_point- пункт выдачи Запрос:
DELETE /infrastructure/delivery_point/889
Ответ:
{
"data": "Пункт выдачи удалён"
}