Work on actors

* Implement group GraphQL APIs
* Change Actors changeset to properly set urls
* Remove old actors indexes and add some new ones

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
Thomas Citharel
2018-12-03 11:58:57 +01:00
parent 1d547ce66a
commit fd0dba62e0
8 changed files with 261 additions and 47 deletions

View File

@@ -0,0 +1,55 @@
defmodule MobilizonWeb.Resolvers.Group do
alias Mobilizon.Actors
alias Mobilizon.Actors.{Actor}
alias Mobilizon.Service.ActivityPub
require Logger
@doc """
Find a group
"""
def find_group(_parent, %{preferred_username: name}, _resolution) do
case ActivityPub.find_or_make_group_from_nickname(name) do
{:ok, actor} ->
{:ok, actor}
_ ->
{:error, "Group with name #{name} not found"}
end
end
@doc """
Lists all groups
"""
def list_groups(_parent, _args, _resolution) do
{:ok, Actors.list_groups}
end
@doc """
Create a new group. The creator is automatically added as admin
"""
def create_group(
_parent,
%{preferred_username: preferred_username, creator_username: actor_username},
%{
context: %{current_user: user}
}
) do
with %Actor{id: actor_id} <- Actors.get_local_actor_by_name(actor_username),
{:user_actor, true} <-
{:user_actor, actor_id in Enum.map(Actors.get_actors_for_user(user), & &1.id)},
{:ok, %Actor{} = group} <- Actors.create_group(%{preferred_username: preferred_username}) do
{:ok, group}
else
{:error, %Ecto.Changeset{errors: [url: {"has already been taken", []}]}} ->
{:error, :group_name_not_available}
err ->
Logger.error(inspect(err))
err
end
end
def create_group(_parent, _args, _resolution) do
{:error, "You need to be logged-in to create a group"}
end
end

View File

@@ -1,7 +1,8 @@
defmodule MobilizonWeb.Resolvers.Actor do
defmodule MobilizonWeb.Resolvers.Person do
alias Mobilizon.Actors
alias Mobilizon.Service.ActivityPub
@deprecated "Use find_person/3 or find_group/3 instead"
def find_actor(_parent, %{preferred_username: name}, _resolution) do
case ActivityPub.find_or_make_actor_from_nickname(name) do
{:ok, actor} ->
@@ -25,19 +26,6 @@ defmodule MobilizonWeb.Resolvers.Actor do
end
end
@doc """
Find a person
"""
def find_group(_parent, %{preferred_username: name}, _resolution) do
case ActivityPub.find_or_make_group_from_nickname(name) do
{:ok, actor} ->
{:ok, actor}
_ ->
{:error, "Group with name #{name} not found"}
end
end
@doc """
Returns the current actor for the currently logged-in user
"""