209 lines
6.4 KiB
Markdown
209 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
|
||
```
|
||
|