- Golang 1.24
- PostgreSQL
- Docker
- make
Для запуска сначала необходимо скопировать .env файл
cp .env.example .envЗатем выполнить команду
make docker-upСервис доступен на порте :8080.
Для запуска модульных тестов сначала необходимо сгенерировать моки командой
make generate-mocksи затем выполнить команду
make testВ конце вывода будет показано покрытие кода тестами. На данный момент покрытие составляет примерно 40%.
Для запуска e2e-тестов необходимо выполнить команду
make e2eДля проверки кода с помощью линтеров необходимо выполнить следующую команду.
make run_linterДля форматирования кода используется следующая команда.
make run_format| Линтер | Комментарий |
|---|---|
| goimports | форматирует код и автоматически упорядочивает/добавляет/удаляет импорты |
| errcheck | проверяет, что возвращаемые ошибки не игнорируются и корректно обрабатываются |
| goconst | находит повторяющиеся литералы, которые стоит вынести в константы |
| govet | выявляет подозрительные конструкции и типичные ошибки (например, теневание переменных, неверные форматные строки) |
| ineffassign | обнаруживает неэффективные присваивания переменным, результаты которых не используются |
| staticcheck | расширенный статический анализ - ловит баги, антипаттерны и потенциальные проблемы производительности |
| unused | находит неиспользуемые переменные, функции, типы, поля и импорты |
| misspell | исправляет/подсвечивает опечатки в комментариях и строках |
| Обработчик | Что делает |
|---|---|
| /stats/assignmentsByReviewers | отдает массив словарей, которые содержат идентификатор пользователя и число открытых pull request'ов, где он назначен reviwer'ом |
| /users/deactivate/ | на вход получает json, представленный ниже и деактивирует пользователей, если они в одной команде, также переназначает ревьюверов для pull request'а |
"team_name": "test_backend",
"users_ids": [
"tb1",
"tb6"
]
}
Были наложены индексы на колонки таблиц, которые чаще всего используются в операциях для работы с базой данных.
| Таблица | Колонка с индексом |
|---|---|
| "user" | id (при создании таблицы) |
| "user" | team_name |
| "user" | (team_name, id) is_active = TRUE (составной индекс) |
| pull_request_reviewers | reviewer_id, pull_request_id (составной индекс) |
| pull_request | author_id |
| pull_request | name |
| Команда | Описание |
|---|---|
| docker-up | Поднимает сервисы из docker-compose с пересборкой образов. |
| docker-remove | Полностью очищает Docker, удаляя все контейнеры и образы. |
| docker-stop | Останавливает docker-compose и удаляет связанные ресурсы. |
| clean | Удаляет временные файлы, каталоги моков и отчёты покрытия. |
| generate-mocks | Генерирует моки для Go-интерфейсов с помощью Mockery. |
| test | Запускает проектный скрипт тестирования. |
| e2e | Выполняет end-to-end тесты с тегом e2e. |
| run_linter | Запускает golangci-lint для анализа кода. |
| run_format | Форматирует Go-код и упорядочивает импорты. |
В случае, когда не на кого переназначить pull request, проверяющий остается прежний. В логи пишется, что не удалось найти проверяющего, а пользователю отдается валидный JSON, в котором проверяющий остался тот же.
В случае, когда пытаются изменить ревьюверов у pull request'а, указывая old_reviewer_id, который на самом деле не является ревьювером этого pull request'а, сервер отдаст ошибку 404 (resource not found).
В случае, когда не осталось активных проверяющих при вызове обработчика /users/deactivate, остаются те же проверяющие, что и до вызова метода.
Ошибка присылается структурой
{
"error": {
"code": 409,
"message": "team_name already exists"
}
}Решил отправлять код ошибки, вместо текстового описания кода ошибки.
- Добавить простой эндпоинт статистики (например, количество назначений по пользователям и/или по PR).
- Добавить метод массовой деактивации пользователей команды и безопасную переназначаемость открытых PR (стремиться уложиться в 100 мс для средних объёмов данных).
- Реализовать интеграционное или E2E-тестирование.
- Описать конфигурацию линтера.
Покрыть тестами repository, usecase, handler.