Описание задания
Цель задания: создать сервис на FastAPI, который будет взаимодействовать с сайтом https://www.wildberries.ru/.
Необходимо реализовать 4 конечные точки для работы с номенклатурой.
Требования:
-
Используйте FastAPI для разработки сервиса.
-
Используйте парсинг данных с сайта https://www.wildberries.ru/ с использованием библиотеки
requests. -
Реализуйте 4 конечные точки:
- Добавить номенклатуру: пользователь указывает nm_id, сервис парсит данные с сайта www.wildberries.ru и сохраняет их в базу данных
PostgreSQL - Получить товар по номенклатуре
- Получить все товары
- Удалить товар по номенклатуре
- Добавить номенклатуру: пользователь указывает nm_id, сервис парсит данные с сайта www.wildberries.ru и сохраняет их в базу данных
-
Товар должен содержать следующие поля:
- nm_id
- name
- brand
- brand_id
- site_brand_id
- supplier_id
- sale
- price
- sale_price
- rating
- feedbacks
- colors
-
Используйте
Dockerдля развертывания сервиса. -
Используйте
SQLAlchemyдля работы с базой данныхPostgreSQL.
Дополнительное задание:
- Реализуйте задачу в
Celeryдля обновления карточек товаров, которые хранятся в базе данных. - Настройте подключение
CORSдля сервиса. - Дополнительное поле в таблице (
quantity- количество товара в наличии). Обновление остатков.
Результат:
Ссылка на github, Dockerfile для развертывания сервиса, и инструкцию по его развертыванию и использованию.
Подсказка:
Пример страницы товара: https://www.wildberries.ru/catalog/139760729/detail.aspx
В случае использования технологий, не указанных в требованиях задание будет считаться нерешенным.
- Клонировать репозиторий
HTTPS
git clone https://github.com/simatheone/product_parser_test_case.git
SSH
git clone [email protected]:simatheone/product_parser_test_case.git- Перейти в директорию с проектом:
cd product_parser_test_case/- Выполнить команду по созданию и запуску контейнеров:
make up- Выполнить миграции:
make migrateДокументация к API доступна по ссылке: http://localhost:8000/docs/
либо выполнить команду
make view-docs
Для получения полного списка доступных комманд выполните:
make help- Запустить создание и запуск контейнеров:
docker-compose -f docker/docker-compose.yaml up -d --build- Выполнить миграции:
docker-compose exec backend alembic upgrade headДокументация к API доступна по ссылке: http://localhost:8000/docs/
- Для остановки и удаления контейнеров выполните:
docker-compose -f docker/docker-compose.yaml up -d --buildОписание по запуску:
Перед началом установки виртуального окружения и запуска тестов, необходимо запустить контейнер с тестовой базой данных.
Выполнить команду:
make test-upДля остановки контейнера выполнить:
make test-downВыполнить команду:
docker-compose -f docker/docker-compose.tests.yaml up -d --buildДля остановки контейнера выполнить:
docker-compose -f docker/docker-compose.tests.yaml downДля запуска тестов выполнить команду:
poetry run pytest- Установить виртуальное окружение:
python3 -m venv venv- Активировать виртуальное окружение:
Unix like:
source venv/bin/activate
Windows:
venv\Scripts\activate.bat
- Обновить
pipи установить зависимости:
pip3 install --upgrade pip
pip3 install -r requirements.txt- Запустить тесты:
pytestВ проекте доступно 4 ендпоинта:
/products/all?page=1&size=10- получение списка всех продуктов, добавленных в базу данных;/products/{product_id}/- получение продукта по его id;/products/{product_id}/- удаление продукта по его id;/products/- создание нового продукта.
GET /products/all?page=1&size=10
Данный ендпоинт принимает query параметры page и size для пагинации запроса.
Возвращает список всех продуктов, с учетом параметров page и size.
Пример запроса:
curl -X 'GET' \
'http://localhost:8000/products/all?page=1&size=10' \
-H 'accept: application/json'
Пример ответа:
{
"items": [
{
"nm_id": 134386495,
"name": "Футболка мужская набор 3 шт однотонные хлопок",
"brand": "OKO-group",
"brand_id": 93472,
"site_brand_id": 103472,
"supplier_id": 409934,
"sale": 42,
"price": 231100,
"sale_price": 134000,
"rating": 5,
"feedbacks": 2199,
"quantity": 1168,
"colors": [
{
"color_id": 4,
"name": "черный"
},
]
},
{
"nm_id": 143422254,
"name": "Футболка мужская набор 3 шт однотонные хлопок",
"brand": "OKO-group",
"brand_id": 93472,
"site_brand_id": 103472,
"supplier_id": 409934,
"sale": 40,
"price": 231100,
"sale_price": 138600,
"rating": 5,
"feedbacks": 2199,
"quantity": 654,
"colors": [
{
"color_id": 4,
"name": "черный"
}
]
}
],
"total": 6,
"page": 1,
"size": 3,
"pages": 2
}Если в базе нет продуктов, вернется пустой список.
Пример ответа:
{
"items": [],
"total": 0,
"page": 1,
"size": 10,
"pages": 0
}GET /products/{product_id}/ - получение продукта по его id;
Данный ендпоинт принимает id продукта в качестве параметра пути (path parameter) и возвращает информацию из базы о данном продукте.
Пример запроса:
curl -X 'GET' \
'http://localhost:8000/products/111' \
-H 'accept: application/json'
Пример ответа:
{
"nm_id": 111,
"name": "Пуловер",
"brand": "Y.O.U",
"brand_id": 987,
"site_brand_id": 439,
"supplier_id": 458,
"sale": 0,
"price": 105000,
"sale_price": 105000,
"rating": 0,
"feedbacks": 0,
"quantity": 0,
"colors": [
{
"color_id": 2,
"name": "коричневый"
}
]
}При попытке получить продукт, который не был сохранен в базе, вернется ошибка со статус кодом 404 и сообщением:
{
"detail": "Product does not exist."
}DELETE /products/{product_id}/ - удаление продукта по его id;
Данный ендпоинт принимает id продукта в качестве параметра пути (path parameter) и возвращает статус код 204, если продукт был удален из базы.
curl -X 'DELETE' \
'http://localhost:8000/products/111' \
-H 'accept: */*'
При попытке повторно удалить продукт из базы, вернется ошибка со статус кодом 404 и сообщением:
{
"detail": "Product does not exist."
}POST /products/
Данный ендпоинт принимает в теле запроса id продукта, который должен быть сохранен в базу.
Пример запроса:
curl -X 'POST' \
'http://localhost:8000/products/' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"nm_id": 139760619
}'
Request body (JSON):
{
"nm_id": 139760619
}Пример ответа:
{
"nm_id": 139760619,
"name": "iPhone 14 Pro Max 1TB (США)",
"brand": "Apple",
"brand_id": 6049,
"site_brand_id": 16049,
"supplier_id": 887491,
"sale": 23,
"price": 19999000,
"sale_price": 15399200,
"rating": 4,
"feedbacks": 7,
"quantity": 18,
"colors": [
{
"color_id": 1,
"name": "серый"
}
]
}При попытке повторно добавить продукт в базу, вернется ошибка со статус кодом 400 и сообщением:
{
"detail": "Product with this id already exists."
}Если по указанному в запросе id не удается найти продукт, вернется ошибка со статус кодом 404 и сообщением:
{
"detail": "Unable to find a product with the provided ID. Check the ID of the product you are entering."
}В случае, если по каким-то причинам не удалось получить информацию о продукте от сайта wildberries, вернется ошибка со статус кодом 500 и сообщением:
{
"detail": "Something went wrong on requesting data from the website."
}