Skip to content

Latest commit

 

History

History
57 lines (34 loc) · 4.31 KB

README.md

File metadata and controls

57 lines (34 loc) · 4.31 KB

Тестовое задание для Mail.ru

Текст задания

API конвертации валют

Нужно написать веб-сервис на asyncio, который предоставляет API для конвертации валют. Данные хранить в Redis. Все явно неописанные форматы и протоколы можно допридумать.

Должны работать следующие локейшены:

  • GET /convert?from=RUR&to=USD&amount=42: перевести amount из валюты from в валюту to. Ответ в JSON.
  • POST /database?merge=1: залить данные по валютам в хранилище. Если merge == 0, то старые данные инвалидируются. Если merge == 1, то новые данные перетирают старые, но старые все еще акутальны, если не перетерты.

Запуск

Используя poetry: make build && make run(или poetry run start.py если poetry создаёт venv вне текущей директории) Используя pip: make build-pip && make run-pip

По умолчанию сервис запущен на 0.0.0.0:8081 и подключается к редису redis://localhost (значение переменной окружения REDIS_URL)

Описание проекта

В процессе работы, был написан маленький веб-фреймворк на asyncio и uvloop под названием keklik (Так как он должен быть маленьким и быстрым)

drawing

Он поддерживает минимум функционала, но его было достаточно для выполнения проекта. В дальнейшем планируется реализовать все todo, а так же перевести сервер с корутин, на корутины + prefork(используя pathos), для этого в классе HTTPServer все готово). Так же стоило бы написать тесты на каждый из слоев приложения, используя моки, я этого не делал так как это не было в требованиях к заданию.

Само приложение(converter, находящийся в src) написано с использованием CleanArchitecture, так что все компоненты взаимо заменяемы, и мы можем легко перейти от использования keklik framework на, например, aiohttp Или вместо использования redis перейти на Postgres.

При подсчете курса, предполагается что пользователь вводит отношение заданной валюты к базовой(например USD), тогда курс подсчитывается по формуле: converted_value = amount * (cur_from / cur_to)

Где можно потыкать? Примеры

Сервиc задеплоен на http://165.227.162.244:8081

Так что можно будет его потыкать там GET http://165.227.162.244:8081/convert?from=USD&&to=EUR&&amount=4 POST http://165.227.162.244:8081/database?merge=1

Примеры запросов на локалхосте

Запрос: GET http://0.0.0.0:8081/convert?from=USD&&to=EUR&&amount=4

Ответ: drawing

Запрос: GET http://0.0.0.0:8081/convert?from=USD&&to=NOTEXIST&&amount=4

Ответ: drawing

Запрос: drawing

Ответ: drawing