# Структура проекта Messenger

```
C:\xampp\htdocs\msg\
│
├── 📄 README.md                          # Основная документация
├── 📄 QUICKSTART.md                      # Быстрый старт
├── 📄 API_DOCUMENTATION.md               # Документация API
├── 📄 SECURITY_AND_PERFORMANCE.md        # Безопасность и производительность
├── 📄 .env.example                       # Шаблон переменных окружения
│
├── 📁 backend/                           # PHP Backend
│   ├── 📄 .htaccess                      # Apache конфигурация
│   │
│   ├── 📁 api/
│   │   └── 📄 index.php                  # REST API роутер и контроллеры
│   │
│   ├── 📁 config/
│   │   ├── 📄 database.php               # Конфиг БД (MySQL)
│   │   ├── 📄 constants.php              # Константы приложения
│   │   └── 📄 init.sql                   # SQL скрипт инициализации БД
│   │
│   ├── 📁 models/
│   │   ├── 📄 User.php                   # Модель пользователя
│   │   │   ├── create()                 # Создать пользователя
│   │   │   ├── findByUsername()         # Найти по логину
│   │   │   ├── findById()               # Найти по ID
│   │   │   ├── updateInviteQuota()      # Обновить квоту инвайтов
│   │   │   ├── updateRole()             # Изменить роль
│   │   │   ├── getAllUsers()            # Все пользователи
│   │   │   └── verifyPassword()         # Проверить пароль
│   │   │
│   │   ├── 📄 Invite.php                # Модель приглашений
│   │   │   ├── create()                 # Создать инвайт
│   │   │   ├── validateInvite()         # Проверить инвайт
│   │   │   ├── useInvite()              # Использовать инвайт
│   │   │   ├── getInvitesByCreator()    # Инвайты пользователя
│   │   │   ├── getAllInvites()          # Все инвайты (админ)
│   │   │   ├── getInviteTree()          # Дерево инвайтов
│   │   │   └── countInvitesCreatedToday() # Счетчик за день
│   │   │
│   │   ├── 📄 Message.php               # Модель сообщений
│   │   │   ├── createPrivateMessage()   # Личное сообщение
│   │   │   ├── createGroupMessage()     # Групповое сообщение
│   │   │   ├── getPrivateMessages()     # История личных сообщений
│   │   │   ├── getGroupMessages()       # История группы
│   │   │   ├── updateMessage()          # Редактировать
│   │   │   ├── deleteMessage()          # Удалить
│   │   │   └── getMessage()             # Получить сообщение
│   │   │
│   │   └── 📄 Group.php                 # Модель групп
│   │       ├── create()                 # Создать группу
│   │       ├── addMember()              # Добавить участника
│   │       ├── removeMember()           # Удалить участника
│   │       ├── getGroupsByUser()        # Группы пользователя
│   │       ├── getGroup()               # Получить группу
│   │       ├── getGroupMembers()        # Участники группы
│   │       └── isUserMember()           # Проверить участника
│   │
│   ├── 📁 middleware/
│   │   └── 📄 auth.php                  # Аутентификация
│   │       ├── authenticateToken()      # Проверить токен
│   │       └── checkAdminRole()         # Проверить админа
│   │
│   └── 📁 utils/
│       └── 📄 JWTHandler.php            # JWT токены
│           ├── encode()                 # Создать токен
│           └── decode()                 # Проверить токен
│
├── 📁 frontend/                          # Vue.js Frontend
│   ├── 📄 index.html                    # Главная страница
│   ├── 📄 service-worker.js             # Service Worker для Push уведомлений
│   │
│   ├── 📁 assets/
│   │   └── 📄 styles.css                # Все стили приложения
│   │
│   └── 📁 src/
│       ├── 📄 app.js                    # Vue приложение
│       │
│       ├── 📁 store/
│       │   └── 📄 auth.js               # Store аутентификации
│       │       └── setAuth()            # Сохранить токен/пользователя
│       │       └── logout()             # Выход
│       │       └── getHeaders()         # Headers для API
│       │
│       ├── 📁 utils/
│       │   ├── 📄 api.js                # HTTP клиент для API
│       │   │   ├── register()           # Регистрация
│       │   │   ├── login()              # Вход
│       │   │   ├── getProfile()         # Профиль
│       │   │   ├── createInvite()       # Создать инвайт
│       │   │   ├── getMyInvites()       # Мои инвайты
│       │   │   ├── sendPrivateMessage() # Отправить сообщение
│       │   │   ├── getPrivateMessages() # История
│       │   │   ├── updateMessage()      # Редактировать
│       │   │   ├── deleteMessage()      # Удалить
│       │   │   ├── getAllUsers()        # Все пользователи (админ)
│       │   │   ├── updateUserQuota()    # Изменить квоту (админ)
│       │   │   ├── updateUserRole()     # Изменить роль (админ)
│       │   │   ├── getAllInvites()      # Все инвайты (админ)
│       │   │   ├── getInviteTree()      # Дерево (админ)
│       │   │   ├── createGroup()        # Создать группу
│       │   │   ├── getMyGroups()        # Мои группы
│       │   │   ├── getGroupMembers()    # Участники
│       │   │   └── addGroupMember()     # Добавить участника
│       │   │
│       │   ├── 📄 socket.js             # Socket.io клиент
│       │   │   ├── connect()            # Подключиться
│       │   │   ├── sendPrivateMessage() # Отправить (real-time)
│       │   │   ├── sendGroupMessage()   # Групповое (real-time)
│       │   │   ├── joinGroup()          # Присоединиться к группе
│       │   │   ├── leaveGroup()         # Покинуть группу
│       │   │   ├── editMessage()        # Редактировать (real-time)
│       │   │   ├── deleteMessage()      # Удалить (real-time)
│       │   │   ├── sendTypingIndicator() # "печатает..."
│       │   │   ├── stopTypingIndicator() # перестал печатать
│       │   │   ├── on()                 # Слушать события
│       │   │   └── disconnect()         # Отключиться
│       │   │
│       │   └── 📄 notifications.js      # Web Push уведомления
│       │       ├── requestNotificationPermission() # Разрешить уведомления
│       │       └── sendNotification()   # Отправить уведомление
│       │
│       └── 📁 components/
│           ├── 📄 Auth.js               # Компонент входа/регистрации
│           │   ├── mode: login/register # Режимы
│           │   ├── handleSubmit()       # Обработка формы
│           │   └── toggleMode()         # Переключение режима
│           │
│           ├── 📄 Dashboard.js          # Главная страница
│           │   ├── Dashboard.js         # Основной макет
│           │   ├── currentView          # Активный раздел
│           │   └── logout()             # Выход
│           │   │
│           │   └── Invites (подкомпонент)
│           │       ├── loadInvites()    # Загрузить инвайты
│           │       ├── createNewInvite() # Создать
│           │       └── updateQuota()    # Обновить квоту
│           │
│           ├── 📄 Chat.js               # Компонент чата
│           │   ├── selectContact()      # Выбрать контакт
│           │   ├── selectGroup()        # Выбрать группу
│           │   ├── sendMessage()        # Отправить сообщение
│           │   ├── editMessage()        # Редактировать
│           │   ├── deleteMessage()      # Удалить
│           │   ├── handleTyping()       # Индикатор печати
│           │   ├── loadGroups()         # Загрузить группы
│           │   ├── createGroup()        # Создать группу
│           │   └── setupSocketListeners() # Слушатели Socket.io
│           │
│           └── 📄 AdminPanel.js         # Админ-панель
│               ├── loadUsers()          # Все пользователи
│               ├── loadInvites()        # Все инвайты
│               ├── loadInviteTree()     # Дерево приглашений
│               ├── updateQuota()        # Изменить квоту
│               ├── updateUserRole()     # Изменить роль
│               └── TreeNode (подкомпонент) # Дерево в виде компонента
│
├── 📁 node_server/                      # Node.js + Socket.io сервер
│   ├── 📄 package.json                  # Зависимости Node.js
│   ├── 📄 server.js                     # Socket.io сервер
│   ├── 📄 start.bat                     # Скрипт запуска (Windows)
│   ├── 📄 start.sh                      # Скрипт запуска (Linux/Mac)
│   └── 📁 node_modules/                 # Установленные пакеты (npm install)
│
└── 📁 logs/                             # Логи приложения (создается автоматически)
    └── app.log
```

