Some checks failed
Deploy on push / deploy (push) Failing after 2m22s
### 🔄 Изменения - **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
16 KiB
16 KiB
Админ-панель
- Управление пользователями: Просмотр, поиск, назначение ролей (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:
- Публикация получает статус 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 — наследование только при инициализации, ускорение, упрощение кода, исправлены тесты