Веб-сервис для автоматического назначения ревьюверов на Pull Request'ы внутри команд разработки. Сервис предоставляет REST API для управления командами, пользователями, Pull Request'ами и получения статистики по назначениям ревьюверов.
- POST /team/add - Создание команды с участниками (создаёт/обновляет пользователей)
- GET /team/get?team_name={name} - Получение информации о команде и её участниках
- POST /users/setIsActive - Установка флага активности пользователя
- GET /users/getReview?user_id={id} - Получение списка PR'ов, где пользователь назначен ревьювером
- POST /pullRequest/create - Создание PR и автоматическое назначение до 2 ревьюверов из команды автора
- POST /pullRequest/merge - Пометка PR как слитого (идемпотентная операция)
- POST /pullRequest/reassign - Переназначение конкретного ревьювера на другого из его команды
- GET /statistics - Получение статистики назначений ревьюверов:
- Количество назначений по каждому пользователю
- Количество ревьюверов на каждый PR
- Java 17 - язык программирования
- Spring Boot 3.2.5 - фреймворк для разработки веб-приложений
- PostgreSQL 15 - реляционная база данных
- Liquibase - управление миграциями базы данных
- MapStruct 1.5.5 - генерация мапперов для преобразования объектов
- Lombok 1.18.32 - уменьшение boilerplate кода
- JUnit 5 - фреймворк для модульного и интеграционного тестирования
- Mockito - библиотека для создания мок-объектов
- Testcontainers - библиотека для интеграционных тестов с реальной базой данных
- Maven - система сборки проекта
- Docker & Docker Compose - контейнеризация и оркестрация
Проект организован в виде многомодульного Maven-проекта:
avito-test/
├── avito-test-domain/ # Доменные модели, сущности JPA, репозитории
├── avito-test-db/ # Миграции базы данных (Liquibase)
├── avito-test-impl/ # Реализация бизнес-логики, контроллеры, сервисы, мапперы
└── pom.xml # Корневой POM файл
- Java 17 или выше
- Maven 3.6+
- Docker и Docker Compose (для запуска через контейнеры)
- PostgreSQL 15 (если запускаете локально без Docker)
- Клонируйте репозиторий:
git clone <repository-url>
cd avito-test- Запустите приложение через Docker Compose:
docker-compose up --buildПриложение будет доступно по адресу: http://localhost:8080
- Убедитесь, что PostgreSQL запущен и доступен:
# Создайте базу данных
createdb avito_test
# Или используйте Docker для PostgreSQL
docker run -d \
--name avito-test-postgres \
-e POSTGRES_DB=avito_test \
-e POSTGRES_USER=postgres \
-e POSTGRES_PASSWORD=postgres \
-p 5432:5432 \
postgres:15-alpine- Настройте переменные окружения или отредактируйте
avito-test-impl/src/main/resources/application.yaml:
spring:
datasource:
url: jdbc:postgresql://localhost:5432/avito_test
username: postgres
password: postgres- Соберите проект:
mvn clean install- Запустите приложение:
cd avito-test-impl
mvn spring-boot:runПолная документация API доступна в файле openapi.yml в формате OpenAPI 3.0.
curl -X POST http://localhost:8080/team/add \
-H "Content-Type: application/json" \
-d '{
"team_name": "backend",
"members": [
{
"user_id": "u1",
"username": "Alice",
"is_active": true
},
{
"user_id": "u2",
"username": "Bob",
"is_active": true
}
]
}'curl -X POST http://localhost:8080/pullRequest/create \
-H "Content-Type: application/json" \
-d '{
"pull_request_id": "pr-1001",
"pull_request_name": "Add search",
"author_id": "u1"
}'curl -X GET http://localhost:8080/statisticsПроект содержит полное покрытие тестами:
- Тесты сервисов с использованием Mockito
- Тесты контроллеров с использованием MockMvc
- Тесты с реальной базой данных через Testcontainers
- Полное покрытие всех API endpoints
Запуск всех тестов:
mvn testЗапуск только интеграционных тестов:
mvn test -Dtest=*IntegrationTestЗапуск только модульных тестов:
mvn test -Dtest=*ServiceTest,*ControllerTestПримечание: Для интеграционных тестов требуется запущенный Docker, так как используется Testcontainers.
Схема базы данных управляется через Liquibase. Миграции находятся в модуле avito-test-db/src/main/resources/db/changelog/.
- teams - таблица команд
- users - таблица пользователей
- pull_requests - таблица Pull Request'ов
- pull_request_reviewers - связь многие-ко-многим между PR и ревьюверами
При создании Pull Request автоматически назначаются до 2 ревьюверов из команды автора:
- Ревьюверы выбираются случайным образом из активных участников команды
- Автор PR не может быть назначен ревьювером своего PR
- Если в команде недостаточно кандидатов, назначается меньшее количество
При переназначении ревьювера:
- Новый ревьювер выбирается из той же команды, что и старый
- Новый ревьювер должен быть активным
- Новый ревьювер не должен быть автором PR
- Новый ревьювер не должен уже быть назначенным на этот PR
- Нельзя переназначить ревьювера на PR, который уже слит (status = MERGED)
Сервис возвращает структурированные ошибки в формате:
{
"error": {
"code": "ERROR_CODE",
"message": "Описание ошибки"
}
}Коды ошибок:
TEAM_EXISTS- команда уже существуетPR_EXISTS- Pull Request с таким ID уже существуетPR_MERGED- попытка изменить уже слитый PRNOT_ASSIGNED- ревьювер не назначен на PRNO_CANDIDATE- нет доступных кандидатов для назначенияNOT_FOUND- ресурс не найден
Это тестовое задание для Авито. Код предоставлен для демонстрации навыков разработки.
Iakov Lysenko