{"id":49562907,"url":"https://github.com/nikitadev-work/pr-manager-service","last_synced_at":"2026-05-06T09:43:05.292Z","repository":{"id":324114460,"uuid":"1095190146","full_name":"nikitadev-work/pr-manager-service","owner":"nikitadev-work","description":"Микросервис, который автоматически назначает ревьюеров на Pull Request’ы (PR), а также позволяет управлять командами и участниками.","archived":false,"fork":false,"pushed_at":"2026-03-31T15:47:05.000Z","size":188,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-03T10:46:40.331Z","etag":null,"topics":["clean-architecture","go","golang","http","openapi","postgresql"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nikitadev-work.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-11-12T17:58:51.000Z","updated_at":"2026-03-31T15:47:31.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/nikitadev-work/pr-manager-service","commit_stats":null,"previous_names":["nikitadev-work/avito-test-task-internship-autumn-2025","nikitadev-work/pr-manager-service"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/nikitadev-work/pr-manager-service","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nikitadev-work%2Fpr-manager-service","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nikitadev-work%2Fpr-manager-service/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nikitadev-work%2Fpr-manager-service/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nikitadev-work%2Fpr-manager-service/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nikitadev-work","download_url":"https://codeload.github.com/nikitadev-work/pr-manager-service/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nikitadev-work%2Fpr-manager-service/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32566444,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-03T06:36:36.687Z","status":"ssl_error","status_checked_at":"2026-05-03T06:36:09.306Z","response_time":103,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["clean-architecture","go","golang","http","openapi","postgresql"],"created_at":"2026-05-03T10:46:41.464Z","updated_at":"2026-05-03T10:46:42.018Z","avatar_url":"https://github.com/nikitadev-work.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# PR Manager Service\n\nСервис для управления pull request’ами и назначениями ревьюеров внутри команд.\n\nОсновной стек:\n- Go 1.23\n- PostgreSQL 16\n- Docker / docker compose\n- Prometheus + Grafana + Loki + Node Exporter\n- k6 для нагрузочного тестирования\n- golangci-lint для статического анализа\n\n---\n\n\n### Для быстрой проверки сервиса выполните `docker compose up` в корне проекта, после этого вам будут доступны [следующие компоненты](README.md#url-адреса-инфраструктуры) \n\n\n## Документация\n\n- [Окружение, локальная разработка и команды Makefile](docs/environment-and-makefile.md)\n- [Тестирование (unit, integration, k6, Postman)](docs/testing.md)\n- [Отчет по нагрузочному тестированию](docs/load-testing-report.md)\n\n---\n\n## Навигация по данному README.md\n- [Структура проекта](#структура-проекта)\n- [URL-адреса инфраструктуры](#url-адреса-инфраструктуры)\n- [Внешнее API и аутентификация](#внешнее-api-и-аутентификация)\n- [Continuous Integration (CI)](#continuous-integration-ci)\n- [Development Workflow](#development-workflow)\n- [Реализованные требования](#реализованные-требования)\n- [Допущения и принятые решения](#допущения-и-принятые-решения)\n\n\n## Структура проекта\n\n```text\n.\n├── pr-manager-service/\n│   ├── cmd/\n│   │   └── pr-manager-service/\n│   ├── config/\n│   ├── internal/\n│   │   ├── app/\n│   │   ├── adapters/\n│   │   │   └── httpadapter/\n│   │   ├── domain/\n│   │   ├── repository/\n│   │   ├── usecase/\n│   │   └── integration-tests/\n│   ├── migrations/\n│   ├── go.mod\n│   └── go.sum\n│\n├── common/\n│   └── kit/ - общий модуль с логгером и метриками\n│\n├── ops/\n│   ├── docker-compose.dev.yml\n│   ├── prometheus.yml\n│   ├── loki-config.yml\n│   ├── promtail-config.yml\n│   ├── grafana/\n│   │   └── provisioning/\n│   │       ├── datasources/\n│   │       └── dashboards/\n│   └── load-testing/\n│\n├── docs/\n│   ├── contracts/ - спецификация openapi\n│   └── postman/ - коллекция и окружение\n│\n├── .github/\n│   └── workflows/\n│       └── ci.yml\n├── Makefile\n└── README.md\n```\n\n---\n\n## URL-адреса инфраструктуры\n\nПосле `make dev-up` доступны:\n\n- Сервис:  \n  `http://localhost:8080`\n\n- Swagger UI (документация API):  \n  `http://localhost:8082`\n\n- Prometheus:  \n  `http://localhost:9090`\n\n- Grafana:  \n  `http://localhost:3000`  \n  Логин/пароль по умолчанию: `admin / admin`.  \n  Основные дашборды:\n  - **Main Service Metrics** — метрики HTTP-эндпоинтов и бизнес-метрики сервиса.\n  - **Node Exporter** — системные метрики хоста (CPU, память, диск).\n  - **Logs Dashboard** — дашборд логов из Loki.\n\n- Loki:  \n  `http://localhost:3100` — источник логов для Grafana.\n\n- Node Exporter:  \n  `http://localhost:9100` — системные метрики.\n\n- Статус/health самого сервиса:\n  - `GET /health` — простой healthcheck.\n  - `GET /stats` — эндпоинт статистики (имя сервиса, версия, текущее время).\n\n---\n\n## Внешнее API и аутентификация\n\nОсновные эндпоинты сервиса:\n\n- `POST /team/add` — создать команду с участниками.\n- `GET  /team/get` — получить команду и список участников.\n- `POST /users/setIsActive` — активировать/деактивировать пользователя.\n- `GET  /users/getReview` — получить список PR, где пользователь назначен ревьюером.\n- `POST /pullRequest/create` — создать PR и автоматически назначить ревьюеров.\n- `POST /pullRequest/merge` — пометить PR как смерженный.\n- `POST /pullRequest/reassign` — переназначить ревьюера.\n- `GET  /stats` — простой эндпоинт статистики сервиса (service name, version, time).\n- `GET  /health` — healthcheck.\n- `GET  /metrics` — метрики Prometheus.\n\nАутентификация:\n\n- Заголовок: `Authorization: Bearer \u003crole\u003e:\u003cuser_id\u003e`\n- Примеры:\n  - администратор: `Authorization: Bearer admin:u1`\n  - пользователь: `Authorization: Bearer user:u2`\n\nРоль проверяется в HTTP-адаптере (`auth.go`). Для админских операций (создание команд, PR и т.п.) требуется `admin`, для чтения ревью достаточно `user`.\n\n---\n\n## Continuous Integration (CI)\n\nПроект использует GitHub Actions для автоматической проверки качества кода и запуска unit-тестов при каждом push или pull-request в ветку `main`.\n\nWorkflow расположен по пути:\n\n```text\n.github/workflows/ci.yml\n```\n\nОсновные шаги:\n\n1. Получение репозитория\n2. Установка\n3. Установка `golangci-lint`\n\n4. Запуск линтера\n\n5. Запуск unit-тестов usecase-слоя\n\nИнтеграционные и нагрузочные тесты в CI не запускаются, так как требуют развернутого docker-окружения и внешних сервисов и выходят за рамки простого CI для тестового задания.\n\n---\n\n## Development Workflow\n\nВесь процесс разработки велся в GitHub Projects в формате Kanban-доски.  \nДля каждой задачи создавался отдельный task (issue) и соответствующая feature-ветка.\n\nПодход включал:\n\n- постановку задач в столбец *Backlog*;\n- перемещение задач по стадиям *In Progress → Review → Done*;\n- выполнение каждого функционального блока в отдельной ветке (`features/*`);\n- создание pull request после завершения задачи;\n- автоматическую проверку изменений через GitHub Actions (линтер + unit-тесты);\n- поддержание чистой истории коммитов и прозрачного хода работы.\n\nТакая организация позволила:\n- структурировать выполнение задания в виде небольших автономных задач;\n- легко отслеживать прогресс;\n- проводить разработку в соответствии с best-practices Git Flow;\n- обеспечить читаемость и воспроизводимость истории репозитория.\n\n---\n\n## Реализованные требования\n\nОбязательная часть:\n\n- Реализован основной REST API в соответствии с контрактом.\n- Хранение данных в PostgreSQL, миграции выполнены через отдельный контейнер `migrate`.\n- Разделение слоёв в духе Чистой архитектуры: HTTP-адаптер, usecase-слой, хранилище, доменная модель.\n- Логирование через общий модуль (`common/kit/logger`).\n- Метрики в формате Prometheus, экспорт по `/metrics`.\n- Настроены Prometheus, Grafana, Loki, Node Exporter, дашборды для метрик и логов.\n- Подготовлена Postman-коллекция и окружение.\n\nДополнительная часть:\n\n- Добавлен простой эндпоинт статистики: `GET /stats` (имя, версия, время).\n- Проведено нагрузочное тестирование решения (k6, два сценария). Отчёт в `load-testing-report.md`.\n- Реализовано интеграционное/E2E-тестирование (HTTP-тесты в `internal/integration-tests`).\n- Описана конфигурация и запуск линтера (`golangci-lint`, gofumpt, errcheck и др.).\n\n---\n\n## Допущения и принятые решения\n\n- Файл `.env` был добавлен в репозиторий по требованию из письма на электронную почту. Так же для корректной автоматической проверки задания файл `docker-compose.yml` был перенесен в корень проекта из папки `/ops`\n- Аутентификация реализована через простой формат токена `Authorization: Bearer \u003crole\u003e:\u003cuser_id\u003e`, так как в задании не было требований к полноценной auth-системе. Это позволяет сфокусироваться на бизнес-логике сервиса.\n- Эндпоинт `/stats` возвращает базовую информацию о сервисе (name, version, time), а не сложную бизнес-статистику. Для более подробных показателей используются метрики Prometheus и дашборды Grafana.\n- Массовая деактивация и безопасная переназначаемость открытых PR не реализованы в рамках тестового задания из-за ограничения по времени. Архитектура usecase-слоя и интерфейсов хранилища позволяет добавить эту логику позднее.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnikitadev-work%2Fpr-manager-service","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnikitadev-work%2Fpr-manager-service","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnikitadev-work%2Fpr-manager-service/lists"}