defmodule Mobilizon.GraphQL.Resolvers.Activity do @moduledoc """ Handles the activity-related GraphQL calls. """ import Mobilizon.Users.Guards alias Mobilizon.{Activities, Actors} alias Mobilizon.Activities.Activity alias Mobilizon.Actors.Actor alias Mobilizon.Service.Activity.Utils alias Mobilizon.Storage.Page alias Mobilizon.Users.User require Logger @spec group_activity(Actor.t(), map(), Absinthe.Resolution.t()) :: {:ok, Page.t(Activity.t())} | {:error, :unauthorized | :unauthenticated} def group_activity(%Actor{type: :Group, id: group_id}, %{page: page, limit: limit} = args, %{ context: %{current_user: %User{role: role}, current_actor: %Actor{id: actor_id}} }) do if 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, [type: Map.get(args, :type), author: Map.get(args, :author)], page, limit ) elements = Enum.map(elements, &Utils.transform_activity/1) {:ok, %Page{total: total, elements: elements}} else {:error, :unauthorized} end end def group_activity(_, _, _) do {:error, :unauthenticated} end end