Внутри команды требуется единый микросервис, который автоматически назначает ревьюеров на Pull Request’ы (PR), а также позволяет управлять командами и участниками. Взаимодействие происходит исключительно через HTTP API.
Необходимо реализовать сервис, который назначает ревьюеров на PR из команды автора, позволяет выполнять переназначение ревьюверов и получать список PR’ов, назначенных конкретному пользователю, а также управлять командами и активностью пользователей. После merge PR изменение состава ревьюверов запрещено.
Пользователь (User) — участник команды с уникальным идентификатором, именем и флагом активности isActive.
Команда (Team) — группа пользователей с уникальным именем.
Pull Request (PR) — сущность с идентификатором, названием, автором, статусом OPEN|MERGEDи списком назначенных ревьюверов (до 2).
- При создании PR автоматически назначаются до двух активных ревьюверов из команды автора, исключая самого автора.
- Переназначение заменяет одного ревьювера на случайного активного участника из команды заменяемого ревьювера.
- После
MERGEDменять список ревьюверов нельзя. - Если доступных кандидатов меньше двух, назначается доступное количество (0/1).
- Используйте этот API (OpenAPI-спецификация будет предоставлена отдельным файлом —
openapi.yaml). - Объём данных умеренный (до 20 команд и до 200 пользователей), RPS — 5, SLI времени ответа — 300 мс, SLI успешности — 99.9%.
- Пользователь с
isActive = falseне должен назначаться на ревью. - Операция merge должна быть идемпотентной — повторный вызов не приводит к ошибке и возвращает актуальное состояние PR.
- Сервис и его зависимости должны подниматься командой docker-compose up. Если решение предусматривает миграции, они также должны применяться при выполнении этой команды. Сервис должен быть доступен на порту 8080.
- Учтите, что соблюдение условий по поднятию сервиса ускорит и упростит проверку вашей работы наставниками.
Эти задания не являются обязательными, но выполнение всех или части из них даст вам преимущество перед другими кандидатами.
- Добавить простой эндпоинт статистики (например, количество назначений по пользователям и/или по PR).
- Провести нагрузочное тестирование полученного решения и приложить краткие результаты тестирования к решению.
- Добавить метод массовой деактивации пользователей команды и безопасную переназначаемость открытых PR (стремиться уложиться в 100 мс для средних объёмов данных).
- Реализовать интеграционное или E2E-тестирование.
- Описать конфигурацию линтера.
Язык сервиса: предпочтительным будет Go, при этом вы можете выбрать любой, удобный вам.
База данных: предпочтительной будет PostgreSQL, при этом вы можете выбрать любую, удобную вам (допускается in-memory реализация).
Если у вас возникнут вопросы по заданию, ответы на которые вы не найдёте в описанных «Условиях», вы вольны принимать решения самостоятельно.
В таком случае приложите к проекту README-файл, в котором будет список вопросов и пояснения о том, какие допущения вы сделали и почему именно выбранным вами способом.
Необходимо предоставить публичный git-репозиторий на любом публичном хосте (GitHub / GitLab / etc), содержащий в master/main ветке:
- Код сервиса
- Makefile c командами сборки проекта / Описанная в README.md инструкция по запуску
- Описанные в README.md вопросы/проблемы, с которыми столкнулись, и ваша логика их решений (если требуется)