This commit is contained in:
parent
785548d055
commit
96afda77a6
|
@ -4,6 +4,10 @@
|
||||||
- Автоматическое восстановление соединения в случае его потери
|
- Автоматическое восстановление соединения в случае его потери
|
||||||
- Проверка соединения перед выполнением операций с кэшем
|
- Проверка соединения перед выполнением операций с кэшем
|
||||||
- Дополнительное логирование для упрощения диагностики проблем
|
- Дополнительное логирование для упрощения диагностики проблем
|
||||||
|
- Исправлен резолвер `unpublish_shout`:
|
||||||
|
- Корректное формирование синтетического поля `publication` с `published_at: null`
|
||||||
|
- Возвращение полноценного словаря с данными вместо объекта модели
|
||||||
|
- Улучшена загрузка связанных данных (авторы, темы) для правильного формирования ответа
|
||||||
|
|
||||||
#### [0.4.19] - 2025-04-14
|
#### [0.4.19] - 2025-04-14
|
||||||
- dropped `Shout.description` and `Draft.description` to be UX-generated
|
- dropped `Shout.description` and `Draft.description` to be UX-generated
|
||||||
|
|
|
@ -711,8 +711,16 @@ async def unpublish_shout(_, info, shout_id: int):
|
||||||
shout = None
|
shout = None
|
||||||
with local_session() as session:
|
with local_session() as session:
|
||||||
try:
|
try:
|
||||||
# Сначала загружаем Shout без связей
|
# Загружаем Shout со всеми связями для правильного формирования ответа
|
||||||
shout = session.query(Shout).filter(Shout.id == shout_id).first()
|
shout = (
|
||||||
|
session.query(Shout)
|
||||||
|
.options(
|
||||||
|
joinedload(Shout.authors),
|
||||||
|
joinedload(Shout.topics).joinedload(ShoutTopic.topic)
|
||||||
|
)
|
||||||
|
.filter(Shout.id == shout_id)
|
||||||
|
.first()
|
||||||
|
)
|
||||||
|
|
||||||
if not shout:
|
if not shout:
|
||||||
logger.warning(f"Shout not found for unpublish: ID {shout_id}")
|
logger.warning(f"Shout not found for unpublish: ID {shout_id}")
|
||||||
|
@ -740,8 +748,46 @@ async def unpublish_shout(_, info, shout_id: int):
|
||||||
# logger.warning(f"Author {author_id} denied unpublishing shout {shout_id}")
|
# logger.warning(f"Author {author_id} denied unpublishing shout {shout_id}")
|
||||||
# return {"error": "Access denied"}
|
# return {"error": "Access denied"}
|
||||||
|
|
||||||
|
# Запоминаем старый slug и id для формирования поля publication
|
||||||
|
shout_slug = shout.slug
|
||||||
|
shout_id_for_publication = shout.id
|
||||||
|
|
||||||
|
# Снимаем с публикации (устанавливаем published_at в None)
|
||||||
shout.published_at = None
|
shout.published_at = None
|
||||||
session.commit()
|
session.commit()
|
||||||
|
|
||||||
|
# Формируем полноценный словарь для ответа
|
||||||
|
shout_dict = shout.dict()
|
||||||
|
|
||||||
|
# Добавляем связанные данные
|
||||||
|
shout_dict["topics"] = (
|
||||||
|
[
|
||||||
|
{"id": topic.topic.id, "slug": topic.topic.slug, "title": topic.topic.title}
|
||||||
|
for topic in shout.topics if topic.topic
|
||||||
|
]
|
||||||
|
if shout.topics
|
||||||
|
else []
|
||||||
|
)
|
||||||
|
|
||||||
|
# Добавляем main_topic
|
||||||
|
shout_dict["main_topic"] = get_main_topic(shout.topics)
|
||||||
|
|
||||||
|
# Добавляем авторов
|
||||||
|
shout_dict["authors"] = (
|
||||||
|
[
|
||||||
|
{"id": author.id, "name": author.name, "slug": author.slug}
|
||||||
|
for author in shout.authors
|
||||||
|
]
|
||||||
|
if shout.authors
|
||||||
|
else []
|
||||||
|
)
|
||||||
|
|
||||||
|
# Важно! Обновляем поле publication, отражая состояние "снят с публикации"
|
||||||
|
shout_dict["publication"] = {
|
||||||
|
"id": shout_id_for_publication,
|
||||||
|
"slug": shout_slug,
|
||||||
|
"published_at": None # Ключевое изменение - устанавливаем published_at в None
|
||||||
|
}
|
||||||
|
|
||||||
# Инвалидация кэша
|
# Инвалидация кэша
|
||||||
try:
|
try:
|
||||||
|
@ -757,12 +803,11 @@ async def unpublish_shout(_, info, shout_id: int):
|
||||||
except Exception as cache_err:
|
except Exception as cache_err:
|
||||||
logger.error(f"Failed to invalidate cache for unpublish shout {shout_id}: {cache_err}")
|
logger.error(f"Failed to invalidate cache for unpublish shout {shout_id}: {cache_err}")
|
||||||
|
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
session.rollback()
|
session.rollback()
|
||||||
logger.error(f"Failed to unpublish shout {shout_id}: {e}", exc_info=True)
|
logger.error(f"Failed to unpublish shout {shout_id}: {e}", exc_info=True)
|
||||||
return {"error": f"Failed to unpublish shout: {str(e)}"}
|
return {"error": f"Failed to unpublish shout: {str(e)}"}
|
||||||
|
|
||||||
# Возвращаем объект shout с предзагруженным draft и его связями
|
# Возвращаем сформированный словарь вместо объекта
|
||||||
logger.info(f"Shout {shout_id} unpublished successfully by author {author_id}")
|
logger.info(f"Shout {shout_id} unpublished successfully by author {author_id}")
|
||||||
return {"shout": shout}
|
return {"shout": shout_dict}
|
Loading…
Reference in New Issue
Block a user