This commit is contained in:
@@ -15,6 +15,14 @@ from utils.logger import root_logger as logger
|
||||
|
||||
|
||||
def apply_options(q, options, author_id: int):
|
||||
"""
|
||||
Применяет опции фильтрации и сортировки к запросу для данного автора.
|
||||
|
||||
:param q: Исходный запрос.
|
||||
:param options: Опции фильтрации и сортировки.
|
||||
:param author_id: Идентификатор автора.
|
||||
:return: Запрос с примененными опциями.
|
||||
"""
|
||||
filters = options.get("filters")
|
||||
if isinstance(filters, dict):
|
||||
q = apply_filters(q, filters)
|
||||
@@ -158,8 +166,7 @@ async def reacted_shouts_updates(info, follower_id: int, options) -> List[Shout]
|
||||
Обновляет публикации, на которые подписан автор, с учетом реакций.
|
||||
|
||||
:param follower_id: Идентификатор подписчика.
|
||||
:param limit: Колиество пукликаций для загрузки.
|
||||
:param offset: Смещение для пагинации.
|
||||
:param options: Опции фильтрации и сортировки.
|
||||
:return: Список публикаций.
|
||||
"""
|
||||
shouts: List[Shout] = []
|
||||
@@ -200,8 +207,7 @@ async def load_shouts_followed(_, info, options) -> List[Shout]:
|
||||
Загружает публикации, на которые подписан пользователь.
|
||||
|
||||
:param info: Информация о контексте GraphQL.
|
||||
:param limit: Количество публикаций для загрузки.
|
||||
:param offset: Смещение для пагинации.
|
||||
:param options: Опции фильтрации и сортировки.
|
||||
:return: Список публикаций.
|
||||
"""
|
||||
user_id = info.context["user_id"]
|
||||
@@ -224,8 +230,7 @@ async def load_shouts_followed_by(_, info, slug: str, options) -> List[Shout]:
|
||||
|
||||
:param info: Информация о контексте GraphQL.
|
||||
:param slug: Slug автора.
|
||||
:param limit: Количество публикаций для загрузки.
|
||||
:param offset: Смещение для пагинации.
|
||||
:param options: Опции фильтрации и сортировки.
|
||||
:return: Список публикаций.
|
||||
"""
|
||||
with local_session() as session:
|
||||
|
@@ -16,7 +16,13 @@ from utils.logger import root_logger as logger
|
||||
|
||||
|
||||
def has_field(info, fieldname: str) -> bool:
|
||||
"""Проверяет, запрошено ли поле :fieldname: в GraphQL запросе"""
|
||||
"""
|
||||
Проверяет, запрошено ли поле :fieldname: в GraphQL запросе
|
||||
|
||||
:param info: Информация о контексте GraphQL
|
||||
:param fieldname: Имя запрашиваемого поля
|
||||
:return: True, если поле запрошено, False в противном случае
|
||||
"""
|
||||
field_node = info.field_nodes[0]
|
||||
for selection in field_node.selection_set.selections:
|
||||
if hasattr(selection, "name") and selection.name.value == fieldname:
|
||||
@@ -25,7 +31,11 @@ def has_field(info, fieldname: str) -> bool:
|
||||
|
||||
|
||||
def query_with_stat():
|
||||
# Оптимизированный подзапрос статистики
|
||||
"""
|
||||
добавляет подзапрос статистики
|
||||
|
||||
:return: Запрос с подзапросом статистики.
|
||||
"""
|
||||
stats_subquery = (
|
||||
select(
|
||||
Reaction.shout.label("shout_id"),
|
||||
@@ -277,6 +287,13 @@ async def get_shout(_, info, slug="", shout_id=0):
|
||||
|
||||
|
||||
def apply_sorting(q, options):
|
||||
"""
|
||||
Применение сортировки к запросу.
|
||||
|
||||
:param q: Исходный запрос.
|
||||
:param options: Опции фильтрации и сортировки.
|
||||
:return: Запрос с примененной сортировкой.
|
||||
"""
|
||||
# Определение поля для сортировки
|
||||
order_str = options.get("order_by")
|
||||
|
||||
@@ -298,6 +315,8 @@ async def load_shouts_by(_, info, options):
|
||||
"""
|
||||
Загрузка публикаций с фильтрацией, сортировкой и пагинацией.
|
||||
|
||||
:param _: Корневой объект запроса (не используется)
|
||||
:param info: Информация о контексте GraphQL
|
||||
:param options: Опции фильтрации и сортировки.
|
||||
:return: Список публикаций, удовлетворяющих критериям.
|
||||
"""
|
||||
@@ -327,6 +346,8 @@ async def load_shouts_search(_, info, text, options):
|
||||
"""
|
||||
Поиск публикаций по тексту.
|
||||
|
||||
:param _: Корневой объект запроса (не используется)
|
||||
:param info: Информация о контексте GraphQL
|
||||
:param text: Строка поиска.
|
||||
:param options: Опции фильтрации и сортировки.
|
||||
:return: Список публикаций, найденных по тексту.
|
||||
@@ -364,6 +385,11 @@ async def load_shouts_search(_, info, text, options):
|
||||
async def load_shouts_unrated(_, info, options):
|
||||
"""
|
||||
Загрузка публикаций с менее чем 3 реакциями типа LIKE/DISLIKE
|
||||
|
||||
:param _: Корневой объект запроса (не используется)
|
||||
:param info: Информация о контексте GraphQL
|
||||
:param options: Опции фильтрации и сортировки.
|
||||
:return: Список публикаций.
|
||||
"""
|
||||
rated_shouts = (
|
||||
select(Reaction.shout)
|
||||
@@ -439,7 +465,7 @@ async def load_shouts_random_topic(_, info, options):
|
||||
Загрузка случайной темы и связанных с ней публикаций.
|
||||
|
||||
:param info: Информация о контексте GraphQL.
|
||||
:param limit: Максимальное количество публикаций.
|
||||
:param options: Опции фильтрации и сортировки.
|
||||
:return: Тема и связанные публикации.
|
||||
"""
|
||||
[topic] = get_topics_random(None, None, 1)
|
||||
|
Reference in New Issue
Block a user