210 lines
6.4 KiB
Markdown
210 lines
6.4 KiB
Markdown
|
|
# Backend - "100 к 1" Multiplayer Game
|
|||
|
|
|
|||
|
|
NestJS backend для мультиплеерной игры "100 к 1" с WebSocket поддержкой.
|
|||
|
|
|
|||
|
|
## 🚀 Быстрый старт
|
|||
|
|
|
|||
|
|
### Предварительные требования
|
|||
|
|
|
|||
|
|
- Node.js 18+
|
|||
|
|
- PostgreSQL 15+
|
|||
|
|
- Docker (опционально, для запуска PostgreSQL в контейнере)
|
|||
|
|
|
|||
|
|
### Установка
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 1. Установить зависимости
|
|||
|
|
npm install
|
|||
|
|
|
|||
|
|
# 2. Настроить переменные окружения
|
|||
|
|
cp .env.example .env
|
|||
|
|
# Отредактировать .env с вашими настройками
|
|||
|
|
|
|||
|
|
# 3. Запустить PostgreSQL
|
|||
|
|
# Вариант A: Использовать Docker Compose
|
|||
|
|
docker-compose up -d postgres
|
|||
|
|
|
|||
|
|
# Вариант B: Использовать локальный PostgreSQL
|
|||
|
|
# Создать базу данных вручную:
|
|||
|
|
# createdb sto_k_odnomu
|
|||
|
|
|
|||
|
|
# 4. Выполнить миграции
|
|||
|
|
npx prisma migrate dev --name init
|
|||
|
|
|
|||
|
|
# 5. Заполнить демо-данными (опционально)
|
|||
|
|
npm run prisma:seed
|
|||
|
|
|
|||
|
|
# 6. Сгенерировать Prisma Client
|
|||
|
|
npx prisma generate
|
|||
|
|
|
|||
|
|
# 7. Запустить backend
|
|||
|
|
npm run start:dev
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Backend запустится на http://localhost:3000
|
|||
|
|
|
|||
|
|
## 📁 Структура проекта
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
backend/
|
|||
|
|
├── src/
|
|||
|
|
│ ├── auth/ # Модуль авторизации (JWT, анонимные пользователи)
|
|||
|
|
│ ├── rooms/ # Модуль комнат (создание, присоединение)
|
|||
|
|
│ ├── questions/ # Модуль паков вопросов (CRUD)
|
|||
|
|
│ ├── game/ # WebSocket модуль (real-time игра)
|
|||
|
|
│ ├── stats/ # Модуль статистики (история игр)
|
|||
|
|
│ ├── prisma/ # Prisma сервис
|
|||
|
|
│ ├── app.module.ts # Главный модуль
|
|||
|
|
│ └── main.ts # Точка входа
|
|||
|
|
├── prisma/
|
|||
|
|
│ ├── schema.prisma # Схема базы данных
|
|||
|
|
│ └── seed.ts # Seed скрипт с демо-данными
|
|||
|
|
├── Dockerfile # Docker конфигурация
|
|||
|
|
├── docker-compose.yml # Docker Compose (PostgreSQL + Backend)
|
|||
|
|
└── .env.example # Пример переменных окружения
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🗄️ База данных
|
|||
|
|
|
|||
|
|
### Модели
|
|||
|
|
|
|||
|
|
- **User** - пользователи (анонимные или зарегистрированные)
|
|||
|
|
- **Room** - игровые комнаты
|
|||
|
|
- **Participant** - участники комнат (игроки, ведущие, зрители)
|
|||
|
|
- **QuestionPack** - паки вопросов
|
|||
|
|
- **GameHistory** - история завершённых игр
|
|||
|
|
|
|||
|
|
### Миграции
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# Создать новую миграцию
|
|||
|
|
npx prisma migrate dev --name migration_name
|
|||
|
|
|
|||
|
|
# Применить миграции на production
|
|||
|
|
npx prisma migrate deploy
|
|||
|
|
|
|||
|
|
# Сбросить базу данных (ВНИМАНИЕ: удалит все данные!)
|
|||
|
|
npx prisma migrate reset
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Seed данные
|
|||
|
|
|
|||
|
|
Seed скрипт создаёт:
|
|||
|
|
- Демо пользователя
|
|||
|
|
- 2 пака вопросов (общие и семейные)
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
npm run prisma:seed
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🔌 API Endpoints
|
|||
|
|
|
|||
|
|
### Auth
|
|||
|
|
- POST /auth/anonymous - создать анонимного пользователя
|
|||
|
|
- POST /auth/register - регистрация
|
|||
|
|
- POST /auth/login - вход
|
|||
|
|
|
|||
|
|
### Rooms
|
|||
|
|
- POST /rooms - создать комнату
|
|||
|
|
- GET /rooms/:code - получить комнату по коду
|
|||
|
|
- POST /rooms/:roomId/join - присоединиться к комнате
|
|||
|
|
|
|||
|
|
### Questions
|
|||
|
|
- POST /questions/packs - создать пак вопросов
|
|||
|
|
- GET /questions/packs - получить все паки
|
|||
|
|
- GET /questions/packs/:id - получить пак по ID
|
|||
|
|
- PUT /questions/packs/:id - обновить пак
|
|||
|
|
- DELETE /questions/packs/:id - удалить пак
|
|||
|
|
|
|||
|
|
### Stats
|
|||
|
|
- POST /stats/game-history - сохранить историю игры
|
|||
|
|
- GET /stats/game-history/:userId - получить историю пользователя
|
|||
|
|
- GET /stats/user/:userId - получить статистику пользователя
|
|||
|
|
|
|||
|
|
## 🌐 WebSocket Events
|
|||
|
|
|
|||
|
|
### Client → Server
|
|||
|
|
- joinRoom - присоединиться к комнате
|
|||
|
|
- startGame - начать игру
|
|||
|
|
- revealAnswer - открыть ответ
|
|||
|
|
- updateScore - обновить счёт
|
|||
|
|
- nextQuestion - следующий вопрос
|
|||
|
|
- endGame - завершить игру
|
|||
|
|
|
|||
|
|
### Server → Client
|
|||
|
|
- roomUpdate - обновление комнаты
|
|||
|
|
- gameStarted - игра началась
|
|||
|
|
- answerRevealed - ответ открыт
|
|||
|
|
- scoreUpdated - счёт обновлён
|
|||
|
|
- questionChanged - вопрос изменён
|
|||
|
|
- gameEnded - игра завершена
|
|||
|
|
|
|||
|
|
## 🔧 NPM Scripts
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
npm run start # Запуск в production режиме
|
|||
|
|
npm run start:dev # Запуск в dev режиме с hot reload
|
|||
|
|
npm run start:debug # Запуск в debug режиме
|
|||
|
|
npm run build # Сборка для production
|
|||
|
|
|
|||
|
|
npm run lint # Проверка ESLint
|
|||
|
|
npm run format # Форматирование кода (Prettier)
|
|||
|
|
npm run test # Запуск тестов
|
|||
|
|
npm run test:watch # Запуск тестов в watch режиме
|
|||
|
|
npm run test:cov # Запуск тестов с coverage
|
|||
|
|
|
|||
|
|
npm run prisma:generate # Генерация Prisma Client
|
|||
|
|
npm run prisma:migrate # Создание и применение миграции
|
|||
|
|
npm run prisma:seed # Заполнение БД демо-данными
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🐳 Docker
|
|||
|
|
|
|||
|
|
### Запуск с Docker Compose
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# Запустить всё (PostgreSQL + Backend)
|
|||
|
|
docker-compose up -d
|
|||
|
|
|
|||
|
|
# Остановить
|
|||
|
|
docker-compose down
|
|||
|
|
|
|||
|
|
# Просмотр логов
|
|||
|
|
docker-compose logs -f backend
|
|||
|
|
|
|||
|
|
# Пересобрать и запустить
|
|||
|
|
docker-compose up -d --build
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Запуск только PostgreSQL
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
docker-compose up -d postgres
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🔐 Переменные окружения
|
|||
|
|
|
|||
|
|
Создайте файл .env на основе .env.example
|
|||
|
|
|
|||
|
|
## 📝 Prisma Studio
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
npx prisma studio
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Откроется на http://localhost:5555
|
|||
|
|
|
|||
|
|
## 🚀 Production Deployment
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 1. Собрать проект
|
|||
|
|
npm run build
|
|||
|
|
|
|||
|
|
# 2. Применить миграции
|
|||
|
|
npx prisma migrate deploy
|
|||
|
|
|
|||
|
|
# 3. Запустить
|
|||
|
|
npm run start:prod
|
|||
|
|
```
|
|||
|
|
|