Introduce activity filters
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
@@ -13,13 +13,19 @@ defmodule Mobilizon.GraphQL.Resolvers.Activity do
|
||||
|
||||
require Logger
|
||||
|
||||
def group_activity(%Actor{type: :Group, id: group_id}, %{page: page, limit: limit}, %{
|
||||
def group_activity(%Actor{type: :Group, id: group_id}, %{page: page, limit: limit} = args, %{
|
||||
context: %{current_user: %User{role: role} = user}
|
||||
}) do
|
||||
with {:actor, %Actor{id: actor_id} = _actor} <- {:actor, Users.get_actor_for_user(user)},
|
||||
{:member, true} <- {:member, Actors.is_member?(actor_id, group_id) or is_moderator(role)} do
|
||||
%Page{total: total, elements: elements} =
|
||||
Activities.list_group_activities_for_member(group_id, actor_id, [], page, limit)
|
||||
Activities.list_group_activities_for_member(
|
||||
group_id,
|
||||
actor_id,
|
||||
[type: Map.get(args, :type), author: Map.get(args, :author)],
|
||||
page,
|
||||
limit
|
||||
)
|
||||
|
||||
elements =
|
||||
Enum.map(elements, fn %Activity{} = activity ->
|
||||
|
||||
@@ -19,6 +19,11 @@ defmodule Mobilizon.GraphQL.Schema.ActivityType do
|
||||
value(:member, description: "Activities concerning members")
|
||||
end
|
||||
|
||||
enum :activity_author do
|
||||
value(:self, description: "Activities created by the current actor")
|
||||
value(:by, description: "Activities created by others")
|
||||
end
|
||||
|
||||
object :activity_param_item do
|
||||
field(:key, :string)
|
||||
field(:value, :string)
|
||||
|
||||
@@ -153,6 +153,7 @@ defmodule Mobilizon.GraphQL.Schema.Actors.GroupType do
|
||||
arg(:limit, :integer, default_value: 10, description: "The limit of activity items per page")
|
||||
|
||||
arg(:type, :activity_type, description: "Filter by type of activity")
|
||||
arg(:author, :activity_author, description: "Filter by activity author")
|
||||
resolve(&Activity.group_activity/3)
|
||||
description("The group activity")
|
||||
end
|
||||
|
||||
@@ -93,6 +93,7 @@ defmodule Mobilizon.Activities do
|
||||
)
|
||||
|> where([a, m], a.inserted_at >= m.member_since)
|
||||
|> filter_object_type(Keyword.get(filters, :type))
|
||||
|> filter_author(Keyword.get(filters, :author), actor_asking_id)
|
||||
|> order_by(desc: :inserted_at)
|
||||
|> preload([:author, :group])
|
||||
|> Page.build_page(page, limit)
|
||||
@@ -158,12 +159,21 @@ defmodule Mobilizon.Activities do
|
||||
|
||||
def activity_types, do: @activity_types
|
||||
|
||||
@spec filter_object_type(Query.t(), atom()) :: Query.t()
|
||||
defp filter_object_type(query, :type) do
|
||||
where(query, [q], q.type == ^:type)
|
||||
@spec filter_object_type(Query.t(), atom() | nil) :: Query.t()
|
||||
defp filter_object_type(query, nil), do: query
|
||||
|
||||
defp filter_object_type(query, type) do
|
||||
where(query, [q], q.type == ^type)
|
||||
end
|
||||
|
||||
defp filter_object_type(query, _) do
|
||||
query
|
||||
@spec filter_author(Query.t(), atom() | nil, integer() | String.t()) :: Query.t()
|
||||
defp filter_author(query, nil, _), do: query
|
||||
|
||||
defp filter_author(query, :self, actor_asking_id) do
|
||||
where(query, [q], q.author_id == ^actor_asking_id)
|
||||
end
|
||||
|
||||
defp filter_author(query, :by, actor_asking_id) do
|
||||
where(query, [q], q.author_id != ^actor_asking_id)
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user