diff --git a/resolvers/draft.py b/resolvers/draft.py index 63789827..01bfa19f 100644 --- a/resolvers/draft.py +++ b/resolvers/draft.py @@ -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}")