Skip to content

Тестовое задание для Reactive Phone - Junior Backend разработчик (в международный проект)

License

Notifications You must be signed in to change notification settings

alexpro2022/test-reactive-phone-FastAPI

Repository files navigation

Проект социальной сети:

Test Suite codecov

Тестовое задание


Оглавление


Технологии

Подробнее

Python asyncio FastAPI FastAPI_Users Pydantic SQLAlchemy Alembic PostgreSQL asyncpg aioredis httpx celery rabbitmq flower Uvicorn docker_compose Pytest Pytest-asyncio pre-commit

Асинхронный проект и асинхронный клиент к внешнему API реализованы с использованием FastAPI и httpx. Асинхронный клиент периодически запускается в фоновой задаче, реализованной на Celery и RabbitMQ. Посмотреть процесс выполнения и результаты фоновых задач можно через удобный интерфейс Flower.

В качестве базы данных используется PostgreSQL + asyncpg драйвер для асинхронных запросов к БД. Кеширование данных реализовано с помощью асинхронной библиотеки aioredis (является официальной частью библиотеки redis-py). Кеширование запускается в background_tasks FastApi для ускорения выдачи ответа пользователю. В качестве ORM используется SQLAlchemy + Alembic для миграций БД.

Асинхронные тесты реализованы с использованием httpx, pytest и плагина pytest-asyncio.

Приложение и тесты могут быть запущены в Docker-контейнерах.

⬆️Оглавление


Описание работы

FastAPI-шаблон состоит из основного блока (реализован стандартный CRUD на основе паттерна репозиторий - поэтому легко подключается любая бизнес-логика) и клиента для обращения к внешнему API с возможностью интеграции полученных данных в бизнес-логику основного блока.

  1. Основной блок - прототип социальной сети:

Неавторизованные пользователи могут получать доступ на чтение либо ко всем постам, либо к конкретному посту.

Авторизованный пользователь дополнительно может создавать посты, редактировать и удалять свои посты (админ имеет права доступа к любым постам), ставить лайки и дислайки для любых постов, кроме своих. Для доступа к этим функциям необходимо авторизоваться в Swagger, используя:

  • либо учетные данные из .env-файла (этот пользователь с правами админа создается программно при запуске приложения)
  • либо учетные данные нового зарегистрированного пользователя - зарегистрироваться можно через эндпоинт /auth/register в Swagger:

Авторизация:

 1. Нажмите:
    - на символ замка в строке любого эндпоинта или
    - на кнопку `Authorize` в верхней части Swagger.
     Появится окно для ввода логина и пароля.

 2. Введите учетные данные в поля формы:
    - в поле `username` — адрес почты (например значение переменной окружения `ADMIN_EMAIL`),
    - в поле `password` — пароль (например значение переменной окружения `ADMIN_PASSWORD`).

    В выпадающем списке `Client credentials location` оставьте значение `Authorization header`,
    остальные два поля оставьте пустыми; нажмите кнопку `Authorize`.

Если данные были введены правильно, и таблица в БД существует — появится окно с подтверждением авторизации, нажмите Close. Чтобы разлогиниться — перезагрузите страницу.

Swagger позволяет осуществлять http-запросы к работающему сервису, тем самым можно управлять постами в рамках политики сервиса (указано в Swagger для каждого запроса).

  1. Асинхронный httpx-клиент для криптобиржи Deribit:

через определенный интервал времени (задается пользователем, по умолчанию 15 сек) httpx-клиент забирает с биржи текущую цену BTC и ETH и логирует тикер валюты, текущую цену и время в UNIX (данные можно посмотреть по ссылке http://127.0.0.1:5555/tasks). Асинхронный клиент работает по протоколу HTTP/2 в фоновой периодической celery-задаче.

⬆️Оглавление


Установка приложения:

Предварительные условия

Предполагается, что пользователь установил Docker и Docker Compose на локальной машине. Проверить наличие можно выполнив команды:

docker --version && docker-compose --version


Клонируйте репозиторий с GitHub и введите данные для переменных окружения (значения даны для примера, но их можно оставить):

git clone https://github.com/alexpro2022/test-reactive-phone-FastAPI.git
cd test-reactive-phone-FastAPI
cp env_example .env
nano .env

⬆️Оглавление


Запуск тестов:

Из корневой директории проекта выполните команду:

docker build -f ./docker/test.Dockerfile -t social_network_tests .
docker run --name tests social_network_tests
docker container rm tests
docker rmi social_network_tests

⬆️Оглавление


Запуск приложения:

  1. Из корневой директории проекта выполните команду:
docker compose -f docker/docker-compose.yml up -d --build

Проект будет развернут в docker-контейнерах по адресу http://127.0.0.1:8000.

Администрирование приложения может быть осуществлено через Swagger доступный по адресу http://127.0.0.1:8000/docs .

Мониторинг фоновых задач Celery осуществляется по адресу: http://127.0.0.1:5555/tasks .

  1. Остановить docker и удалить контейнеры можно командой из корневой директории проекта:
docker compose -f docker/docker-compose.yml down

Если также необходимо удалить том базы данных:

docker compose -f docker/docker-compose.yml down -v

⬆️Оглавление


Удаление приложения:

Из корневой директории проекта выполните команду:

cd .. && rm -fr test-reactive-phone-FastAPI

⬆️Оглавление


Автор:

Aleksei Proskuriakov

⬆️В начало

About

Тестовое задание для Reactive Phone - Junior Backend разработчик (в международный проект)

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages