Это реализация тестового задания для стажёра Backend (осенняя волна 2025). Сервис представляет собой HTTP API для управления командами, пользователями и назначения ревьюеров на Pull Request'ы.
https://avito-pr-project-production.up.railway.app/
- Язык: Python 3.11
- Фреймворк: FastAPI
- База данных: PostgreSQL
- Оркестрация: Docker, Docker Compose
- ORM: SQLAlchemy
Для запуска проекта у вас должны быть установлены Docker и Docker Compose.
-
Клонируйте репозиторий:
git clone https://github.com/YUNIX-sudo/avito cd <project-folder>
-
Создайте файл
.env: Скопируйте содержимое файла.env.exampleили создайте.envвручную со следующими переменными:# PostgreSQL Settings DB_NAME=pr_reviewer_db DB_USER=pr_reviewer_user DB_PASS=pr_reviewer_pass DB_HOST=db DB_PORT=5432 # Application Settings APP_PORT=8080
-
Makefile для запуска:
-
Запустить проект:
make up
Эта команда соберет Docker-образ и запустит контейнеры с приложением и базой данных в фоновом режиме.
-
Остановить проект:
make down
-
Посмотреть логи приложения:
make logs
-
Полностью удалить контейнеры и данные БД:
make destroy
-
- API:
http://localhost:8080 - Интерактивная документация (Swagger UI):
http://localhost:8080/docs- При переходе на корень (
/) происходит автоматическая переадресация на эту страницу.
- При переходе на корень (
- Альтернативная документация (ReDoc):
http://localhost:8080/redoc
- Хранение ревьюеров: Список ID ревьюеров для каждого PR хранится в виде строки с разделителями-запятыми (например,
"u1,u2"). Это простое решение, подходящее для небольшого количества ревьюеров (до 2). Для более сложной системы можно было бы использовать отдельную связующую таблицу (many-to-many). - Миграции: Для простоты таблицы в базе данных создаются при старте приложения (
Base.metadata.create_all(bind=engine)). В продакшн-проекте для управления изменениями схемы БД следовало бы использовать инструменты миграций, такие как Alembic. - RPC-стиль API: Структура эндпоинтов (
/team/add,/users/setIsActive) продиктована предоставленнымopenapi.ymlи следует стилю RPC (Remote Procedure Call), а не классическому REST.