# Серверная часть EEV_Proj

## Описание

Серверная часть проекта EEV_Proj построена на Node.js и Express. Сервер обеспечивает API для клиентской части, управляет WebSocket соединениями и взаимодействует с базой данных PostgreSQL.

## Структура

```
server/
├── server.js              # Основной файл сервера
├── db.js                  # Подключение к базе данных
├── db1.js                 # Альтернативная конфигурация БД
├── organizations.js        # Логика организаций
├── ecosystem.config.js     # Конфигурация PM2
└── README.md              # Эта документация
```

## Основные компоненты

### server.js
Главный файл сервера, который:
- Инициализирует Express приложение
- Настраивает middleware
- Определяет API маршруты
- Запускает WebSocket сервер
- Обрабатывает игровую логику

### db.js
Модуль для работы с базой данных PostgreSQL:
- Подключение к БД
- Выполнение SQL запросов
- Управление транзакциями

### organizations.js
Логика для работы с организациями в игре:
- Создание организаций
- Управление меню организаций
- Обработка покупок

## API эндпоинты

### Аутентификация
- `POST /api/auth/login` - Вход в систему
- `POST /api/auth/register` - Регистрация

### Интерьеры
- `GET /api/interiors/:id/definition` - Получение определения интерьера
- `POST /api/interiors/:id/enter` - Вход в интерьер

### Объекты города
- `GET /api/city_objects/:id/interior` - Получение информации об объекте

### Экономика
- `GET /api/economy/balance` - Получение баланса
- `POST /api/economy/purchase` - Покупка предметов
- `GET /api/economy/inventory` - Получение инвентаря

### Квесты
- `GET /api/quests/progress` - Прогресс квестов
- `POST /api/quests/complete` - Завершение квеста

### Пользователи
- `GET /api/users/status` - Статус пользователей
- `GET /api/users/:id/profile` - Профиль пользователя

### Сообщения
- `GET /api/messages/:contactId` - Получение сообщений
- `POST /api/messages/send` - Отправка сообщения
- `POST /api/messages-read/:contactId` - Отметка сообщений как прочитанных

## WebSocket события

### Клиент → Сервер
- `playerMovement` - Движение игрока
- `interiorChange` - Смена интерьера
- `economy:getBalance` - Запрос баланса
- `economy:getInventory` - Запрос инвентаря
- `economy:updateStats` - Обновление статистики
- `economy:removeItem` - Удаление предмета
- `voiceChatToggle` - Переключение голосового чата

### Сервер → Клиент
- `economy:balanceChanged` - Изменение баланса
- `economy:inventory` - Обновление инвентаря
- `gameTime:update` - Обновление игрового времени
- `us` - Обновление статуса пользователей

## Установка и запуск

### Зависимости
```bash
npm install
```

### Переменные окружения
Создайте файл `.env` в корне проекта:
```dotenv
# Сервер
PORT=4000
NODE_ENV=development

# База данных
DB_HOST=localhost
DB_PORT=5432
DB_USER=your_username
DB_PASS=your_password
DB_NAME=your_database

# JWT
JWT_SECRET=your_jwt_secret
```

### Запуск
```bash
# Обычный запуск
node server.js

# Через PM2
pm2 start ecosystem.config.js

# В режиме разработки
npm run dev
```

## База данных

### Основные таблицы

#### users
- `id` - Уникальный идентификатор
- `username` - Имя пользователя
- `email` - Email адрес
- `password_hash` - Хеш пароля
- `created_at` - Дата создания

#### interiors
- `id` - Уникальный идентификатор
- `name` - Название интерьера
- `glb_path` - Путь к 3D модели
- `spawn_x`, `spawn_y`, `spawn_z` - Координаты входа
- `exit_x`, `exit_y`, `exit_z` - Координаты выхода

#### city_objects
- `id` - Уникальный идентификатор
- `name` - Название объекта
- `interior_id` - Ссылка на интерьер
- `position_x`, `position_y`, `position_z` - Позиция в мире

#### organizations
- `id` - Уникальный идентификатор
- `name` - Название организации
- `type` - Тип организации
- `menu` - JSON с меню организации

#### inventory
- `id` - Уникальный идентификатор
- `user_id` - Ссылка на пользователя
- `item_id` - Ссылка на предмет
- `quantity` - Количество

## Безопасность

### JWT токены
- Используются для аутентификации
- Хранятся в localStorage клиента
- Передаются в заголовке Authorization

### Валидация данных
- Проверка входных данных
- Санитизация SQL запросов
- Защита от SQL инъекций

### CORS
- Настроен для разрешения запросов с клиента
- Ограничен по доменам в продакшене

## Мониторинг и логирование

### PM2
- Управление процессами
- Автоперезапуск при сбоях
- Логирование

### Логи
- Логирование ошибок
- Логирование API запросов
- Логирование WebSocket событий

## Масштабирование

### Кластеризация
- Поддержка нескольких процессов через PM2
- Балансировка нагрузки
- Общие WebSocket соединения

### Кэширование
- Redis для кэширования данных
- Кэширование статических файлов
- Кэширование результатов запросов

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

### Docker
```dockerfile
FROM node:16-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 4000
CMD ["node", "server.js"]
```

### Nginx
Настройте Nginx для проксирования API запросов на порт 4000.

### SSL
Настройте HTTPS для безопасного соединения.

## Тестирование

### Unit тесты
```bash
npm test
```

### Интеграционные тесты
```bash
npm run test:integration
```

### Нагрузочное тестирование
```bash
npm run test:load
```

## Отладка

### Логи
- Проверьте логи PM2: `pm2 logs`
- Проверьте логи приложения в консоли

### База данных
- Проверьте подключение к БД
- Выполните тестовые запросы

### WebSocket
- Проверьте подключение клиента
- Проверьте события в консоли браузера

## Поддержка

При возникновении проблем:
1. Проверьте логи сервера
2. Проверьте подключение к базе данных
3. Проверьте конфигурацию
4. Создайте issue в репозитории
