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
- Host: GitHub
- URL: https://github.com/likeinlife/banner_api
- Owner: likeinlife
- Created: 2024-04-07T12:11:05.000Z (about 2 years ago)
- Default Branch: main
- Last Pushed: 2024-04-13T17:31:33.000Z (about 2 years ago)
- Last Synced: 2024-04-14T08:00:05.472Z (about 2 years ago)
- Topics: dependency-injector, docker, docker-compose, fastapi, poetry, postgresql, pydantic, python, python3, sqlalchemy
- Language: Python
- Homepage:
- Size: 104 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
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. Представления