From cc837288bb50918f4d3be6e6b81fac3b0dc53b79 Mon Sep 17 00:00:00 2001 From: Untone Date: Sun, 26 Jan 2025 17:59:08 +0300 Subject: [PATCH] simpler-reader-field --- resolvers/reader.py | 45 ++++++++++++------------------------------- services/schema.py | 47 +-------------------------------------------- 2 files changed, 13 insertions(+), 79 deletions(-) diff --git a/resolvers/reader.py b/resolvers/reader.py index 05f83edc..a80870b2 100644 --- a/resolvers/reader.py +++ b/resolvers/reader.py @@ -11,7 +11,7 @@ from orm.shout import Shout, ShoutAuthor, ShoutTopic from orm.topic import Topic from services.auth import login_accepted from services.db import json_array_builder, json_builder, local_session -from services.schema import query, type_ +from services.schema import query from services.search import search_text from services.viewed import ViewedStorage from utils.logger import root_logger as logger @@ -215,14 +215,12 @@ def get_shouts_with_links(info, q, limit=20, offset=0): "pic": a.pic, } - if hasattr(row, "stat"): + if has_field(info, "stat"): stat = {} if isinstance(row.stat, str): stat = json.loads(row.stat) elif isinstance(row.stat, dict): stat = row.stat - else: - logger.warning(f"Строка {idx} - неизвестный тип stat: {type(row.stat)}") viewed = ViewedStorage.get_shout(shout_id=shout_id) or 0 shout_dict["stat"] = {**stat, "viewed": viewed, "commented": stat.get("comments_count", 0)} @@ -237,6 +235,16 @@ def get_shouts_with_links(info, q, limit=20, offset=0): if has_field(info, "topics") and hasattr(row, "topics"): shout_dict["topics"] = json.loads(row.topics) if isinstance(row.topics, str) else row.topics + if has_field(info, "media") and shout.media: + # Обработка поля media + media_data = shout.media + if isinstance(media_data, str): + try: + media_data = json.loads(media_data) + except json.JSONDecodeError: + media_data = [] + shout_dict["media"] = [media_data] if isinstance(media_data, dict) else media_data + shouts.append(shout_dict) except Exception as row_error: @@ -468,32 +476,3 @@ async def load_shouts_random_top(_, info, options): q = q.order_by(func.random()) limit = options.get("limit", 10) return get_shouts_with_links(info, q, limit) - - -shout = type_("Shout") - - -@shout.field("media") -def resolve_shout_media(shout, _): - """ - Резолвер для поля media типа Shout - Преобразует JSON из БД в список MediaItem - """ - if not shout.media: - return [] - - # Если media это строка JSON, парсим её - if isinstance(shout.media, str): - try: - media_data = json.loads(shout.media) - except json.JSONDecodeError: - return [] - else: - media_data = shout.media - - # Если media_data это словарь, оборачиваем его в список - if isinstance(media_data, dict): - return [media_data] - elif isinstance(media_data, list): - return media_data - return [] diff --git a/services/schema.py b/services/schema.py index ad05883f..32fb1525 100644 --- a/services/schema.py +++ b/services/schema.py @@ -1,50 +1,5 @@ -from asyncio.log import logger - -import httpx -from ariadne import MutationType, ObjectType, QueryType - -from settings import AUTH_URL +from ariadne import MutationType, QueryType query = QueryType() mutation = MutationType() - - -def type_(name: str) -> ObjectType: - """ - Создает резолвер для объектного типа - - :param name: Имя типа в схеме GraphQL - :return: Резолвер объектного типа - """ - resolver = ObjectType(name) - resolvers.append(resolver) - return resolver - - resolvers = [query, mutation] - - -async def request_graphql_data(gql, url=AUTH_URL, headers=None): - if not url: - return None - if headers is None: - headers = {"Content-Type": "application/json"} - try: - # logger.debug(f"{url}:\n{headers}\n{gql}") - async with httpx.AsyncClient() as client: - response = await client.post(url, json=gql, headers=headers) - if response.status_code == 200: - data = response.json() - errors = data.get("errors") - if errors: - logger.error(f"{url} response: {data}") - else: - return data - else: - logger.error(f"{url}: {response.status_code} {response.text}") - except Exception as _e: - # Handling and logging exceptions during authentication check - import traceback - - logger.error(f"request_graphql_data error: {traceback.format_exc()}") - return None