/banner_api

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

Primary LanguagePython

Banner API

Сервис, который позволяет показывать пользователям баннеры, в зависимости от требуемой фичи и тега пользователя, а также управлять баннерами и связанными с ними тегами и фичами.

Демонстрация работы

https://disk.yandex.ru/i/xiCEISJEF4f0yA

Запуск и остановка

  1. make env - скопировать sample.env в .env
  2. make up - запустить сервис (banner_api, postgresql, redis)
  3. make fill-db count=10 - заполнить ДБ случайными значениями
  4. make down - остановить сервис. make downv - остановить сервис и удалить volumes

Проверка

  1. Swagger: http://127.0.0.1:8000/api/openapi
  2. Postman: коллекция в корне проекта Banner API.postman_collection.json

Тестирование

  1. make test - запустить тесты
  2. make test-down - полностью удалить контейнеры с тестами

Реализованные дополнительные требования

  1. Линтеры - ruff, mypy
  2. Интеграционные тесты
  3. Метод удаления баннера по фиче/тегу. Для выполнения задачи использовался Dramatiq

Примечание

Стек

Основной:

  • Python 3.10
  • FastAPI
  • SQLAlchemy 2
  • Dramatiq
  • PostreSQL
  • Redis
  • Docker, docker-compose

Вспомогательный:

  • Pydantic v2, pydantic-settings - конфиги, модели
  • DependencyInjector - DI
  • structlog, asgi_correlation_id - логирование, request-id
  • alembic - миграции

Инструменты разработки, линтеры/форматтеры:

  • mypy
  • ruff
  • pre-commit

Токены

Т.к. задачи разработать сервис аутентификации/авторизации не стояло, токены реализованы следующим образом:

  • отрицательные число - администратор
  • положительное число - обычный пользователь

Архитектура

Сделано что-то похожее на слоистую архитектуру. Выделены DTO, но нет абстрактных репозиториев.

Структура состоит из слоёв:

  1. DTO
  2. Репозитории (работа происходит через Unit of Work)
  3. Usecases
  4. Представления