EventBooker — это веб-сервис для бронирования мест на мероприятия. Система поддерживает создание событий, регистрацию пользователей, бронирование с автоматической отменой неоплаченных броней через заданный интервал времени, а также административный интерфейс для управления. Все операции с базой данных выполняются с использованием транзакций для обеспечения безопасности и избежания гонок данных.
Система реализует полный цикл работы с бронированиями:
- Регистрация и аутентификация пользователей через JWT.
- Создание и просмотр событий (для обычных пользователей и администраторов).
- Бронирование мест на события с автоматической отменой неоплаченных броней через фоновый процесс (горутину, которая периодически проверяет сроки и удаляет просроченные записи, отправляя уведомления в Telegram-бота).
- Подтверждение (оплата) и отмена броней.
- Административная панель для создания событий и просмотра списка пользователей.
- Просмотр списка личных броней пользователя.
- Язык: Go (1.21+).
- Веб-фреймворк: Gin для роутинга и обработки HTTP-запросов.
- База данных: PostgreSQL с тремя таблицами: users (пользователи), events (мероприятия), booking (брони, с foreign keys на events и users).
- Миграции: утилита migrate для миграций базы данных.
- Аутентификация: JWT-токены.
- Контейнеризация: Docker для сервиса и Nginx (как reverse proxy), Docker Compose для оркестрации (базу данных нужно поднимать отдельно).
- Дополнительно: Telegram Bot API для уведомлений об отмене, CORS-middleware для фронтенда, mockery для генерации моков сервисов и тестирования handlers.
Архитектура следует паттерну слоев: handlers (API-эндпоинты) → services (бизнес-логика) → repositories (работа с БД).
API построено на Gin с группами роутов. Базовый URL: http://localhost:8080. Все защищенные эндпоинты требуют JWT в заголовке Authorization: Bearer "token".
- GET / — Главная страница (HTML).
- GET /admin_panel — Страница логина админа (HTML).
- GET /admin — Админ-панель (HTML, требует аутентификации).
- POST /auth/register — Регистрация пользователя (JSON: email, password).
- POST /auth/login — Логин (JSON: email, password; возвращает JWT).
- GET /events — Список событий (пагинация).
- GET /events/:id — Детали события.
- POST /api/events/:event_id/book — Бронирование места.
- POST /api/events/:event_id/confirm/:book_id — Подтверждение брони (оплата).
- POST /api/events/:event_id/cancel/:book_id — Отмена брони.
- GET /api/books — Список броней пользователя.
- GET /api/admin/check — Проверка доступа админа.
- POST /api/admin/events — Создание события.
- GET /api/admin/users — Список пользователей.
- Установите утилиту migrate
- Клонируйте репозиторий: git clone "repo-url" && cd EventBooker
- Скопируйте .env.example в .env и заполните
- Установите зависимости: go mod tidy
- Примените миграции с помощью Makefile
- Запустите PostgreSQL (отдельно, например, docker run --name db -e POSTGRES_PASSWORD=pass -p 5432:5432 -d postgres:15).
- Запустите сервис: go run cmd/EventBooker/main.go.
- Сервер доступен на http://localhost:8080. Nginx не обязателен локально.
- Убедитесь, что БД запущена отдельно.
- Соберите и запустите: docker-compose up --build