Нужно написать веб-сервис на 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 (Так как он должен быть маленьким и быстрым)
Он поддерживает минимум функционала, но его было достаточно для выполнения проекта. В дальнейшем планируется реализовать все 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
Запрос: GET http://0.0.0.0:8081/convert?from=USD&&to=NOTEXIST&&amount=4