An open API service indexing awesome lists of open source software.

https://github.com/likeinlife/banner_api

Тестовое задание Backend Avito
https://github.com/likeinlife/banner_api

dependency-injector docker docker-compose fastapi poetry postgresql pydantic python python3 sqlalchemy

Last synced: 3 months ago
JSON representation

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

Awesome Lists containing this project

README

          

# 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. Представления