Skip to content

sudo-odner/test-pr-system

Repository files navigation

Тестовое задание для стажёра Backend

Сервис бронирования переговорок. Позволяет администраторам управлять ресурсами и расписанием, а пользователям — находить свободные слоты и бронировать их.

Технологический стек

  • Language: Go 1.26+
  • Database: PostgreSQL
  • Router: chi
  • Logging: zap
  • Validation: go-playground/validator
  • Documentation: Swagger (swaggo)
  • Testing: testify, mock, k6 (load testing)

Быстрый запуск

1. Запуск через Docker Compose

Команда поднимет приложение, базу данных и выполнит миграции(http://localhost:8080):

make up

2. Наполнение базы тестовыми данными

Для проверки работы под нагрузкой и базового тестирования:

make seed

3. Запуск тестов и покрытие

Запуск тестов:

make test

Запуск тестов и покрытие:

make cover

*Текущее покрытие проекта:

  • ~55% (всего проека)(go test -coverprofile=coverage.out ./... && go tool cover -func=coverage.out)
  • ~71.3%(internal и test)(go test -coverpkg=./internal/... -coverprofile=coverage.out ./internal/... ./tests/... && go tool cover -func=coverage.out

Решения

Стратегия формирования слотов

В проекте реализован Lazy Generation (Ленивая генерация) подход:

  • Слоты не создаются заранее на годы вперед.
  • При первом запросе списка слотов на конкретную дату (/rooms/{id}/slots/list), система проверяет их наличие в БД.
  • Если слотов нет, они генерируются на лету на основе расписания и сохраняются в БД.
  • Обоснование: Это предотвращает избыточное раздувание базы данных (до 1k слотов в день на комнату) и гарантирует стабильность UUID для бронирования. Для предотвращения "race condition" при одновременном запросе одной даты разными пользователями используется golang.org/x/sync/singleflight.

Первичные ключи и UUIDv7

В проекте в качестве идентификаторов ресурсов (ID) используются UUIDv7. Это осознанный выбор в пользу производительности базы данных по следующим причинам:

  • Встроенный Timestamp: В отличие от UUIDv4 (который полностью случаен), UUIDv7 содержит в себе временную метку (Unix timestamp с точностью до миллисекунд). Это позволяет сортировать идентификаторы по времени их создания без использования дополнительных колонок created_at.
  • Оптимизация B-tree индексов: PostgreSQL использует B-tree для индексации первичных ключей. Так как UUIDv7 монотонно возрастают (являются k-sortable), новые записи вставляются в "конец" индекса.

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

Swagger UI доступен после запуска приложения по адресу: http://localhost:8080/swagger/index.html


Нагрузочное тестирование

Требования: 100 RPS, SLI 99.9%, Latency < 200ms для списка слотов.

Тестовая нагрузка.png

Для запуска:

make loadtest

Реализованные дополнительные задания

  • Регистрация и авторизация: Полноценные /register и /login с хешированием паролей (bcrypt).
  • Makefile: Удобные команды для управления проектом.
  • Swagger: Полная аннотация кода и генерация доки.
  • Linter: Настроен .golangci.yaml.
  • Нагрузочное тестирование: Скрипты k6 включены в проект.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages