Описание задания
Цель задания: создать сервис на 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."
}