Refactor Mobilizon.Federation.ActivityPub and add typespecs
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
@@ -5,7 +5,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Resource do
|
||||
|
||||
alias Mobilizon.{Actors, Resources}
|
||||
alias Mobilizon.Actors.Actor
|
||||
alias Mobilizon.Federation.ActivityPub
|
||||
alias Mobilizon.Federation.ActivityPub.Actions
|
||||
alias Mobilizon.Resources.Resource
|
||||
alias Mobilizon.Resources.Resource.Metadata
|
||||
alias Mobilizon.Service.RichMedia.Parser
|
||||
@@ -21,6 +21,8 @@ defmodule Mobilizon.GraphQL.Resolvers.Resource do
|
||||
|
||||
Returns only if actor requesting is a member of the group
|
||||
"""
|
||||
@spec find_resources_for_group(Actor.t(), map(), Absinthe.Resolution.t()) ::
|
||||
{:ok, Page.t(Resource.t())}
|
||||
def find_resources_for_group(
|
||||
%Actor{id: group_id} = group,
|
||||
%{page: page, limit: limit},
|
||||
@@ -47,6 +49,8 @@ defmodule Mobilizon.GraphQL.Resolvers.Resource do
|
||||
{:ok, %Page{total: 0, elements: []}}
|
||||
end
|
||||
|
||||
@spec find_resources_for_parent(Resource.t(), map(), Absinthe.Resolution.t()) ::
|
||||
{:ok, Page.t(Resource.t())}
|
||||
def find_resources_for_parent(
|
||||
%Resource{actor_id: group_id} = parent,
|
||||
%{page: page, limit: limit},
|
||||
@@ -65,6 +69,8 @@ defmodule Mobilizon.GraphQL.Resolvers.Resource do
|
||||
def find_resources_for_parent(_parent, _args, _resolution),
|
||||
do: {:ok, %Page{total: 0, elements: []}}
|
||||
|
||||
@spec get_resource(any(), map(), Absinthe.Resolution.t()) ::
|
||||
{:ok, Resource.t()} | {:error, :group_not_found | :resource_not_found | String.t()}
|
||||
def get_resource(
|
||||
_parent,
|
||||
%{path: path, username: username},
|
||||
@@ -90,6 +96,8 @@ defmodule Mobilizon.GraphQL.Resolvers.Resource do
|
||||
{:error, dgettext("errors", "You need to be logged-in to access resources")}
|
||||
end
|
||||
|
||||
@spec create_resource(any(), map(), Absinthe.Resolution.t()) ::
|
||||
{:ok, Resource.t()} | {:error, String.t()}
|
||||
def create_resource(
|
||||
_parent,
|
||||
%{actor_id: group_id} = args,
|
||||
@@ -103,7 +111,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Resource do
|
||||
parent <- get_eventual_parent(args),
|
||||
{:own_check, true} <- {:own_check, check_resource_owned_by_group(parent, group_id)},
|
||||
{:ok, _, %Resource{} = resource} <-
|
||||
ActivityPub.create(
|
||||
Actions.Create.create(
|
||||
:resource,
|
||||
args
|
||||
|> Map.put(:actor_id, group_id)
|
||||
@@ -128,6 +136,8 @@ defmodule Mobilizon.GraphQL.Resolvers.Resource do
|
||||
{:error, dgettext("errors", "You need to be logged-in to create resources")}
|
||||
end
|
||||
|
||||
@spec update_resource(any(), map(), Absinthe.Resolution.t()) ::
|
||||
{:ok, Resource.t()} | {:error, String.t()}
|
||||
def update_resource(
|
||||
_parent,
|
||||
%{id: resource_id} = args,
|
||||
@@ -137,18 +147,25 @@ defmodule Mobilizon.GraphQL.Resolvers.Resource do
|
||||
}
|
||||
} = _resolution
|
||||
) do
|
||||
with {:resource, %Resource{actor_id: group_id} = resource} <-
|
||||
{:resource, Resources.get_resource_with_preloads(resource_id)},
|
||||
{:member, true} <- {:member, Actors.is_member?(actor_id, group_id)},
|
||||
{:ok, _, %Resource{} = resource} <-
|
||||
ActivityPub.update(resource, args, true, %{"actor" => actor_url}) do
|
||||
{:ok, resource}
|
||||
else
|
||||
{:resource, _} ->
|
||||
{:error, dgettext("errors", "Resource doesn't exist")}
|
||||
case Resources.get_resource_with_preloads(resource_id) do
|
||||
%Resource{actor_id: group_id} = resource ->
|
||||
if Actors.is_member?(actor_id, group_id) do
|
||||
case Actions.Update.update(resource, args, true, %{"actor" => actor_url}) do
|
||||
{:ok, _, %Resource{} = resource} ->
|
||||
{:ok, resource}
|
||||
|
||||
{:member, _} ->
|
||||
{:error, dgettext("errors", "Profile is not member of group")}
|
||||
{:error, %Ecto.Changeset{} = err} ->
|
||||
{:error, err}
|
||||
|
||||
{:error, err} when is_atom(err) ->
|
||||
{:error, dgettext("errors", "Unknown error while updating resource")}
|
||||
end
|
||||
else
|
||||
{:error, dgettext("errors", "Profile is not member of group")}
|
||||
end
|
||||
|
||||
nil ->
|
||||
{:error, dgettext("errors", "Resource doesn't exist")}
|
||||
end
|
||||
end
|
||||
|
||||
@@ -156,6 +173,8 @@ defmodule Mobilizon.GraphQL.Resolvers.Resource do
|
||||
{:error, dgettext("errors", "You need to be logged-in to update resources")}
|
||||
end
|
||||
|
||||
@spec delete_resource(any(), map(), Absinthe.Resolution.t()) ::
|
||||
{:ok, Resource.t()} | {:error, String.t()}
|
||||
def delete_resource(
|
||||
_parent,
|
||||
%{id: resource_id},
|
||||
@@ -169,7 +188,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Resource do
|
||||
{:resource, Resources.get_resource_with_preloads(resource_id)},
|
||||
{:member, true} <- {:member, Actors.is_member?(actor_id, group_id)},
|
||||
{:ok, _, %Resource{} = resource} <-
|
||||
ActivityPub.delete(resource, actor) do
|
||||
Actions.Delete.delete(resource, actor) do
|
||||
{:ok, resource}
|
||||
else
|
||||
{:resource, _} ->
|
||||
@@ -184,6 +203,8 @@ defmodule Mobilizon.GraphQL.Resolvers.Resource do
|
||||
{:error, dgettext("errors", "You need to be logged-in to delete resources")}
|
||||
end
|
||||
|
||||
@spec preview_resource_link(any(), map(), Absinthe.Resolution.t()) ::
|
||||
{:ok, Metadata.t()} | {:error, String.t() | :unknown_resource}
|
||||
def preview_resource_link(
|
||||
_parent,
|
||||
%{resource_url: resource_url},
|
||||
@@ -211,6 +232,8 @@ defmodule Mobilizon.GraphQL.Resolvers.Resource do
|
||||
{:error, dgettext("errors", "You need to be logged-in to view a resource preview")}
|
||||
end
|
||||
|
||||
@spec proxyify_pictures(Metadata.t(), map(), Absinthe.Resolution.t()) ::
|
||||
{:ok, String.t() | nil} | {:error, String.t()}
|
||||
def proxyify_pictures(%Metadata{} = metadata, _args, %{
|
||||
definition: %{schema_node: %{name: name}}
|
||||
}) do
|
||||
|
||||
Reference in New Issue
Block a user