diff --git a/CHANGELOG.md b/CHANGELOG.md index 27c7fed4..fb7b8aa7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,21 +1,5 @@ # Changelog -## [0.9.14] - 2025-08-27 - -### 🚨 Исправлено -- **Проблемы с созданием таблиц на CI**: Улучшена надежность создания тестовых таблиц - - Добавлено принудительное создание таблиц по одной при сбое `metadata.create_all` - - Улучшена обработка ошибок импорта моделей ORM - - Добавлены fallback механизмы для создания отсутствующих таблиц - - Исправлены ошибки `no such table: author`, `no such table: shout`, `no such table: draft` - -### 🔧 Техническое -- **Улучшена тестовая инфраструктура**: Более надежное создание тестовой БД - - Добавлена функция `force_create_all_tables` с созданием таблиц по одной - - Улучшена фикстура `db_session` с множественными fallback стратегиями - - Добавлена проверка импорта всех моделей ORM на уровне модуля - - Улучшена диагностика проблем с созданием таблиц - ## [0.9.13] - 2025-08-27 ### 🚨 Исправлено @@ -33,16 +17,34 @@ - Добавлен фикстура `create_test_users_in_backend_db` для регистрации пользователей через API - Убраны несуществующие GraphQL запросы (`get_community_stats`) - Тесты корректно работают с системой ролей и правами администратора +- **Проблемы с созданием таблиц на CI**: Улучшена надежность создания тестовых таблиц + - Добавлено принудительное создание таблиц по одной при сбое `metadata.create_all` + - Улучшена обработка ошибок импорта моделей ORM + - Добавлены fallback механизмы для создания отсутствующих таблиц + - Исправлены ошибки `no such table: author`, `no such table: shout`, `no such table: draft` +- **Исправлен счетчик просмотров**: Теперь корректно показывает количество просмотров публикаций + - Исправлена передача `slug` вместо `id` в `ViewedStorage.get_shout` + - Добавлена поддержка получения views_count по ID через поиск slug в БД + - Исправлена проблема когда всегда возвращался 0 для счетчика просмотров + ### 🔧 Техническое - **Рефакторинг аутентификации**: Упрощена логика работы с пользователями - Убраны зависимости от несуществующих полей в ORM моделях - Обновлены сервисы аутентификации для корректной работы без `username` - Исправлены все места использования `username` в коде -- **Улучшена тестовая инфраструктура**: +- **Улучшена тестовая инфраструктура**: Более надежное создание тестовой БД + - Добавлена функция `force_create_all_tables` с созданием таблиц по одной + - Улучшена фикстура `db_session` с множественными fallback стратегиями + - Добавлена проверка импорта всех моделей ORM на уровне модуля + - Улучшена диагностика проблем с созданием таблиц - Тесты теперь используют реальный HTTP API вместо прямых DB проверок - Правильная изоляция тестовых данных через отдельную БД - Корректная работа с системой ролей и правами +- **Исправлена логика счетчика просмотров**: Улучшена работа ViewedStorage + - Исправлен метод `get_shout` для корректной работы с ID и slug + - Добавлен fallback для получения slug по ID из БД + - Оптимизирована передача параметров в resolvers ## [0.9.12] - 2025-08-26 diff --git a/resolvers/reader.py b/resolvers/reader.py index 6d4dcc69..e80341d7 100644 --- a/resolvers/reader.py +++ b/resolvers/reader.py @@ -318,7 +318,9 @@ def get_shouts_with_links( stat = orjson.loads(row.stat) elif isinstance(row.stat, dict): stat = row.stat - viewed = ViewedStorage.get_shout(shout_id=shout_id) or 0 + # 🔎 Получаем views_count по slug, а не по id + shout_slug = shout_dict.get("slug", "") + viewed = ViewedStorage.get_shout(shout_slug=shout_slug) or 0 shout_dict["stat"] = {**stat, "views_count": viewed} # Обработка main_topic и topics diff --git a/services/viewed.py b/services/viewed.py index 62c11958..9954f4ba 100644 --- a/services/viewed.py +++ b/services/viewed.py @@ -205,11 +205,16 @@ class ViewedStorage: if shout_slug: return self.views_by_shout.get(shout_slug, 0) - # 🔎 Для ID ищем по всем slug'ам (пока нет прямого ID -> views mapping) - # TODO: можно добавить views_by_id кеш для оптимизации + # 🔎 Для ID ищем slug в БД и затем получаем views_count if shout_id: - # Простое решение: возвращаем 0 если нет slug - # В production лучше добавить отдельный кеш по ID + try: + with local_session() as session: + from orm.shout import Shout + shout = session.query(Shout).where(Shout.id == shout_id).first() + if shout and shout.slug: + return self.views_by_shout.get(shout.slug, 0) + except Exception as e: + logger.warning(f"Failed to get shout slug for id {shout_id}: {e}") return 0 return 0 diff --git a/uv.lock b/uv.lock index ace904be..b6e55554 100644 --- a/uv.lock +++ b/uv.lock @@ -413,7 +413,7 @@ wheels = [ [[package]] name = "discours-core" -version = "0.9.10" +version = "0.9.13" source = { editable = "." } dependencies = [ { name = "alembic" },