Данный микросервис был реализован на основе FastAPI с использованием базы данных Postgres и ORM SQLAlchemy. Сервис предоставляет HTTP API и принимает/отдает запросы/ответы в формате JSON. Описание методов API
1. POST /provider-a/search Данный метод возвращает данные из файла response_a.json с задержкой в 30 секунд.
2. POST /provider-b/search Данный метод возвращает данные из файла response_b.json с задержкой в 60 секунд.
3. POST /airflow/search Данный метод отправляет запросы на поиск в сервисах provider-a и provider-b и в ответе возвращает уникальный search_id поиска
4. GET /airflow/results/{search_id}/{currency} Данный метод возвращает результаты поиска в провайдерах provider-a и provider-b по уникальному search_id с указанием валюты currency. Результаты поиска накапливаются и сортируются по цене. Ответ также содержит статус поиска PENDING или COMPLETED в зависимости от стадии поиска
А также Курс валют скачивается раз в день в 12:00, также он будет скачан при первом запуске приложения.
Запуск приложения
Скачайте репозиторий на свой компьютер.
Запустите контейнеры с помощью команды: docker-compose up --build Приложение будет запущено на порту 9000. http://localhost:9000/ А также можно вручную запустить при помощи команды: _uvicorn main:app --reload --port 9000 для этого уже подготовлен .env file
Тестирование
Для тестирования используется pytest
Требования
- Сервисы должен быть написан на языке Python с использованием любого из веб фреймворков. <Выбран FastAPI>
- В качестве хранилища данных можно использовать любую технологию. _<Postgres и SQLAlchemy>_
- Сервер должен быть доступен на порту 9000
- Предоставить инструкцию по запуску приложения. В идеале (но не обязательно) – использовать контейнеризацию с возможностью запустить проект командой docker-compose up
Будет плюсом
- Использование асинхронного фреймворка и кода
- Написать тесты (постарайтесь достичь покрытия в 70% и больше)
- Если вдруг будет желание, можно сделать простой UI
- Вместо файлов response_a.json и response_b.json, распарсить реальные ответы провайдеров из файлов response_a.xml и response_b.xml, результат должен быть идентичным по формату.