Сервис бронирования переговорок с REST API.
Сервис позволяет администраторам создавать переговорки и настраивать расписание их доступности, а пользователям - просматривать доступные слоты и создавать/отменять брони.
- Язык: Go 1.26
- Веб-фреймворк: Gin
- База данных: PostgreSQL (jackc/pgx/v5)
- Авторизация: JWT
- Конфигурация: .env и config/config.yaml (cleanenv, godotenv)
- Документация: Swagger (swaggo)
- Миграции: migrate
- Тестирование: testify
.
├── cmd/
│ ├── app/ # Точка входа приложения
│ └── db_seed/ # Наполнение БД тестовыми данными
├── config/ # Конфигурация
├── db/
│ ├── migrations/ # SQL миграции
│ └── queries/ # SQL запросы (sqlc)
├── docs/ # Сгенерированная Swagger документация
├── internal/
│ ├── app/ # Инициализация приложения
│ ├── controller/ # HTTP контроллеры
│ │ └── restapi/ # REST API
│ │ ├── dto/ # Data Transfer Objects
│ │ ├── handler/ # Handlers
│ │ └── middleware/ # Middleware (JWT, CORS, Role)
│ ├── deps/ # Зависимости
│ ├── entity/ # Сущности предметной области
│ ├── errs/ # Кастомные ошибки
│ ├── repo/ # Репозитории (доступ к БД)
│ └── usecase/ # Бизнес-логика
├── pkg/
│ ├── httpserver/ # HTTP сервер
│ ├── logger/ # Логирование
│ ├── postgres/ # Подключение к PostgreSQL
│ ├── timeonly/ # Утилиты для работы со временем
│ └── utils/ # Общие утилиты (JWT, криптография, валидация)
└── tests/
├── integration/ # Интеграционные тесты
└── mocks/ # Mock-и для тестов
- Docker и Docker Compose
- Go 1.26+
Параметры настраиваются через переменные окружения .env или файл config/config.yaml:
-
POSTGRES_HOST,POSTGRES_PORT,POSTGRES_USER,POSTGRES_PASSWORD,POSTGRES_DB,POSTGRES_SSL_MODE- подключение к БД -
JWT_SECRET- секрет для подписи JWT токенов -
CONFIG_PATH- путь к файлу конфигурации -
MIGRATIONS_PATH- путь к миграциям -
POSTGRES_EXTERNAL_PORT- внешний порт Postgres контейнера -
EXTERNAL_API_PORT- внешний порт api контейнера
make help # Показать все доступные команды# Запуск всех сервисов
docker compose up --build
# Или через Makefile
make up- Сервис доступен на
localhost:8080. - Swagger документация доступен на
http://localhost:8080/swagger/index.html
# Установка зависимостей
go mod tidy
# Установка инструментов
make install-tools
# Запуск приложения
make run
# С горячей перезагрузкой (air)
make run-livemake seedPOST /dummyLogin- Получение тестового JWT токена (обязательно)POST /register- Регистрация пользователя (доп. задание)POST /login- Вход по email/паролю (доп. задание)
GET /rooms/list- Список переговорокPOST /rooms/create- Создать переговорку (admin only)
POST /rooms/{roomId}/schedule/create- Создать расписание (admin only, один раз)
GET /rooms/{roomId}/slots/list?date=YYYY-MM-DD- Доступные слоты для бронирования
POST /bookings/create- Создать бронь (user only)GET /bookings/list- Все брони с пагинацией (admin only)GET /bookings/my- Мои брони на будущее (user only)POST /bookings/{bookingId}/cancel- Отменить бронь (user only)
GET /_info- Health check (всегда 200)
Для тестирования используйте /dummyLogin:
# Получить токен admin
curl -X POST http://localhost:8080/dummyLogin \
-H "Content-Type: application/json" \
-d '{"role": "admin"}'
# Получить токен user
curl -X POST http://localhost:8080/dummyLogin \
-H "Content-Type: application/json" \
-d '{"role": "user"}'Используйте полученный токен в заголовке Authorization: Bearer <token>.
# Юнит-тесты
make test
# Интеграционные тесты
make test-integration
# Все тесты с покрытием
make test-all# Swagger
make swag-gen-docs
# SQL кодогенерация (sqlc)
make sqlc-genmake lint
make lint-fix # С авто-исправлениемИспользуется гибридный режим: слоты создаются заранее при добавлении расписания на 7 дней вперёд, а также могут генерироваться на лету при запросе, если запрошенная дата выходит за пределы доступных слотов.
Повторная отмена уже отменённой брони возвращает 200 с актуальным состоянием, не считаясь ошибкой. Это реализовано на уровне usecase.