Skip to content

Latest commit

 

History

History
244 lines (186 loc) · 9.38 KB

File metadata and controls

244 lines (186 loc) · 9.38 KB

Тестовое задание Авито: Сервис назначения ревьюверов на Pull Request'ы

Описание

Веб-сервис для автоматического назначения ревьюверов на 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'ов, где пользователь назначен ревьювером

Управление Pull Request'ами

  • 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)

Установка и запуск

Запуск через Docker Compose (рекомендуется)

  1. Клонируйте репозиторий:
git clone <repository-url>
cd avito-test
  1. Запустите приложение через Docker Compose:
docker-compose up --build

Приложение будет доступно по адресу: http://localhost:8080

Локальный запуск

  1. Убедитесь, что 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
  1. Настройте переменные окружения или отредактируйте avito-test-impl/src/main/resources/application.yaml:
spring:
  datasource:
    url: jdbc:postgresql://localhost:5432/avito_test
    username: postgres
    password: postgres
  1. Соберите проект:
mvn clean install
  1. Запустите приложение:
cd avito-test-impl
mvn spring-boot:run

API документация

Полная документация API доступна в файле openapi.yml в формате OpenAPI 3.0.

Примеры использования API

Создание команды

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
      }
    ]
  }'

Создание Pull Request

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 - попытка изменить уже слитый PR
  • NOT_ASSIGNED - ревьювер не назначен на PR
  • NO_CANDIDATE - нет доступных кандидатов для назначения
  • NOT_FOUND - ресурс не найден

Это тестовое задание для Авито. Код предоставлен для демонстрации навыков разработки.

Автор

Iakov Lysenko