This commit is contained in:
parent
3a5297015f
commit
1892ea666a
|
@ -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):
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user