В данном задании вам предлагается реализовать бэкенд для веб-сервиса сравнения цен, аналогичный сервису Яндекс Товары. Обычно взаимодействие с такими сервисами происходит следующим образом:
- Представители магазинов загружают информацию о своих товарах и категориях. Также можно изменять и удалять информацию о ранее загруженных товарах и категориях.
- Покупатели, пользуясь веб-приложением, могут искать предложения разных магазинов, сравнивать цены и следить за их динамикой и историей.
Ваша задача - разработать REST API сервис, который позволяет магазинам загружать и обновлять информацию о товарах, а пользователям - смотреть какие товары были обновлены за последние сутки, а также следить за динамикой цен товара или категории за указанный интервал времени.
Реализуйте сервис на Python или Java в зависимости от выбранного направления школы. Сервис должен удовлетворять следующим требованиям:
- реализует спецификацию API, описанную в файле
openapi.yaml
, и корректно отвечает на запросы проверяющей системы - некоторые обработчики из них являются необязательными, их реализация позволит вам набрать дополнительное количество баллов
- сервис должен быть развернут в контейнере на
0.0.0.0:8080
- сервис должен обеспечивать персистентность данных (должен сохранять состояние данных при перезапуске)
- сервис должен обладать возможностью автоматического перезапуска при рестарте контейнера, в котором работает ваш бэкенд (этого можно достичь настройкой контейнера)
- после запуска сервиса время ответа сервиса на все методы API не должно превышать 1 секунду
- время полного старта сервиса не должно превышать 1 минуту
- импорт и удаление данных не превосходит 1000 элементов в 1 минуту
- RPS (Request per second) получения статистики, недавних изменений и информации об элементе суммарно не превосходит 100 запросов в секунду
В качестве предварительного тестирования мы подготовили для вас юнит-тест unit_test.py
, написанный на Python. Он позволит проверить минимальную работоспособность вашего бэкенда до отправки решения на проверку.
Для прохождения проверки обратите внимание на следующее:
- Коды ответа HTTP.
- Корректность JSON структуры запроса и ответа.
- Типы данных (строки, числа).
- Формат даты.
- Проведение необходмых валидаций входных данных.
- Краевые случаи.
- Формат и коды ошибок.
Рекомендуется написать свои тесты для проверки разработанной функциональности.
На выделенном контейнере вы можете:
- Работать с вашим репозиторием на GitLab.
- Использовать средства контейнеризации, например Docker, он уже установлен.
- Устанавливать программное обеспечение для сборки и запуска вашего приложения, используя Интернет. Например, для реализации задания на языке Java вы можете использовать Maven или Gradle. Явных требований по сборке и развертыванию приложения нет.
- Настраивать контейнер по своему усмотрению (например, настройки автозапуска или версии Java).
Оценивание решения будет проходить после отправки решения кандидатом на проверку в несколько этапов.
- Автоматическое тестирование. Проверяющей системой будут выполнятся запросы к вашему бэкенду. Будет проверятся корректность ответов, их коды ответа HTTP и тела.
- Ручная проверка решения проверяющими Школы бэкенд-разработки. Будут учитываться различные особенности вашего решения:
- Способ решения.
- Качество решения.
- Возможность обработки нескольких запросов сервисом одновременно.
- Покрытие тестами.
- Документация описывающая код, сборку, запуск и работу приложения.
- Подробнее про спецификацию OpenAPI вы можете узнать здесь Спецификация OpenAPI
- Практическое руководство по разработке бэкенд-сервиса на Python
- Как реализовать автозапуск программы при рестарте контейнера вы можете узнать в Практическом руководстве по разработке бэкенд-сервиса на Python в разделе "Деплой".
- Визуализация файла спецификации Open API
- Автозапуск сервера при рестарте контейнера
Как обратиться к моему приложению с рабочего компьютера?
Как и проверяющая система, вы можете сделать запрос по адресу https://Ваш_никнейм.usr.yandex-academy.ru
для проверки своего решения.
Как подключиться к базе данных внутри моего контейнера?
Вы можете развернуть требуемую базу данных внутри Docker (или другой программы для контейнеризации) или на выданном вам контейнере. В качестве примера вы можете изучить статью на Habr , рассказывающую о развёртывании PostgreSQL в Docker контейнере.
Почему не использовали oneOf в спецификации OpenAPI?
Поскольку у OpenAPI в последних версиях есть нерешенные проблемы с кодогенерацией oneOf классов, мы решили отказаться от использования такой функциональности.
Для комманды /import при отправки товара с отрицательной ценой или ценой равной null должен возвращаться код 400
Для комманды /nodes/{id} порядок элементов не важен (из-за этого могут не проходить некоторые Unit тесты)
Для комманды /node/{id}/statistic дата формируемая при удалении равна текущему времени (из-за этого могут не проходить некоторые Unit тесты)
foo@bar:~$ bash service.sh
При этом будет запущен скрипт start.sh
Данный скрипт будет автоматически запущен и при перезапуске машины
foo@bar:~$ bash start.sh
При этом будет проброшен порт с 80 на 8080
Будет развернута бд PostgreSQL
Через Maven будет собран сервис
В отдельном контейнере будет развернут собранный сервис