Refactor Mobilizon.Federation.ActivityPub and add typespecs
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
@@ -6,7 +6,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Member do
|
||||
import Mobilizon.Users.Guards
|
||||
alias Mobilizon.Actors
|
||||
alias Mobilizon.Actors.{Actor, Member}
|
||||
alias Mobilizon.Federation.ActivityPub
|
||||
alias Mobilizon.Federation.ActivityPub.Actions
|
||||
alias Mobilizon.Federation.ActivityPub.Actor, as: ActivityPubActor
|
||||
alias Mobilizon.Storage.Page
|
||||
alias Mobilizon.Users.User
|
||||
@@ -17,6 +17,8 @@ defmodule Mobilizon.GraphQL.Resolvers.Member do
|
||||
|
||||
If actor requesting is not part of the group, we only return the number of members, not members
|
||||
"""
|
||||
@spec find_members_for_group(Actor.t(), map(), Absinthe.Resolution.t()) ::
|
||||
{:ok, Page.t(Member.t())}
|
||||
def find_members_for_group(
|
||||
%Actor{id: group_id} = group,
|
||||
%{page: page, limit: limit, roles: roles},
|
||||
@@ -47,11 +49,12 @@ defmodule Mobilizon.GraphQL.Resolvers.Member do
|
||||
end
|
||||
|
||||
def find_members_for_group(%Actor{} = group, _args, _resolution) do
|
||||
with %Page{} = page <- Actors.list_members_for_group(group) do
|
||||
{:ok, %Page{page | elements: []}}
|
||||
end
|
||||
%Page{} = page = Actors.list_members_for_group(group)
|
||||
{:ok, %Page{page | elements: []}}
|
||||
end
|
||||
|
||||
@spec invite_member(any(), map(), Absinthe.Resolution.t()) ::
|
||||
{:ok, Member.t()} | {:error, String.t()}
|
||||
def invite_member(
|
||||
_parent,
|
||||
%{group_id: group_id, target_actor_username: target_actor_username},
|
||||
@@ -68,7 +71,8 @@ defmodule Mobilizon.GraphQL.Resolvers.Member do
|
||||
ActivityPubActor.find_or_make_actor_from_nickname(target_actor_username)},
|
||||
{:existant, true} <-
|
||||
{:existant, check_member_not_existant_or_rejected(target_actor_id, group.id)},
|
||||
{:ok, _activity, %Member{} = member} <- ActivityPub.invite(group, actor, target_actor) do
|
||||
{:ok, _activity, %Member{} = member} <-
|
||||
Actions.Invite.invite(group, actor, target_actor) do
|
||||
{:ok, member}
|
||||
else
|
||||
{:error, :group_not_found} ->
|
||||
@@ -92,6 +96,8 @@ defmodule Mobilizon.GraphQL.Resolvers.Member do
|
||||
end
|
||||
end
|
||||
|
||||
@spec accept_invitation(any(), map(), Absinthe.Resolution.t()) ::
|
||||
{:ok, Member.t()} | {:error, String.t()}
|
||||
def accept_invitation(_parent, %{id: member_id}, %{
|
||||
context: %{current_actor: %Actor{id: actor_id}}
|
||||
}) do
|
||||
@@ -99,7 +105,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Member do
|
||||
Actors.get_member(member_id),
|
||||
{:is_same_actor, true} <- {:is_same_actor, member_actor_id == actor_id},
|
||||
{:ok, _activity, %Member{} = member} <-
|
||||
ActivityPub.accept(
|
||||
Actions.Accept.accept(
|
||||
:invite,
|
||||
member,
|
||||
true
|
||||
@@ -111,6 +117,8 @@ defmodule Mobilizon.GraphQL.Resolvers.Member do
|
||||
end
|
||||
end
|
||||
|
||||
@spec reject_invitation(any(), map(), Absinthe.Resolution.t()) ::
|
||||
{:ok, Member.t()} | {:error, String.t()}
|
||||
def reject_invitation(_parent, %{id: member_id}, %{
|
||||
context: %{current_actor: %Actor{id: actor_id}}
|
||||
}) do
|
||||
@@ -118,7 +126,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Member do
|
||||
{:invitation_exists, Actors.get_member(member_id)},
|
||||
{:is_same_actor, true} <- {:is_same_actor, member_actor_id == actor_id},
|
||||
{:ok, _activity, %Member{} = member} <-
|
||||
ActivityPub.reject(
|
||||
Actions.Reject.reject(
|
||||
:invite,
|
||||
member,
|
||||
true
|
||||
@@ -133,12 +141,14 @@ defmodule Mobilizon.GraphQL.Resolvers.Member do
|
||||
end
|
||||
end
|
||||
|
||||
@spec update_member(any(), map(), Absinthe.Resolution.t()) ::
|
||||
{:ok, Member.t()} | {:error, String.t()}
|
||||
def update_member(_parent, %{member_id: member_id, role: role}, %{
|
||||
context: %{current_actor: %Actor{} = moderator}
|
||||
}) do
|
||||
with %Member{} = member <- Actors.get_member(member_id),
|
||||
{:ok, _activity, %Member{} = member} <-
|
||||
ActivityPub.update(member, %{role: role}, true, %{moderator: moderator}) do
|
||||
Actions.Update.update(member, %{role: role}, true, %{moderator: moderator}) do
|
||||
{:ok, member}
|
||||
else
|
||||
{:error, :member_not_found} ->
|
||||
@@ -156,6 +166,8 @@ defmodule Mobilizon.GraphQL.Resolvers.Member do
|
||||
def update_member(_parent, _args, _resolution),
|
||||
do: {:error, "You must be logged-in to update a member"}
|
||||
|
||||
@spec remove_member(any(), map(), Absinthe.Resolution.t()) ::
|
||||
{:ok, Member.t()} | {:error, String.t()}
|
||||
def remove_member(_parent, %{member_id: member_id, group_id: group_id}, %{
|
||||
context: %{current_actor: %Actor{id: moderator_id} = moderator}
|
||||
}) do
|
||||
@@ -164,7 +176,8 @@ defmodule Mobilizon.GraphQL.Resolvers.Member do
|
||||
{:has_rights_to_remove, {:ok, %Member{role: role}}}
|
||||
when role in [:moderator, :administrator, :creator] <-
|
||||
{:has_rights_to_remove, Actors.get_member(moderator_id, group_id)},
|
||||
{:ok, _activity, %Member{}} <- ActivityPub.remove(member, group, moderator, true) do
|
||||
{:ok, _activity, %Member{}} <-
|
||||
Actions.Remove.remove(member, group, moderator, true) do
|
||||
{:ok, member}
|
||||
else
|
||||
%Member{role: :rejected} ->
|
||||
|
||||
Reference in New Issue
Block a user