views-count-fix
Some checks failed
Deploy on push / deploy (push) Failing after 7s

This commit is contained in:
2025-08-27 15:22:18 +03:00
parent 29f8625617
commit 32f1fab867
4 changed files with 32 additions and 23 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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

2
uv.lock generated
View File

@@ -413,7 +413,7 @@ wheels = [
[[package]]
name = "discours-core"
version = "0.9.10"
version = "0.9.13"
source = { editable = "." }
dependencies = [
{ name = "alembic" },