Files
core/docs/features.md
Untone 1b48675b92
Some checks failed
Deploy on push / deploy (push) Failing after 2m22s
[0.9.7] - 2025-08-18
### 🔄 Изменения
- **SQLAlchemy KeyError** - исправление ошибки `KeyError: Reaction` при инициализации
- **Исправлена ошибка SQLAlchemy**: Устранена проблема `InvalidRequestError: When initializing mapper Mapper[Shout(shout)], expression Reaction failed to locate a name (Reaction)`

### 🧪 Тестирование
- **Исправление тестов** - адаптация к новой структуре моделей
- **RBAC инициализация** - добавление `rbac.initialize_rbac()` в `conftest.py`
- **Создан тест для getSession**: Добавлен комплексный тест `test_getSession_cookies.py` с проверкой всех сценариев
- **Покрытие edge cases**: Тесты проверяют работу с валидными/невалидными токенами, отсутствующими пользователями
- **Мокирование зависимостей**: Использование unittest.mock для изоляции тестируемого кода

### 🔧 Рефакторинг
- **Упрощена архитектура**: Убраны сложные конструкции с отложенными импортами, заменены на чистую архитектуру
- **Перемещение моделей** - `Author` и связанные модели перенесены в `orm/author.py`: Вынесены базовые модели пользователей (`Author`, `AuthorFollower`, `AuthorBookmark`, `AuthorRating`) из `orm.author` в отдельный модуль
- **Устранены циклические импорты**: Разорван цикл между `auth.core` → `orm.community` → `orm.author` через реструктуризацию архитектуры
- **Создан модуль `utils/password.py`**: Класс `Password` вынесен в utils для избежания циклических зависимостей
- **Оптимизированы импорты моделей**: Убран прямой импорт `Shout` из `orm/community.py`, заменен на строковые ссылки

### 🔧 Авторизация с cookies
- **getSession теперь работает с cookies**: Мутация `getSession` теперь может получать токен из httpOnly cookies даже без заголовка Authorization
- **Убрано требование авторизации**: `getSession` больше не требует декоратор `@login_required`, работает автономно
- **Поддержка dual-авторизации**: Токен может быть получен как из заголовка Authorization, так и из cookie `session_token`
- **Автоматическая установка cookies**: Middleware автоматически устанавливает httpOnly cookies при успешном `getSession`
- **Обновлена GraphQL схема**: `SessionInfo` теперь содержит поля `success`, `error` и опциональные `token`, `author`
- **Единообразная обработка токенов**: Все модули теперь используют централизованные функции для работы с токенами
- **Улучшена обработка ошибок**: Добавлена детальная валидация токенов и пользователей в `getSession`
- **Логирование операций**: Добавлены подробные логи для отслеживания процесса авторизации

### 📝 Документация
- **Обновлена схема GraphQL**: `SessionInfo` тип теперь соответствует новому формату ответа
- Обновлена документация RBAC
- Обновлена документация авторизации с cookies
2025-08-18 14:25:25 +03:00

16 KiB
Raw Blame History

Админ-панель

  • Управление пользователями: Просмотр, поиск, назначение ролей (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

Улучшенная система кеширования топиков

  • Централизованная функция: 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 - детальное описание всех структур данных
  • 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 при более чем 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 — наследование только при инициализации, ускорение, упрощение кода, исправлены тесты