draft-shout-link-fix

This commit is contained in:
2025-08-23 18:14:28 +03:00
parent 421defe776
commit 394fadfbd1

View File

@@ -51,7 +51,8 @@ def create_draft_dict(draft: Draft) -> dict[str, Any]:
"deleted_at": draft.deleted_at,
"updated_by": draft.updated_by,
"deleted_by": draft.deleted_by,
"shout": draft.shout,
# добавляется вручную в каждой мутации
# "shout": draft.shout,
# Явно загружаем связи, чтобы избежать null значений
"authors": [
{"id": a.id, "name": a.name, "slug": a.slug, "pic": getattr(a, "pic", None)} for a in (draft.authors or [])
@@ -142,13 +143,25 @@ async def load_drafts(_: None, info: GraphQLResolveInfo) -> dict[str, Any]:
)
drafts = drafts_query.all()
# Преобразуем объекты в словари, пока они в контексте сессии
# 🔍 Преобразуем объекты в словари, пока они в контексте сессии
drafts_data = []
for draft in drafts:
draft_dict = draft.dict()
draft_dict = create_draft_dict(draft)
# Всегда возвращаем массив для topics, даже если он пустой
draft_dict["topics"] = [topic.dict() for topic in (draft.topics or [])]
draft_dict["authors"] = [author.dict() for author in (draft.authors or [])]
# 🔍 Обрабатываем поле shout правильно
if draft.shout:
# Загружаем связанный shout если есть
shout = session.query(Shout).where(Shout.id == draft.shout).first()
if shout:
draft_dict["shout"] = {"id": shout.id, "slug": shout.slug, "published_at": shout.published_at}
else:
draft_dict["shout"] = None
else:
draft_dict["shout"] = None
drafts_data.append(draft_dict)
return {"drafts": drafts_data}
@@ -248,7 +261,14 @@ async def create_draft(_: None, info: GraphQLResolveInfo, draft_input: dict[str,
session.add(da)
session.commit()
return {"draft": draft}
# 🔍 Формируем результат с правильным форматом
draft_dict = create_draft_dict(draft)
# 🔍 При создании черновика shout еще не существует
draft_dict["shout"] = None
return {"draft": draft_dict}
except Exception as e:
logger.error(f"Failed to create draft: {e}", exc_info=True)
return {"error": f"Failed to create draft: {e!s}"}
@@ -370,13 +390,24 @@ async def update_draft(_: None, info: GraphQLResolveInfo, draft_id: int, draft_i
session.commit()
# Преобразуем объект в словарь для ответа
draft_dict = draft.dict()
# 🔍 Преобразуем объект в словарь для ответа
draft_dict = create_draft_dict(draft)
draft_dict["topics"] = [topic.dict() for topic in draft.topics]
draft_dict["authors"] = [author.dict() for author in draft.authors]
# Добавляем объект автора в updated_by
draft_dict["updated_by"] = author_dict
# 🔍 Обрабатываем поле shout правильно
if draft.shout:
# Загружаем связанный shout если есть
shout = session.query(Shout).where(Shout.id == draft.shout).first()
if shout:
draft_dict["shout"] = {"id": shout.id, "slug": shout.slug, "published_at": shout.published_at}
else:
draft_dict["shout"] = None
else:
draft_dict["shout"] = None
return {"draft": draft_dict}
except Exception as e:
@@ -396,9 +427,14 @@ async def delete_draft(_: None, info: GraphQLResolveInfo, draft_id: int) -> dict
return {"error": "Draft not found"}
if author_id != draft.created_by and draft.authors.where(Author.id == author_id).count() == 0:
return {"error": "You are not allowed to delete this draft"}
# 🔍 Сохраняем данные черновика перед удалением
draft_dict = create_draft_dict(draft)
# При удалении shout информация уже не актуальна
draft_dict["shout"] = None
session.delete(draft)
session.commit()
return {"draft": draft}
return {"draft": draft_dict}
@mutation.field("publish_draft")
@@ -587,8 +623,8 @@ async def unpublish_draft(_: None, info: GraphQLResolveInfo, draft_id: int) -> d
# Формируем результат
draft_dict = create_draft_dict(draft)
# Добавляем информацию о публикации
draft_dict["shout"] = {"id": shout.id, "slug": shout.slug, "published_at": None}
# 🔍 После снятия с публикации, черновик больше не связан с публикацией
draft_dict["shout"] = None
logger.info(f"Successfully unpublished shout #{shout.id} for draft #{draft_id}")