Сервис, который позволяет:
- создавать мероприятия,
- бронировать места,
- подтверждать их
- автоматически отменять неподтвержденные брони через заданный интервал времени.
Имеется минималистичный UI, который предоставляет функциональность в зависимости от роли залогиненного пользователя.
Очистка неактуальных/истекших броней производится посредством интервального запуска фоновой горутины Cleaner, которая делает выборку и удаление броней по статусу и дедлайну бронирования.
P.S. Вместо удаления можно(нужно) использовать отмену(установку статуса "cancelled"), что даст возможность накопления аналитики, но в рамках данного проекта удаление нагляднее показывает работу фонового Cleaner в UI. Брони были вынесены как отдельный ресурс в API для более удобного взаимодействия с ним.
- Регистрация (
signup) с выбором роли - Авторизация (
login) по email + пароль - JWT-аутентификация через HTTP-only cookie
-
admin
- создание ивентов(с указанием времени жизни бронирования)
- удаление ивентов(возможно только при отсутствии у ивента броней)
- просмотр всех ивентов
-
user
- просмотр ивентов
- бронирование мест
- подтверждение бронирования
- отмена своих бронирований
-
Язык: Go
-
HTTP-фреймворк: Gin
-
Аутентификация: JWT (cookie-based)
-
Middleware:
RequestID- логирование каждого запросаRequireAuth- проверка авторизацииRequireRole- проверка роли пользователя
-
Слои:
- handlers - HTTP-обработчики
- service - бизнес-логика, транзакции
- repository - работа с БД
- PostgreSQL
- Один HTML-файл
- UI меняется динамически в зависимости от роли
- Вся авторизация основана на cookie (без хранения JWT в JS)
POST /auth/signup
POST /auth/login
GET /events
POST /events (admin)
DELETE /events/:id (admin)
POST /bookings
POST /bookings/:id/confirm
GET /bookings/my
DELETE /bookings/:id
- Web UI доступен по адресу:
http://localhost:8080/ui - API - на том же хосте.
-
Если пользователь не авторизован:
- отображаются формы логина и регистрации
-
Если пользователь авторизован:
- формы логина/регистрации скрыты
- UI зависит от роли
- форма создания ивента
- таблица всех ивентов с кнопкой удаления
- таблица всех ивентов с кнопкой бронирования
- таблица текущих бронирований пользователя
- JWT хранится только в http-only cookie
- Frontend не имеет доступа к токену
user_id,role,emailберутся только из JWT на backend- Клиент не передаёт
user_idни в одном запросе
- Склонировать репозиторий
- Создать файл окружения из примера(скопировать и переименовать), внести в него необходимые правки:
cp .env.example .env- Запустить приложение:
docker-compose up- Открыть в браузере:
http://localhost:8080/ui
- добавить refresh-токены
- pagination для ивентов/броней
- WebSocket-уведомления, уведомления email/telegram
- unit-тесты для middleware и сервисов
- переделать ошибки в структуры с указанием их кодов HTTP