core/CHANGELOG.md
Untone c48f5f9368
All checks were successful
Deploy on push / deploy (push) Successful in 5s
0.5.7-shouts-admin
2025-06-28 13:47:08 +03:00

40 KiB
Raw Blame History

Changelog

[0.5.7] - 2025-06-28

Новая функциональность админ-панели

  • НОВОЕ: Управление публикациями в админ-панели:
    • Просмотр публикаций: Таблица со всеми публикациями с пагинацией и поиском
    • Фильтрация по статусу: Все/Опубликованные/Черновики/Удаленные
    • Детальная информация: ID, заголовок, slug, статус, авторы, темы, дата создания
    • Превью контента: Body (сырой код) и media файлы с количеством
    • Поиск: По заголовку, slug, ID или содержимому body
    • Адаптивный дизайн: Оптимизированная таблица для мобильных устройств

Архитектурные улучшения

  • DRY принцип: Переиспользование существующих резолверов:
    • adminGetShouts использует функции из reader.py (query_with_stat, get_shouts_with_links)
    • adminUpdateShout и adminDeleteShout используют функции из editor.py
    • adminRestoreShout для восстановления удаленных публикаций
  • GraphQL схема: Новые типы AdminShoutInfo, AdminShoutListResponse для админ-панели
  • TypeScript интерфейсы: Полная типизация для публикаций в админ-панели

UI/UX улучшения

  • Новая вкладка: "Публикации" в навигации админ-панели
  • Статусные бейджи: Цветовая индикация статуса публикаций (опубликована/черновик/удалена)
  • Компактное отображение: Авторы и темы в виде бейджей с ограничением по ширине
  • Умное сокращение текста: Превью body с удалением HTML тегов
  • Адаптивные стили: Оптимизация для экранов разной ширины

Документация

  • Обновлен README.md: Добавлен раздел "Администрирование" с описанием новых возможностей

[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):
    • Проблема: Не работали условия 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

[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 корректно отображает реальное состояние подписок пользователя
  • КРИТИЧНО: Аналогичная ошибка в функции 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
  • Система авторизации и аутентификации:
    • Локальная система аутентификации с сессиями в 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 and Draft.description to be UX-generated
  • use redis to init views counters after migrator

[0.4.18] - 2025-04-10

  • Fixed Topic.stat.authors and Topic.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"

[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

[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 in Stat 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)

[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 and invalidate_cache_by_prefix
    • Added cached_query function for unified approach to query caching
    • Updated resolvers author.py and topic.py to use the new caching API
    • Improved logging for cache operations to simplify debugging
    • Optimized Redis memory usage through key format unification
  • 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
  • Performance optimizations for author-related queries:
    • Added SQLAlchemy-managed indexes to Author, AuthorFollower, AuthorRating and AuthorBookmark 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 statistics
      • load_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

[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 listing
      • get_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 when include_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 uses deleted_at update
  • check_to_unfeature etc. update
  • dogpile dep in services/memorycache.py optimized

[0.4.11] - 2025-02-12

  • create_draft resolver requires draft_id fixed
  • create_draft resolver defaults body and title fields to empty string

[0.4.9] - 2025-02-09

  • Shout.draft field added
  • Draft entity added
  • create_draft, update_draft, delete_draft mutations and resolvers added
  • create_shout, update_shout, delete_shout mutations removed from GraphQL API
  • load_drafts resolver implemented
  • publish_ and unpublish_ mutations and resolvers added
  • create_, update_, delete_ mutations and resolvers added for Draft entity
  • tests with pytest for original auth, shouts, drafts
  • Dockerfile and pyproject.toml removed for the simplicity: Procfile and requirements.txt

[0.4.8] - 2025-02-03

  • Reaction.deleted_at filter on update_reaction resolver added
  • triggers module updated with after_shout_handler, after_reaction_handler for cache revalidation
  • after_shout_handler, after_reaction_handler now also handle deleted_at field
  • get_cached_topic_followers fixed
  • get_my_rates_comments fixed

[0.4.7]

  • get_my_rates_shouts resolver added with:
    • shout_id and my_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 versions
    • Reaction model direct selection instead of labeled columns
    • proper row access with row[0].shout and row[0].kind
  • GraphQL resolver fixes:
    • added root parameter _ to match schema
    • proper async/await handling with @login_required
    • error logging added via logger.error()

[0.4.6]

  • login_accepted decorator added
  • docs added
  • optimized and unified load_shouts_* resolvers with LoadShoutsOptions
  • load_shouts_bookmarked resolver fixed
  • resolvers updates:
    • new resolvers group feed
    • load_shouts_authored_by resolver added
    • load_shouts_with_topic resolver added
    • load_shouts_followed removed
    • load_shouts_random_topic removed
    • get_topics_random removed
  • model updates:
    • ShoutsOrderBy enum added
    • Shout.main_topic from ShoutTopic.main as Topic type output
    • Shout.created_by as Author type output

[0.4.5]

  • bookmark_shout mutation resolver added
  • load_shouts_bookmarked resolver added
  • get_communities_by_author resolver added
  • get_communities_all resolver fixed
  • Community stats in orm
  • Community CUDL resolvers added
  • Reaction filter by Reaction.kinds
  • ReactionSort enum added
  • CommunityFollowerRole enum added
  • InviteStatus enum added
  • Topic.parents ids added
  • `