Skip to content

CalmNad/eventio

Repository files navigation

Eventio - Система бронирования мест на мероприятия

API для бронирования мест на мероприятия с авторизацией пользователей.

Требования

Перед началом работы убедитесь, что установлены следующие инструменты:

Архитектура

Проект построен на базе:

  • NestJS
  • PostgreSQL
  • DDD (Domain-Driven Design) - архитектурный подход
  • Чистая архитектура - разделение на слои

Домены

  • users - управление пользователями и авторизация
  • events - управление событиями
  • booking - бронирование мест на события

Развертывание

1. Создание Docker сети

docker network create eventio

2. Запуск через Tilt

Перейдите в директорию проекта и запустите Tilt:

cd <project folder>
tilt up

Нажмите пробел, чтобы открыть контрольную панель Tilt в браузере.

Tilt автоматически:

  • Соберет Docker образ приложения
  • Запустит контейнеры (приложение и PostgreSQL)
  • Настроит hot-reload для разработки

Инициализация базы данных

После запуска контейнеров выполните инициализацию БД:

1. Создание пользователя и базы данных

docker exec -i eventio-postgres psql -U postgres -d postgres < ./db/init/init.sql

WARNING: Инициализация должна выполнится автоматически, команда дана "для подстраховки". Результат в виде:

ERROR:  role "eventio" already exists
ERROR:  database "eventio" already exists

говорит о том, что база ранее успешно создана.

2. Применение миграций

# Основные миграции (создание таблиц)
docker exec -i eventio-main pnpm migrate:up

# Seed миграции (тестовые данные)
docker exec -i eventio-main pnpm migrate:seed:up

Запуск

После выполнения инициализации приложение будет доступно по адресу:

Доступ к сервисам с локальной машины

API сервис

API доступен на порту 4001:

curl http://localhost:4001/api/events

База данных PostgreSQL

БД доступна на порту 5434:

# Подключение через psql
psql -h localhost -p 5434 -U eventio -d eventio

# Пароль: eventio

Или через Docker:

docker exec -it eventio-postgres psql -U eventio -d eventio

Учетные данные БД:

  • Host: localhost
  • Port: 5434
  • User: eventio
  • Password: eventio
  • Database: eventio

API Endpoints

Авторизация

Вход (получение токена)

curl -X POST http://localhost:4001/api/users/login \
  -H "Content-Type: application/json" \
  -d '{
    "name": "UserOne",
    "password": "111"
  }'

Ответ:

{
  "success": true,
  "token": "uuid-токен",
  "userId": 1
}

Важно: Сохраните полученный токен для использования в последующих запросах.

Выход

curl -X POST http://localhost:4001/api/users/logout \
  -H "Authorization: Bearer YOUR_TOKEN_HERE"

События

Получение списка всех событий (публичный)

curl -X GET http://localhost:4001/api/events

Получение события по ID (публичный)

curl -X GET http://localhost:4001/api/events/1

Создание нового события (требует авторизации)

curl -X POST http://localhost:4001/api/events \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_TOKEN_HERE" \
  -d '{
    "name": "Концерт джаз-группы",
    "total_seats": 150
  }'

Бронирование

Резервация места на событии (требует авторизации)

curl -X POST http://localhost:4001/api/bookings/reserve \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_TOKEN_HERE" \
  -d '{
    "eventId": 1
  }'

Примечание: userId автоматически берется из токена авторизации, в теле запроса передается только eventId.

Примеры использования

Полный цикл работы с API

# 1. Авторизация и сохранение токена
TOKEN=$(curl -s -X POST http://localhost:4001/api/users/login \
  -H "Content-Type: application/json" \
  -d '{"name": "UserOne", "password": "111"}' | jq -r '.token')

echo "Token: $TOKEN"

# 2. Получение списка событий
curl -X GET http://localhost:4001/api/events

# 3. Создание нового события
curl -X POST http://localhost:4001/api/events \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{"name": "Концерт джаз-группы", "total_seats": 150}'

# 4. Резервация места
curl -X POST http://localhost:4001/api/bookings/reserve \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{"eventId": 1}'

# 5. Выход
curl -X POST http://localhost:4001/api/users/logout \
  -H "Authorization: Bearer $TOKEN"

Тестовые данные

После выполнения seed миграций в системе будут доступны:

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

  • UserOne / 111
  • UserTwo / 222
  • UserThree / 333

События:

  • Концерт рок-группы (100 мест)
  • Театральная постановка (50 мест)
  • Спортивное мероприятие (200 мест)

Важные замечания

Авторизация

  • Используется простейшая система авторизации через Bearer токены
  • Токены хранятся в памяти приложения
  • Все токены сбрасываются при перезапуске контейнера

Типы данных

  • В проекте используется минимальная типизация для упрощения разработки

Порты

  • API сервис: 4001 (внешний) → 3000 (внутри контейнера)
  • PostgreSQL: 5434 (внешний) → 5432 (внутри контейнера)

Обработка ошибок

Все доменные ошибки автоматически преобразуются в JSON ответы с соответствующими HTTP кодами:

  • BusinessRuleError400 Bad Request
  • ValidationError400 Bad Request
  • EntityNotFoundError404 Not Found
  • DuplicateEntityError409 Conflict

Остановка

Для остановки всех сервисов:

tilt down

Или через Docker Compose:

docker compose down

Разработка

Структура проекта

src/
├── app/              # Инфраструктурные модули
│   ├── database/     # Настройки БД и миграции
│   └── main.ts       # Точка входа
├── domains/          # Домены приложения
│   ├── users/        # Домен пользователей
│   ├── events/       # Домен событий
│   └── booking/      # Домен бронирования
└── shared/           # Общий код
    └── common/        # Базовые классы DDD

Команды разработки

# Запуск в режиме разработки (через Tilt)
tilt up

# Применение миграций
docker exec -i eventio-main pnpm migrate:up

# Откат миграций
docker exec -i eventio-main pnpm migrate:down

# Применение seed миграций
docker exec -i eventio-main pnpm migrate:seed:up

# Откат seed миграций
docker exec -i eventio-main pnpm migrate:seed:down

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published