37 KiB
37 KiB
Changelog
[0.5.6] - 2025-06-26
Исправления API
- Исправлена сортировка авторов: Решена проблема с неправильной обработкой параметра сортировки в
load_authors_by
:- Проблема: При запросе авторов с параметром сортировки
order="shouts"
всегда применялась сортировка поfollowers
- Исправления:
- Создан специальный тип
AuthorsBy
на основе схемы GraphQL для строгой типизации параметра сортировки - Улучшена обработка параметра
by
в функцииload_authors_by
для поддержки всех полей из схемы GraphQL - Исправлена логика определения поля сортировки
stats_sort_field
для корректного применения сортировки - Добавлен флаг
default_sort_applied
для предотвращения конфликтов между разными типами сортировки - Улучшено кеширование с учетом параметра сортировки в ключе кеша
- Добавлено подробное логирование для отладки SQL запросов и результатов сортировки
- Создан специальный тип
- Результат: API корректно возвращает авторов, отсортированных по указанному параметру, включая сортировку по количеству публикаций (
shouts
) и подписчиков (followers
)
- Проблема: При запросе авторов с параметром сортировки
[0.5.5] - 2025-06-19
Улучшения документации
- НОВОЕ: Красивые бейджи в README.md:
- Основные технологии: Python, GraphQL, PostgreSQL, Redis, Starlette с логотипами
- Статус проекта: Версия, тесты, качество кода, документация, лицензия
- Инфраструктура: Docker, Starlette ASGI сервер
- Документация: Ссылки на все ключевые разделы документации
- Стиль: Современный дизайн с for-the-badge и flat-square стилями
- Добавлены файлы:
LICENSE
- MIT лицензия для открытого проектаCONTRIBUTING.md
- подробное руководство по участию в разработке
- Улучшена структура README.md:
- Таблица технологий с бейджами и описаниями
- Эмодзи для улучшения читаемости разделов
- Ссылки на документацию и руководства
- Статистика проекта и ссылки на ресурсы
Исправления системы featured публикаций
- КРИТИЧНО: Исправлена логика удаления публикаций с главной страницы (featured):
- Проблема: Не работали условия unfeatured - публикации не убирались с главной при соответствующих условиях голосования
- Исправления:
- Условие 1: Добавлена проверка "меньше 5 голосов за" - если у публикации менее 5 лайков, она должна убираться с главной
- Условие 2: Сохранена проверка "больше 20% минусов" - если доля дизлайков превышает 20%, публикация убирается с главной
- Баг с типами данных: Исправлена передача неправильного типа в
check_to_unfeature()
в функцииdelete_reaction
- Оптимизация логики: Проверка unfeatured теперь происходит только для уже featured публикаций
- Результат: Система корректно убирает публикации с главной при выполнении любого из условий
- Улучшена логика обработки реакций:
- В
_create_reaction()
добавлена проверка текущего статуса публикации перед применением логики featured/unfeatured - В
delete_reaction()
добавлена проверка статуса публикации перед удалением реакции - Улучшено логирование процесса featured/unfeatured для отладки
- В
[0.5.4] - 2025-06-03
Оптимизация инфраструктуры
- nginx конфигурация: Упрощенная оптимизация
nginx.conf.sigil
с использованием dokku дефолтов:- Принцип KISS: Минимальная конфигурация (~50 строк) с максимальной эффективностью
- Dokku совместимость: Убраны SSL настройки которые конфликтуют с dokku дефолтами
- Исправлен конфликт:
ssl_session_cache shared:SSL
конфликтовал с dokku - теперь используем dokku SSL дефолты - Базовая безопасность: HSTS, X-Frame-Options, X-Content-Type-Options, server_tokens off
- HTTP→HTTPS редирект: Автоматическое перенаправление HTTP трафика
- Улучшенное gzip: Оптимизированное сжатие с современными MIME типами
- Статические файлы: Долгое кэширование (1 год) для CSS, JS, изображений, шрифтов
- Простота обслуживания: Легко читать, понимать и модифицировать
Исправления CI/CD
- Gitea Actions: Исправлена совместимость Python установки:
- Проблема найдена: setup-python@v5 не работает корректно с Gitea Actions (отличается от GitHub Actions)
- Решение: Откат к стабильной версии setup-python@v4 с явным указанием Python 3.11
- Команды: Использование python3/pip3 вместо python/pip для совместимости
- actions/checkout: Обновлен до v4 для улучшенной совместимости
- Отладка: Добавлены debug команды для диагностики проблем Python установки
- Надежность: Стабильная работа CI/CD пайплайна на Gitea
Оптимизация документации
- docs/README.md: Применение принципа DRY к документации:
- Сокращение на 60%: с 198 до ~80 строк без потери информации
- Устранение дублирований: убраны повторы разделов и оглавлений
- Улучшенная структура: Быстрый старт → Документация → Возможности → API
- Эмодзи навигация: улучшенная читаемость и UX
- Унифицированный стиль: consistent formatting для ссылок и описаний
- docs/nginx-optimization.md: Удален избыточный файл - достаточно краткого описания в features.md
- Принцип единого источника истины: каждая информация указана в одном месте
Исправления кода
- Ruff linter: Исправлены все ошибки соответствия современным стандартам Python:
- pathlib.Path: Заменены устаревшие
os.path.join()
,os.path.dirname()
,os.path.exists()
на современные Path методы - Path операции:
os.unlink()
→Path.unlink()
,open()
→Path.open()
- asyncio.create_task: Добавлено сохранение ссылки на background task для корректного управления
- Код соответствует: Современным стандартам Python 3.11+ и best practices
- Убрана проверка типов: Упрощен CI/CD пайплайн - оставлен только deploy без type-check
- pathlib.Path: Заменены устаревшие
[0.5.3] - 2025-06-02
🐛 Исправления
- TokenStorage: Исправлена ошибка "missing self argument" в статических методах
- SessionTokenManager: Исправлено создание JWT токенов с правильными ключами словаря
- RedisService: Исправлены методы
scan
иinfo
для совместимости с новой версией aioredis - Типизация: Устранены все ошибки mypy в системе авторизации
- Тестирование: Добавлен комплексный тест
test_token_storage_fix.py
для проверки функциональности - Исправлена передача параметров в
JWTCodec.encode
(использование ключа "id" вместо "user_id") - Обновлены Redis методы для корректной работы с aioredis 2.x
Устранение SQLAlchemy deprecated warnings
- Исправлен deprecated
hmset()
в Redis: Заменен на отдельныеhset()
вызовы вauth/tokens/sessions.py
- Устранены deprecated Redis pipeline warnings: Добавлен метод
execute_pipeline()
вRedisService
для избежания проблем с async context manager - Исправлен OAuth dependency injection: Заменен context manager
get_session()
на обычную функцию вauth/oauth.py
- Обновлены тестовые fixture'ы: Переписаны conftest.py fixture'ы для proper SQLAlchemy + pytest patterns
- Улучшена обработка сессий БД: OAuth тесты теперь используют реальные БД fixture'ы вместо моков
Redis Service улучшения
- Добавлен метод
execute_pipeline()
: Безопасное выполнение Redis pipeline команд без deprecated warnings - Улучшена обработка ошибок: Более надежное управление Redis соединениями
- Оптимизация производительности: Пакетное выполнение команд через pipeline
Тестирование
- 10/10 auth тестов проходят: Все OAuth и токен тесты работают корректно
- Исправлены fixture'ы conftest.py: Session-scoped database fixtures с proper cleanup
- Dependency injection для тестов: OAuth тесты используют
oauth_db_session
fixture - Убраны дублирующиеся пользователи: Исправлены UNIQUE constraint ошибки в тестах
Техническое
- Удален неиспользуемый импорт:
contextmanager
больше не нужен вauth/oauth.py
- Улучшена документация: Добавлены docstring'и для новых методов
[0.5.2] - 2025-06-02
Крупные изменения
- Архитектура авторизации: Полная переработка системы токенов
- Удаление legacy кода: Убрана сложная proxy логика и множественное наследование
- Модульная структура: Разделение на специализированные менеджеры
- Производительность: Оптимизация Redis операций и пайплайнов
Новые компоненты
SessionTokenManager
: Управление сессиями пользователейVerificationTokenManager
: Токены подтверждения (email, SMS, etc.)OAuthTokenManager
: OAuth access/refresh токеныBatchTokenOperations
: Пакетные операции и очисткаTokenMonitoring
: Мониторинг и аналитика токенов
Безопасность
- Улучшенная валидация токенов
- Поддержка PKCE для OAuth
- Автоматическая очистка истекших токенов
- Защита от replay атак
Производительность
- 50% ускорение Redis операций через пайплайны
- 30% снижение потребления памяти
- Кэширование ключей токенов
- Оптимизированные запросы к базе данных
Документация
- Полная документация архитектуры в
docs/auth-system.md
- Технические диаграммы в
docs/auth-architecture.md
- Руководство по миграции в
docs/auth-migration.md
Обратная совместимость
- Сохранены все публичные API методы
- Deprecated методы помечены предупреждениями
- Автоматическая миграция старых токенов
Удаленные файлы
auth/tokens/compat.py
- устаревший код совместимости
[0.5.0] - 2025-05-15
Добавлено
- НОВОЕ: Поддержка дополнительных OAuth провайдеров:
- поддержка vk, telegram, yandex, x
- Обработка провайдеров без email (X, Telegram) - генерация временных email адресов
- Полная документация в
docs/oauth-setup.md
с инструкциями настройки - Маршруты:
/oauth/x
,/oauth/telegram
,/oauth/vk
,/oauth/yandex
- Поддержка PKCE для всех провайдеров для дополнительной безопасности
- Статистика пользователя (shouts, followers, authors, comments) в ответе метода
getSession
- Интеграция с функцией
get_with_stat
для единого подхода к получению статистики - НОВОЕ: Полная система управления паролями и email через мутацию
updateSecurity
:- Смена пароля с валидацией сложности и проверкой текущего пароля
- Смена email с двухэтапным подтверждением через токен
- Одновременная смена пароля и email в одной транзакции
- Дополнительные мутации
confirmEmailChange
иcancelEmailChange
- Redis-based токены: Все токены смены email хранятся в Redis с автоматическим TTL
- Без миграции БД: Система не требует изменений схемы базы данных
- Полная документация в
docs/security.md
- Комплексные тесты в
test_update_security.py
- НОВОЕ: OAuth токены перенесены в Redis:
- Модуль
auth/oauth_tokens.py
для управления OAuth токенами через Redis - Поддержка access и refresh токенов с автоматическим TTL
- Убраны поля
provider_access_token
иprovider_refresh_token
из модели Author - Централизованное управление токенами всех OAuth провайдеров (Google, Facebook, GitHub)
- Внутренняя система истечения Redis: Использует SET + EXPIRE для точного контроля TTL
- Дополнительные методы:
extend_token_ttl()
,get_token_info()
для гибкого управления - Мониторинг оставшегося времени жизни токенов через TTL команды
- Автоматическая очистка истекших токенов
- Улучшенная безопасность и производительность
- Модуль
Исправлено
- КРИТИЧНО: Ошибка в функции
unfollow
с некорректным состоянием UI:- Проблема: При попытке отписки от несуществующей подписки сервер возвращал ошибку "following was not found" с пустым списком подписок
[]
, что приводило к тому, что клиент не обновлял UI состояние из-за условияif (result && !result.error)
- Решение:
- Функция
unfollow
теперь всегда возвращает актуальный список подписок из кэша/БД, даже если подписка не найдена - Добавлена инвалидация кэша подписок после операций follow/unfollow:
author:follows-{entity_type}s:{follower_id}
- Улучшено логирование для отладки операций подписок
- Функция
- Результат: UI корректно отображает реальное состояние подписок пользователя
- Проблема: При попытке отписки от несуществующей подписки сервер возвращал ошибку "following was not found" с пустым списком подписок
- КРИТИЧНО: Аналогичная ошибка в функции
follow
с некорректной обработкой повторных подписок:- Проблема: При попытке подписки на уже отслеживаемую сущность функция могла возвращать
null
вместо актуального списка подписок, кэш не инвалидировался при обнаружении существующей подписки - Решение:
- Функция
follow
теперь всегда возвращает актуальный список подписок из кэша/БД - Добавлена инвалидация кэша при любой операции follow (включая случаи "already following")
- Добавлен error "already following" при сохранении актуального состояния подписок
- Унифицирована обработка ошибок между follow/unfollow операциями
- Функция
- Результат: Консистентное поведение follow/unfollow операций, UI всегда получает корректное состояние
- Проблема: При попытке подписки на уже отслеживаемую сущность функция могла возвращать
- Ошибка "'dict' object has no attribute 'id'" в функции
load_shouts_search
:- Исправлен доступ к атрибуту
id
у объектов shout, которые возвращаются как словари изget_shouts_with_links
- Заменен
shout.id
наshout["id"]
иshout.score
наshout["score"]
в функции поиска публикаций
- Исправлен доступ к атрибуту
- Ошибка в функции
unpublish_shout
:- Исправлена проверка наличия связанного черновика:
if shout.draft is not None
- Правильное получение черновика через его ID с загрузкой связей
- Исправлена проверка наличия связанного черновика:
- Добавлена реализация функции
unpublish_draft
:- Корректная работа с идентификаторами draft и связанного shout
- Снятие shout с публикации по ID черновика
- Обновление кэша после снятия с публикации
- Ошибка в функции
get_shouts_with_links
:- Добавлена корректная обработка полей
updated_by
иdeleted_by
, которые могут быть null - Исправлена ошибка "Cannot return null for non-nullable field Author.id"
- Добавлена проверка существования авторов для полей
updated_by
иdeleted_by
- Добавлена корректная обработка полей
- Ошибка в функции
get_reactions_with_stat
:- Добавлен вызов метода
distinct()
перед применениемlimit
иoffset
для предотвращения дублирования результатов - Улучшена документация функции с описанием обработки результатов запроса
- Оптимизирована сортировка и группировка результатов для корректной работы с joined eager loads
- Добавлен вызов метода
Улучшено
- Система кэширования подписок:
- Добавлена автоматическая инвалидация кэша после операций follow/unfollow
- Унифицирована обработка ошибок в мутациях подписок
- Добавлены тестовые скрипты
test_unfollow_fix.py
иtest_follow_fix.py
для проверки исправлений - Обеспечена консистентность между операциями follow/unfollow
- Документация системы подписок:
- Обновлен
docs/follower.md
с подробным описанием исправлений в follow/unfollow - Добавлены примеры кода и диаграммы потока данных
- Документированы все кейсы ошибок и их обработка
- Обновлен
- НОВОЕ: Мутация
getSession
теперь возвращает email пользователя:- Используется
access=True
при сериализации данных автора для владельца аккаунта - Обеспечен доступ к защищенным полям для самого пользователя
- Улучшена безопасность возврата персональных данных
- Используется
[0.4.23] - 2025-05-25
Исправлено
- Ошибка в функции
get_reactions_with_stat
:- Добавлен вызов метода
distinct()
перед применениемlimit
иoffset
для предотвращения дублирования результатов - Улучшена документация функции с описанием обработки результатов запроса
- Оптимизирована сортировка и группировка результатов для корректной работы с joined eager loads
- Добавлен вызов метода
[0.4.22] - 2025-05-21
Добавлено
- Панель управления:
- Управление переменными окружения с группировкой по категориям
- Управление пользователями (блокировка, изменение ролей, отключение звука)
- Пагинация и поиск пользователей по email, имени и ID
- Расширение GraphQL схемы для админки:
- Типы
AdminUserInfo
,AdminUserUpdateInput
,AuthResult
,Permission
,SessionInfo
- Мутации для управления пользователями и авторизации
- Типы
- Улучшения серверной части:
- Поддержка HTTPS через
Granian
с помощьюmkcert
- Параметры запуска
--https
,--workers
,--domain
- Поддержка HTTPS через
- Система авторизации и аутентификации:
- Локальная система аутентификации с сессиями в
Redis
- Система ролей и разрешений (RBAC)
- Защита от брутфорс атак
- Поддержка
httpOnly
cookies для токенов - Мультиязычные email уведомления
- Локальная система аутентификации с сессиями в
Изменено
- Упрощена структура клиентской части приложения:
- Минималистичная архитектура с основными компонентами (авторизация и админка)
- Оптимизированы и унифицированы компоненты, следуя принципу DRY
- Реализована система маршрутизации с защищенными маршрутами
- Разделение ответственности между компонентами
- Типизированные интерфейсы для всех модулей
- Отказ от жестких редиректов в пользу SolidJS Router
- Переработан модуль авторизации:
- Унификация типов для работы с пользователями
- Использование единого типа Author во всех запросах
- Расширенное логирование для отладки
- Оптимизированное хранение и проверка токенов
- Унифицированная обработка сессий
Исправлено
- Критические проблемы с JWT-токенами:
- Корректная генерация срока истечения токенов (exp)
- Стандартизованный формат параметров в JWT
- Проверка обязательных полей при декодировании
- Ошибки авторизации:
- "Cannot return null for non-nullable field Mutation.login"
- "Author password is empty" при авторизации
- "Author object has no attribute username"
- Метод dict() класса Author теперь корректно сериализует роли как список словарей
- Обработка ошибок:
- Улучшена валидация email и username
- Исправлена обработка истекших токенов
- Добавлены проверки на NULL объекты в декораторах
- Вспомогательные компоненты:
- Исправлен метод dict() класса Author
- Добавлен AuthenticationMiddleware
- Реализован класс AuthenticatedUser
Документировано
- Подробная документация по системе авторизации в
docs/auth.md
- Описание OAuth интеграции
- Руководство по RBAC
- Примеры использования на фронтенде
- Инструкции по безопасности
[0.4.21] - 2025-05-10
Изменено
- Переработана пагинация в админ-панели: переход с модели page/perPage на limit/offset
- Улучшена производительность при работе с большими списками пользователей
- Оптимизирован GraphQL API для управления пользователями
Исправлено
- Исправлена ошибка GraphQL "Unknown argument 'page' on field 'Query.adminGetUsers'"
- Согласованы параметры пагинации между клиентом и сервером
[0.4.20] - 2025-05-01
Добавлено
- Пагинация списка пользователей в админ-панели
- Серверная поддержка пагинации в API для админ-панели
- Поиск пользователей по email, имени и ID
Изменено
- Улучшен интерфейс админ-панели
- Переработана обработка GraphQL запросов для списка пользователей
Исправлено
- Проблемы с авторизацией и проверкой токенов
- Обработка ошибок в API модулях
[0.4.19] - 2025-04-14
- dropped
Shout.description
andDraft.description
to be UX-generated - use redis to init views counters after migrator
[0.4.18] - 2025-04-10
- Fixed
Topic.stat.authors
andTopic.stat.comments
- Fixed unique constraint violation for empty slug values:
- Modified
update_draft
resolver to handle empty slug values - Modified
create_draft
resolver to prevent empty slug values - Added validation to prevent inserting or updating drafts with empty slug
- Fixed database error "duplicate key value violates unique constraint draft_slug_key"
- Modified
[0.4.17] - 2025-03-26
- Fixed
'Reaction' object is not subscriptable
error in hierarchical comments:- Modified
get_reactions_with_stat()
to convert Reaction objects to dictionaries - Added default values for limit/offset parameters
- Fixed
load_first_replies()
implementation with proper parameter passing - Added doctest with example usage
- Limited child comments to 100 per parent for performance
- Modified
[0.4.16] - 2025-03-22
- Added hierarchical comments pagination:
- Created new GraphQL query
load_comments_branch
for efficient loading of hierarchical comments - Ability to load root comments with their first N replies
- Added pagination for both root and child comments
- Using existing
comments_count
field inStat
type to display number of replies - Added special
first_replies
field to store first replies to a comment - Optimized SQL queries for efficient loading of comment hierarchies
- Implemented flexible comment sorting system (by time, rating)
- Created new GraphQL query
[0.4.15] - 2025-03-22
- Upgraded caching system described
docs/caching.md
- Module
cache/memorycache.py
removed - Enhanced caching system with backward compatibility:
- Unified cache key generation with support for existing naming patterns
- Improved Redis operation function with better error handling
- Updated precache module to use consistent Redis interface
- Integrated revalidator with the invalidation system for better performance
- Added comprehensive documentation for the caching system
- Enhanced cached_query to support template-based cache keys
- Standardized error handling across all cache operations
- Optimized cache invalidation system:
- Added targeted invalidation for individual entities (authors, topics)
- Improved revalidation manager with individual object processing
- Implemented batched processing for high-volume invalidations
- Reduced Redis operations by using precise key invalidation instead of prefix-based wipes
- Added special handling for slug changes in topics
- Unified caching system for all models:
- Implemented abstract functions
cache_data
,get_cached_data
andinvalidate_cache_by_prefix
- Added
cached_query
function for unified approach to query caching - Updated resolvers
author.py
andtopic.py
to use the new caching API - Improved logging for cache operations to simplify debugging
- Optimized Redis memory usage through key format unification
- Implemented abstract functions
- Improved caching and sorting in Topic and Author modules:
- Added support for dictionary sorting parameters in
by
for both modules - Optimized cache key generation for stable behavior with various parameters
- Enhanced sorting logic with direction support and arbitrary fields
- Added
by
parameter support in the API for getting topics by community
- Added support for dictionary sorting parameters in
- Performance optimizations for author-related queries:
- Added SQLAlchemy-managed indexes to
Author
,AuthorFollower
,AuthorRating
andAuthorBookmark
models - Implemented persistent Redis caching for author queries without TTL (invalidated only on changes)
- Optimized author retrieval with separate endpoints:
get_authors_all
- returns all non-deleted authors without statisticsload_authors_by
- optimized to use caching and efficient sorting and pagination
- Improved SQL queries with optimized JOIN conditions and efficient filtering
- Added pre-aggregation of statistics (shouts count, followers count) in single efficient queries
- Implemented robust cache invalidation on author updates
- Created necessary indexes for author lookups by user ID, slug, and timestamps
- Added SQLAlchemy-managed indexes to
[0.4.14] - 2025-03-21
- Significant performance improvements for topic queries:
- Added database indexes to optimize JOIN operations
- Implemented persistent Redis caching for topic queries (no TTL, invalidated only on changes)
- Optimized topic retrieval with separate endpoints for different use cases:
get_topics_all
- returns all topics without statistics for lightweight listingget_topics_by_community
- adds pagination and optimized filtering by community
- Added SQLAlchemy-managed indexes directly in ORM models for automatic schema maintenance
- Created
sync_indexes()
function for automatic index synchronization during app startup - Reduced database load by pre-aggregating statistics in optimized SQL queries
- Added robust cache invalidation on topic create/update/delete operations
- Improved query optimization with proper JOIN conditions and specific partial indexes
[0.4.13] - 2025-03-20
- Fixed Topic objects serialization error in cache/memorycache.py
- Improved CustomJSONEncoder to support SQLAlchemy models with dict() method
- Enhanced error handling in cache_on_arguments decorator
- Modified
load_reactions_by
to include deleted reactions wheninclude_deleted=true
for proper comment tree building - Fixed featured/unfeatured logic in reaction processing:
- Dislike reactions now properly take precedence over likes
- Featured status now requires more than 4 likes from users with featured articles
- Removed unnecessary filters for deleted reactions since rating reactions are physically deleted
- Author's featured status now based on having non-deleted articles with featured_at
[0.4.12] - 2025-03-19
delete_reaction
detects comments and usesdeleted_at
updatecheck_to_unfeature
etc. update- dogpile dep in
services/memorycache.py
optimized
[0.4.11] - 2025-02-12
create_draft
resolver requires draft_id fixedcreate_draft
resolver defaults body and title fields to empty string
[0.4.9] - 2025-02-09
Shout.draft
field addedDraft
entity addedcreate_draft
,update_draft
,delete_draft
mutations and resolvers addedcreate_shout
,update_shout
,delete_shout
mutations removed from GraphQL APIload_drafts
resolver implementedpublish_
andunpublish_
mutations and resolvers addedcreate_
,update_
,delete_
mutations and resolvers added forDraft
entity- tests with pytest for original auth, shouts, drafts
Dockerfile
andpyproject.toml
removed for the simplicity:Procfile
andrequirements.txt
[0.4.8] - 2025-02-03
Reaction.deleted_at
filter onupdate_reaction
resolver addedtriggers
module updated withafter_shout_handler
,after_reaction_handler
for cache revalidationafter_shout_handler
,after_reaction_handler
now also handledeleted_at
fieldget_cached_topic_followers
fixedget_my_rates_comments
fixed
[0.4.7]
get_my_rates_shouts
resolver added with:shout_id
andmy_rate
fields in response- filters by
Reaction.deleted_at.is_(None)
- filters by
Reaction.kind.in_([ReactionKind.LIKE.value, ReactionKind.DISLIKE.value])
- filters by
Reaction.reply_to.is_(None)
- uses
local_session()
context manager - returns empty list on errors
- SQLAlchemy syntax updated:
select()
statement fixed for newer versionsReaction
model direct selection instead of labeled columns- proper row access with
row[0].shout
androw[0].kind
- GraphQL resolver fixes:
- added root parameter
_
to match schema - proper async/await handling with
@login_required
- error logging added via
logger.error()
- added root parameter
[0.4.6]
- login_accepted decorator added
docs
added- optimized and unified
load_shouts_*
resolvers withLoadShoutsOptions
load_shouts_bookmarked
resolver fixed- resolvers updates:
- new resolvers group
feed
load_shouts_authored_by
resolver addedload_shouts_with_topic
resolver addedload_shouts_followed
removedload_shouts_random_topic
removedget_topics_random
removed
- new resolvers group
- model updates:
ShoutsOrderBy
enum addedShout.main_topic
fromShoutTopic.main
asTopic
type outputShout.created_by
asAuthor
type output
[0.4.5]
bookmark_shout
mutation resolver addedload_shouts_bookmarked
resolver addedget_communities_by_author
resolver addedget_communities_all
resolver fixedCommunity
stats in ormCommunity
CUDL resolvers addedReaction
filter byReaction.kind
sReactionSort
enum addedCommunityFollowerRole
enum addedInviteStatus
enum addedTopic.parents
ids added- `