Skip to content

Cервис бронирования с дедлайнами

Notifications You must be signed in to change notification settings

UnendingLoop/EventBooker

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

EventBooker

Сервис, который позволяет:

  • создавать мероприятия,
  • бронировать места,
  • подтверждать их
  • автоматически отменять неподтвержденные брони через заданный интервал времени.

Имеется минималистичный UI, который предоставляет функциональность в зависимости от роли залогиненного пользователя.

Очистка неактуальных/истекших броней производится посредством интервального запуска фоновой горутины Cleaner, которая делает выборку и удаление броней по статусу и дедлайну бронирования.

P.S. Вместо удаления можно(нужно) использовать отмену(установку статуса "cancelled"), что даст возможность накопления аналитики, но в рамках данного проекта удаление нагляднее показывает работу фонового Cleaner в UI. Брони были вынесены как отдельный ресурс в API для более удобного взаимодействия с ним.


Возможности

Пользователи

  • Регистрация (signup) с выбором роли
  • Авторизация (login) по email + пароль
  • JWT-аутентификация через HTTP-only cookie

Роли и права

  • admin

    • создание ивентов(с указанием времени жизни бронирования)
    • удаление ивентов(возможно только при отсутствии у ивента броней)
    • просмотр всех ивентов
  • user

    • просмотр ивентов
    • бронирование мест
    • подтверждение бронирования
    • отмена своих бронирований

Архитектура

Backend

  • Язык: Go

  • HTTP-фреймворк: Gin

  • Аутентификация: JWT (cookie-based)

  • Middleware:

    • RequestID - логирование каждого запроса
    • RequireAuth - проверка авторизации
    • RequireRole - проверка роли пользователя
  • Слои:

    • handlers - HTTP-обработчики
    • service - бизнес-логика, транзакции
    • repository - работа с БД

Database

  • PostgreSQL

Frontend

  • Один HTML-файл
  • UI меняется динамически в зависимости от роли
  • Вся авторизация основана на cookie (без хранения JWT в JS)

API

Auth

POST /auth/signup
POST /auth/login

Events (требует авторизацию)

GET    /events
POST   /events        (admin)
DELETE /events/:id    (admin)

Bookings (требует авторизацию)

POST   /bookings
POST   /bookings/:id/confirm
GET    /bookings/my
DELETE /bookings/:id

UI

  • Web UI доступен по адресу: http://localhost:8080/ui
  • API - на том же хосте.

Поведение UI

  • Если пользователь не авторизован:

    • отображаются формы логина и регистрации
  • Если пользователь авторизован:

    • формы логина/регистрации скрыты
    • UI зависит от роли

Admin

  • форма создания ивента
  • таблица всех ивентов с кнопкой удаления

User

  • таблица всех ивентов с кнопкой бронирования
  • таблица текущих бронирований пользователя

Безопасность (ключевые решения)

  • JWT хранится только в http-only cookie
  • Frontend не имеет доступа к токену
  • user_id, role, email берутся только из JWT на backend
  • Клиент не передаёт user_id ни в одном запросе

Запуск проекта

  1. Склонировать репозиторий
  2. Создать файл окружения из примера(скопировать и переименовать), внести в него необходимые правки:
cp .env.example .env
  1. Запустить приложение:
docker-compose up
  1. Открыть в браузере:
http://localhost:8080/ui

Что можно улучшить

  • добавить refresh-токены
  • pagination для ивентов/броней
  • WebSocket-уведомления, уведомления email/telegram
  • unit-тесты для middleware и сервисов
  • переделать ошибки в структуры с указанием их кодов HTTP

About

Cервис бронирования с дедлайнами

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published