# Messenger Web Application

Полнофункциональное веб-приложение мессенджер с системой инвайтов и админ-панелью.

## Функции

✅ **Регистрация только по инвайтам** - без телефона и email  
✅ **Система управления инвайтами** - создание, ограничение по времени и количеству  
✅ **Чат в реальном времени** - личные и групповые сообщения  
✅ **WebSocket (Socket.io)** - мгновенная доставка сообщений  
✅ **Админ-панель** - управление пользователями, ролями, квотами  
✅ **Дерево приглашений** - визуализация иерархии пользователей  
✅ **Редактирование и удаление сообщений**  
✅ **Индикаторы печати**  
✅ **Статус онлайн/офлайн**  
✅ **Пуш-уведомления (Web Push API)**  

## Стек технологий

- **Backend**: PHP 7.4+ + MySQL 5.7+
- **Frontend**: Vue 3 + JavaScript
- **Реал-тайм**: Node.js + Socket.io
- **API**: REST API

## Установка и запуск

### 1. Подготовка базы данных

1. Откройте phpMyAdmin (http://localhost/phpmyadmin)
2. Импортируйте `backend/config/init.sql`
3. Или выполните SQL вручную через консоль MySQL

```sql
mysql -u root < backend/config/init.sql
```

### 2. Конфигурация PHP Backend

1. Убедитесь, что XAMPP запущен
2. Папка проекта должна быть в `C:\xampp\htdocs\msg`
3. Проверьте конфиг БД в `backend/config/database.php`

### 3. Запуск Node.js Socket Server

```powershell
# Перейти в папку node_server
cd C:\xampp\htdocs\msg\node_server

# Установить зависимости
npm install

# Запустить сервер
npm start
```

Сервер будет запущен на `http://localhost:3000`

### 4. Запуск фронтенда

1. Откройте браузер и перейдите на `http://localhost/msg/frontend/`
2. Или используйте простой HTTP сервер для фронтенда

## Запуск PHP Backend

PHP backend работает автоматически через Apache/XAMPP на порту 80.
API доступен по адресу: `http://localhost/msg/backend/api/`

## Учетные данные администратора

После инициализации БД доступны следующие учетные данные:

- **Логин**: `admin`
- **Пароль**: `admin123`
- **Роль**: Администратор

⚠️ **Измените пароль администратора в production!**

## Структура проекта

```
msg/
├── backend/
│   ├── api/
│   │   └── index.php          # REST API
│   ├── config/
│   │   ├── database.php       # Конфиг БД
│   │   ├── constants.php      # Константы приложения
│   │   └── init.sql           # SQL для создания БД
│   ├── controllers/           # Контроллеры (если нужны)
│   ├── models/
│   │   ├── User.php           # Модель пользователя
│   │   ├── Invite.php         # Модель приглашения
│   │   ├── Message.php        # Модель сообщения
│   │   └── Group.php          # Модель группы
│   ├── middleware/
│   │   └── auth.php           # Аутентификация
│   └── utils/
│       └── JWTHandler.php     # JWT токены
├── frontend/
│   ├── index.html             # Главная страница
│   ├── assets/
│   │   └── styles.css         # Стили
│   └── src/
│       ├── app.js             # Vue приложение
│       ├── store/
│       │   └── auth.js        # Store аутентификации
│       ├── utils/
│       │   ├── api.js         # API клиент
│       │   └── socket.js      # Socket.io клиент
│       └── components/
│           ├── Auth.js        # Компонент входа
│           ├── Dashboard.js   # Главное приложение
│           ├── Chat.js        # Компонент чата
│           └── AdminPanel.js  # Админ-панель
└── node_server/
    ├── server.js              # Socket.io сервер
    ├── package.json           # Зависимости Node.js
    └── node_modules/          # Установленные пакеты
```

## API Endpoints

### Аутентификация

```
POST /api/auth/register
POST /api/auth/login
```

### Пользователь

```
GET /api/user/profile
GET /api/user/online-users
```

### Инвайты

```
POST /api/invite/create
GET /api/invite/my-invites
```

### Сообщения

```
POST /api/message/send-private
GET /api/message/get-private/{recipient_id}
POST /api/message/update
POST /api/message/delete
```

### Группы

```
POST /api/group/create
GET /api/group/my-groups
GET /api/group/members/{group_id}
POST /api/group/members
```

### Админ (требуется роль admin)

```
GET /api/admin/users
POST /api/admin/update-quota
POST /api/admin/update-role
GET /api/admin/all-invites
GET /api/admin/invite-tree
```

## Socket.io Events

### Клиент отправляет:

```javascript
user:online              // Пользователь вошел
message:private          // Личное сообщение
message:group            // Групповое сообщение
group:join               // Присоединиться к группе
group:leave              // Покинуть группу
message:edit             // Редактировать сообщение
message:delete           // Удалить сообщение
user:typing              // Начать печатать
user:stop-typing         // Остановить печать
```

### Сервер отправляет:

```javascript
user:status:changed      // Статус пользователя изменился
message:private:receive  // Получено личное сообщение
message:group:receive    // Получено групповое сообщение
user:typing:indicator    // Пользователь печатает
user:stop-typing:indicator // Пользователь перестал печатать
message:edited           // Сообщение отредактировано
message:deleted          // Сообщение удалено
```

## Сетевые требования

- **Backend**: `http://localhost/msg/backend/api`
- **Frontend**: `http://localhost/msg/frontend`
- **Socket Server**: `http://localhost:3000`

Убедитесь, что порт 3000 не занят другим приложением!

## Безопасность

⚠️ **Важно для production:**

1. Измените `JWT_SECRET` в `backend/config/constants.php`
2. Используйте HTTPS вместо HTTP
3. Используйте переменные окружения для чувствительных данных
4. Очищайте SQL запросы от инъекций (используйте prepared statements)
5. Добавьте CORS проверку
6. Реализуйте rate limiting

## Решение проблем

### MySQL не подключается

- Проверьте, что XAMPP MySQL запущен
- Проверьте учетные данные в `backend/config/database.php`
- Убедитесь, что база данных создана

### Socket.io не подключается

- Проверьте, что Node.js сервер запущен на порту 3000
- Проверьте в консоли браузера ошибки WebSocket
- Проверьте брандмауэр

### Ошибка CORS

- Убедитесь, что `Access-Control-Allow-Origin` установлен правильно
- Проверьте URL фронтенда в Socket.io конфиге

## Лицензия

MIT

## Поддержка

Для вопросов и проблем обращайтесь к разработчику.
