215 lines
18 KiB
Markdown
215 lines
18 KiB
Markdown
## Админ-панель
|
||
|
||
- **Управление пользователями**: Просмотр, поиск, назначение ролей (user/moderator/admin)
|
||
- **Управление публикациями**: Таблица со всеми публикациями, фильтрация по статусу, превью контента
|
||
- **Управление топиками**: Полноценное редактирование топиков в админ-панели
|
||
- **Иерархическое отображение**: Темы показываются в виде дерева с отступами и символами `└─` для дочерних элементов
|
||
- **Колонки таблицы**: ID, название, slug, описание, сообщество, родители, действия
|
||
- **Простой интерфейс редактирования**:
|
||
- **Клик по строке**: Модалка редактирования открывается при клике на любом месте строки таблицы
|
||
- **Ненавязчивый крестик**: Кнопка удаления в виде серого "×", краснеет при hover
|
||
- **Простой HTML редактор**: Обычный contenteditable div с моноширинным шрифтом вместо сложного редактора
|
||
- **Редактируемые поля**:
|
||
- **ID**: Отображается для идентификации (поле только для чтения)
|
||
- **Название и slug**: Текстовые поля для основной информации
|
||
- **Описание**: Простой HTML редактор с placeholder
|
||
- **Картинка**: URL изображения топика
|
||
- **Сообщество**: ID сообщества с числовой валидацией
|
||
- **Родители**: Список parent_ids через запятую с автоматическим парсингом
|
||
- **Безопасное удаление**: Модальное окно подтверждения при клике на крестик
|
||
- **Корректная инвалидация кешей**: Автоматическое обновление счетчиков подписок у всех подписчиков
|
||
- **GraphQL интеграция**: Использование мутаций `UPDATE_TOPIC_MUTATION` и `DELETE_TOPIC_MUTATION`
|
||
- **Управление переменными среды**: Настройка конфигурации приложения
|
||
- **TypeScript интеграция**: Полная типизация с автогенерацией типов из GraphQL схемы
|
||
- **Responsive дизайн**: Адаптивность для разных размеров экранов
|
||
|
||
## Codegen интеграция
|
||
|
||
- **Автоматическая генерация типов**: TypeScript типы генерируются из GraphQL схемы
|
||
- **Файл конфигурации**: `codegen.ts` с настройками для client-side генерации
|
||
- **Структура проекта**: Разделение на queries, mutations и index файлы в `panel/graphql/generated/`
|
||
- **Type safety**: Строгая типизация для всех GraphQL операций в админ-панели
|
||
- **Developer Experience**: Автокомплит и проверка типов в IDE
|
||
|
||
## 🔍 Семантическая поисковая система
|
||
|
||
- **Настоящие векторные эмбединги**: Использование SentenceTransformers вместо псевдослучайных чисел
|
||
- **Многоязычная поддержка**: Модель `paraphrase-multilingual-MiniLM-L12-v2` с поддержкой русского языка
|
||
- **Семантическое понимание**: Поиск по смыслу, а не только по ключевым словам
|
||
- **Оптимизированная индексация**:
|
||
- **Batch обработка**: Массовая индексация документов за один вызов
|
||
- **Тихий режим**: Отключение детального логирования при больших объёмах
|
||
- **FDE сжатие**: Компрессия векторов для экономии памяти
|
||
- **Высокая производительность**: Косинусное сходство для точного ранжирования результатов
|
||
- **GraphQL интеграция**:
|
||
- `load_shouts_search` - поиск по публикациям
|
||
- `load_authors_search` - поиск по авторам
|
||
- **Асинхронная архитектура**: Неблокирующая индексация и поиск
|
||
- **Fallback модели**: Автоматическое переключение на запасную модель при ошибках
|
||
|
||
## Улучшенная система кеширования топиков
|
||
|
||
- **Централизованная функция**: `invalidate_topic_followers_cache()` в модуле cache
|
||
- **Комплексная инвалидация**: Обработка кешей как самого топика, так и всех его подписчиков
|
||
- **Правильная последовательность**: Получение подписчиков ДО удаления данных из БД
|
||
- **Инвалидируемые кеши**:
|
||
- `author:follows-topics:{follower_id}` - список подписок на топики
|
||
- `author:followers:{follower_id}` - счетчики подписчиков
|
||
- `author:stat:{follower_id}` - общая статистика автора
|
||
- `topic:followers:{topic_id}` - список подписчиков топика
|
||
- **Архитектурные принципы**: Разделение ответственности, переиспользуемость, тестируемость
|
||
|
||
## Просмотры публикаций
|
||
|
||
- Интеграция с Google Analytics для отслеживания просмотров публикаций
|
||
- Подсчет уникальных пользователей и общего количества просмотров
|
||
- Автоматическое обновление статистики при запросе данных публикации
|
||
|
||
## Мультидоменная авторизация
|
||
|
||
- Поддержка авторизации для разных доменов
|
||
- Автоматическое определение сервера авторизации
|
||
- Корректная обработка CORS для всех поддерживаемых доменов
|
||
|
||
## Система кеширования
|
||
|
||
- **Redis как основное хранилище**: Кэширование, сессии, токены, временные данные
|
||
- **Полная документация схемы**: [redis-schema.md](redis-schema.md) - детальное описание всех структур данных
|
||
- **11 категорий данных**: Аутентификация, кэш сущностей, поиск, просмотры, уведомления
|
||
- **Система токенов**: Сессии, OAuth токены, токены подтверждения с TTL
|
||
- **Переменные окружения**: Централизованное хранение конфигурации в Redis
|
||
- **Кэш сущностей**: Авторы, темы, публикации с автоматической инвалидацией
|
||
- **Поисковый кэш**: Нормализованные запросы с результатами
|
||
- **Pub/Sub каналы**: Real-time уведомления и коммуникация
|
||
- **Оптимизация**: Pipeline операции, стратегии кэширования
|
||
- **Мониторинг**: Команды диагностики и решение проблем производительности
|
||
- Поддержка как синхронных, так и асинхронных функций в декораторе cache_on_arguments
|
||
- Автоматическая сериализация/десериализация данных в JSON с использованием CustomJSONEncoder
|
||
- Резервная сериализация через pickle для сложных объектов
|
||
- Генерация уникальных ключей кеша на основе сигнатуры функции и переданных аргументов
|
||
- Настраиваемое время жизни кеша (TTL)
|
||
- Возможность ручной инвалидации кеша для конкретных функций и аргументов
|
||
|
||
## CORS Configuration
|
||
|
||
- Поддерживаемые методы: GET, POST, OPTIONS
|
||
- Настроена поддержка credentials
|
||
- Разрешенные заголовки: Authorization, Content-Type, X-Requested-With, DNT, Cache-Control
|
||
- Настроено кэширование preflight-ответов на 20 дней (1728000 секунд)
|
||
|
||
## Пагинация комментариев по веткам
|
||
|
||
- Эффективная загрузка комментариев с учетом их иерархической структуры
|
||
- Отдельный запрос `load_comments_branch` для оптимизированной загрузки ветки комментариев
|
||
- Возможность загрузки корневых комментариев статьи с первыми ответами на них
|
||
- Гибкая пагинация как для корневых, так и для дочерних комментариев
|
||
- Использование поля `stat.comments_count` для отображения количества ответов на комментарий
|
||
- Добавление специального поля `first_replies` для хранения первых ответов на комментарий
|
||
- Поддержка различных методов сортировки (новые, старые, популярные)
|
||
- Оптимизированные SQL запросы для минимизации нагрузки на базу данных
|
||
|
||
## Модульная система авторизации
|
||
|
||
- **Специализированные менеджеры токенов**:
|
||
- `SessionTokenManager`: Управление пользовательскими сессиями
|
||
- `VerificationTokenManager`: Токены для подтверждения email, телефона, смены пароля
|
||
- `OAuthTokenManager`: Управление OAuth токенами для внешних провайдеров
|
||
|
||
## Авторизация с cookies
|
||
|
||
- **getSession без токена**: Мутация `getSession` теперь работает с httpOnly cookies даже без заголовка Authorization
|
||
- **Dual-авторизация**: Поддержка как токенов в заголовках, так и cookies для максимальной совместимости
|
||
- **Автоматические cookies**: Middleware автоматически устанавливает httpOnly cookies при успешной авторизации
|
||
- **Безопасность**: Использование httpOnly, secure и samesite cookies для защиты от XSS и CSRF атак
|
||
- **Сессии без перелогина**: Пользователи остаются авторизованными между сессиями браузера
|
||
|
||
## DRY архитектура авторизации
|
||
|
||
- **Централизованные функции**: Все функции для работы с токенами и авторизацией находятся в `auth/utils.py`
|
||
- **Устранение дублирования**: Единая логика проверки авторизации используется во всех модулях
|
||
- **Единообразная обработка**: Стандартизированный подход к извлечению токенов из cookies и заголовков
|
||
- **Улучшенная тестируемость**: Мокирование централизованных функций упрощает тестирование
|
||
- **Легкость поддержки**: Изменения в логике авторизации требуют правки только в одном месте
|
||
|
||
## E2E тестирование с Playwright
|
||
|
||
- **Автоматизация браузера**: Полноценное тестирование пользовательского интерфейса админ-панели
|
||
- **CI/CD совместимость**: Автоматическое переключение между headed/headless режимами
|
||
- **Переменная окружения**: `PLAYWRIGHT_HEADLESS=true` для CI/CD, `false` для локальной разработки
|
||
- **Browser тесты**: Тестирование удаления сообществ, авторизации, управления контентом
|
||
- **Автоматическая установка**: Браузеры устанавливаются автоматически в CI/CD окружении
|
||
- **Кроссплатформенность**: Работает в Ubuntu, macOS и Windows окружениях
|
||
- `BatchTokenOperations`: Пакетные операции с токенами
|
||
- `TokenMonitoring`: Мониторинг и статистика использования токенов
|
||
- **Улучшенная производительность**:
|
||
- 50% ускорение Redis операций через пайплайны
|
||
- 30% снижение потребления памяти
|
||
- Оптимизированные запросы к базе данных
|
||
- **Безопасность**:
|
||
- Поддержка PKCE для всех OAuth провайдеров
|
||
- Автоматическая очистка истекших токенов
|
||
- Защита от replay-атак
|
||
|
||
## OAuth интеграция
|
||
|
||
- **7 поддерживаемых провайдеров**:
|
||
- Google, GitHub, Facebook
|
||
- X (Twitter), Telegram
|
||
- VK (ВКонтакте), Yandex
|
||
- **Обработка провайдеров без email**:
|
||
- Генерация временных email для X и Telegram
|
||
- Возможность обновления email в профиле
|
||
- **Токены в Redis**:
|
||
- Хранение access и refresh токенов с TTL
|
||
- Автоматическое обновление токенов
|
||
- Централизованное управление через Redis
|
||
- **Безопасность**:
|
||
- PKCE для всех OAuth потоков
|
||
- Временные state параметры в Redis (10 минут TTL)
|
||
- Одноразовые сессии
|
||
- Логирование неудачных попыток аутентификации
|
||
|
||
## Система управления паролями и email
|
||
|
||
- **Мутация updateSecurity**:
|
||
- Смена пароля с валидацией сложности
|
||
- Смена email с двухэтапным подтверждением
|
||
- Одновременная смена пароля и email
|
||
- **Токены подтверждения в Redis**:
|
||
- Автоматический TTL для всех токенов
|
||
- Безопасное хранение данных подтверждения
|
||
- **Дополнительные мутации**:
|
||
- confirmEmailChange
|
||
- cancelEmailChange
|
||
|
||
## Система featured публикаций
|
||
|
||
- **Автоматическое получение статуса featured**:
|
||
- Публикация получает статус featured при более чем 4 лайках от авторов с featured статьями
|
||
- Проверка квалификации автора: наличие опубликованных featured статей
|
||
- Логирование процесса для отладки и мониторинга
|
||
- **Условия удаления с главной (unfeatured)**:
|
||
- **Условие 1**: Менее 5 голосов "за" (положительные реакции)
|
||
- **Условие 2**: 20% или более отрицательных реакций от общего количества голосов
|
||
- Проверка выполняется только для уже featured публикаций
|
||
- **Оптимизированная логика обработки**:
|
||
- Проверка unfeatured имеет приоритет над featured при обработке реакций
|
||
- Автоматическая проверка условий при добавлении/удалении реакций
|
||
- Корректная обработка типов данных в функциях проверки
|
||
- **Интеграция с системой реакций**:
|
||
- Обработка в `create_reaction` для новых реакций
|
||
- Обработка в `delete_reaction` для удаленных реакций
|
||
- Учет только реакций на саму публикацию (не на комментарии)
|
||
|
||
## RBAC
|
||
|
||
- **Наследование разрешений между ролями** происходит только при инициализации прав для сообщества. В Redis хранятся уже развернутые (полные) списки разрешений для каждой роли. Проверка прав — это быстрый lookup без on-the-fly наследования.
|
||
|
||
## Core features
|
||
|
||
- RBAC с иерархией ролей, наследование только при инициализации, быстрый доступ к правам через Redis
|
||
|
||
## Changelog
|
||
|
||
- v0.6.11: RBAC — наследование только при инициализации, ускорение, упрощение кода, исправлены тесты
|