
ЗадаЧат — это индивидуальная русскоязычная платформа для управления проектами, задачами и командной коммуникации. Разработана с нуля на чистом PHP & MariaDB с использованием практик безопасности и реального времени (Server-Sent Events), с ориентацией на недорогие shared-хостинги.
1. СИСТЕМА АУТЕНТИФИКАЦИИ И УПРАВЛЕНИЯ ДОСТУПОМ
1.1. Аутентификация пользователей
1.1.1. Логин по паре «логин/пароль» с хешированием паролей (PASSWORD_DEFAULT + соль)
1.1.2. Защита от брутфорса:
- Сессионный метод (попытки входа за 15 минут, блокировка на 5 минут при 10+ неудачах)
- БД-метод с таблицей попыток логина (IP + логин, очистка старых записей через CRON)
1.1.3. Автоматическая установка часового пояса пользователя через JS → AJAX → сессия
1.1.4. Поддержка принудительной смены пароля для новых/импортированных пользователей (флаг force_password_change)
1.2. Ролевая модель
1.2.1. Администратор (role=0) — полный доступ ко всем проектам, пользователям, правам доступа
1.2.2. Менеджер (role=1) — расширенные права (назначение задач, управление проектами)
1.2.3. Контролёр (role=2) — базовый доступ (просмотр, отправка сообщений в задачах)
1.2.4. Проверка прав на уровне:
- Проектов (view / edit_tasks / edit_messages / upload_files)
- Задач (наследование прав проекта + подписки)
- Сообщений (только автор или администратор может редактировать/удалять)
- Файлов (владелец или администратор)
1.3. Управление пользователями (только админ)
1.3.1. Создание пользователя (логин, имя, email, телефон, роль, временный пароль)
1.3.2. Редактирование пользователя (только разрешённые поля: login, name, email, tel — role/status через отдельную форму)
1.3.3. Сброс пароля пользователя (генерация временного пароля)
1.3.4. Удаление пользователя (защита от самоудаления)
1.3.5. Блокировка/разблокировка учётной записи (status=2)
2. УПРАВЛЕНИЕ ПРОЕКТАМИ И ЗАДАЧАМИ
2.1. Проекты
2.1.1. CRUD операции (создание, просмотр, редактирование, удаление)
2.1.2. Удаление проекта — рекурсивное удаление всех задач, сообщений и файлов
2.1.3. Права доступа к проекту через таблицу user_project_permissions (4 типа прав)
2.1.4. Отображение последнего активного проекта (по времени последнего сообщения/задачи)
2.1.5. Сортировка проектов на странице сообщений по времени последнего сообщения
2.2. Задачи
2.2.1. Иерархическая структура (подзадачи неограниченной вложенности)
2.2.2. CRUD операции (создание, редактирование, удаление с рекурсивным удалением подзадач)
2.2.3. Перемещение задачи между проектами (с сохранением всех подзадач)
2.2.4. Изменение родительской задачи (с проверкой на циклические ссылки через CTE)
2.2.5. Переключение статуса (активна/выполнена) с обновлением UI
2.2.6. Назначение исполнителя (assigned_to_uuid)
2.2.7. Установка дат: время начала (time_start) и плановое окончание (time_end_plan)
2.2.8. Пагинация задач с сохранением настроек в сессии (per_page, сортировка, фильтры)
2.2.9. Фильтрация задач (активные/выполненные, по исполнителю, поиск по заголовку/описанию)
2.2.10. Сортировка задач (по активности, названию, статусу, сроку)
2.2.11. Умная фильтрация подзадач (при фильтрации показываются родительские задачи, а подзадачи загружаются по требованию)
2.2.12. Подсветка просроченных задач (deadline < текущего времени)
2.3. Отображение задач (Projects.php)
2.3.1. Плоский список задач с возможностью раскрытия подзадач
2.3.2. Клик по строке задачи — копирование ссылки на задачу (с защитой от выделения текста)
2.3.3. Кнопки действий: редактировать, создать подзадачу, скопировать ссылку, подписаться, перейти к сообщениям
2.3.4. Отображение прикреплённых файлов под задачей
2.3.5. Свёртывание длинных описаний (collapsible description)
2.3.6. Прямая ссылка на задачу (параметр task) с автоматическим определением страницы и раскрытием цепочки родителей
3. СИСТЕМА СООБЩЕНИЙ (ЧАТ)
3.1. Архитектура сообщений
3.1.1. Все сообщения привязаны к конкретной задаче
3.1.2. Пагинация с окном страниц — буфер из 3 страниц (текущая + 2 соседних) для плавного скролла
3.1.3. Кеширование страниц сообщений (pageCache)
3.1.4. Автоматическая подгрузка старых сообщений при скролле вверх
3.1.5. Автоматическая загрузка новых сообщений при скролле вниз
3.2. Функции сообщений
3.2.1. Отправка сообщений (текст + файлы с проверкой безопасности)
3.2.2. Редактирование сообщений (только автор или админ)
3.2.3. Удаление сообщений (автор или админ) с удалением прикреплённых файлов (при отсутствии других ссылок)
3.2.4. Ответ на сообщение (reply) с цитированием
3.2.5. Меню сообщения (правый клик / долгий тап):
- Копировать ссылку
- Копировать текст
- Ответить
- Редактировать (для автора)
- Добавить файл (для автора)
- Заменить/удалить файл (для автора)
- Удалить сообщение (автор или админ)
3.3. Форматирование сообщений
3.3.1. Преобразование ссылок в кликабельные (HTTP/HTTPS, TG, Telegram, mailto, tel)
3.3.2. Смарт-ссылки для объектов системы:
[msg:UUID]→ ссылка на сообщение[task:UUID]→ ссылка на задачу[file:UUID]→ ссылка на файл
3.3.3. Преобразование URL проектов/задач/сообщений/файлов в смарт-ссылки
3.3.4. Поддержка цитат (строки, начинающиеся с > или »)
3.3.5. Сохранение переносов строк
3.4. Отметка о прочтении
3.4.1. Автоматическая отметка сообщений как прочитанных при прокрутке
3.4.2. Пакетная отметка (batch mark) для оптимизации
3.4.3. Обновление бейджей после отметки
4. ФАЙЛОВАЯ СИСТЕМА
4.1. Загрузка и хранение файлов
4.1.1. Две директории — файлы сообщений чатов и файлы задач
4.1.2. Криптостойкие имена файлов (генерация через random_bytes)
4.1.3. Защита от дублирования имён (уникальные storage_name)
4.1.4. Поддержка загрузки нескольких файлов одновременно
4.1.5. Привязка файлов к задачам (task_files) и к сообщениям (message_files)
4.2. Просмотр файлов (file_preview.php)
4.2.1. Изображения — зумирование (колёсико/жесты), панорамирование, сброс зума
4.2.2. PDF — встроенный просмотр через iframe (с fallback-кнопкой на мобильных)
4.2.3. Excel (XLSX/XLS) — рендеринг через SheetJS с переключением листов
4.2.4. Word (DOCX) — рендеринг через Mammoth.js
4.2.5. DOC (старый формат) — сообщение о невозможности предпросмотра + скачивание
4.2.6. ZIP/RAR/7z — просмотр содержимого архива (имена, размеры, даты)
4.2.7. Аудио/Видео — встроенный плеер
4.2.8. Текстовые файлы — отображение с обрезкой больших файлов
4.2.9. Неизвестные бинарные файлы — HEX-дамп первых 1024 байт + кнопка скачивания
4.3. Управление файлами
4.3.1. Скачивание файла с защитой от path traversal и LFI
4.3.2. Копирование ссылки на файл
4.3.3. Удаление файла (владелец или админ) с физическим удалением с диска
4.3.4. Замена файла в сообщении (для автора) с поддержкой вставки из буфера обмена (Ctrl+V)
4.3.5. Удаление файла из сообщения (для автора)
4.4. Страница всех файлов (files.php)
4.4.1. Фильтрация по контексту (message → task → все файлы)
4.4.2. Фильтрация по типу (все, изображения, PDF, документы, таблицы, архивы, аудио, видео)
4.4.3. Поиск по имени файла
4.4.4. Сортировка (по имени, дате, размеру)
4.4.5. Пагинация с сохранением настроек в сессии
4.4.6. Отображение связей файла (в каких задачах/сообщениях используется)
4.5. Безопасность файлов (UploadSecurity)
4.5.1. Белый список MIME-типов по категориям
4.5.2. Ограничение размера по категориям
4.5.3. Проверка реального MIME-типа через finfo
4.5.4. Валидация изображений через GD (imagecreatefrom*)
4.5.5. Проверка PDF на JavaScript и вредоносные действия (/JavaScript, /JS, /Launch, /OpenAction)
4.5.6. Очистка имени файла от потенциально опасных символов
4.5.7. Максимальное количество файлов за раз (по умолчанию 10)
5. УВЕДОМЛЕНИЯ
5.1. Типы уведомлений
5.1.1. Новые сообщения — push, звук, вибрация, toast, обновление бейджа, уведомление в колокольчике
5.1.2. Новые задачи — push, звук, тост, бейдж проектов
5.1.3. Изменения задач — push, уведомление в колокольчике, сохранение в истории изменений
5.1.4. Новые файлы — push, звук, бейдж файлов
5.1.5. Просроченные задачи — push, уведомление в колокольчике, бейдж с анимацией
5.2. Push-уведомления (Web Push)
5.2.1. VAPID аутентификация (публичный/приватный ключи из конфига)
5.2.2. Поддержка FCM (Chrome, Firefox), WNS (Edge), Mozilla Autopush
5.2.3. Локальная реализация шифрования (RFC 8188, AES128GCM) без внешних библиотек
5.2.4. Автоматическая подписка через Service Worker
5.2.5. Сохранение подписок в таблице push_subscriptions
5.2.6. Дедупликация уведомлений по message_uuid
5.2.7. Фильтрация уведомлений для автора сообщения
5.2.8. Умный клик по push-уведомлению:
- Если чат уже открыт — прокрутка к последним сообщениям
- Если другая задача — переключение и прокрутка
- Если нет открытых вкладок — открытие новой
5.3. Email-уведомления (CRON)
5.3.1. Отправка сводки за интервал (alert_interval_min, минимум 3 минуты)
5.3.2. Фильтрация по дням недели (alert_days)
5.3.3. Ограничение количества событий в письме (MAX_NOTIFICATIONS_PER_EMAIL)
5.3.4. Сборка уведомлений о новых задачах, сообщениях, файлах, просрочках
5.3.5. Приведение ссылок к абсолютному формату
5.4. Уведомления в интерфейсе
5.4.1. Колокольчик — выпадающий список уведомлений (task_changed, new_task)
5.4.2. Дашборд — блок уведомлений из таблицы user_notifications
5.4.3. Отметка всех уведомлений как прочитанных (с синхронизацией бейджей)
5.4.4. Сохранение истории изменений задач (task_change_history)
5.5. Звуковые уведомления
5.5.1. Генерация короткого звука нового сообщения через Web Audio API (осциллятор 600 Гц)
5.5.2. Настраиваемый интервал (sound_interval_sec, от 6 до 60000 секунд)
5.5.3. Включение/отключение звука (sound_enabled)
5.5.4. Единый источник настроек — сессия → sessionStorage → Service Worker
5.5.5. Активация AudioContext по первому взаимодействию пользователя
6. БЕЙДЖИ И СЧЁТЧИКИ
6.1. API получения бейджей
6.1.1. messages — непрочитанные сообщения в подписанных задачах
6.1.2. projects — новые задачи (подписанные задачи)
6.1.3. files — новые файлы (подписанные задачи)
6.1.4. notifications — системные уведомления (из user_notifications)
6.2. Применение бейджей
6.2.1. Навигационное меню (проекты, сообщения, файлы)
6.2.2. Колокольчик уведомлений
6.2.3. Мобильная кнопка-гамбургер (mobile-drawer-badge)
6.2.4. Заголовок страницы (добавление счётчика в title)
6.3. Обновление бейджей
6.3.1. SSE-события (unread_update, new_messages, new_task, new_file, message_deleted)
6.3.2. Периодический опрос (polling_data.php) как fallback
6.3.3. Принудительное обновление через updateAllBadges()
6.3.4. Сброс бейджей при отметке всех прочитанных (mark_read + mark_notifications_read)
7. ПОИСК (search.php)
7.1. Функции поиска
7.1.1. Поиск по проектам, задачам, сообщениям, файлам
7.1.2. Нормализация запроса:
- Приведение к нижнему регистру, удаление пунктуации
- Генерация вариантов с дефисом/без дефиса/с пробелом/слитно
- Комбинирование вариантов для многословных запросов
7.1.3. Подсветка найденных фрагментов (highlight_text) с поддержкой нескольких вариантов
7.1.4. Фильтрация результатов по правам доступа
7.2. Результаты поиска
7.2.1. Вкладки по типам (все, проекты, задачи, сообщения, файлы)
7.2.2. Пагинация для каждого типа с сохранением настроек в сессии
7.2.3. Сортировка (по дате, названию, релевантности)
7.2.4. Отображение мета-информации (автор, дата, проект/задача для контекста)
8. SSE (Server-Sent Events) — РЕАЛЬНОЕ ВРЕМЯ
8.1. Архитектура SSE
8.1.1. Обход ограничений shared-хостинга — принудительные flush(), отключение компрессии, отключение буферизации nginx
8.1.2. Автоматический реконнект с экспоненциальной задержкой
8.1.3. Heartbeat-проверка (ping каждые 15 секунд, таймаут 45 секунд)
8.1.4. Максимальное время жизни соединения (600 секунд)
8.2. Типы событий SSE
8.2.1. ping — поддержание соединения
8.2.2. connected — подтверждение подключения
8.2.3. unread_update — обновление счётчика непрочитанных сообщений
8.2.4. new_messages — новые сообщения в текущей/подписанной задаче
8.2.5. message_edited — редактирование сообщения
8.2.6. message_deleted — удаление сообщения
8.2.7. new_task — новая задача (с проверкой assigned_to_uuid или подписки)
8.2.8. new_file — новый файл (с проверкой подписки)
8.2.9. overdue_task — просроченная задача
8.2.10. task_deleted — удаление задачи
8.3. Очередь событий (sse_queue)
8.3.1. Хранение неотправленных событий (для клиентов, отключившихся во время генерации)
8.3.2. Периодическая очистка старых обработанных событий (CRON)
8.3.3. Формат: uuid, task_uuid, event_type, event_data, processed
9. ДАШБОРД (index.php)
9.1. Блоки дашборда
9.1.1. Новые задачи — только чужие задачи
9.1.2. Новые сообщения — только непрочитанные, чужие, в доступных задачах
9.1.3. Новые файлы — чужие файлы в доступных задачах
9.1.4. Просроченные задачи — назначенные на пользователя, со статусом 0
9.1.5. Уведомления — из таблицы user_notifications
9.2. Автообновление
9.2.1. Периодический опрос (каждые 30 секунд) через dashboard_data.php
9.2.2. Retry-логика при ошибках 503 (экспоненциальная задержка, до 5 попыток)
9.2.3. Обновление при возвращении на вкладку (visibilitychange)
9.3. Настройки дашборда
9.3.1. Отображение времени последнего визита
9.3.2. Email-интервал (alert_interval_min)
9.3.3. Кнопка «Отметить всё как прочитанное» (mark_read + mark_notifications_read)
10. АДМИНИСТРИРОВАНИЕ (admin.php)
10.1. Вкладки
10.1.1. Личные данные — настройка профиля, смена пароля, настройки уведомлений
10.1.2. Пользователи (только админ) — CRUD, сброс пароля, блокировка
10.1.3. Права доступа (только админ) — выдача прав на проекты (4 типа прав)
10.1.4. Подписчики (только админ) — управление подписками на задачи
10.2. Защита
10.2.1. CSRF-проверка для всех мутирующих действий
10.2.2. Запрет обновления role/status через форму редактирования (белый список полей)
10.2.3. Защита от самоудаления
10.2.4. Уведомление пользователя при изменении его учётной записи (email)
10.3. Очистка файлов
10.3.1. Анализ (dry run) — поиск файлов без привязки к задачам/сообщениям
10.3.2. Удаление «мёртвых» файлов с диска
10.3.3. Удаление импортированных файлов (asana_, msg_)
11. ПОДПИСКИ НА ЗАДАЧИ (task_subscribers)
11.1. Функции подписок
11.1.1. Автоматическая подписка автора и исполнителя при создании задачи
11.1.2. Подписка через упоминания (@login) в сообщениях
11.1.3. Ручная подписка/отписка через интерфейс (кнопка в задачах)
11.1.4. Управление подписками из админки
11.2. Влияние подписок
11.2.1. Уведомления — пользователь получает уведомления о подписанных задачах
11.2.2. Бейджи — сообщения/задачи/файлы считаются только из подписанных задач
11.2.3. SSE-фильтрация — события отправляются только подписанным пользователям
12. ИМПОРТ ИЗ ASANA
12.1. Архитектура импорта
12.1.1. Клиент AsanaClient (REST API) с rate limiting (0.2 сек между запросами)
12.1.2. Маппер AsanaMapper (преобразование Asana → ЗадаЧат)
12.1.3. Чанковый импорт (маленькими порциями для обхода лимитов хостинга):
- Сначала список задач
- Затем импорт задач по 3-4 штуки
- Затем импорт сообщений и файлов по 2 задачи за раз
12.1.4. Поддержка трёх режимов: dry run, полный импорт, обновление
12.2. Импортируемые объекты
12.2.1. Проекты — название, описание, создатель (маппинг на администратора)
12.2.2. Задачи — иерархическая структура (подзадачи), статус, даты, исполнитель
12.2.3. Сообщения — все stories типа comment и attachment
12.2.4. Файлы — загрузка по download_url, определение MIME, сохранение с расширением
12.3. Маппинг пользователей
12.3.1. Автоматическое сопоставление по email
12.3.2. Ручное сопоставление через интерфейс
12.3.3. Автоматическое создание новых пользователей (логин: транслитерация имени, временный пароль)
12.4. Управление импортом из Asana
12.4.1. UI-панель с вкладками: проекты, импорт, пользователи, лог, настройки
12.4.2. Отмена импорта через файл-семафор (.import_cancel)
12.4.3. Лог импорта (asana_import_log) с уникальными индексами по asana_gid + type
13. БЕЗОПАСНОСТЬ
13.1. Защита от атак
13.1.1. CSRF — токены в формах, AJAX-запросах, заголовках X-CSRF-Token
13.1.2. XSS — htmlspecialchars при выводе, CSP с nonce, запрет inline-скриптов
13.1.3. SQL-инъекции — параметризованные запросы (prepare + bind_param)
13.1.4. SSRF — блокировка внутренних IP и доменов (localhost, 10.x.x.x, 172.16-31.x.x, 192.168.x.x)
13.1.5. LFI/Path traversal — строгая валидация storage_name (разрешены только [a-zA-Z0-9_-.]), проверка realpath
13.1.6. Clickjacking — X-Frame-Options: DENY
13.1.7. MIME-sniffing — X-Content-Type-Options: nosniff
13.2. HTTP-заголовки безопасности
13.2.1. Content-Security-Policy (CSP) с nonce для скриптов и стилей
13.2.2. Referrer-Policy: strict-origin-when-cross-origin
13.2.3. Permissions-Policy — запрет геолокации, микрофона, камеры
13.2.4. X-XSS-Protection: 1; mode=block
13.3. Сессионная безопасность
13.3.1. Cookie с SameSite=Lax, Secure (при HTTPS), HttpOnly
13.3.2. Регенерация session_id при логине
13.3.3. Уничтожение сессии при выходе (с очисткой cookies)
13.3.4. Защита от фиксации сессии
13.4. Валидация и санация
13.4.1. Санация служебных символов (\n, \r, \t) в логах
13.4.2. Санация имён файлов при загрузке
13.4.3. Ограничение длины строк (названия 190 символов, сообщения 65000 символов)
14. ЧАСОВЫЕ ПОЯСА
14.1. Механизм
14.1.1. Определение offset через JavaScript (new Date().getTimezoneOffset())
14.1.2. Сохранение в сессию через AJAX
14.1.3. Хранение в базе как целое число (минуты от UTC)
14.2. Применение
14.2.1. Форматирование дат в сообщениях (formatTime) с отображением смещения
14.2.2. Преобразование локальных дат в UTC при сохранении в БД
14.2.3. Отображение дат в stamp (дд.мм.гггг чч:мм (TZ))
15. ОБРАБОТКА ФАЙЛОВ (ДОПОЛНИТЕЛЬНО)
15.1. Анализатор файлов
15.1.1. Определение типа по сигнатурам (magic bytes) — PNG, JPEG, GIF, WebP, BMP, PDF, ZIP, RAR, 7z, MP4, OGG, WAV, FLAC, AVI, MKV, WebM, DOC (OLE)
15.1.2. Определение CAD/EDA форматов:
- 3D модели: STL (ASCII/бинарный), STEP, IGES
- Печатные платы: Altium (SCHDOC, PCBDOC), KiCAD (kicad_sch, kicad_pcb), Eagle (SCH, BRD)
- Производственные: Gerber, Excellon Drill, ODB++
15.1.3. Определение текстовых файлов (JSON, XML, HTML, CSS, JS, CSV, Markdown, LOG, PHP, Python, Shell)
15.1.4. Строгая проверка MP3 (ID3-теги, frame sync)
15.1.5. Проверка бинарных STL (треугольники, размер файла)
15.2. Защита при скачивании
15.2.1. Проверка прав доступа (через task_files, message_files, подписки)
15.2.2. Валидация storage_name (символы, path traversal)
15.2.3. Блокировка опасных расширений (php, phtml, pl, py, cgi, asp, jsp, sh)
15.2.4. Использование readfile() для отправки бинарных данных
16. ИНТЕРФЕЙС И UX
16.1. Адаптивный дизайн
16.1.1. Desktop — двухколоночный макет (сайдбар + контент)
16.1.2. Мобильные устройства — выдвижная панель (drawer) для сайдбара, фиксированная панель ввода, sticky-хедер
16.1.3. Определение мобильных браузеров (Chrome, Safari, Firefox, Samsung Internet, Edge, Opera, UC Browser, Brave, Vivaldi, Yandex, Huawei, MIUI, Puffin, Dolphin, Kiwi, Via, DuckDuckGo)
16.2. Копирование в буфер
16.2.1. Копирование ссылки на задачу (клик по строке задачи, защита от выделения текста)
16.2.2. Копирование ссылки на сообщение (через меню)
16.2.3. Копирование текста сообщения (чистый текст, без цитат)
16.2.4. Копирование ссылки на файл
16.2.5. Toast-уведомление об успешном копировании
16.3. Навигация
16.3.1. Якорные ссылки на блоки дашборда
16.3.2. Прокрутка к блоку при клике на счётчик
16.3.3. Обработка URL-якорей при загрузке страницы
16.3.4. Глобальное меню с бейджами
16.4. Анимации и визуальные эффекты
16.4.1. Подсветка выделенных задач (анимация pulse-highlight)
16.4.2. Плавное появление/исчезновение сообщений при удалении
16.4.3. Подсветка блоков при прокрутке по якорю (block-highlight)
16.4.4. Анимация появления тостов (slideInRight / slideOutRight)
17. ТЕЛЕМЕТРИЯ И ОТЛАДКА
17.1. Логирование (logger.php / logger.js)
17.1.1. Уровни логирования (0 — выкл, 1 — только ошибки, 2 — всё)
17.1.2. Ротация лога при превышении 5 МБ
17.1.3. Сохранение логов в localStorage (для JS)
17.1.4. Логирование пользователя (UUID, логин, роль, IP)
17.1.5. Определение caller (файл:строка → функция)
17.2. Диагностика
17.2.1. Страница тестирования push-уведомлений
17.2.2. Диагностика уведомлений на странице admin.php
17.2.3. Анализ файлов перед очисткой
17.2.4. Консоль логирования в админском разделе импорта
18. CRON-ЗАДАЧИ
18.1. Отправка email-уведомлений (cron_send_notifications.php)
18.1.1. Очистка старых записей login_attempts (по умолчанию 30 дней)
18.1.2. Очистка очереди SSE (обработанные события старше 7 дней, оставляя 5000 записей)
18.1.3. Очистка прочитанных уведомлений (user_notifications, 7 дней)
18.2. Параметры
18.2.1. MAX_NOTIFICATIONS_PER_EMAIL = 10
18.2.2. SSE_QUEUE_KEEP_COUNT = 5000
18.2.3. LOGIN_ATTEMPTS_RETENTION_DAYS = 30
19. СТРУКТУРА БАЗЫ ДАННЫХ (КЛЮЧЕВЫЕ ТАБЛИЦЫ)
19.1. Основные таблицы
19.1.1. users — пользователи
19.1.2. projects — проекты
19.1.3. tasks — задачи
19.1.4. messages — сообщения
19.1.5. files — файлы
Все сущности имеют индекс типа UUID.
19.2. Таблицы связей
19.2.1. task_files — связь задач и файлов
19.2.2. message_files — связь сообщений и файлов
19.2.3. user_project_permissions — права доступа к проектам
19.2.4. task_subscribers — подписки на задачи
19.3. Служебные таблицы
19.3.1. push_subscriptions — Web Push подписки
19.3.2. sse_queue — очередь SSE-событий
19.3.3. user_notifications — системные уведомления (колокольчик)
19.3.4. task_change_history — история изменений задач
19.3.5. asana_import_log — лог импорта из Asana
19.3.6. asana_user_mapping — сопоставление пользователей Asana
19.3.7. login_attempts — попытки входа (анти-брутфорс)
20. ОСОБЕННОСТИ АРХИТЕКТУРЫ
20.1. Гибридная архитектура
20.1.1. Совмещение проверенной сессионной модели с новыми функциями (CSRF, часовые пояса, SSE)
20.1.2. Сессия запускается ТОЛЬКО в boot.php (единая точка)
20.1.3. Все функции аутентификации в auth.php
20.2. Оптимизация для shared-хостинга
20.2.1. Чанковый импорт (маленькие порции, паузы между запросами)
20.2.2. Последовательная загрузка изображений (batchSize=1, задержка 500ms)
20.2.3. Принудительные flush() и отключение буферизации в SSE
20.2.4. Ограничение количества одновременно загружаемых подзадач
20.3. Service Worker
20.3.1. Регистрация sw.js с автоматической активацией
20.3.2. Фоновые push-уведомления
20.3.3. Умная обработка кликов по уведомлениям
20.3.4. Кэширование для офлайн-режима
20.3.5. Heartbeat для поддержания активности
(с) 2026 Влад Помелов aka Peacemaker
Автор в MAX, @pmakerv в Телеграм. Видео-обзор.