apply-options-moved
All checks were successful
Deploy on push / deploy (push) Successful in 1m26s

This commit is contained in:
Untone 2024-11-01 14:29:58 +03:00
parent 3a5297015f
commit 1892ea666a
2 changed files with 26 additions and 37 deletions

View File

@ -3,40 +3,14 @@ from typing import List
from sqlalchemy import and_, select from sqlalchemy import and_, select
from orm.author import Author, AuthorFollower from orm.author import Author, AuthorFollower
from orm.reaction import Reaction
from orm.shout import Shout, ShoutAuthor, ShoutReactionsFollower, ShoutTopic from orm.shout import Shout, ShoutAuthor, ShoutReactionsFollower, ShoutTopic
from orm.topic import Topic, TopicFollower from orm.topic import Topic, TopicFollower
from resolvers.reader import apply_filters, apply_sorting, get_shouts_with_links, has_field, query_with_stat from resolvers.reader import apply_options, get_shouts_with_links, has_field, query_with_stat
from services.auth import login_required from services.auth import login_required
from services.db import local_session from services.db import local_session
from services.schema import query from services.schema import query
from utils.logger import root_logger as logger from utils.logger import root_logger as logger
def apply_options(q, options, reactions_created_by=0):
"""
Применяет опции фильтрации и сортировки
[опционально] выбирая те публикации, на которые есть реакции/комментарии от указанного автора
:param q: Исходный запрос.
:param options: Опции фильтрации и сортировки.
:param reactions_created_by: Идентификатор автора.
:return: Запрос с примененными опциями.
"""
filters = options.get("filters")
if isinstance(filters, dict):
q = apply_filters(q, filters)
if reactions_created_by:
q = q.join(Reaction, Reaction.shout == Shout.id)
q = q.filter(Reaction.created_by == reactions_created_by)
if "commented" in filters:
q = q.filter(Reaction.body.is_not(None))
q = apply_sorting(q, options)
limit = options.get("limit", 10)
offset = options.get("offset", 0)
return q, limit, offset
@query.field("load_shouts_coauthored") @query.field("load_shouts_coauthored")
@login_required @login_required
async def load_shouts_coauthored(_, info, options): async def load_shouts_coauthored(_, info, options):

View File

@ -14,6 +14,30 @@ from services.viewed import ViewedStorage
from utils.logger import root_logger as logger from utils.logger import root_logger as logger
def apply_options(q, options, reactions_created_by=0):
"""
Применяет опции фильтрации и сортировки
[опционально] выбирая те публикации, на которые есть реакции/комментарии от указанного автора
:param q: Исходный запрос.
:param options: Опции фильтрации и сортировки.
:param reactions_created_by: Идентификатор автора.
:return: Запрос с примененными опциями.
"""
filters = options.get("filters")
if isinstance(filters, dict):
q = apply_filters(q, filters)
if reactions_created_by:
q = q.join(Reaction, Reaction.shout == Shout.id)
q = q.filter(Reaction.created_by == reactions_created_by)
if "commented" in filters:
q = q.filter(Reaction.body.is_not(None))
q = apply_sorting(q, options)
limit = options.get("limit", 10)
offset = options.get("offset", 0)
return q, limit, offset
def has_field(info, fieldname: str) -> bool: def has_field(info, fieldname: str) -> bool:
""" """
Проверяет, запрошено ли поле :fieldname: в GraphQL запросе Проверяет, запрошено ли поле :fieldname: в GraphQL запросе
@ -321,16 +345,7 @@ async def load_shouts_by(_, info, options):
""" """
# Базовый запрос: если запрашиваются статистические данные, используем специальный запрос с статистикой # Базовый запрос: если запрашиваются статистические данные, используем специальный запрос с статистикой
q = query_with_stat(info) q = query_with_stat(info)
q, limit, offset = apply_options(q, options)
filters = options.get("filters")
if isinstance(filters, dict):
q = apply_filters(q, filters)
q = apply_sorting(q, options)
# Установка лимита и смещения для пагинации
offset = options.get("offset", 0)
limit = options.get("limit", 10)
# Передача сформированного запроса в метод получения публикаций с учетом сортировки и пагинации # Передача сформированного запроса в метод получения публикаций с учетом сортировки и пагинации
return get_shouts_with_links(info, q, limit, offset) return get_shouts_with_links(info, q, limit, offset)