---

## 📋 API Routes

### Аутентификация (`/auth/`)
```
POST   /auth/register      Регистрация по инвайту
POST   /auth/login         Вход в систему
```

### Пользователь (`/user/`)
```
GET    /user/profile       Профиль пользователя
GET    /user/online-users  Онлайн пользователи
```

### Инвайты (`/invite/`)
```
POST   /invite/create      Создать инвайт
GET    /invite/my-invites  Мои приглашения
```

### Сообщения (`/message/`)
```
POST   /message/send-private        Отправить личное сообщение
GET    /message/get-private/{id}    История личных сообщений
POST   /message/update              Редактировать сообщение
POST   /message/delete              Удалить сообщение
```

### Группы (`/group/`)
```
POST   /group/create           Создать группу
GET    /group/my-groups        Мои группы
GET    /group/members/{id}     Участники группы
POST   /group/members          Добавить участника
```

### Админ (`/admin/`)
```
GET    /admin/users            Все пользователи
POST   /admin/update-quota     Изменить квоту инвайтов
POST   /admin/update-role      Изменить роль пользователя
GET    /admin/all-invites      Все приглашения
GET    /admin/invite-tree      Дерево приглашений
```

---

## 🔌 Socket.io Events

### Client → Server (Отправляет клиент)
```
user:online                 Пользователь вошел онлайн
message:private             Личное сообщение
message:group               Групповое сообщение
group:join                  Присоединиться к группе
group:leave                 Покинуть группу
message:edit                Редактировать сообщение
message:delete              Удалить сообщение
user:typing                 Пользователь печатает
user:stop-typing            Пользователь перестал печатать
```

