diff --git a/CHANGELOG.txt b/CHANGELOG.txt index e648419b..4271567c 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -5,6 +5,7 @@ - resolvers: queries and mutations revision and renaming - resolvers: delete_topic(slug) implemented - resolvers: added get_shout_followers +- resolvers: load_shouts_by filters implemented [0.2.15] - schema: Shout.created_by removed diff --git a/resolvers/reader.py b/resolvers/reader.py index 5d4313c1..370e060a 100644 --- a/resolvers/reader.py +++ b/resolvers/reader.py @@ -9,7 +9,7 @@ from orm.author import AuthorFollower, Author from orm.topic import TopicFollower, Topic from orm.community import CommunityAuthor as CommunityFollower, Community from orm.reaction import Reaction, ReactionKind -from orm.shout import Shout, ShoutAuthor, ShoutTopic +from orm.shout import Shout, ShoutAuthor, ShoutTopic, ShoutVisibility from services.search import SearchService from services.viewed import ViewedStorage @@ -122,13 +122,11 @@ async def load_shouts_by(_, info, options): :param info:GraphQLInfo :param options: { filters: { - layout: 'audio', + layouts: ['audio', 'video', ..], visibility: "public", author: 'discours', topic: 'culture', - title: 'something', - body: 'something else', - days: 30 + time_ago: 1234567 // unixtime } offset: 0 limit: 50 @@ -152,12 +150,27 @@ async def load_shouts_by(_, info, options): filters = options.get("filters") if filters: - # with local_session() as session: - # TODO: some filtering logix? - pass + layouts = filters.get("layouts") + if layouts: + q = q.filter(Shout.layout.in_(layouts)) + by_author = filters.get("author") + if by_author: + q = q.filter(Shout.authors.contains(by_author)) + by_topic = filters.get("topic") + if by_topic: + q = q.filter(Shout.topics.contains(by_topic)) + by_visibility = { + "authors": ShoutVisibility.AUTHORS, + "community": ShoutVisibility.COMMUNITY, + "public": ShoutVisibility.PUBLIC, + }[filters.get("visibility")] + if by_visibility: + q = q.filter(Shout.visibility > by_visibility) + by_time_ago = filters.get("time_ago") + if by_time_ago: + q = q.filter(Shout.created_at < by_time_ago) order_by = options.get("order_by", Shout.published_at) - query_order_by = desc(order_by) if options.get("order_by_desc", True) else asc(order_by) offset = options.get("offset", 0) limit = options.get("limit", 10) diff --git a/schemas/core.graphql b/schemas/core.graphql index 7a97118f..ad3bb39a 100644 --- a/schemas/core.graphql +++ b/schemas/core.graphql @@ -257,14 +257,11 @@ input ShoutsFilterBy { } input LoadShoutsFilters { - title: String - body: String topic: String author: String layouts: [String] visibility: String time_ago: Int - reacted: Boolean } input LoadShoutsOptions {