### Server → Client (Отправляет сервер)
```
user:status:changed         Статус пользователя изменился
message:private:receive     Получено личное сообщение
message:group:receive       Получено групповое сообщение
user:typing:indicator       Пользователь печатает
user:stop-typing:indicator  Перестал печатать
message:edited              Сообщение отредактировано
message:deleted             Сообщение удалено
users:online:list           Список онлайн пользователей
```

---

## 📊 Database Schema

### users
- `id` - Primary Key
- `username` - Уникальный логин
- `password` - Хеш пароля BCrypt
- `role` - Роль (user/admin)
- `invite_quota` - Квота инвайтов в день
- `created_at` - Дата регистрации
- `updated_at` - Последнее изменение

### invites
- `id` - Primary Key
- `code` - Уникальный код приглашения
- `creator_id` - Кто создал (FK: users.id)
- `used_by` - Кто использовал (FK: users.id)
- `created_at` - Дата создания
- `expires_at` - Дата истечения (30 дней)
- `used_at` - Дата использования

### messages
- `id` - Primary Key
- `sender_id` - Отправитель (FK: users.id)
- `recipient_id` - Получатель (FK: users.id) для личных
- `group_id` - Группа (FK: groups.id) для групповых
- `content` - Текст сообщения
- `is_group` - Тип (0=личное, 1=групповое)
- `is_deleted` - Удалено ли
- `created_at` - Время создания
- `updated_at` - Время редактирования

### groups
- `id` - Primary Key
- `creator_id` - Создатель (FK: users.id)
- `name` - Название группы
- `description` - Описание
- `created_at` - Дата создания
- `updated_at` - Дата изменения

### group_members
- `id` - Primary Key
- `group_id` - Группа (FK: groups.id)
- `user_id` - Пользователь (FK: users.id)
- `joined_at` - Дата присоединения

---

## 🔑 Учетные данные по умолчанию

| Поле | Значение |
|------|----------|
| **Логин** | admin |
| **Пароль** | admin123 |
| **Роль** | admin |
| **Квота инвайтов** | 10 в день |

⚠️ **Измените в production!**

---

## 📡 Потоки данных

### Регистрация
```
1. Фронтенд: Ввод (логин, пароль, код инвайта)
2. Фронтенд: POST /auth/register
3. Бекенд: Валидация инвайта
4. Бекенд: Проверка логина
5. Бекенд: Создание пользователя
6. Бекенд: Отметить инвайт как использованный
7. Фронтенд: Редирект на вход
```

### Вход
```
1. Фронтенд: Ввод (логин, пароль)
2. Фронтенд: POST /auth/login
3. Бекенд: Проверка учетных данных
4. Бекенд: Генерация JWT токена
5. Фронтенд: Сохранение токена в localStorage
6. Фронтенд: Socket.io подключение
7. Бекенд (Node): Отметить пользователя онлайн
```

### Отправка сообщения (real-time)
```
1. Фронтенд (отправитель): Ввод текста
2. Фронтенд: Socket.io emit 'message:private'
3. Node сервер: Получает сообщение
4. Node сервер: Находит получателя по userId
5. Node сервер: Отправляет на socket получателя
6. Фронтенд (получатель): Получает и отображает
7. Фронтенд (отправитель): Подтверждение отправки
```

---

## 🎨 Компоненты Vue

### Auth.js
- Режимы: login, register
- Проверка и валидация
- Ошибки и сообщения об успехе

### Dashboard.js
- Боковое меню навигации
- Три основных раздела (Chat, Invites, AdminPanel)
- Счетчик онлайн пользователей

### Chat.js
- Список контактов (онлайн пользователи)
- Список групп
- Окно чата с сообщениями
- Поле ввода с отправкой
- Индикаторы печати
- Редактирование и удаление сообщений

### AdminPanel.js
- Таблица пользователей
- Управление ролями и квотами
- Таблица всех инвайтов
- Дерево приглашений (TreeNode компонент)

---

## 🚀 Развертывание

### Требования
- PHP 7.4+
- MySQL 5.7+
- Node.js 14+
- npm 6+

### Шаги
1. Установить зависимости БД (init.sql)
2. Установить npm пакеты (npm install в node_server)
3. Запустить Node.js сервер (npm start)
4. Открыть frontend в браузере
5. Залогиниться с admin/admin123

---

